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

Commit 067e9a2

Browse files
committed
Cleanup august challenge.
1 parent 75aba54 commit 067e9a2

18 files changed

+382
-342
lines changed

Diff for: scripts/migrate-repo-url.js

+18-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ const AWS = require('aws-sdk');
22
const helper = require('../src/common/helper');
33
const dbHelper = require('../src/common/db-helper');
44
const Project = require('../src/models').Project;
5+
const Repository = require('../src/models').Repository;
56

67
if (process.env.IS_LOCAL=="true") {
78
AWS.config.update({
@@ -21,8 +22,23 @@ var documentClient = new AWS.DynamoDB.DocumentClient();
2122
items = await documentClient.scan(params).promise();
2223
items.Items.forEach(async (item) => {
2324
console.log(item);
24-
item.repoUrls = [item.repoUrl];
25-
await dbHelper.update(Project, item.id, item);
25+
let repoUrls;
26+
if (item.repoUrls) {
27+
repoUrls = item.repoUrls.values;
28+
}
29+
else {
30+
repoUrls = [item.repoUrl];
31+
}
32+
for (const url of repoUrls) { // eslint-disable-line
33+
console.log(`Creating ${url}`);
34+
await dbHelper.create(Repository, {
35+
id: helper.generateIdentifier(),
36+
projectId: item.id,
37+
url,
38+
archived: item.archived,
39+
registeredWebhookId: item.registeredWebhookId
40+
});
41+
}
2642
});
2743
params.ExclusiveStartKey = items.LastEvaluatedKey;
2844
} while(typeof items.LastEvaluatedKey !== 'undefined');

Diff for: src/common/db-helper.js

+184-23
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1+
// eslint-disable-line max-lines
2+
const _ = require('lodash');
13
const logger = require('./logger');
4+
const models = require('../models');
25

36
/*
47
* Copyright (c) 2018 TopCoder, Inc. All rights reserved.
@@ -67,6 +70,50 @@ async function scan(model, scanParams) {
6770
});
6871
}
6972

73+
/**
74+
* Get data collection by scan parameters with paging
75+
* @param {Object} model The dynamoose model to scan
76+
* @param {String} size The size of result
77+
* @param {String} lastKey The lastKey param
78+
* @returns {Promise<void>}
79+
*/
80+
async function scanAll(model, size, lastKey) {
81+
return await new Promise((resolve, reject) => {
82+
const scanMethod = model.scan({}).limit(size);
83+
if (lastKey) scanMethod.startAt(lastKey);
84+
scanMethod.exec((err, result) => {
85+
if (err) {
86+
logger.error(`DynamoDB scan error ${err}`);
87+
return reject(err);
88+
}
89+
return resolve(result.count === 0 ? [] : result);
90+
});
91+
});
92+
}
93+
94+
/**
95+
* Get data collection by scan with search
96+
* @param {Object} model The dynamoose model to scan
97+
* @param {String} size The size of result
98+
* @param {String} lastKey The lastKey param
99+
* @param {String} containsKey The contains key param
100+
* @param {String} contains The contains value
101+
* @returns {Promise<void>}
102+
*/
103+
async function scanAllWithSearch(model, size, lastKey, containsKey, contains) {
104+
return await new Promise((resolve, reject) => {
105+
const scanMethod = model.scan(containsKey).contains(contains).limit(size);
106+
if (lastKey) scanMethod.startAt(lastKey);
107+
scanMethod.exec((err, result) => {
108+
if (err) {
109+
logger.error(`DynamoDB scan error ${err}`);
110+
return reject(err);
111+
}
112+
return resolve(result.count === 0 ? [] : result);
113+
});
114+
});
115+
}
116+
70117
/**
71118
* Get single data by query parameters
72119
* @param {Object} model The dynamoose model to query
@@ -171,16 +218,16 @@ async function queryOneUserMappingByTCUsername(model, tcusername) {
171218
*/
172219
async function queryOneActiveProject(model, repoUrl) {
173220
return await new Promise((resolve, reject) => {
174-
model.scan('repoUrls').contains(repoUrl)
175-
.filter('archived')
176-
.eq('false')
177-
.all()
178-
.exec((err, result) => {
179-
if (err || !result) {
180-
logger.debug(`queryOneActiveProject. Error. ${err}`);
181-
return reject(err);
182-
}
183-
return resolve(result.count === 0 ? null : result[0]);
221+
queryOneActiveRepository(models.Repository, repoUrl).then((repo) => {
222+
if (!repo) resolve(null);
223+
else model.queryOne('id').eq(repo.projectId).consistent()
224+
.exec((err, result) => {
225+
if (err) {
226+
logger.debug(`queryOneActiveProject. Error. ${err}`);
227+
return reject(err);
228+
}
229+
return resolve(result);
230+
});
184231
});
185232
});
186233
}
@@ -268,18 +315,16 @@ async function queryOneUserTeamMapping(model, teamId, githubUserName, githubOrgI
268315
*/
269316
async function queryOneActiveProjectWithFilter(model, repoUrl, projectIdToFilter) {
270317
return await new Promise((resolve, reject) => {
271-
model.scan('repoUrls').contains(repoUrl)
272-
.filter('archived')
273-
.eq('false')
274-
.filter('id')
275-
.not().eq(projectIdToFilter)
276-
.all()
277-
.exec((err, result) => {
278-
if (err || !result) {
279-
logger.debug(`queryOneActiveProjectWithFilter. Error. ${err}`);
280-
return reject(err);
281-
}
282-
return resolve(result.count === 0 ? null : result[0]);
318+
queryActiveRepositoriesExcludeByProjectId(models.Repository, repoUrl, projectIdToFilter).then((repos) => {
319+
if (!repos || repos.length === 0) resolve(null);
320+
else model.queryOne('id').eq(repos[0].projectId).consistent()
321+
.exec((err, result) => {
322+
if (err) {
323+
logger.debug(`queryOneActiveProjectWithFilter. Error. ${err}`);
324+
return reject(err);
325+
}
326+
return resolve(result);
327+
});
283328
});
284329
});
285330
}
@@ -387,22 +432,138 @@ async function queryOneOrganisation(model, organisation) {
387432
});
388433
}
389434

435+
/**
436+
* Query one active repository
437+
* @param {Object} model the dynamoose model
438+
* @param {String} url the repository url
439+
* @returns {Promise<Object>}
440+
*/
441+
async function queryOneActiveRepository(model, url) {
442+
return await new Promise((resolve, reject) => {
443+
model.queryOne({
444+
url,
445+
archived: 'false'
446+
})
447+
.all()
448+
.exec((err, result) => {
449+
if (err) {
450+
return reject(err);
451+
}
452+
return resolve(result);
453+
});
454+
});
455+
}
456+
457+
/**
458+
* Query active repository with project id exclude filter.
459+
* @param {String} url the repository url
460+
* @param {String} projectId the project id
461+
* @returns {Promise<Object>}
462+
*/
463+
async function queryActiveRepositoriesExcludeByProjectId(url, projectId) {
464+
return await new Promise((resolve, reject) => {
465+
models.Repository.query({
466+
url,
467+
archived: 'false'
468+
})
469+
.filter('projectId')
470+
.not().eq(projectId)
471+
.all()
472+
.exec((err, result) => {
473+
if (err) {
474+
return reject(err);
475+
}
476+
return resolve(result);
477+
});
478+
});
479+
}
480+
481+
/**
482+
* Query repository by project id.
483+
* @param {String} projectId the project id
484+
* @returns {Promise<Object>}
485+
*/
486+
async function queryRepositoriesByProjectId(projectId) {
487+
return await new Promise((resolve, reject) => {
488+
models.Repository.query({
489+
projectId
490+
})
491+
.all()
492+
.exec((err, result) => {
493+
if (err) {
494+
return reject(err);
495+
}
496+
return resolve(result);
497+
});
498+
});
499+
}
500+
501+
/**
502+
* Query repository by project id with url filter.
503+
* @param {String} projectId the project id
504+
* @param {String} url the repo url
505+
* @returns {Promise<Object>}
506+
*/
507+
async function queryRepositoryByProjectIdFilterUrl(projectId, url) {
508+
return await new Promise((resolve, reject) => {
509+
models.Repository.query({
510+
projectId
511+
})
512+
.filter('url')
513+
.eq(url)
514+
.all()
515+
.exec((err, result) => {
516+
if (err) {
517+
return reject(err);
518+
}
519+
return resolve(result.count === 0 ? null : result[0]);
520+
});
521+
});
522+
}
523+
524+
/**
525+
* Find array of repo url of given project id
526+
* @param {String} projectId the project id
527+
* @returns {Promise<Object>}
528+
*/
529+
async function populateRepoUrls(projectId) {
530+
return await new Promise((resolve, reject) => {
531+
models.Repository.query({
532+
projectId
533+
})
534+
.all()
535+
.exec((err, result) => {
536+
if (err) {
537+
return reject(err);
538+
}
539+
return resolve(_.map(result, 'url'));
540+
});
541+
});
542+
}
543+
390544
module.exports = {
391545
getById,
392546
getByKey,
393547
scan,
548+
scanAll,
549+
scanAllWithSearch,
394550
create,
395551
update,
396552
removeById,
397553
removeUser,
554+
populateRepoUrls,
555+
queryActiveRepositoriesExcludeByProjectId,
398556
queryOneActiveCopilotPayment,
399557
queryOneActiveProject,
400558
queryOneActiveProjectWithFilter,
559+
queryOneActiveRepository,
401560
queryOneOrganisation,
402561
queryOneIssue,
403562
queryOneUserByType,
404563
queryOneUserByTypeAndRole,
405564
queryOneUserGroupMapping,
406565
queryOneUserTeamMapping,
407-
queryOneUserMappingByTCUsername
566+
queryOneUserMappingByTCUsername,
567+
queryRepositoriesByProjectId,
568+
queryRepositoryByProjectIdFilterUrl
408569
};

Diff for: src/controllers/IssueController.js

-11
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,6 @@ async function search(req) {
2121
return await IssueService.search(req.query, req.currentUser.handle);
2222
}
2323

24-
/**
25-
* create an issue
26-
* @param {Object} req the request
27-
* @param {Object} res the response
28-
* @returns {Object} the result
29-
*/
30-
async function create(req) {
31-
return await IssueService.create(req.body, req.currentUser);
32-
}
33-
3424
/**
3525
* recreate an issue
3626
* Remove the related db record.
@@ -45,7 +35,6 @@ async function recreate(req) {
4535

4636
module.exports = {
4737
search,
48-
create,
4938
recreate
5039
};
5140

Diff for: src/controllers/ProjectController.js

+7-3
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
* @version 1.0
1010
*/
1111
const helper = require('../common/helper');
12+
const dbHelper = require('../common/db-helper');
1213
const ProjectService = require('../services/ProjectService');
1314
const models = require('../models');
1415

@@ -49,7 +50,8 @@ async function getAll(req) {
4950
*/
5051
async function createLabel(req) {
5152
const dbProject = await helper.ensureExists(models.Project, req.body.projectId, 'Project');
52-
for (const repoUrl of dbProject.repoUrls) { // eslint-disable-line no-restricted-syntax
53+
const repoUrls = await dbHelper.populateRepoUrls(dbProject.id);
54+
for (const repoUrl of repoUrls) { // eslint-disable-line no-restricted-syntax
5355
try {
5456
await ProjectService.createLabel(req.body, req.currentUser, repoUrl);
5557
}
@@ -70,7 +72,8 @@ async function createLabel(req) {
7072
*/
7173
async function createHook(req) {
7274
const dbProject = await helper.ensureExists(models.Project, req.body.projectId, 'Project');
73-
for (const repoUrl of dbProject.repoUrls) { // eslint-disable-line no-restricted-syntax
75+
const repoUrls = await dbHelper.populateRepoUrls(dbProject.id);
76+
for (const repoUrl of repoUrls) { // eslint-disable-line no-restricted-syntax
7477
try {
7578
await ProjectService.createHook(req.body, req.currentUser, repoUrl);
7679
}
@@ -91,7 +94,8 @@ async function createHook(req) {
9194
*/
9295
async function addWikiRules(req) {
9396
const dbProject = await helper.ensureExists(models.Project, req.body.projectId, 'Project');
94-
for (const repoUrl of dbProject.repoUrls) { // eslint-disable-line no-restricted-syntax
97+
const repoUrls = await dbHelper.populateRepoUrls(dbProject.id);
98+
for (const repoUrl of repoUrls) { // eslint-disable-line no-restricted-syntax
9599
try {
96100
await ProjectService.addWikiRules(req.body, req.currentUser, repoUrl);
97101
}

Diff for: src/front/src/app/app.js

-8
Original file line numberDiff line numberDiff line change
@@ -95,14 +95,6 @@ angular.module('topcoderX', [
9595
data: { pageTitle: 'Project Management' },
9696
resolve: { auth: authenticate }
9797
})
98-
.state('app.issue', {
99-
url: '/upsertissue',
100-
controller: 'IssueController',
101-
controllerAs: 'vm',
102-
templateUrl: 'app/upsertissue/upsertissue.html',
103-
data: { pageTitle: 'Project Management' },
104-
resolve: { auth: authenticate }
105-
})
10698
// following code is commented to hide the menu
10799
// un comment this when pages are developed
108100
// .state('app.challenges', {

Diff for: src/front/src/app/projects/projects.controller.js

-5
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,6 @@ angular.module('topcoderX')
2626
$state.go('app.project');
2727
};
2828

29-
//go to a add issue page
30-
$scope.goIssue = function () {
31-
$state.go('app.issue');
32-
};
33-
3429
//the actived project list
3530
$scope.projects = [];
3631
//the archived project list

0 commit comments

Comments
 (0)