integrations.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. Integrations = new Mongo.Collection('integrations');
  2. Integrations.attachSchema(new SimpleSchema({
  3. enabled: {
  4. type: Boolean,
  5. defaultValue: true,
  6. },
  7. title: {
  8. type: String,
  9. optional: true,
  10. },
  11. type: {
  12. type: String,
  13. defaultValue: 'outgoing-webhooks',
  14. },
  15. activities: {
  16. type: [String],
  17. defaultValue: ['all'],
  18. },
  19. url: { // URL validation regex (https://mathiasbynens.be/demo/url-regex)
  20. type: String,
  21. },
  22. token: {
  23. type: String,
  24. optional: true,
  25. },
  26. boardId: {
  27. type: String,
  28. },
  29. createdAt: {
  30. type: Date,
  31. denyUpdate: false,
  32. autoValue() { // eslint-disable-line consistent-return
  33. if (this.isInsert) {
  34. return new Date();
  35. } else {
  36. this.unset();
  37. }
  38. },
  39. },
  40. userId: {
  41. type: String,
  42. },
  43. }));
  44. Integrations.allow({
  45. insert(userId, doc) {
  46. return allowIsBoardAdmin(userId, Boards.findOne(doc.boardId));
  47. },
  48. update(userId, doc) {
  49. return allowIsBoardAdmin(userId, Boards.findOne(doc.boardId));
  50. },
  51. fetch: ['boardId'],
  52. });
  53. //INTEGRATIONS REST API
  54. if (Meteor.isServer) {
  55. // Get all integrations in board
  56. JsonRoutes.add('GET', '/api/boards/:boardId/integrations', function(req, res, next) {
  57. const paramBoardId = req.params.boardId;
  58. Authentication.checkBoardAccess(req.userId, paramBoardId);
  59. const data = Integrations.find({ boardId: paramBoardId }, { fields: { token: 0 } }).map(function(doc) {
  60. return doc;
  61. });
  62. JsonRoutes.sendResult(res, {code: 200, data});
  63. });
  64. // Get a single integration in board
  65. JsonRoutes.add('GET', '/api/boards/:boardId/integrations/:intId', function(req, res, next) {
  66. const paramBoardId = req.params.boardId;
  67. const paramIntId = req.params.intId;
  68. Authentication.checkBoardAccess(req.userId, paramBoardId);
  69. JsonRoutes.sendResult(res, {
  70. code: 200,
  71. data: Integrations.findOne({ _id: paramIntId, boardId: paramBoardId }, { fields: { token: 0 } }),
  72. });
  73. });
  74. // Create a new integration
  75. JsonRoutes.add('POST', '/api/boards/:boardId/integrations', function(req, res, next) {
  76. const paramBoardId = req.params.boardId;
  77. Authentication.checkBoardAccess(req.userId, paramBoardId);
  78. const id = Integrations.insert({
  79. userId: req.userId,
  80. boardId: paramBoardId,
  81. url: req.body.url,
  82. });
  83. JsonRoutes.sendResult(res, {
  84. code: 200,
  85. data: {
  86. _id: id,
  87. },
  88. });
  89. });
  90. // Edit integration data
  91. JsonRoutes.add('PUT', '/api/boards/:boardId/integrations/:intId', function (req, res, next) {
  92. const paramBoardId = req.params.boardId;
  93. const paramIntId = req.params.intId;
  94. Authentication.checkBoardAccess(req.userId, paramBoardId);
  95. if (req.body.hasOwnProperty('enabled')) {
  96. const newEnabled = req.body.enabled;
  97. Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
  98. {$set: {enabled: newEnabled}});
  99. }
  100. if (req.body.hasOwnProperty('title')) {
  101. const newTitle = req.body.title;
  102. Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
  103. {$set: {title: newTitle}});
  104. }
  105. if (req.body.hasOwnProperty('url')) {
  106. const newUrl = req.body.url;
  107. Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
  108. {$set: {url: newUrl}});
  109. }
  110. if (req.body.hasOwnProperty('token')) {
  111. const newToken = req.body.token;
  112. Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
  113. {$set: {token: newToken}});
  114. }
  115. if (req.body.hasOwnProperty('activities')) {
  116. const newActivities = req.body.activities;
  117. Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
  118. {$set: {activities: newActivities}});
  119. }
  120. JsonRoutes.sendResult(res, {
  121. code: 200,
  122. data: {
  123. _id: paramIntId,
  124. },
  125. });
  126. });
  127. // Delete subscribed activities
  128. JsonRoutes.add('DELETE', '/api/boards/:boardId/integrations/:intId/activities', function (req, res, next) {
  129. const paramBoardId = req.params.boardId;
  130. const paramIntId = req.params.intId;
  131. const newActivities = req.body.activities;
  132. Authentication.checkBoardAccess(req.userId, paramBoardId);
  133. Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
  134. {$pullAll: {activities: newActivities}});
  135. JsonRoutes.sendResult(res, {
  136. code: 200,
  137. data: Integrations.findOne({_id: paramIntId, boardId: paramBoardId}, { fields: {_id: 1, activities: 1}}),
  138. });
  139. });
  140. // Add subscribed activities
  141. JsonRoutes.add('POST', '/api/boards/:boardId/integrations/:intId/activities', function (req, res, next) {
  142. const paramBoardId = req.params.boardId;
  143. const paramIntId = req.params.intId;
  144. const newActivities = req.body.activities;
  145. Authentication.checkBoardAccess(req.userId, paramBoardId);
  146. Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
  147. {$addToSet: {activities: { $each: newActivities}}});
  148. JsonRoutes.sendResult(res, {
  149. code: 200,
  150. data: Integrations.findOne({_id: paramIntId, boardId: paramBoardId}, { fields: {_id: 1, activities: 1}}),
  151. });
  152. });
  153. // Delete integration
  154. JsonRoutes.add('DELETE', '/api/boards/:boardId/integrations/:intId', function (req, res, next) {
  155. const paramBoardId = req.params.boardId;
  156. const paramIntId = req.params.intId;
  157. Authentication.checkBoardAccess(req.userId, paramBoardId);
  158. Integrations.direct.remove({_id: paramIntId, boardId: paramBoardId});
  159. JsonRoutes.sendResult(res, {
  160. code: 200,
  161. data: {
  162. _id: paramIntId,
  163. },
  164. });
  165. });
  166. }