integrations.js 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  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) {
  60. try {
  61. const paramBoardId = req.params.boardId;
  62. Authentication.checkBoardAccess(req.userId, paramBoardId);
  63. const data = Integrations.find({ boardId: paramBoardId }, { fields: { token: 0 } }).map(function(doc) {
  64. return doc;
  65. });
  66. JsonRoutes.sendResult(res, {code: 200, data});
  67. }
  68. catch (error) {
  69. JsonRoutes.sendResult(res, {
  70. code: 200,
  71. data: error,
  72. });
  73. }
  74. });
  75. // Get a single integration in board
  76. JsonRoutes.add('GET', '/api/boards/:boardId/integrations/:intId', function(req, res) {
  77. try {
  78. const paramBoardId = req.params.boardId;
  79. const paramIntId = req.params.intId;
  80. Authentication.checkBoardAccess(req.userId, paramBoardId);
  81. JsonRoutes.sendResult(res, {
  82. code: 200,
  83. data: Integrations.findOne({ _id: paramIntId, boardId: paramBoardId }, { fields: { token: 0 } }),
  84. });
  85. }
  86. catch (error) {
  87. JsonRoutes.sendResult(res, {
  88. code: 200,
  89. data: error,
  90. });
  91. }
  92. });
  93. // Create a new integration
  94. JsonRoutes.add('POST', '/api/boards/:boardId/integrations', function(req, res) {
  95. try {
  96. const paramBoardId = req.params.boardId;
  97. Authentication.checkBoardAccess(req.userId, paramBoardId);
  98. const id = Integrations.insert({
  99. userId: req.userId,
  100. boardId: paramBoardId,
  101. url: req.body.url,
  102. });
  103. JsonRoutes.sendResult(res, {
  104. code: 200,
  105. data: {
  106. _id: id,
  107. },
  108. });
  109. }
  110. catch (error) {
  111. JsonRoutes.sendResult(res, {
  112. code: 200,
  113. data: error,
  114. });
  115. }
  116. });
  117. // Edit integration data
  118. JsonRoutes.add('PUT', '/api/boards/:boardId/integrations/:intId', function (req, res) {
  119. try {
  120. const paramBoardId = req.params.boardId;
  121. const paramIntId = req.params.intId;
  122. Authentication.checkBoardAccess(req.userId, paramBoardId);
  123. if (req.body.hasOwnProperty('enabled')) {
  124. const newEnabled = req.body.enabled;
  125. Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
  126. {$set: {enabled: newEnabled}});
  127. }
  128. if (req.body.hasOwnProperty('title')) {
  129. const newTitle = req.body.title;
  130. Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
  131. {$set: {title: newTitle}});
  132. }
  133. if (req.body.hasOwnProperty('url')) {
  134. const newUrl = req.body.url;
  135. Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
  136. {$set: {url: newUrl}});
  137. }
  138. if (req.body.hasOwnProperty('token')) {
  139. const newToken = req.body.token;
  140. Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
  141. {$set: {token: newToken}});
  142. }
  143. if (req.body.hasOwnProperty('activities')) {
  144. const newActivities = req.body.activities;
  145. Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
  146. {$set: {activities: newActivities}});
  147. }
  148. JsonRoutes.sendResult(res, {
  149. code: 200,
  150. data: {
  151. _id: paramIntId,
  152. },
  153. });
  154. }
  155. catch (error) {
  156. JsonRoutes.sendResult(res, {
  157. code: 200,
  158. data: error,
  159. });
  160. }
  161. });
  162. // Delete subscribed activities
  163. JsonRoutes.add('DELETE', '/api/boards/:boardId/integrations/:intId/activities', function (req, res) {
  164. try {
  165. const paramBoardId = req.params.boardId;
  166. const paramIntId = req.params.intId;
  167. const newActivities = req.body.activities;
  168. Authentication.checkBoardAccess(req.userId, paramBoardId);
  169. Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
  170. {$pullAll: {activities: newActivities}});
  171. JsonRoutes.sendResult(res, {
  172. code: 200,
  173. data: Integrations.findOne({_id: paramIntId, boardId: paramBoardId}, { fields: {_id: 1, activities: 1}}),
  174. });
  175. }
  176. catch (error) {
  177. JsonRoutes.sendResult(res, {
  178. code: 200,
  179. data: error,
  180. });
  181. }
  182. });
  183. // Add subscribed activities
  184. JsonRoutes.add('POST', '/api/boards/:boardId/integrations/:intId/activities', function (req, res) {
  185. try {
  186. const paramBoardId = req.params.boardId;
  187. const paramIntId = req.params.intId;
  188. const newActivities = req.body.activities;
  189. Authentication.checkBoardAccess(req.userId, paramBoardId);
  190. Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
  191. {$addToSet: {activities: { $each: newActivities}}});
  192. JsonRoutes.sendResult(res, {
  193. code: 200,
  194. data: Integrations.findOne({_id: paramIntId, boardId: paramBoardId}, { fields: {_id: 1, activities: 1}}),
  195. });
  196. }
  197. catch (error) {
  198. JsonRoutes.sendResult(res, {
  199. code: 200,
  200. data: error,
  201. });
  202. }
  203. });
  204. // Delete integration
  205. JsonRoutes.add('DELETE', '/api/boards/:boardId/integrations/:intId', function (req, res) {
  206. try {
  207. const paramBoardId = req.params.boardId;
  208. const paramIntId = req.params.intId;
  209. Authentication.checkBoardAccess(req.userId, paramBoardId);
  210. Integrations.direct.remove({_id: paramIntId, boardId: paramBoardId});
  211. JsonRoutes.sendResult(res, {
  212. code: 200,
  213. data: {
  214. _id: paramIntId,
  215. },
  216. });
  217. }
  218. catch (error) {
  219. JsonRoutes.sendResult(res, {
  220. code: 200,
  221. data: error,
  222. });
  223. }
  224. });
  225. }