cards.js 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. Meteor.publish('card', cardId => {
  2. check(cardId, String);
  3. return Cards.find({ _id: cardId });
  4. });
  5. Meteor.publish('myCards', function() {
  6. const userId = Meteor.userId();
  7. const archivedBoards = [];
  8. Boards.find({ archived: true }).forEach(board => {
  9. archivedBoards.push(board._id);
  10. });
  11. const archivedSwimlanes = [];
  12. Swimlanes.find({ archived: true }).forEach(swimlane => {
  13. archivedSwimlanes.push(swimlane._id);
  14. });
  15. const archivedLists = [];
  16. Lists.find({ archived: true }).forEach(list => {
  17. archivedLists.push(list._id);
  18. });
  19. selector = {
  20. archived: false,
  21. boardId: { $nin: archivedBoards },
  22. swimlaneId: { $nin: archivedSwimlanes },
  23. listId: { $nin: archivedLists },
  24. $or: [{ members: userId }, { assignees: userId }],
  25. };
  26. const cards = Cards.find(selector, {
  27. fields: {
  28. _id: 1,
  29. archived: 1,
  30. boardId: 1,
  31. swimlaneId: 1,
  32. listId: 1,
  33. title: 1,
  34. type: 1,
  35. sort: 1,
  36. members: 1,
  37. assignees: 1,
  38. colors: 1,
  39. dueAt: 1,
  40. },
  41. });
  42. const boards = [];
  43. const swimlanes = [];
  44. const lists = [];
  45. const users = [];
  46. cards.forEach(card => {
  47. if (card.boardId) boards.push(card.boardId);
  48. if (card.swimlaneId) swimlanes.push(card.swimlaneId);
  49. if (card.listId) lists.push(card.listId);
  50. if (card.members) {
  51. card.members.forEach(userId => {
  52. users.push(userId);
  53. });
  54. }
  55. if (card.assignees) {
  56. card.assignees.forEach(userId => {
  57. users.push(userId);
  58. });
  59. }
  60. });
  61. return [
  62. cards,
  63. Boards.find({ _id: { $in: boards } }),
  64. Swimlanes.find({ _id: { $in: swimlanes } }),
  65. Lists.find({ _id: { $in: lists } }),
  66. Users.find({ _id: { $in: users } }, { fields: Users.safeFields }),
  67. ];
  68. });
  69. Meteor.publish('dueCards', function(allUsers = false) {
  70. check(allUsers, Boolean);
  71. // eslint-disable-next-line no-console
  72. // console.log('all users:', allUsers);
  73. const user = Users.findOne({ _id: this.userId });
  74. const archivedBoards = [];
  75. Boards.find({ archived: true }).forEach(board => {
  76. archivedBoards.push(board._id);
  77. });
  78. const permiitedBoards = [];
  79. let selector = {
  80. archived: false,
  81. };
  82. selector.$or = [
  83. { permission: 'public' },
  84. { members: { $elemMatch: { userId: user._id, isActive: true } } },
  85. ];
  86. Boards.find(selector).forEach(board => {
  87. permiitedBoards.push(board._id);
  88. });
  89. const archivedSwimlanes = [];
  90. Swimlanes.find({ archived: true }).forEach(swimlane => {
  91. archivedSwimlanes.push(swimlane._id);
  92. });
  93. const archivedLists = [];
  94. Lists.find({ archived: true }).forEach(list => {
  95. archivedLists.push(list._id);
  96. });
  97. selector = {
  98. archived: false,
  99. boardId: { $nin: archivedBoards, $in: permiitedBoards },
  100. swimlaneId: { $nin: archivedSwimlanes },
  101. listId: { $nin: archivedLists },
  102. dueAt: { $ne: null },
  103. endAt: null,
  104. };
  105. if (!allUsers) {
  106. selector.$or = [{ members: user._id }, { assignees: user._id }];
  107. }
  108. const cards = Cards.find(selector, {
  109. fields: {
  110. _id: 1,
  111. archived: 1,
  112. boardId: 1,
  113. swimlaneId: 1,
  114. listId: 1,
  115. title: 1,
  116. type: 1,
  117. sort: 1,
  118. members: 1,
  119. assignees: 1,
  120. colors: 1,
  121. dueAt: 1,
  122. },
  123. });
  124. const boards = [];
  125. const swimlanes = [];
  126. const lists = [];
  127. const users = [];
  128. cards.forEach(card => {
  129. if (card.boardId) boards.push(card.boardId);
  130. if (card.swimlaneId) swimlanes.push(card.swimlaneId);
  131. if (card.listId) lists.push(card.listId);
  132. if (card.members) {
  133. card.members.forEach(userId => {
  134. users.push(userId);
  135. });
  136. }
  137. if (card.assignees) {
  138. card.assignees.forEach(userId => {
  139. users.push(userId);
  140. });
  141. }
  142. });
  143. return [
  144. cards,
  145. Boards.find({ _id: { $in: boards } }),
  146. Swimlanes.find({ _id: { $in: swimlanes } }),
  147. Lists.find({ _id: { $in: lists } }),
  148. Users.find({ _id: { $in: users } }, { fields: Users.safeFields }),
  149. ];
  150. });
  151. Meteor.publish('globalSearch', function(queryParams) {
  152. check(queryParams, Object);
  153. // eslint-disable-next-line no-console
  154. // console.log('queryParams:', queryParams);
  155. const cards = Cards.globalSearch(queryParams).cards;
  156. if (!cards) {
  157. return [];
  158. }
  159. SessionData.upsert(
  160. { userId: this.userId },
  161. {
  162. $set: {
  163. totalHits: cards.count(),
  164. lastHit: cards.count() > 50 ? 50 : cards.count(),
  165. },
  166. },
  167. );
  168. const boards = [];
  169. const swimlanes = [];
  170. const lists = [];
  171. const users = [this.userId];
  172. cards.forEach(card => {
  173. if (card.boardId) boards.push(card.boardId);
  174. if (card.swimlaneId) swimlanes.push(card.swimlaneId);
  175. if (card.listId) lists.push(card.listId);
  176. if (card.members) {
  177. card.members.forEach(userId => {
  178. users.push(userId);
  179. });
  180. }
  181. if (card.assignees) {
  182. card.assignees.forEach(userId => {
  183. users.push(userId);
  184. });
  185. }
  186. });
  187. // eslint-disable-next-line no-console
  188. // console.log('users:', users);
  189. return [
  190. cards,
  191. Boards.find({ _id: { $in: boards } }),
  192. Swimlanes.find({ _id: { $in: swimlanes } }),
  193. Lists.find({ _id: { $in: lists } }),
  194. Users.find({ _id: { $in: users } }, { fields: Users.safeFields }),
  195. SessionData.find({ userId: this.userId }),
  196. ];
  197. });
  198. Meteor.publish('brokenCards', function() {
  199. const user = Users.findOne({ _id: this.userId });
  200. const permiitedBoards = [null];
  201. let selector = {};
  202. selector.$or = [
  203. { permission: 'public' },
  204. { members: { $elemMatch: { userId: user._id, isActive: true } } },
  205. ];
  206. Boards.find(selector).forEach(board => {
  207. permiitedBoards.push(board._id);
  208. });
  209. selector = {
  210. boardId: { $in: permiitedBoards },
  211. $or: [
  212. { boardId: { $in: [null, ''] } },
  213. { swimlaneId: { $in: [null, ''] } },
  214. { listId: { $in: [null, ''] } },
  215. ],
  216. };
  217. const cards = Cards.find(selector, {
  218. fields: {
  219. _id: 1,
  220. archived: 1,
  221. boardId: 1,
  222. swimlaneId: 1,
  223. listId: 1,
  224. title: 1,
  225. type: 1,
  226. sort: 1,
  227. members: 1,
  228. assignees: 1,
  229. colors: 1,
  230. dueAt: 1,
  231. },
  232. });
  233. const boards = [];
  234. const swimlanes = [];
  235. const lists = [];
  236. const users = [];
  237. cards.forEach(card => {
  238. if (card.boardId) boards.push(card.boardId);
  239. if (card.swimlaneId) swimlanes.push(card.swimlaneId);
  240. if (card.listId) lists.push(card.listId);
  241. if (card.members) {
  242. card.members.forEach(userId => {
  243. users.push(userId);
  244. });
  245. }
  246. if (card.assignees) {
  247. card.assignees.forEach(userId => {
  248. users.push(userId);
  249. });
  250. }
  251. });
  252. return [
  253. cards,
  254. Boards.find({ _id: { $in: boards } }),
  255. Swimlanes.find({ _id: { $in: swimlanes } }),
  256. Lists.find({ _id: { $in: lists } }),
  257. Users.find({ _id: { $in: users } }, { fields: Users.safeFields }),
  258. ];
  259. });