Skip to content
This repository was archived by the owner on Mar 13, 2025. It is now read-only.

Commit 7e24575

Browse files
authored
Merge pull request #30 from afrisalyp/develop
Cleanup august challenge.
2 parents e1ca506 + 7402214 commit 7e24575

File tree

6 files changed

+128
-25
lines changed

6 files changed

+128
-25
lines changed

models/Project.js

-5
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,6 @@ const schema = new Schema({
2323
type: Number,
2424
required: true
2525
},
26-
repoUrls: {
27-
type: [String],
28-
required: true
29-
},
30-
repoId: {type: String, required: false},
3126
rocketChatWebhook: {type: String, required: false},
3227
rocketChatChannelName: {type: String, required: false},
3328
archived: {type: String, required: true},

models/Repository.js

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/*
2+
* Copyright (c) 2018 TopCoder, Inc. All rights reserved.
3+
*/
4+
'use strict';
5+
6+
/**
7+
* Schema for project and repository mapping.
8+
* @author TCSCODER
9+
* @version 1.0
10+
*/
11+
const dynamoose = require('dynamoose');
12+
13+
const Schema = dynamoose.Schema;
14+
15+
const schema = new Schema({
16+
id: {
17+
type: String,
18+
hashKey: true,
19+
required: true
20+
},
21+
projectId: {
22+
type: String,
23+
required: true,
24+
index: {
25+
global: true,
26+
project: true,
27+
name: 'ProjectIdIndex'
28+
}
29+
},
30+
url: {
31+
type: String,
32+
required: true,
33+
index: {
34+
global: true,
35+
project: true,
36+
rangKey: 'archived',
37+
name: 'URLIndex'
38+
}
39+
},
40+
archived: {type: String, required: true},
41+
repoId: {type: String, required: false},
42+
registeredWebhookId: {type: String, required: false}
43+
});
44+
45+
module.exports = schema;

models/index.js

+2
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ const PullRequestCreatedEvent = require('./PullRequestCreatedEvent');
4646
const PullRequestClosedEvent = require('./PullRequestClosedEvent');
4747
const LabelUpdatedEvent = require('./LabelUpdatedEvent');
4848
const Project = require('./Project');
49+
const Repository = require('./Repository');
4950

5051
module.exports = {
5152
IssueCreatedEvent,
@@ -58,5 +59,6 @@ module.exports = {
5859
PullRequestClosedEvent,
5960
LabelUpdatedEvent,
6061
Project: dynamoose.model('Topcoder_X.Project', Project),
62+
Repository: dynamoose.model('Topcoder_X.Repository', Repository),
6163
IssueClosedEvent
6264
};

routes/middlewares/RepositoryFilter.js

+5-8
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,9 @@
88
* @version 1.0
99
*/
1010
'use strict';
11-
const _ = require('lodash');
1211

1312
const logger = require('../../utils/logger');
14-
const Project = require('../../models').Project;
13+
const Repository = require('../../models').Repository;
1514
const dbHelper = require('../../utils/db-helper');
1615

1716
module.exports = (provider) => async (req, res, next) => {
@@ -23,12 +22,10 @@ module.exports = (provider) => async (req, res, next) => {
2322
const repo = req.body.project || {};
2423
repoNames = [repo.homepage, repo.http_url, repo.url, repo.ssh_url, repo.web_url];
2524
}
26-
const projects = await dbHelper.scan(Project, {
27-
archived: 'false'
28-
});
29-
const found = _.some(projects, (project) => _.intersection(repoNames, project.repoUrls).length > 0);
30-
if (found) {
31-
return next();
25+
for (const repoName of repoNames) { //eslint-disable-line
26+
if (await dbHelper.queryOneActiveRepository(Repository, repoName)) {
27+
return next();
28+
}
3229
}
3330

3431
// ignore this repo

routes/middlewares/SecurityChecker.js

+9-11
Original file line numberDiff line numberDiff line change
@@ -9,33 +9,31 @@
99
*/
1010
'use strict';
1111
const crypto = require('crypto');
12-
const _ = require('lodash');
1312
const logger = require('../../utils/logger');
1413
const Project = require('../../models').Project;
14+
const Repository = require('../../models').Repository;
1515
const dbHelper = require('../../utils/db-helper');
1616

1717
module.exports = (provider) => async (req, res, next) => {
1818
let isValid = false;
1919
const params = req.body;
2020
if (provider === 'github') {
21-
const projectDetails = await dbHelper.scan(Project, {
22-
repoUrls: { contains: params.repository.html_url }
23-
});
24-
_.forEach(projectDetails, (projectDetail) => {
21+
const repositories = await dbHelper.queryRepositories(Repository, params.repository.html_url);
22+
for (const repository of repositories) { // eslint-disable-line
23+
const projectDetail = await dbHelper.queryOneProject(Project, repository.projectId);
2524
const hash = crypto.createHmac('sha1', projectDetail.secretWebhookKey).update(req.rawBody).digest('hex');
2625
if (`sha1=${hash}` === req.header('X-Hub-Signature')) {
2726
isValid = true;
2827
}
29-
});
28+
}
3029
} else if (provider === 'gitlab') {
31-
const projectDetails = await dbHelper.scan(Project, {
32-
repoUrls: { contains: params.project.web_url }
33-
});
34-
_.forEach(projectDetails, (projectDetail) => { // eslint-disable-line lodash/prefer-filter
30+
const repositories = await dbHelper.queryRepositories(Repository, params.project.web_url);
31+
for (const repository of repositories) { // eslint-disable-line
32+
const projectDetail = await dbHelper.queryOneProject(Project, repository.projectId);
3533
if (projectDetail.secretWebhookKey === req.header('X-Gitlab-Token')) {
3634
isValid = true;
3735
}
38-
});
36+
}
3937
} else {
4038
// unknown provider
4139
return next();

utils/db-helper.js

+67-1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,72 @@ async function scan(model, scanParams) {
2626
});
2727
}
2828

29+
/**
30+
* Query active repositories
31+
* @param {Object} model the dynamoose model
32+
* @param {String} url the repository url
33+
* @returns {Promise<Object>}
34+
*/
35+
async function queryRepositories(model, url) {
36+
return await new Promise((resolve, reject) => {
37+
model.query({
38+
url
39+
})
40+
.all()
41+
.exec((err, result) => {
42+
if (err) {
43+
return reject(err);
44+
}
45+
return resolve(result);
46+
});
47+
});
48+
}
49+
50+
/**
51+
* Query one active repository
52+
* @param {Object} model the dynamoose model
53+
* @param {String} url the repository url
54+
* @returns {Promise<Object>}
55+
*/
56+
async function queryOneActiveRepository(model, url) {
57+
return await new Promise((resolve, reject) => {
58+
model.queryOne({
59+
url,
60+
archived: 'false'
61+
})
62+
.all()
63+
.exec((err, result) => {
64+
if (err) {
65+
return reject(err);
66+
}
67+
return resolve(result);
68+
});
69+
});
70+
}
71+
72+
/**
73+
* Query one project
74+
* @param {Object} model the dynamoose model
75+
* @param {String} projectId the project id
76+
* @returns {Promise<Object>}
77+
*/
78+
async function queryOneProject(model, projectId) {
79+
return await new Promise((resolve, reject) => {
80+
model.queryOne('id')
81+
.eq(projectId)
82+
.all()
83+
.exec((err, result) => {
84+
if (err) {
85+
return reject(err);
86+
}
87+
return resolve(result);
88+
});
89+
});
90+
}
91+
2992
module.exports = {
30-
scan
93+
scan,
94+
queryRepositories,
95+
queryOneActiveRepository,
96+
queryOneProject
3197
};

0 commit comments

Comments
 (0)