summaryrefslogtreecommitdiffstats
path: root/models/integrations.js
diff options
context:
space:
mode:
authorAndrés Manelli <andresmanelli@gmail.com>2017-08-29 14:41:11 -0300
committerAndrés Manelli <andresmanelli@gmail.com>2017-08-30 00:56:09 -0300
commitf566022aa4cdddf20dd040c8fdc42b83f2cc340e (patch)
tree9ccbb322cc9c32f988071cddaa89e6f803987000 /models/integrations.js
parentddc21046b9385ac5ce5bbb9a773484fcd056d10c (diff)
downloadwekan-f566022aa4cdddf20dd040c8fdc42b83f2cc340e.tar.gz
wekan-f566022aa4cdddf20dd040c8fdc42b83f2cc340e.tar.bz2
wekan-f566022aa4cdddf20dd040c8fdc42b83f2cc340e.zip
Add activity subscription to integrations. Add API for integrations. Allow multiple integrations per board
Diffstat (limited to 'models/integrations.js')
-rw-r--r--models/integrations.js143
1 files changed, 138 insertions, 5 deletions
diff --git a/models/integrations.js b/models/integrations.js
index b9bf248f..e9447f69 100644
--- a/models/integrations.js
+++ b/models/integrations.js
@@ -11,6 +11,11 @@ Integrations.attachSchema(new SimpleSchema({
},
type: {
type: String,
+ defaultValue: 'outgoing-webhooks',
+ },
+ activities: {
+ type: [String],
+ defaultValue: ['all'],
},
url: { // URL validation regex (https://mathiasbynens.be/demo/url-regex)
type: String,
@@ -35,11 +40,6 @@ Integrations.attachSchema(new SimpleSchema({
},
userId: {
type: String,
- autoValue() { // eslint-disable-line consistent-return
- if (this.isInsert || this.isUpdate) {
- return this.userId;
- }
- },
},
}));
@@ -52,3 +52,136 @@ Integrations.allow({
},
fetch: ['boardId'],
});
+
+//INTEGRATIONS REST API
+if (Meteor.isServer) {
+ // Get all integrations in board
+ JsonRoutes.add('GET', '/api/boards/:boardId/integrations', function(req, res, next) {
+ const paramBoardId = req.params.boardId;
+ Authentication.checkBoardAccess(req.userId, paramBoardId);
+
+ const data = Integrations.find({ boardId: paramBoardId }, { fields: { token: 0 } }).map(function(doc) {
+ return doc;
+ });
+
+ JsonRoutes.sendResult(res, {code: 200, data});
+ });
+
+ // Get a single integration in board
+ JsonRoutes.add('GET', '/api/boards/:boardId/integrations/:intId', function(req, res, next) {
+ const paramBoardId = req.params.boardId;
+ const paramIntId = req.params.intId;
+ Authentication.checkBoardAccess(req.userId, paramBoardId);
+
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: Integrations.findOne({ _id: paramIntId, boardId: paramBoardId }, { fields: { token: 0 } }),
+ });
+ });
+
+ // Create a new integration
+ JsonRoutes.add('POST', '/api/boards/:boardId/integrations', function(req, res, next) {
+ const paramBoardId = req.params.boardId;
+ Authentication.checkBoardAccess(req.userId, paramBoardId);
+
+ const id = Integrations.insert({
+ userId: req.userId,
+ boardId: paramBoardId,
+ url: req.body.url,
+ });
+
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: {
+ _id: id,
+ },
+ });
+ });
+
+ // Edit integration data
+ JsonRoutes.add('PUT', '/api/boards/:boardId/integrations/:intId', function (req, res, next) {
+ const paramBoardId = req.params.boardId;
+ const paramIntId = req.params.intId;
+ Authentication.checkBoardAccess(req.userId, paramBoardId);
+
+ if (req.body.hasOwnProperty('enabled')) {
+ const newEnabled = req.body.enabled;
+ Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
+ {$set: {enabled: newEnabled}});
+ }
+ if (req.body.hasOwnProperty('title')) {
+ const newTitle = req.body.title;
+ Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
+ {$set: {title: newTitle}});
+ }
+ if (req.body.hasOwnProperty('url')) {
+ const newUrl = req.body.url;
+ Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
+ {$set: {url: newUrl}});
+ }
+ if (req.body.hasOwnProperty('token')) {
+ const newToken = req.body.token;
+ Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
+ {$set: {token: newToken}});
+ }
+ if (req.body.hasOwnProperty('activities')) {
+ const newActivities = req.body.activities;
+ Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
+ {$set: {activities: newActivities}});
+ }
+
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: {
+ _id: paramIntId,
+ },
+ });
+ });
+
+ // Delete subscribed activities
+ JsonRoutes.add('DELETE', '/api/boards/:boardId/integrations/:intId/activities', function (req, res, next) {
+ const paramBoardId = req.params.boardId;
+ const paramIntId = req.params.intId;
+ const newActivities = req.body.activities;
+ Authentication.checkBoardAccess(req.userId, paramBoardId);
+
+ Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
+ {$pullAll: {activities: newActivities}});
+
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: Integrations.findOne({_id: paramIntId, boardId: paramBoardId}, { fields: {_id: 1, activities: 1}}),
+ });
+ });
+
+ // Add subscribed activities
+ JsonRoutes.add('POST', '/api/boards/:boardId/integrations/:intId/activities', function (req, res, next) {
+ const paramBoardId = req.params.boardId;
+ const paramIntId = req.params.intId;
+ const newActivities = req.body.activities;
+ Authentication.checkBoardAccess(req.userId, paramBoardId);
+
+ Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
+ {$addToSet: {activities: { $each: newActivities}}});
+
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: Integrations.findOne({_id: paramIntId, boardId: paramBoardId}, { fields: {_id: 1, activities: 1}}),
+ });
+ });
+
+ // Delete integration
+ JsonRoutes.add('DELETE', '/api/boards/:boardId/integrations/:intId', function (req, res, next) {
+ const paramBoardId = req.params.boardId;
+ const paramIntId = req.params.intId;
+ Authentication.checkBoardAccess(req.userId, paramBoardId);
+
+ Integrations.direct.remove({_id: paramIntId, boardId: paramBoardId});
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: {
+ _id: paramIntId,
+ },
+ });
+ });
+}