Replace reywood:publish-composite by cottz:publish-relations

Since bug #431 is due to publish-composite I tried to fix this package
and propose a pull request but the code was difficult to refactor. I
decided to use @cottz package instead which handled DDP messages in
the correct order.

Fixes #431
reviewable/pr435/r1
Maxime Quandalle 10 years ago
parent 0954cff5b4
commit 677e9937e0
  1. 2
      .meteor/packages
  2. 2
      .meteor/versions
  3. 139
      server/publications/boards.js

@ -18,13 +18,13 @@ es5-shim
aldeed:collection2
cfs:gridfs
cfs:standard-packages
cottz:publish-relations
dburles:collection-helpers
idmontie:migrations
matb33:collection-hooks
matteodem:easy-search
mongo
mquandalle:collection-mutations
reywood:publish-composite
# Account system
accounts-password

@ -39,6 +39,7 @@ check@1.1.0
chuangbo:cookie@1.1.0
coffeescript@1.0.11
cosmos:browserify@0.9.2
cottz:publish-relations@2.0.0
dburles:collection-helpers@1.0.4
ddp@1.2.2
ddp-client@1.2.1
@ -119,7 +120,6 @@ reactive-dict@1.1.3
reactive-var@1.0.6
reload@1.1.4
retry@1.0.4
reywood:publish-composite@1.4.2
routepolicy@1.0.6
seriousm:emoji-continued@1.4.0
service-configuration@1.0.5

@ -55,97 +55,58 @@ Meteor.publish('archivedBoards', function() {
});
});
Meteor.publishComposite('board', function(boardId) {
Meteor.publishRelations('board', function(boardId) {
check(boardId, String);
return {
find() {
return Boards.find({
_id: boardId,
archived: false,
// If the board is not public the user has to be a member of it to see
// it.
$or: [
{ permission: 'public' },
{ members: { $elemMatch: { userId: this.userId, isActive: true }}},
],
}, { limit: 1 });
},
children: [
// Lists
{
find(board) {
return Lists.find({
boardId: board._id,
});
},
},
// Cards and cards comments
// XXX Originally we were publishing the card documents as a child of the
// list publication defined above using the following selector `{ listId:
// list._id }`. But it was causing a race condition in publish-composite,
// that I documented here:
//
// https://github.com/englue/meteor-publish-composite/issues/29
//
// I then tried to replace publish-composite by cottz:publish, but it had
// a similar problem:
//
// https://github.com/Goluis/cottz-publish/issues/4
// https://github.com/wekan/wekan/pull/78
//
// The current state of relational publishing in meteor is a bit sad,
// there are a lot of various packages, with various APIs, some of them
// are unmaintained. Fortunately this is something that will be fixed by
// meteor-core at some point:
//
// https://trello.com/c/BGvIwkEa/48-easy-joins-in-subscriptions
//
// And in the meantime our code below works pretty well -- it's not even a
// hack!
{
find(board) {
return Cards.find({
boardId: board._id,
});
},
this.cursor(Boards.find({
_id: boardId,
archived: false,
// If the board is not public the user has to be a member of it to see
// it.
$or: [
{ permission: 'public' },
{ members: { $elemMatch: { userId: this.userId, isActive: true }}},
],
}, { limit: 1 }), function(boardId, board) {
this.cursor(Lists.find({ boardId }));
children: [
// comments
{
find(card) {
return CardComments.find({
cardId: card._id,
});
},
},
// Attachments
{
find(card) {
return Attachments.find({
cardId: card._id,
});
},
},
],
},
// Cards and cards comments
// XXX Originally we were publishing the card documents as a child of the
// list publication defined above using the following selector `{ listId:
// list._id }`. But it was causing a race condition in publish-composite,
// that I documented here:
//
// https://github.com/englue/meteor-publish-composite/issues/29
//
// cottz:publish had a similar problem:
//
// https://github.com/Goluis/cottz-publish/issues/4
//
// The current state of relational publishing in meteor is a bit sad,
// there are a lot of various packages, with various APIs, some of them
// are unmaintained. Fortunately this is something that will be fixed by
// meteor-core at some point:
//
// https://trello.com/c/BGvIwkEa/48-easy-joins-in-subscriptions
//
// And in the meantime our code below works pretty well -- it's not even a
// hack!
this.cursor(Cards.find({ boardId }), function(cardId) {
this.cursor(CardComments.find({ cardId }));
this.cursor(Attachments.find({ cardId }));
});
// Board members. This publication also includes former board members that
// aren't members anymore but may have some activities attached to them in
// the history.
{
find(board) {
return Users.find({
_id: { $in: _.pluck(board.members, 'userId') },
});
},
// Presence indicators
children: [{
find(user) {
return presences.find({userId: user._id});
},
}],
},
],
};
// Board members. This publication also includes former board members that
// aren't members anymore but may have some activities attached to them in
// the history.
//
this.cursor(Users.find({
_id: { $in: _.pluck(board.members, 'userId') },
}), function(userId) {
// Presence indicators
this.cursor(presences.find({ userId }));
});
});
return this.ready();
});

Loading…
Cancel
Save