2016-12-14 4 views
0

Мне нужно опубликовать очередь из коллекции. Сообщения в зависимости от конфиденциальности. Но я не знаю, как это получить. Я раздаточный Mindmap главной концепции, что я пытаюсь реализовать:Как публиковать сообщения в зависимости от конфиденциальности?

enter image description here

Вход:

var currentUser = "Andrey"; 

Events.find(); 

Выход:

[ 
{ 
    //it's going to output, becouse I've created this post 
    "_id" : "1", 
    "createdBy" : "Andrey", 
    "private" : true, 
    "title" : "", 
    "text": "", 
    "members" : [ 
     "Sheldon", "Mike" 
    ] 
}, 
{ 
    //it's going to output, becouse this post not private 
    "_id" : "2", 
    "createdBy" : "Sheldon", 
    "private" : false, 
    "title" : "", 
    "members" : [] 
}, 
{ 
    //it's going to output, becouse I'm one of members' 
    "_id" : "3", 
    "createdBy" : "Mike", 
    "private" : true, 
    "title" : "", 
    "text": "", 
    "members" : [ 
     "Andrey" 
    ] 
}, 
{ 
    //it's NOT going to output, becouse it's private post, I'm not the member or author 
    "_id" : "4", 
    "createdBy" : "Ana", 
    "private" : true, 
    "title" : "", 
    "text": "", 
    "members" : [ 
     "Sheldon" 
    ] 
}, 
] 

Ожидаемый результат:

[ 
{ 
    "_id" : "1", 
    "createdBy" : "Andrey", 
    "private" : true, 
    "title" : "", 
    "text": "", 
    "members" : [ 
     "Sheldon", "Mike" 
    ] 
}, 
{ 
    "_id" : "2", 
    "createdBy" : "Sheldon", 
    "private" : false, 
    "title" : "", 
    "text": "", 
    "members" : [] 
}, 
{ 
    "_id" : "3", 
    "createdBy" : "Mike", 
    "private" : true, 
    "title" : "", 
    "text": "", 
    "members" : [ 
     "Andrey" 
    ] 
} 
] 

Но эта идея может быть неправильной вообще, может быть, у вас есть другой способ?

ответ

2

Я не уверен, что это правильный подход, но, вероятно, я попробую что-то подобное, если я столкнусь с этой проблемой. (Кстати, я хотел бы использовать USERID вместо имен. Если вы использовали имена для того, чтобы объяснить свою цель, пожалуйста, игнорировать этот комментарий)

До тех пор, как я помню, вы можете вернуть несколько результатов запроса, как, что

return [ 
     Result1, 
     Result2, 
     ] 

Для публичных сообщений не нужно беспокоиться, я думаю. Достаточно вернуть только private: false.

Для частных, я хотел бы использовать в качестве параметра USERID и попробовать эти композиционные публикации:

Meteor.publish('posts', function postPublication(userId) { 

    return [ 
    Posts.find({ 
    $and: [{ 
     $or: [ 
     {_id: userId}, 
     {memberId: {$in: userId}} 
     ]}, 
     {private: {$eq: true}} 
    ]}), // => should return private posts created or commented by member 
    Posts.find({private: {$eq: false}}) // => should return public ones 
    ]; 
} 

Затем сделать подписку с USERID

Meteor.subscribe('posts', userId); 
+0

Thanx, много! Я думаю, что у него есть только одно решение этой проблемы, это делать с $ и $ или операторами, как в вашем примере. Я трачу весь день на эксперименты, и теперь я получаю ожидаемый результат. И об идентификаторе пользователя, я тоже использую идентификаторы, это было дано, например. Спасибо! –

0

Этого код, как я решил эту задачу, с $ или $ и. Но не уверен, если это лучшее решение. Но я получаю ожидаемый результат.

Meteor.publish('posts', function(currentUser) { 
selector = { 
       $or : [ 
        { $and : [ {'private': true, 'members': currentUser} ] }, 
        { $and : [ {'private': true, 'author': currentUser} ] }, 
        { $and : [ {'private': false, 'author': currentUser} ] }, 
        { $and : [ {'private': undefined} ] }, 
        { $and : [ {'private': false} ] }, 

       ] 
      } 
return Posts.find(selector); 
});