subtasks.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. Subtasks = new Mongo.Collection('subtasks');
  2. Subtasks.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. cardId: {
  15. type: String,
  16. },
  17. }));
  18. Subtasks.allow({
  19. insert(userId, doc) {
  20. return allowIsBoardMemberByCard(userId, Cards.findOne(doc.cardId));
  21. },
  22. update(userId, doc) {
  23. return allowIsBoardMemberByCard(userId, Cards.findOne(doc.cardId));
  24. },
  25. remove(userId, doc) {
  26. return allowIsBoardMemberByCard(userId, Cards.findOne(doc.cardId));
  27. },
  28. fetch: ['userId', 'cardId'],
  29. });
  30. Subtasks.before.insert((userId, doc) => {
  31. if (!doc.userId) {
  32. doc.userId = userId;
  33. }
  34. });
  35. // Mutations
  36. Subtasks.mutations({
  37. setTitle(title) {
  38. return { $set: { title } };
  39. },
  40. toggleItem() {
  41. return { $set: { isFinished: !this.isFinished } };
  42. },
  43. move(sortIndex) {
  44. const mutatedFields = {
  45. sort: sortIndex,
  46. };
  47. return {$set: mutatedFields};
  48. },
  49. });
  50. // Activities helper
  51. function itemCreation(userId, doc) {
  52. const card = Cards.findOne(doc.cardId);
  53. const boardId = card.boardId;
  54. Activities.insert({
  55. userId,
  56. activityType: 'addSubtaskItem',
  57. cardId: doc.cardId,
  58. boardId,
  59. subtaskItemId: doc._id,
  60. });
  61. }
  62. function itemRemover(userId, doc) {
  63. Activities.remove({
  64. subtaskItemId: doc._id,
  65. });
  66. }
  67. // Activities
  68. if (Meteor.isServer) {
  69. Meteor.startup(() => {
  70. Subtasks._collection._ensureIndex({ cardId: 1 });
  71. });
  72. Subtasks.after.insert((userId, doc) => {
  73. itemCreation(userId, doc);
  74. });
  75. Subtasks.after.remove((userId, doc) => {
  76. itemRemover(userId, doc);
  77. });
  78. }
  79. // APIs
  80. if (Meteor.isServer) {
  81. JsonRoutes.add('GET', '/api/boards/:boardId/cards/:cardId/subtasks/:itemId', function (req, res) {
  82. Authentication.checkUserId( req.userId);
  83. const paramItemId = req.params.itemId;
  84. const subtaskItem = Subtasks.findOne({ _id: paramItemId });
  85. if (subtaskItem) {
  86. JsonRoutes.sendResult(res, {
  87. code: 200,
  88. data: subtaskItem,
  89. });
  90. } else {
  91. JsonRoutes.sendResult(res, {
  92. code: 500,
  93. });
  94. }
  95. });
  96. JsonRoutes.add('PUT', '/api/boards/:boardId/cards/:cardId/subtasks/:itemId', function (req, res) {
  97. Authentication.checkUserId( req.userId);
  98. const paramItemId = req.params.itemId;
  99. if (req.body.hasOwnProperty('isFinished')) {
  100. Subtasks.direct.update({_id: paramItemId}, {$set: {isFinished: req.body.isFinished}});
  101. }
  102. if (req.body.hasOwnProperty('title')) {
  103. Subtasks.direct.update({_id: paramItemId}, {$set: {title: req.body.title}});
  104. }
  105. JsonRoutes.sendResult(res, {
  106. code: 200,
  107. data: {
  108. _id: paramItemId,
  109. },
  110. });
  111. });
  112. JsonRoutes.add('DELETE', '/api/boards/:boardId/cards/:cardId/subtasks/:itemId', function (req, res) {
  113. Authentication.checkUserId( req.userId);
  114. const paramItemId = req.params.itemId;
  115. Subtasks.direct.remove({ _id: paramItemId });
  116. JsonRoutes.sendResult(res, {
  117. code: 200,
  118. data: {
  119. _id: paramItemId,
  120. },
  121. });
  122. });
  123. }