diff --git a/models/Project.js b/models/Project.js index bdf63dc..08a7837 100755 --- a/models/Project.js +++ b/models/Project.js @@ -23,18 +23,12 @@ const schema = new Schema({ type: Number, required: true }, - repoUrls: { - type: [String], - required: true - }, - repoId: {type: String, required: false}, rocketChatWebhook: {type: String, required: false}, rocketChatChannelName: {type: String, required: false}, archived: {type: String, required: true}, owner: {type: String, required: true}, secretWebhookKey: {type: String, required: true}, copilot: {type: String, required: false}, - registeredWebhookId: {type: String, required: false}, updatedAt: { type: Date, default: Date.now diff --git a/models/Repository.js b/models/Repository.js new file mode 100644 index 0000000..e9a8f1a --- /dev/null +++ b/models/Repository.js @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018 TopCoder, Inc. All rights reserved. + */ +'use strict'; + +/** + * Schema for project and repository mapping. + * @author TCSCODER + * @version 1.0 + */ +const dynamoose = require('dynamoose'); + +const Schema = dynamoose.Schema; + +const schema = new Schema({ + id: { + type: String, + hashKey: true, + required: true + }, + projectId: { + type: String, + required: true, + index: { + global: true, + project: true, + name: 'ProjectIdIndex' + } + }, + url: { + type: String, + required: true, + index: { + global: true, + project: true, + rangKey: 'archived', + name: 'URLIndex' + } + }, + archived: {type: String, required: true}, + repoId: {type: String, required: false}, + registeredWebhookId: {type: String, required: false} +}); + +module.exports = schema; diff --git a/models/index.js b/models/index.js index 43390cd..2c88f37 100644 --- a/models/index.js +++ b/models/index.js @@ -40,7 +40,8 @@ const models = { User: dynamoose.model('Topcoder_X.User', require('./User')), CopilotPayment: dynamoose.model('Topcoder_X.CopilotPayment', require('./CopilotPayment')), GithubUserMapping: dynamoose.model('Topcoder_X.GithubUserMapping', require('./GithubUserMapping')), - GitlabUserMapping: dynamoose.model('Topcoder_X.GitlabUserMapping', require('./GitlabUserMapping')) + GitlabUserMapping: dynamoose.model('Topcoder_X.GitlabUserMapping', require('./GitlabUserMapping')), + Repository: dynamoose.model('Topcoder_X.Repository', require('./Repository')) }; /* eslint-enable global-require */ diff --git a/utils/db-helper.js b/utils/db-helper.js index 84b8b54..38425b5 100644 --- a/utils/db-helper.js +++ b/utils/db-helper.js @@ -2,6 +2,7 @@ * Copyright (c) 2018 TopCoder, Inc. All rights reserved. */ 'use strict'; +const models = require('../models'); const logger = require('./logger'); /** @@ -81,16 +82,16 @@ async function queryOneIssue(model, repositoryId, number, provider) { */ 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); + }); }); }); } @@ -319,6 +320,28 @@ async function removeIssue(Model, repositoryId, number, provider) { }); } +/** + * Query one active repository + * @param {Object} model the dynamoose model + * @param {String} url the repository url + * @returns {Promise} + */ +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); + }); + }); +} + module.exports = { getById, scan, @@ -326,6 +349,7 @@ module.exports = { create, update, queryOneActiveProject, + queryOneActiveRepository, queryOneIssue, queryOneUserByType, queryOneUserMappingByGithubUserId,