@ -55,97 +55,58 @@ Meteor.publish('archivedBoards', function() {
} ) ;
} ) ;
} ) ;
} ) ;
Meteor . publishComposite ( 'board' , function ( boardId ) {
Meteor . publishRelations ( 'board' , function ( boardId ) {
check ( boardId , String ) ;
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
this . cursor ( Boards . find ( {
// XXX Originally we were publishing the card documents as a child of the
_id : boardId ,
// list publication defined above using the following selector `{ listId:
archived : false ,
// list._id }`. But it was causing a race condition in publish-composite,
// If the board is not public the user has to be a member of it to see
// that I documented here:
// it.
//
$or : [
// https://github.com/englue/meteor-publish-composite/issues/29
{ permission : 'public' } ,
//
{ members : { $elemMatch : { userId : this . userId , isActive : true } } } ,
// I then tried to replace publish-composite by cottz:publish, but it had
] ,
// a similar problem:
} , { limit : 1 } ) , function ( boardId , board ) {
//
this . cursor ( Lists . find ( { boardId } ) ) ;
// 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 ,
} ) ;
} ,
children : [
// Cards and cards comments
// comments
// XXX Originally we were publishing the card documents as a child of the
{
// list publication defined above using the following selector `{ listId:
find ( card ) {
// list._id }`. But it was causing a race condition in publish-composite,
return CardComments . find ( {
// that I documented here:
cardId : card . _id ,
//
} ) ;
// https://github.com/englue/meteor-publish-composite/issues/29
} ,
//
} ,
// cottz:publish had a similar problem:
// Attachments
//
{
// https://github.com/Goluis/cottz-publish/issues/4
find ( card ) {
//
return Attachments . find ( {
// The current state of relational publishing in meteor is a bit sad,
cardId : card . _id ,
// 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
// Board members. This publication also includes former board members that
// aren't members anymore but may have some activities attached to them in
// aren't members anymore but may have some activities attached to them in
// the history.
// the history.
{
//
find ( board ) {
this . cursor ( Users . find ( {
return Users . find ( {
_id : { $in : _ . pluck ( board . members , 'userId' ) } ,
_id : { $in : _ . pluck ( board . members , 'userId' ) } ,
} ) , function ( userId ) {
} ) ;
// Presence indicators
} ,
this . cursor ( presences . find ( { userId } ) ) ;
// Presence indicators
} ) ;
children : [ {
} ) ;
find ( user ) {
return presences . find ( { userId : user . _id } ) ;
return this . ready ( ) ;
} ,
} ] ,
} ,
] ,
} ;
} ) ;
} ) ;