From 677e9937e0c1872bfe4ec5ce87bf2a8ca99febe1 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Mon, 14 Dec 2015 19:52:21 +0100 Subject: 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 --- .meteor/packages | 2 +- .meteor/versions | 2 +- server/publications/boards.js | 139 +++++++++++++++--------------------------- 3 files changed, 52 insertions(+), 91 deletions(-) diff --git a/.meteor/packages b/.meteor/packages index 98c06cc9..93965383 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -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 diff --git a/.meteor/versions b/.meteor/versions index 9d7fe1b3..cf64a5d2 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -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 diff --git a/server/publications/boards.js b/server/publications/boards.js index ffb077e9..da6bc1cd 100644 --- a/server/publications/boards.js +++ b/server/publications/boards.js @@ -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(); }); -- cgit v1.2.3-1-g7c22