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

Cleanup august challenge. #426

Merged
merged 1 commit into from
Aug 15, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 18 additions & 2 deletions scripts/migrate-repo-url.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ const AWS = require('aws-sdk');
const helper = require('../src/common/helper');
const dbHelper = require('../src/common/db-helper');
const Project = require('../src/models').Project;
const Repository = require('../src/models').Repository;

if (process.env.IS_LOCAL=="true") {
AWS.config.update({
Expand All @@ -21,8 +22,23 @@ var documentClient = new AWS.DynamoDB.DocumentClient();
items = await documentClient.scan(params).promise();
items.Items.forEach(async (item) => {
console.log(item);
item.repoUrls = [item.repoUrl];
await dbHelper.update(Project, item.id, item);
let repoUrls;
if (item.repoUrls) {
repoUrls = item.repoUrls.values;
}
else {
repoUrls = [item.repoUrl];
}
for (const url of repoUrls) { // eslint-disable-line
console.log(`Creating ${url}`);
await dbHelper.create(Repository, {
id: helper.generateIdentifier(),
projectId: item.id,
url,
archived: item.archived,
registeredWebhookId: item.registeredWebhookId
});
}
});
params.ExclusiveStartKey = items.LastEvaluatedKey;
} while(typeof items.LastEvaluatedKey !== 'undefined');
Expand Down
207 changes: 184 additions & 23 deletions src/common/db-helper.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
// eslint-disable-line max-lines
const _ = require('lodash');
const logger = require('./logger');
const models = require('../models');

/*
* Copyright (c) 2018 TopCoder, Inc. All rights reserved.
Expand Down Expand Up @@ -67,6 +70,50 @@ async function scan(model, scanParams) {
});
}

/**
* Get data collection by scan parameters with paging
* @param {Object} model The dynamoose model to scan
* @param {String} size The size of result
* @param {String} lastKey The lastKey param
* @returns {Promise<void>}
*/
async function scanAll(model, size, lastKey) {
return await new Promise((resolve, reject) => {
const scanMethod = model.scan({}).limit(size);
if (lastKey) scanMethod.startAt(lastKey);
scanMethod.exec((err, result) => {
if (err) {
logger.error(`DynamoDB scan error ${err}`);
return reject(err);
}
return resolve(result.count === 0 ? [] : result);
});
});
}

/**
* Get data collection by scan with search
* @param {Object} model The dynamoose model to scan
* @param {String} size The size of result
* @param {String} lastKey The lastKey param
* @param {String} containsKey The contains key param
* @param {String} contains The contains value
* @returns {Promise<void>}
*/
async function scanAllWithSearch(model, size, lastKey, containsKey, contains) {
return await new Promise((resolve, reject) => {
const scanMethod = model.scan(containsKey).contains(contains).limit(size);
if (lastKey) scanMethod.startAt(lastKey);
scanMethod.exec((err, result) => {
if (err) {
logger.error(`DynamoDB scan error ${err}`);
return reject(err);
}
return resolve(result.count === 0 ? [] : result);
});
});
}

/**
* Get single data by query parameters
* @param {Object} model The dynamoose model to query
Expand Down Expand Up @@ -171,16 +218,16 @@ async function queryOneUserMappingByTCUsername(model, tcusername) {
*/
async function queryOneActiveProject(model, repoUrl) {
return await new Promise((resolve, reject) => {
model.scan('repoUrls').contains(repoUrl)
.filter('archived')
.eq('false')
.all()
.exec((err, result) => {
if (err || !result) {
logger.debug(`queryOneActiveProject. Error. ${err}`);
return reject(err);
}
return resolve(result.count === 0 ? null : result[0]);
queryOneActiveRepository(models.Repository, repoUrl).then((repo) => {
if (!repo) resolve(null);
else model.queryOne('id').eq(repo.projectId).consistent()
.exec((err, result) => {
if (err) {
logger.debug(`queryOneActiveProject. Error. ${err}`);
return reject(err);
}
return resolve(result);
});
});
});
}
Expand Down Expand Up @@ -268,18 +315,16 @@ async function queryOneUserTeamMapping(model, teamId, githubUserName, githubOrgI
*/
async function queryOneActiveProjectWithFilter(model, repoUrl, projectIdToFilter) {
return await new Promise((resolve, reject) => {
model.scan('repoUrls').contains(repoUrl)
.filter('archived')
.eq('false')
.filter('id')
.not().eq(projectIdToFilter)
.all()
.exec((err, result) => {
if (err || !result) {
logger.debug(`queryOneActiveProjectWithFilter. Error. ${err}`);
return reject(err);
}
return resolve(result.count === 0 ? null : result[0]);
queryActiveRepositoriesExcludeByProjectId(models.Repository, repoUrl, projectIdToFilter).then((repos) => {
if (!repos || repos.length === 0) resolve(null);
else model.queryOne('id').eq(repos[0].projectId).consistent()
.exec((err, result) => {
if (err) {
logger.debug(`queryOneActiveProjectWithFilter. Error. ${err}`);
return reject(err);
}
return resolve(result);
});
});
});
}
Expand Down Expand Up @@ -387,22 +432,138 @@ async function queryOneOrganisation(model, organisation) {
});
}

/**
* Query one active repository
* @param {Object} model the dynamoose model
* @param {String} url the repository url
* @returns {Promise<Object>}
*/
async function queryOneActiveRepository(model, url) {
return await new Promise((resolve, reject) => {
model.queryOne({
url,
archived: 'false'
})
.all()
.exec((err, result) => {
if (err) {
return reject(err);
}
return resolve(result);
});
});
}

/**
* Query active repository with project id exclude filter.
* @param {String} url the repository url
* @param {String} projectId the project id
* @returns {Promise<Object>}
*/
async function queryActiveRepositoriesExcludeByProjectId(url, projectId) {
return await new Promise((resolve, reject) => {
models.Repository.query({
url,
archived: 'false'
})
.filter('projectId')
.not().eq(projectId)
.all()
.exec((err, result) => {
if (err) {
return reject(err);
}
return resolve(result);
});
});
}

/**
* Query repository by project id.
* @param {String} projectId the project id
* @returns {Promise<Object>}
*/
async function queryRepositoriesByProjectId(projectId) {
return await new Promise((resolve, reject) => {
models.Repository.query({
projectId
})
.all()
.exec((err, result) => {
if (err) {
return reject(err);
}
return resolve(result);
});
});
}

/**
* Query repository by project id with url filter.
* @param {String} projectId the project id
* @param {String} url the repo url
* @returns {Promise<Object>}
*/
async function queryRepositoryByProjectIdFilterUrl(projectId, url) {
return await new Promise((resolve, reject) => {
models.Repository.query({
projectId
})
.filter('url')
.eq(url)
.all()
.exec((err, result) => {
if (err) {
return reject(err);
}
return resolve(result.count === 0 ? null : result[0]);
});
});
}

/**
* Find array of repo url of given project id
* @param {String} projectId the project id
* @returns {Promise<Object>}
*/
async function populateRepoUrls(projectId) {
return await new Promise((resolve, reject) => {
models.Repository.query({
projectId
})
.all()
.exec((err, result) => {
if (err) {
return reject(err);
}
return resolve(_.map(result, 'url'));
});
});
}

module.exports = {
getById,
getByKey,
scan,
scanAll,
scanAllWithSearch,
create,
update,
removeById,
removeUser,
populateRepoUrls,
queryActiveRepositoriesExcludeByProjectId,
queryOneActiveCopilotPayment,
queryOneActiveProject,
queryOneActiveProjectWithFilter,
queryOneActiveRepository,
queryOneOrganisation,
queryOneIssue,
queryOneUserByType,
queryOneUserByTypeAndRole,
queryOneUserGroupMapping,
queryOneUserTeamMapping,
queryOneUserMappingByTCUsername
queryOneUserMappingByTCUsername,
queryRepositoriesByProjectId,
queryRepositoryByProjectIdFilterUrl
};
11 changes: 0 additions & 11 deletions src/controllers/IssueController.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,16 +21,6 @@ async function search(req) {
return await IssueService.search(req.query, req.currentUser.handle);
}

/**
* create an issue
* @param {Object} req the request
* @param {Object} res the response
* @returns {Object} the result
*/
async function create(req) {
return await IssueService.create(req.body, req.currentUser);
}

/**
* recreate an issue
* Remove the related db record.
Expand All @@ -45,7 +35,6 @@ async function recreate(req) {

module.exports = {
search,
create,
recreate
};

Expand Down
10 changes: 7 additions & 3 deletions src/controllers/ProjectController.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
* @version 1.0
*/
const helper = require('../common/helper');
const dbHelper = require('../common/db-helper');
const ProjectService = require('../services/ProjectService');
const models = require('../models');

Expand Down Expand Up @@ -49,7 +50,8 @@ async function getAll(req) {
*/
async function createLabel(req) {
const dbProject = await helper.ensureExists(models.Project, req.body.projectId, 'Project');
for (const repoUrl of dbProject.repoUrls) { // eslint-disable-line no-restricted-syntax
const repoUrls = await dbHelper.populateRepoUrls(dbProject.id);
for (const repoUrl of repoUrls) { // eslint-disable-line no-restricted-syntax
try {
await ProjectService.createLabel(req.body, req.currentUser, repoUrl);
}
Expand All @@ -70,7 +72,8 @@ async function createLabel(req) {
*/
async function createHook(req) {
const dbProject = await helper.ensureExists(models.Project, req.body.projectId, 'Project');
for (const repoUrl of dbProject.repoUrls) { // eslint-disable-line no-restricted-syntax
const repoUrls = await dbHelper.populateRepoUrls(dbProject.id);
for (const repoUrl of repoUrls) { // eslint-disable-line no-restricted-syntax
try {
await ProjectService.createHook(req.body, req.currentUser, repoUrl);
}
Expand All @@ -91,7 +94,8 @@ async function createHook(req) {
*/
async function addWikiRules(req) {
const dbProject = await helper.ensureExists(models.Project, req.body.projectId, 'Project');
for (const repoUrl of dbProject.repoUrls) { // eslint-disable-line no-restricted-syntax
const repoUrls = await dbHelper.populateRepoUrls(dbProject.id);
for (const repoUrl of repoUrls) { // eslint-disable-line no-restricted-syntax
try {
await ProjectService.addWikiRules(req.body, req.currentUser, repoUrl);
}
Expand Down
8 changes: 0 additions & 8 deletions src/front/src/app/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -95,14 +95,6 @@ angular.module('topcoderX', [
data: { pageTitle: 'Project Management' },
resolve: { auth: authenticate }
})
.state('app.issue', {
url: '/upsertissue',
controller: 'IssueController',
controllerAs: 'vm',
templateUrl: 'app/upsertissue/upsertissue.html',
data: { pageTitle: 'Project Management' },
resolve: { auth: authenticate }
})
// following code is commented to hide the menu
// un comment this when pages are developed
// .state('app.challenges', {
Expand Down
5 changes: 0 additions & 5 deletions src/front/src/app/projects/projects.controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,6 @@ angular.module('topcoderX')
$state.go('app.project');
};

//go to a add issue page
$scope.goIssue = function () {
$state.go('app.issue');
};

//the actived project list
$scope.projects = [];
//the archived project list
Expand Down
Loading