subtasks.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. Subtasks = new Mongo.Collection('subtasks');
  2. Subtasks.attachSchema(new SimpleSchema({
  3. title: {
  4. type: String,
  5. },
  6. startAt: { // this is a predicted time
  7. type: Date,
  8. optional: true,
  9. },
  10. endAt: { // this is a predicted time
  11. type: Date,
  12. optional: true,
  13. },
  14. finishedAt: { // The date & time when it is marked as being done
  15. type: Date,
  16. optional: true,
  17. },
  18. createdAt: {
  19. type: Date,
  20. denyUpdate: false,
  21. autoValue() { // eslint-disable-line consistent-return
  22. if (this.isInsert) {
  23. return new Date();
  24. } else {
  25. this.unset();
  26. }
  27. },
  28. },
  29. sort: {
  30. type: Number,
  31. decimal: true,
  32. },
  33. isFinished: {
  34. type: Boolean,
  35. defaultValue: false,
  36. },
  37. cardId: {
  38. type: String,
  39. },
  40. }));
  41. Subtasks.helpers({
  42. // ...
  43. });
  44. Subtasks.allow({
  45. insert(userId, doc) {
  46. return allowIsBoardMemberByCard(userId, Cards.findOne(doc.cardId));
  47. },
  48. update(userId, doc) {
  49. return allowIsBoardMemberByCard(userId, Cards.findOne(doc.cardId));
  50. },
  51. remove(userId, doc) {
  52. return allowIsBoardMemberByCard(userId, Cards.findOne(doc.cardId));
  53. },
  54. fetch: ['userId', 'cardId'],
  55. });
  56. Subtasks.before.insert((userId, doc) => {
  57. doc.createdAt = new Date();
  58. if (!doc.userId) {
  59. doc.userId = userId;
  60. }
  61. });
  62. // Mutations
  63. Subtasks.mutations({
  64. setTitle(title) {
  65. return { $set: { title } };
  66. },
  67. toggleItem() {
  68. return { $set: { isFinished: !this.isFinished } };
  69. },
  70. move(sortIndex) {
  71. const mutatedFields = {
  72. sort: sortIndex,
  73. };
  74. return {$set: mutatedFields};
  75. },
  76. });
  77. // Activities helper
  78. function itemCreation(userId, doc) {
  79. const card = Cards.findOne(doc.cardId);
  80. const boardId = card.boardId;
  81. Activities.insert({
  82. userId,
  83. activityType: 'addSubtaskItem',
  84. cardId: doc.cardId,
  85. boardId,
  86. subtaskItemId: doc._id,
  87. });
  88. }
  89. function itemRemover(userId, doc) {
  90. Activities.remove({
  91. subtaskItemId: doc._id,
  92. });
  93. }
  94. // Activities
  95. if (Meteor.isServer) {
  96. Meteor.startup(() => {
  97. Subtasks._collection._ensureIndex({ cardId: 1 });
  98. });
  99. Subtasks.after.insert((userId, doc) => {
  100. itemCreation(userId, doc);
  101. });
  102. Subtasks.after.remove((userId, doc) => {
  103. itemRemover(userId, doc);
  104. });
  105. }
  106. // APIs
  107. if (Meteor.isServer) {
  108. JsonRoutes.add('GET', '/api/boards/:boardId/cards/:cardId/subtasks/:itemId', function (req, res) {
  109. Authentication.checkUserId( req.userId);
  110. const paramItemId = req.params.itemId;
  111. const subtaskItem = Subtasks.findOne({ _id: paramItemId });
  112. if (subtaskItem) {
  113. JsonRoutes.sendResult(res, {
  114. code: 200,
  115. data: subtaskItem,
  116. });
  117. } else {
  118. JsonRoutes.sendResult(res, {
  119. code: 500,
  120. });
  121. }
  122. });
  123. JsonRoutes.add('PUT', '/api/boards/:boardId/cards/:cardId/subtasks/:itemId', function (req, res) {
  124. Authentication.checkUserId( req.userId);
  125. const paramItemId = req.params.itemId;
  126. if (req.body.hasOwnProperty('isFinished')) {
  127. Subtasks.direct.update({_id: paramItemId}, {$set: {isFinished: req.body.isFinished}});
  128. }
  129. if (req.body.hasOwnProperty('title')) {
  130. Subtasks.direct.update({_id: paramItemId}, {$set: {title: req.body.title}});
  131. }
  132. JsonRoutes.sendResult(res, {
  133. code: 200,
  134. data: {
  135. _id: paramItemId,
  136. },
  137. });
  138. });
  139. JsonRoutes.add('DELETE', '/api/boards/:boardId/cards/:cardId/subtasks/:itemId', function (req, res) {
  140. Authentication.checkUserId( req.userId);
  141. const paramItemId = req.params.itemId;
  142. Subtasks.direct.remove({ _id: paramItemId });
  143. JsonRoutes.sendResult(res, {
  144. code: 200,
  145. data: {
  146. _id: paramItemId,
  147. },
  148. });
  149. });
  150. }