|
@@ -4,31 +4,173 @@ Meteor.publish('card', cardId => {
|
|
|
});
|
|
|
|
|
|
Meteor.publish('myCards', function() {
|
|
|
- const userId = this.userId;
|
|
|
+ const userId = Meteor.userId();
|
|
|
|
|
|
- return Cards.find(
|
|
|
- {
|
|
|
- archived: false,
|
|
|
- $or: [{ members: userId }, { assignees: userId }],
|
|
|
+ const archivedBoards = [];
|
|
|
+ Boards.find({ archived: true }).forEach(board => {
|
|
|
+ archivedBoards.push(board._id);
|
|
|
+ });
|
|
|
+
|
|
|
+ const archivedSwimlanes = [];
|
|
|
+ Swimlanes.find({ archived: true }).forEach(swimlane => {
|
|
|
+ archivedSwimlanes.push(swimlane._id);
|
|
|
+ });
|
|
|
+
|
|
|
+ const archivedLists = [];
|
|
|
+ Lists.find({ archived: true }).forEach(list => {
|
|
|
+ archivedLists.push(list._id);
|
|
|
+ });
|
|
|
+
|
|
|
+ selector = {
|
|
|
+ archived: false,
|
|
|
+ boardId: { $nin: archivedBoards },
|
|
|
+ swimlaneId: { $nin: archivedSwimlanes },
|
|
|
+ listId: { $nin: archivedLists },
|
|
|
+ $or: [{ members: userId }, { assignees: userId }],
|
|
|
+ };
|
|
|
+
|
|
|
+ const cards = Cards.find(selector, {
|
|
|
+ fields: {
|
|
|
+ _id: 1,
|
|
|
+ archived: 1,
|
|
|
+ boardId: 1,
|
|
|
+ swimlaneId: 1,
|
|
|
+ listId: 1,
|
|
|
+ title: 1,
|
|
|
+ type: 1,
|
|
|
+ sort: 1,
|
|
|
+ members: 1,
|
|
|
+ assignees: 1,
|
|
|
+ colors: 1,
|
|
|
+ dueAt: 1,
|
|
|
},
|
|
|
- {
|
|
|
- fields: {
|
|
|
- _id: 1,
|
|
|
- archived: 1,
|
|
|
- boardId: 1,
|
|
|
- swimlaneId: 1,
|
|
|
- listId: 1,
|
|
|
- title: 1,
|
|
|
- type: 1,
|
|
|
- sort: 1,
|
|
|
- members: 1,
|
|
|
- assignees: 1,
|
|
|
- colors: 1,
|
|
|
- dueAt: 1,
|
|
|
- },
|
|
|
- // sort: {
|
|
|
- // sort: ['boardId', 'listId', 'sort'],
|
|
|
- // },
|
|
|
+ });
|
|
|
+
|
|
|
+ const boards = [];
|
|
|
+ const swimlanes = [];
|
|
|
+ const lists = [];
|
|
|
+ const users = [];
|
|
|
+
|
|
|
+ cards.forEach(card => {
|
|
|
+ if (card.boardId) boards.push(card.boardId);
|
|
|
+ if (card.swimlaneId) swimlanes.push(card.swimlaneId);
|
|
|
+ if (card.listId) lists.push(card.listId);
|
|
|
+ if (card.members) {
|
|
|
+ card.members.forEach(userId => {
|
|
|
+ users.push(userId);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ if (card.assignees) {
|
|
|
+ card.assignees.forEach(userId => {
|
|
|
+ users.push(userId);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ return [
|
|
|
+ cards,
|
|
|
+ Boards.find({ _id: { $in: boards } }),
|
|
|
+ Swimlanes.find({ _id: { $in: swimlanes } }),
|
|
|
+ Lists.find({ _id: { $in: lists } }),
|
|
|
+ Users.find({ _id: { $in: users } }),
|
|
|
+ ];
|
|
|
+});
|
|
|
+
|
|
|
+Meteor.publish('dueCards', function(allUsers = false) {
|
|
|
+ check(allUsers, Boolean);
|
|
|
+
|
|
|
+ // eslint-disable-next-line no-console
|
|
|
+ // console.log('all users:', allUsers);
|
|
|
+
|
|
|
+ const user = Users.findOne(this.userId);
|
|
|
+
|
|
|
+ const archivedBoards = [];
|
|
|
+ Boards.find({ archived: true }).forEach(board => {
|
|
|
+ archivedBoards.push(board._id);
|
|
|
+ });
|
|
|
+
|
|
|
+ const permiitedBoards = [];
|
|
|
+ let selector = {
|
|
|
+ archived: false,
|
|
|
+ };
|
|
|
+ // if user is not an admin allow her to see cards only from boards where
|
|
|
+ // she is a member
|
|
|
+ if (!user.isAdmin) {
|
|
|
+ selector.$or = [
|
|
|
+ { permission: 'public' },
|
|
|
+ { members: { $elemMatch: { userId: user._id, isActive: true } } },
|
|
|
+ ];
|
|
|
+ }
|
|
|
+ Boards.find(selector).forEach(board => {
|
|
|
+ permiitedBoards.push(board._id);
|
|
|
+ });
|
|
|
+
|
|
|
+ const archivedSwimlanes = [];
|
|
|
+ Swimlanes.find({ archived: true }).forEach(swimlane => {
|
|
|
+ archivedSwimlanes.push(swimlane._id);
|
|
|
+ });
|
|
|
+
|
|
|
+ const archivedLists = [];
|
|
|
+ Lists.find({ archived: true }).forEach(list => {
|
|
|
+ archivedLists.push(list._id);
|
|
|
+ });
|
|
|
+
|
|
|
+ selector = {
|
|
|
+ archived: false,
|
|
|
+ boardId: { $nin: archivedBoards, $in: permiitedBoards },
|
|
|
+ swimlaneId: { $nin: archivedSwimlanes },
|
|
|
+ listId: { $nin: archivedLists },
|
|
|
+ dueAt: { $ne: null },
|
|
|
+ endAt: null,
|
|
|
+ };
|
|
|
+
|
|
|
+ if (!allUsers) {
|
|
|
+ selector.$or = [{ members: user._id }, { assignees: user._id }];
|
|
|
+ }
|
|
|
+
|
|
|
+ const cards = Cards.find(selector, {
|
|
|
+ fields: {
|
|
|
+ _id: 1,
|
|
|
+ archived: 1,
|
|
|
+ boardId: 1,
|
|
|
+ swimlaneId: 1,
|
|
|
+ listId: 1,
|
|
|
+ title: 1,
|
|
|
+ type: 1,
|
|
|
+ sort: 1,
|
|
|
+ members: 1,
|
|
|
+ assignees: 1,
|
|
|
+ colors: 1,
|
|
|
+ dueAt: 1,
|
|
|
},
|
|
|
- );
|
|
|
+ });
|
|
|
+
|
|
|
+ const boards = [];
|
|
|
+ const swimlanes = [];
|
|
|
+ const lists = [];
|
|
|
+ const users = [];
|
|
|
+
|
|
|
+ cards.forEach(card => {
|
|
|
+ if (card.boardId) boards.push(card.boardId);
|
|
|
+ if (card.swimlaneId) swimlanes.push(card.swimlaneId);
|
|
|
+ if (card.listId) lists.push(card.listId);
|
|
|
+ if (card.members) {
|
|
|
+ card.members.forEach(userId => {
|
|
|
+ users.push(userId);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ if (card.assignees) {
|
|
|
+ card.assignees.forEach(userId => {
|
|
|
+ users.push(userId);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ return [
|
|
|
+ cards,
|
|
|
+ Boards.find({ _id: { $in: boards } }),
|
|
|
+ Swimlanes.find({ _id: { $in: swimlanes } }),
|
|
|
+ Lists.find({ _id: { $in: lists } }),
|
|
|
+ Users.find({ _id: { $in: users } }),
|
|
|
+ ];
|
|
|
});
|