Integrations = new Mongo . Collection ( 'integrations' ) ;
Integrations . attachSchema ( new SimpleSchema ( {
enabled : {
type : Boolean ,
defaultValue : true ,
} ,
title : {
type : String ,
optional : true ,
} ,
type : {
type : String ,
defaultValue : 'outgoing-webhooks' ,
} ,
activities : {
type : [ String ] ,
defaultValue : [ 'all' ] ,
} ,
url : { // URL validation regex (https://mathiasbynens.be/demo/url-regex)
type : String ,
} ,
token : {
type : String ,
optional : true ,
} ,
boardId : {
type : String ,
} ,
createdAt : {
type : Date ,
denyUpdate : false ,
autoValue ( ) { // eslint-disable-line consistent-return
if ( this . isInsert ) {
return new Date ( ) ;
} else {
this . unset ( ) ;
}
} ,
} ,
userId : {
type : String ,
} ,
} ) ) ;
Integrations . allow ( {
insert ( userId , doc ) {
return allowIsBoardAdmin ( userId , Boards . findOne ( doc . boardId ) ) ;
} ,
update ( userId , doc ) {
return allowIsBoardAdmin ( userId , Boards . findOne ( doc . boardId ) ) ;
} ,
remove ( userId , doc ) {
return allowIsBoardAdmin ( userId , Boards . findOne ( doc . boardId ) ) ;
} ,
fetch : [ 'boardId' ] ,
} ) ;
//INTEGRATIONS REST API
if ( Meteor . isServer ) {
// Get all integrations in board
JsonRoutes . add ( 'GET' , '/api/boards/:boardId/integrations' , function ( req , res ) {
try {
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 } ) ;
}
catch ( error ) {
JsonRoutes . sendResult ( res , {
code : 200 ,
data : error ,
} ) ;
}
} ) ;
// Get a single integration in board
JsonRoutes . add ( 'GET' , '/api/boards/:boardId/integrations/:intId' , function ( req , res ) {
try {
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 } } ) ,
} ) ;
}
catch ( error ) {
JsonRoutes . sendResult ( res , {
code : 200 ,
data : error ,
} ) ;
}
} ) ;
// Create a new integration
JsonRoutes . add ( 'POST' , '/api/boards/:boardId/integrations' , function ( req , res ) {
try {
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 ,
} ,
} ) ;
}
catch ( error ) {
JsonRoutes . sendResult ( res , {
code : 200 ,
data : error ,
} ) ;
}
} ) ;
// Edit integration data
JsonRoutes . add ( 'PUT' , '/api/boards/:boardId/integrations/:intId' , function ( req , res ) {
try {
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 ,
} ,
} ) ;
}
catch ( error ) {
JsonRoutes . sendResult ( res , {
code : 200 ,
data : error ,
} ) ;
}
} ) ;
// Delete subscribed activities
JsonRoutes . add ( 'DELETE' , '/api/boards/:boardId/integrations/:intId/activities' , function ( req , res ) {
try {
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 } } ) ,
} ) ;
}
catch ( error ) {
JsonRoutes . sendResult ( res , {
code : 200 ,
data : error ,
} ) ;
}
} ) ;
// Add subscribed activities
JsonRoutes . add ( 'POST' , '/api/boards/:boardId/integrations/:intId/activities' , function ( req , res ) {
try {
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 } } ) ,
} ) ;
}
catch ( error ) {
JsonRoutes . sendResult ( res , {
code : 200 ,
data : error ,
} ) ;
}
} ) ;
// Delete integration
JsonRoutes . add ( 'DELETE' , '/api/boards/:boardId/integrations/:intId' , function ( req , res ) {
try {
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 ,
} ,
} ) ;
}
catch ( error ) {
JsonRoutes . sendResult ( res , {
code : 200 ,
data : error ,
} ) ;
}
} ) ;
}