diff --git a/routes/middlewares/RepositoryFilter.js b/routes/middlewares/RepositoryFilter.js index c662bb6..4a2ddcc 100755 --- a/routes/middlewares/RepositoryFilter.js +++ b/routes/middlewares/RepositoryFilter.js @@ -22,15 +22,6 @@ module.exports = (provider) => async (req, res, next) => { } else if (provider === 'gitlab') { const repo = req.body.project || {}; repoNames = [repo.homepage, repo.http_url, repo.url, repo.ssh_url, repo.web_url]; - } else if (provider === 'azure') { - const projectId = req.body.resourceContainers.project.id; - const projects = await dbHelper.scan(Project, { - repoId: projectId, - archived: 'false' - }); - if (projects && projects.length > 0) { - return next(); - } } const projects = await dbHelper.scan(Project, { archived: 'false' diff --git a/routes/middlewares/SecurityChecker.js b/routes/middlewares/SecurityChecker.js index 8a744aa..93fad31 100755 --- a/routes/middlewares/SecurityChecker.js +++ b/routes/middlewares/SecurityChecker.js @@ -36,17 +36,6 @@ module.exports = (provider) => async (req, res, next) => { isValid = true; } }); - } else if (provider === 'azure') { - const projectId = req.body.resourceContainers.project.id; - const project = await dbHelper.scanOne(Project, { - repoId: projectId - }); - const buff = Buffer.from(req.headers.authorization.split(' ')[1], 'base64'); // Ta-da - const authorization = buff.toString('utf-8'); - const pwd = authorization.split(':')[1]; - if (pwd === project.secretWebhookKey) { - isValid = true; - } } else { // unknown provider return next(); diff --git a/routes/webhooks.js b/routes/webhooks.js index 37c741c..ca5cd9b 100755 --- a/routes/webhooks.js +++ b/routes/webhooks.js @@ -14,7 +14,6 @@ const logger = require('../utils/logger'); const kafka = require('../utils/kafka'); const GithubEventDetector = require('../utils/GithubEventDetector'); const GitlabEventDetector = require('../utils/GitlabEventDetector'); -const AzureEventDetector = require('../utils/AzureEventDetector'); const RepositoryFilter = require('./middlewares/RepositoryFilter'); const SecurityChecker = require('./middlewares/SecurityChecker'); @@ -48,19 +47,4 @@ router.post('/gitlab', SecurityChecker('gitlab'), RepositoryFilter('gitlab'), wr res.json({success: true}); })); -router.post('/azure', SecurityChecker('azure'), RepositoryFilter('azure'), wrapper(async (req, res) => { - const result = AzureEventDetector.detectMany(req.body); - if (!result || result.length === 0) { - logger.info('unknown event detected'); - logger.debug(req.body); - } else { - for (const event of result) { // eslint-disable-line no-restricted-syntax - await kafka.send(JSON.stringify(event)); - logger.info(`successfully add event: ${event.event} to kafka queue`); - logger.debug(`kafka message: ${JSON.stringify(event)}`); - } - } - res.json({success: true}); -})); - module.exports = router; diff --git a/utils/AzureEventDetector.js b/utils/AzureEventDetector.js deleted file mode 100644 index 9224b84..0000000 --- a/utils/AzureEventDetector.js +++ /dev/null @@ -1,234 +0,0 @@ -/* - * Copyright (c) 2017 TopCoder, Inc. All rights reserved. - */ - -/** - * This module contains the EventDetector for azure. - * - * @author TCSCODER - * @version 1.0 - */ -'use strict'; - -const Joi = require('joi'); -const _ = require('lodash'); - -const models = require('../models'); -const EventDetector = require('./EventDetector'); - -/** - * parse the issues from azure webhook - * @param {object} data the azure webhook payload - * @returns {object} the parsed issue detail - */ -const parseIssue = (data) => { - const resource = data.resource.revision ? data.resource.revision : data.resource; - return { - number: resource.id, - body: resource.fields['System.Description'], - title: resource.fields['System.Title'], - labels: resource.fields['System.Tags'] ? resource.fields['System.Tags'].split('; ') : [], - assignees: resource.fields['System.AssignedTo'] ? [{id: resource.fields['System.AssignedTo'].id}] : [], - owner: { - id: resource.fields['System.CreatedBy'].id - } - }; -}; - -/** - * parse the project from azure webhook project payload - * @param {object} data the azure project payload - * @returns {object} the parsed project detail - */ -const parseProject = (data) => { - const resource = data.resource.revision ? data.resource.revision : data.resource; - const repoName = resource.fields['System.TeamProject']; - const repoUrl = data.resourceContainers.project.baseUrl + repoName; - const results = repoUrl.split('/'); - const excludePart = 3; - const repoOwner = _(results).slice(excludePart, results.length - 1).join('/'); - - return { - id: data.resourceContainers.project.id, - name: resource.fields['System.TeamProject'], - full_name: `${repoOwner}/${repoName}` - }; -}; - -/** - * parse the comments from azure webhook payload - * @param {object} data the azure webhook payload - * @returns {object} the parsed comment detail - */ -const parseComment = (data) => ({ - issue: parseIssue(data), - repository: parseProject(data), - comment: { - id: data.resource.revision.commentVersionRef.commentId, - body: data.resource.revision.fields['System.History'], - user: { - id: data.resource.revisedBy.id - } - } -}); - -/** - * parse the issue event from azure webhook payload - * @param {object} data the azure webhook payload - * @returns {object} the parsed issue event detail - */ -const parseIssueEventData = (data) => ({ - issue: parseIssue(data), - repository: parseProject(data) -}); - -// definition of issue created event -const IssueCreatedEvent = { - event: models.IssueCreatedEvent, - schema: Joi.object().keys({ - eventType: Joi.string().valid('workitem.created').required() - }), - parse: parseIssueEventData -}; - -// definition of issue updated event -const IssueUpdatedEvent = { - event: models.IssueUpdatedEvent, - schema: Joi.object().keys({ - eventType: Joi.string().valid('workitem.updated').required(), - resource: Joi.object().keys({ - fields: Joi.object().keys({ - 'System.Title': Joi.object().keys({ - newValue: Joi.string().required() - }).required() - }).required() - }).required() - }), - parse: parseIssueEventData -}; - -const IssueDescriptionUpdatedEvent = { - event: models.IssueUpdatedEvent, - schema: Joi.object().keys({ - eventType: Joi.string().valid('workitem.updated').required(), - resource: Joi.object().keys({ - fields: Joi.object().keys({ - 'System.Description': Joi.object().keys({ - newValue: Joi.string().required() - }).required() - }).required() - }).required() - }), - parse: parseIssueEventData -}; - -// definition of issue closed event -const IssueClosedEvent = { - event: models.IssueClosedEvent, - schema: Joi.object().keys({ - eventType: Joi.string().valid('workitem.updated').required(), - resource: Joi.object().keys({ - fields: Joi.object().keys({ - 'System.State': Joi.object().keys({ - newValue: Joi.string().valid('Done').required() - }).required() - }).required() - }).required() - }), - parse: (data) => ({ - issue: parseIssue(data), - repository: parseProject(data), - assignee: { - id: data.resource.revision.fields['System.AssignedTo'] ? - data.resource.revision.fields['System.AssignedTo'].id : null - } - }) -}; - -// definition of issue comment created event -const CommentCreatedEvent = { - event: models.CommentCreatedEvent, - schema: Joi.object().keys({ - eventType: Joi.string().valid('workitem.updated').required(), - resource: Joi.object().keys({ - fields: Joi.object().keys({ - 'System.History': Joi.object().keys({ - newValue: Joi.string().required() - }).required() - }).required() - }).required() - }), - parse: parseComment -}; - -// definition of issue user assigned event -const UserAssignedEvent = { - event: models.UserAssignedEvent, - schema: Joi.object().keys({ - eventType: Joi.string().valid('workitem.updated').required(), - resource: Joi.object().keys({ - fields: Joi.object().keys({ - 'System.AssignedTo': Joi.object().keys({ - newValue: Joi.object().required() - }).required() - }).required() - }).required() - }), - parse: (data) => ({ - issue: parseIssue(data), - repository: parseProject(data), - assignee: { - id: data.resource.fields['System.AssignedTo'].newValue.id - } - }) -}; - -// definition of issue user unassigned event -const UserUnassignedEvent = { - event: models.UserUnassignedEvent, - schema: Joi.object().keys({ - eventType: Joi.string().valid('workitem.updated').required(), - resource: Joi.object().keys({ - fields: Joi.object().keys({ - 'System.AssignedTo': Joi.object().keys({ - oldValue: Joi.object().required() - }).required() - }).required() - }).required() - }), - parse: (data) => ({ - issue: parseIssue(data, data), - repository: parseProject(data) - }) -}; - -// definition of issue label updated event -const LabelUpdatedEvent = { - event: models.LabelUpdatedEvent, - schema: Joi.object().keys({ - eventType: Joi.string().valid('workitem.updated').required(), - resource: Joi.object().keys({ - fields: Joi.object().keys({ - 'System.Tags': Joi.object().keys({ - newValue: Joi.string().required() - }).required() - }).required() - }).required() - }), - parse: (data) => ({ - issue: parseIssue(data), - repository: parseProject(data), - labels: data.resource.fields['System.Tags'].newValue.split('; ') - }) -}; - -module.exports = new EventDetector('azure', [ - IssueCreatedEvent, - LabelUpdatedEvent, - UserUnassignedEvent, - UserAssignedEvent, - IssueUpdatedEvent, - IssueDescriptionUpdatedEvent, - IssueClosedEvent, - CommentCreatedEvent -]);