checklists.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. Checklists = new Mongo.Collection('checklists');
  2. Checklists.attachSchema(new SimpleSchema({
  3. cardId: {
  4. type: String,
  5. },
  6. title: {
  7. type: String,
  8. defaultValue: 'Checklist',
  9. optional: true,
  10. },
  11. finishedAt: {
  12. type: Date,
  13. optional: true,
  14. },
  15. createdAt: {
  16. type: Date,
  17. denyUpdate: false,
  18. autoValue() { // eslint-disable-line consistent-return
  19. if (this.isInsert) {
  20. return new Date();
  21. } else {
  22. this.unset();
  23. }
  24. },
  25. },
  26. sort: {
  27. type: Number,
  28. decimal: true,
  29. },
  30. }));
  31. Checklists.helpers({
  32. itemCount() {
  33. return ChecklistItems.find({ checklistId: this._id }).count();
  34. },
  35. items() {
  36. return ChecklistItems.find({
  37. checklistId: this._id,
  38. }, { sort: ['sort'] });
  39. },
  40. finishedCount() {
  41. return ChecklistItems.find({
  42. checklistId: this._id,
  43. isFinished: true,
  44. }).count();
  45. },
  46. isFinished() {
  47. return 0 !== this.itemCount() && this.itemCount() === this.finishedCount();
  48. },
  49. itemIndex(itemId) {
  50. const items = self.findOne({_id : this._id}).items;
  51. return _.pluck(items, '_id').indexOf(itemId);
  52. },
  53. });
  54. Checklists.allow({
  55. insert(userId, doc) {
  56. return allowIsBoardMemberByCard(userId, Cards.findOne(doc.cardId));
  57. },
  58. update(userId, doc) {
  59. return allowIsBoardMemberByCard(userId, Cards.findOne(doc.cardId));
  60. },
  61. remove(userId, doc) {
  62. return allowIsBoardMemberByCard(userId, Cards.findOne(doc.cardId));
  63. },
  64. fetch: ['userId', 'cardId'],
  65. });
  66. Checklists.before.insert((userId, doc) => {
  67. doc.createdAt = new Date();
  68. if (!doc.userId) {
  69. doc.userId = userId;
  70. }
  71. });
  72. Checklists.mutations({
  73. setTitle(title) {
  74. return { $set: { title } };
  75. },
  76. });
  77. if (Meteor.isServer) {
  78. Meteor.startup(() => {
  79. Checklists._collection._ensureIndex({ cardId: 1, createdAt: 1 });
  80. });
  81. Checklists.after.insert((userId, doc) => {
  82. Activities.insert({
  83. userId,
  84. activityType: 'addChecklist',
  85. cardId: doc.cardId,
  86. boardId: Cards.findOne(doc.cardId).boardId,
  87. checklistId: doc._id,
  88. });
  89. });
  90. Checklists.before.remove((userId, doc) => {
  91. const activities = Activities.find({ checklistId: doc._id });
  92. if (activities) {
  93. activities.forEach((activity) => {
  94. Activities.remove(activity._id);
  95. });
  96. }
  97. });
  98. }
  99. if (Meteor.isServer) {
  100. JsonRoutes.add('GET', '/api/boards/:boardId/cards/:cardId/checklists', function (req, res) {
  101. Authentication.checkUserId( req.userId);
  102. const paramCardId = req.params.cardId;
  103. const checklists = Checklists.find({ cardId: paramCardId }).map(function (doc) {
  104. return {
  105. _id: doc._id,
  106. title: doc.title,
  107. };
  108. });
  109. if (checklists) {
  110. JsonRoutes.sendResult(res, {
  111. code: 200,
  112. data: checklists,
  113. });
  114. } else {
  115. JsonRoutes.sendResult(res, {
  116. code: 500,
  117. });
  118. }
  119. });
  120. JsonRoutes.add('GET', '/api/boards/:boardId/cards/:cardId/checklists/:checklistId', function (req, res) {
  121. Authentication.checkUserId( req.userId);
  122. const paramChecklistId = req.params.checklistId;
  123. const paramCardId = req.params.cardId;
  124. const checklist = Checklists.findOne({ _id: paramChecklistId, cardId: paramCardId });
  125. if (checklist) {
  126. checklist.items = ChecklistItems.find({checklistId: checklist._id}).map(function (doc) {
  127. return {
  128. _id: doc._id,
  129. title: doc.title,
  130. isFinished: doc.isFinished,
  131. };
  132. });
  133. JsonRoutes.sendResult(res, {
  134. code: 200,
  135. data: checklist,
  136. });
  137. } else {
  138. JsonRoutes.sendResult(res, {
  139. code: 500,
  140. });
  141. }
  142. });
  143. JsonRoutes.add('POST', '/api/boards/:boardId/cards/:cardId/checklists', function (req, res) {
  144. Authentication.checkUserId( req.userId);
  145. const paramCardId = req.params.cardId;
  146. const id = Checklists.insert({
  147. title: req.body.title,
  148. cardId: paramCardId,
  149. sort: 0,
  150. });
  151. if (id) {
  152. req.body.items.forEach(function (item, idx) {
  153. ChecklistItems.insert({
  154. cardId: paramCardId,
  155. checklistId: id,
  156. title: item.title,
  157. sort: idx,
  158. });
  159. });
  160. JsonRoutes.sendResult(res, {
  161. code: 200,
  162. data: {
  163. _id: id,
  164. },
  165. });
  166. } else {
  167. JsonRoutes.sendResult(res, {
  168. code: 400,
  169. });
  170. }
  171. });
  172. JsonRoutes.add('DELETE', '/api/boards/:boardId/cards/:cardId/checklists/:checklistId', function (req, res) {
  173. Authentication.checkUserId( req.userId);
  174. const paramChecklistId = req.params.checklistId;
  175. Checklists.remove({ _id: paramChecklistId });
  176. JsonRoutes.sendResult(res, {
  177. code: 200,
  178. data: {
  179. _id: paramChecklistId,
  180. },
  181. });
  182. });
  183. }