integrations.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  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. remove(userId, doc) {
  52. return allowIsBoardAdmin(userId, Boards.findOne(doc.boardId));
  53. },
  54. fetch: ['boardId'],
  55. });
  56. //INTEGRATIONS REST API
  57. if (Meteor.isServer) {
  58. // Get all integrations in board
  59. JsonRoutes.add('GET', '/api/boards/:boardId/integrations', function(req, res, next) {
  60. const paramBoardId = req.params.boardId;
  61. Authentication.checkBoardAccess(req.userId, paramBoardId);
  62. const data = Integrations.find({ boardId: paramBoardId }, { fields: { token: 0 } }).map(function(doc) {
  63. return doc;
  64. });
  65. JsonRoutes.sendResult(res, {code: 200, data});
  66. });
  67. // Get a single integration in board
  68. JsonRoutes.add('GET', '/api/boards/:boardId/integrations/:intId', function(req, res, next) {
  69. const paramBoardId = req.params.boardId;
  70. const paramIntId = req.params.intId;
  71. Authentication.checkBoardAccess(req.userId, paramBoardId);
  72. JsonRoutes.sendResult(res, {
  73. code: 200,
  74. data: Integrations.findOne({ _id: paramIntId, boardId: paramBoardId }, { fields: { token: 0 } }),
  75. });
  76. });
  77. // Create a new integration
  78. JsonRoutes.add('POST', '/api/boards/:boardId/integrations', function(req, res, next) {
  79. const paramBoardId = req.params.boardId;
  80. Authentication.checkBoardAccess(req.userId, paramBoardId);
  81. const id = Integrations.insert({
  82. userId: req.userId,
  83. boardId: paramBoardId,
  84. url: req.body.url,
  85. });
  86. JsonRoutes.sendResult(res, {
  87. code: 200,
  88. data: {
  89. _id: id,
  90. },
  91. });
  92. });
  93. // Edit integration data
  94. JsonRoutes.add('PUT', '/api/boards/:boardId/integrations/:intId', function (req, res, next) {
  95. const paramBoardId = req.params.boardId;
  96. const paramIntId = req.params.intId;
  97. Authentication.checkBoardAccess(req.userId, paramBoardId);
  98. if (req.body.hasOwnProperty('enabled')) {
  99. const newEnabled = req.body.enabled;
  100. Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
  101. {$set: {enabled: newEnabled}});
  102. }
  103. if (req.body.hasOwnProperty('title')) {
  104. const newTitle = req.body.title;
  105. Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
  106. {$set: {title: newTitle}});
  107. }
  108. if (req.body.hasOwnProperty('url')) {
  109. const newUrl = req.body.url;
  110. Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
  111. {$set: {url: newUrl}});
  112. }
  113. if (req.body.hasOwnProperty('token')) {
  114. const newToken = req.body.token;
  115. Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
  116. {$set: {token: newToken}});
  117. }
  118. if (req.body.hasOwnProperty('activities')) {
  119. const newActivities = req.body.activities;
  120. Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
  121. {$set: {activities: newActivities}});
  122. }
  123. JsonRoutes.sendResult(res, {
  124. code: 200,
  125. data: {
  126. _id: paramIntId,
  127. },
  128. });
  129. });
  130. // Delete subscribed activities
  131. JsonRoutes.add('DELETE', '/api/boards/:boardId/integrations/:intId/activities', function (req, res, next) {
  132. const paramBoardId = req.params.boardId;
  133. const paramIntId = req.params.intId;
  134. const newActivities = req.body.activities;
  135. Authentication.checkBoardAccess(req.userId, paramBoardId);
  136. Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
  137. {$pullAll: {activities: newActivities}});
  138. JsonRoutes.sendResult(res, {
  139. code: 200,
  140. data: Integrations.findOne({_id: paramIntId, boardId: paramBoardId}, { fields: {_id: 1, activities: 1}}),
  141. });
  142. });
  143. // Add subscribed activities
  144. JsonRoutes.add('POST', '/api/boards/:boardId/integrations/:intId/activities', function (req, res, next) {
  145. const paramBoardId = req.params.boardId;
  146. const paramIntId = req.params.intId;
  147. const newActivities = req.body.activities;
  148. Authentication.checkBoardAccess(req.userId, paramBoardId);
  149. Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
  150. {$addToSet: {activities: { $each: newActivities}}});
  151. JsonRoutes.sendResult(res, {
  152. code: 200,
  153. data: Integrations.findOne({_id: paramIntId, boardId: paramBoardId}, { fields: {_id: 1, activities: 1}}),
  154. });
  155. });
  156. // Delete integration
  157. JsonRoutes.add('DELETE', '/api/boards/:boardId/integrations/:intId', function (req, res, next) {
  158. const paramBoardId = req.params.boardId;
  159. const paramIntId = req.params.intId;
  160. Authentication.checkBoardAccess(req.userId, paramBoardId);
  161. Integrations.direct.remove({_id: paramIntId, boardId: paramBoardId});
  162. JsonRoutes.sendResult(res, {
  163. code: 200,
  164. data: {
  165. _id: paramIntId,
  166. },
  167. });
  168. });
  169. }