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