checklistItems.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. ChecklistItems = new Mongo.Collection('checklistItems');
  2. ChecklistItems.attachSchema(new SimpleSchema({
  3. title: {
  4. type: String,
  5. },
  6. sort: {
  7. type: Number,
  8. decimal: true,
  9. },
  10. isFinished: {
  11. type: Boolean,
  12. defaultValue: false,
  13. },
  14. checklistId: {
  15. type: String,
  16. },
  17. cardId: {
  18. type: String,
  19. },
  20. }));
  21. ChecklistItems.allow({
  22. insert(userId, doc) {
  23. return allowIsBoardMemberByCard(userId, Cards.findOne(doc.cardId));
  24. },
  25. update(userId, doc) {
  26. return allowIsBoardMemberByCard(userId, Cards.findOne(doc.cardId));
  27. },
  28. remove(userId, doc) {
  29. return allowIsBoardMemberByCard(userId, Cards.findOne(doc.cardId));
  30. },
  31. fetch: ['userId', 'cardId'],
  32. });
  33. ChecklistItems.before.insert((userId, doc) => {
  34. if (!doc.userId) {
  35. doc.userId = userId;
  36. }
  37. });
  38. // Mutations
  39. ChecklistItems.mutations({
  40. setTitle(title) {
  41. return { $set: { title } };
  42. },
  43. toggleItem() {
  44. return { $set: { isFinished: !this.isFinished } };
  45. },
  46. move(checklistId, sortIndex) {
  47. const cardId = Checklists.findOne(checklistId).cardId;
  48. const mutatedFields = {
  49. cardId,
  50. checklistId,
  51. sort: sortIndex,
  52. };
  53. return {$set: mutatedFields};
  54. },
  55. });
  56. // Activities helper
  57. function itemCreation(userId, doc) {
  58. const card = Cards.findOne(doc.cardId);
  59. const boardId = card.boardId;
  60. Activities.insert({
  61. userId,
  62. activityType: 'addChecklistItem',
  63. cardId: doc.cardId,
  64. boardId,
  65. checklistId: doc.checklistId,
  66. checklistItemId: doc._id,
  67. });
  68. }
  69. function itemRemover(userId, doc) {
  70. const card = Cards.findOne(doc.cardId);
  71. const boardId = card.boardId;
  72. Activities.insert({
  73. userId,
  74. activityType: 'removedChecklistItem',
  75. cardId: doc.cardId,
  76. boardId,
  77. checklistId: doc.checklistId,
  78. checklistItemId: doc._id,
  79. });
  80. Activities.remove({
  81. checklistItemId: doc._id,
  82. });
  83. }
  84. function publishCheckActivity(userId,doc){
  85. const card = Cards.findOne(doc.cardId);
  86. const boardId = card.boardId;
  87. let activityType;
  88. if(doc.isFinished){
  89. activityType = "checkedItem";
  90. }else{
  91. activityType = "uncheckedItem";
  92. }
  93. let act = {
  94. userId,
  95. activityType: activityType,
  96. cardId: doc.cardId,
  97. boardId,
  98. checklistId: doc.checklistId,
  99. checklistItemId: doc._id,
  100. }
  101. console.log(act);
  102. Activities.insert(act);
  103. }
  104. function publishChekListCompleted(userId,doc,fieldNames,modifier){
  105. const card = Cards.findOne(doc.cardId);
  106. const boardId = card.boardId;
  107. const checklistId = doc.checklistId;
  108. const checkList = Checklists.findOne({_id:checklistId});
  109. if(checkList.isFinished()){
  110. let act = {
  111. userId,
  112. activityType: "checklistCompleted",
  113. cardId: doc.cardId,
  114. boardId,
  115. checklistId: doc.checklistId,
  116. }
  117. Activities.insert(act);
  118. }
  119. }
  120. function publishChekListUncompleted(userId,doc,fieldNames,modifier){
  121. const card = Cards.findOne(doc.cardId);
  122. const boardId = card.boardId;
  123. const checklistId = doc.checklistId;
  124. const checkList = Checklists.findOne({_id:checklistId});
  125. if(checkList.isFinished()){
  126. let act = {
  127. userId,
  128. activityType: "checklistUncompleted",
  129. cardId: doc.cardId,
  130. boardId,
  131. checklistId: doc.checklistId,
  132. }
  133. Activities.insert(act);
  134. }
  135. }
  136. // Activities
  137. if (Meteor.isServer) {
  138. Meteor.startup(() => {
  139. ChecklistItems._collection._ensureIndex({ checklistId: 1 });
  140. });
  141. ChecklistItems.after.update((userId, doc, fieldNames, modifier) => {
  142. publishCheckActivity(userId,doc);
  143. publishChekListCompleted(userId,doc,fieldNames,modifier)
  144. });
  145. ChecklistItems.before.update((userId, doc, fieldNames, modifier) => {
  146. publishChekListUncompleted(userId,doc,fieldNames,modifier)
  147. });
  148. ChecklistItems.after.insert((userId, doc) => {
  149. itemCreation(userId, doc);
  150. });
  151. ChecklistItems.after.remove((userId, doc) => {
  152. itemRemover(userId, doc);
  153. });
  154. }
  155. if (Meteor.isServer) {
  156. JsonRoutes.add('GET', '/api/boards/:boardId/cards/:cardId/checklists/:checklistId/items/:itemId', function (req, res) {
  157. Authentication.checkUserId( req.userId);
  158. const paramItemId = req.params.itemId;
  159. const checklistItem = ChecklistItems.findOne({ _id: paramItemId });
  160. if (checklistItem) {
  161. JsonRoutes.sendResult(res, {
  162. code: 200,
  163. data: checklistItem,
  164. });
  165. } else {
  166. JsonRoutes.sendResult(res, {
  167. code: 500,
  168. });
  169. }
  170. });
  171. JsonRoutes.add('PUT', '/api/boards/:boardId/cards/:cardId/checklists/:checklistId/items/:itemId', function (req, res) {
  172. Authentication.checkUserId( req.userId);
  173. const paramItemId = req.params.itemId;
  174. if (req.body.hasOwnProperty('isFinished')) {
  175. ChecklistItems.direct.update({_id: paramItemId}, {$set: {isFinished: req.body.isFinished}});
  176. }
  177. if (req.body.hasOwnProperty('title')) {
  178. ChecklistItems.direct.update({_id: paramItemId}, {$set: {title: req.body.title}});
  179. }
  180. JsonRoutes.sendResult(res, {
  181. code: 200,
  182. data: {
  183. _id: paramItemId,
  184. },
  185. });
  186. });
  187. JsonRoutes.add('DELETE', '/api/boards/:boardId/cards/:cardId/checklists/:checklistId/items/:itemId', function (req, res) {
  188. Authentication.checkUserId( req.userId);
  189. const paramItemId = req.params.itemId;
  190. ChecklistItems.direct.remove({ _id: paramItemId });
  191. JsonRoutes.sendResult(res, {
  192. code: 200,
  193. data: {
  194. _id: paramItemId,
  195. },
  196. });
  197. });
  198. }