diff --git a/services/IssueService.js b/services/IssueService.js index fb53c2a..183959b 100755 --- a/services/IssueService.js +++ b/services/IssueService.js @@ -68,11 +68,7 @@ async function ensureChallengeExists(event, issue, create = true) { logger.debug(`Enter ensureChallengeExists. provider: ${issue.provider}`); logger.debug(`Enter ensureChallengeExists. repositoryId: ${issue.repositoryId}`); - let dbIssue = await dbHelper.queryOne(models.Issue, { - number: issue.number, - provider: issue.provider, - repositoryId: issue.repositoryId - }); + let dbIssue = await dbHelper.queryOneIssue(models.Issue, issue.repositoryId, issue.number, issue.provider); logger.debug(`DB Issue number: ${issue.number}`); logger.debug(`DB Issue provider: ${issue.provider}`); logger.debug(`DB Issue repository: ${issue.repositoryId}`); @@ -82,11 +78,7 @@ async function ensureChallengeExists(event, issue, create = true) { } if (dbIssue && dbIssue.status === 'challenge_creation_failed') { // remove issue from db - await dbHelper.remove(models.Issue, { - number: issue.number, - provider: issue.provider, - repositoryId: issue.repositoryId - }, true); + await dbHelper.removeIssue(models.Issue, issue.repositoryId, issue.number, issue.provider); dbIssue = null; } @@ -94,11 +86,7 @@ async function ensureChallengeExists(event, issue, create = true) { logger.debug('dbIssue is NULL, process to create new record and challenge'); await handleIssueCreate(event, issue); - dbIssue = await dbHelper.queryOne(models.Issue, { - number: issue.number, - provider: issue.provider, - repositoryId: issue.repositoryId - }); + dbIssue = await dbHelper.queryOneIssue(models.Issue, issue.repositoryId, issue.number, issue.provider); logger.debug(`dbIssue is CREATED ${dbIssue ? 'Succesfully' : 'Failed'}`); } return dbIssue; @@ -551,11 +539,7 @@ async function handleIssueCreate(event, issue, recreate = false) { }// if existing found don't create a project // Check if duplicated - let dbIssue = await dbHelper.queryOne(models.Issue, { - number: issue.number, - provider: issue.provider, - repositoryId: issue.repositoryId - }); + let dbIssue = await dbHelper.queryOneIssue(models.Issue, issue.repositoryId, issue.number, issue.provider); if (dbIssue) { throw new Error( @@ -599,11 +583,7 @@ async function handleIssueCreate(event, issue, recreate = false) { }); } catch (e) { logger.error(`Challenge creation failure: ${e}`); - await dbHelper.remove(models.Issue, { - number: issue.number, - provider: issue.provider, - repositoryId: issue.repositoryId - }, true); + await dbHelper.removeIssue(models.Issue, issue.repositoryId, issue.number, issue.provider); await eventService.handleEventGracefully(event, issue, e); return; } @@ -745,11 +725,7 @@ async function handleIssueUnAssignment(event, issue) { * @private */ async function handleIssueRecreate(event, issue) { - const dbIssue = await dbHelper.queryOne(models.Issue, { - number: issue.number, - provider: issue.provider, - repositoryId: issue.repositoryId - }); + const dbIssue = await dbHelper.queryOneIssue(models.Issue, issue.repositoryId, issue.number, issue.provider); try { await dbIssue.delete(); diff --git a/utils/db-helper.js b/utils/db-helper.js index 6785b5b..816dafa 100644 --- a/utils/db-helper.js +++ b/utils/db-helper.js @@ -2,7 +2,6 @@ * Copyright (c) 2018 TopCoder, Inc. All rights reserved. */ 'use strict'; -const _ = require('lodash'); const logger = require('./logger'); /** @@ -50,21 +49,25 @@ async function scan(model, scanParams) { /** * Get single data by query parameters * @param {Object} model The dynamoose model to query - * @param {Object} params The parameters object + * @param {String} repositoryId The repository id to query + * @param {Number} number The number id to query + * @param {String} provider The provider id to query * @returns {Promise<void>} */ -async function queryOne(model, params) { +async function queryOneIssue(model, repositoryId, number, provider) { logger.debug('Enter queryOne.'); return await new Promise((resolve, reject) => { - const queryParams = {}; - - _.forOwn(params, (value, key) => { - queryParams[key] = {eq: value}; - }); - - logger.debug(`${JSON.stringify(queryParams)}`); - model.queryOne(queryParams).exec((err, result) => { + logger.debug(`repositoryId : ${repositoryId}`); + logger.debug(`number : ${number}`); + logger.debug(`provider : ${provider}`); + model.query('repositoryId').eq(repositoryId) + .filter('number') + .eq(number) + .filter('provider') + .eq(provider) + .all() + .exec((err, result) => { if (err) { logger.debug(`queryOne. Error. ${err}`); return reject(err); @@ -72,7 +75,7 @@ async function queryOne(model, params) { logger.debug('queryOne. Result.'); logger.debug(result); - return resolve(result); + return resolve(result.count === 0 ? null : result[0]); }); }); } @@ -163,15 +166,31 @@ async function update(Model, id, data) { * Delete item in database * @param {Object} Model The dynamoose model to delete * @param {Object} queryParams The query parameters object - * @param {Boolean} withQuery Find the object with query instead of scan */ -async function remove(Model, queryParams, withQuery = false) { - let dbItem; - if (withQuery) { - dbItem = await queryOne(Model, queryParams); - } else { - dbItem = await scanOne(Model, queryParams); - } +async function remove(Model, queryParams) { + const dbItem = await scanOne(Model, queryParams); + await new Promise((resolve, reject) => { + if (dbItem != null) { + dbItem.delete((err) => { + if (err) { + return reject(err); + } + + return resolve(dbItem); + }); + } + }); +} + +/** + * Delete issue item in database + * @param {Object} Model The dynamoose model to delete + * @param {String} repositoryId The repository id to delete + * @param {Number} number The number id to delete + * @param {String} provider The provider id to delete + */ +async function removeIssue(Model, repositoryId, number, provider) { + const dbItem = await queryOneIssue(Model, repositoryId, number, provider); await new Promise((resolve, reject) => { if (dbItem != null) { dbItem.delete((err) => { @@ -193,5 +212,6 @@ module.exports = { create, update, remove, - queryOne + queryOneIssue, + removeIssue };