|
@@ -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();
|
|
|
});
|