diff --git a/services/IssueService.js b/services/IssueService.js index bae4f1d..fb53c2a 100755 --- a/services/IssueService.js +++ b/services/IssueService.js @@ -68,7 +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.scanOne(models.Issue, { + let dbIssue = await dbHelper.queryOne(models.Issue, { number: issue.number, provider: issue.provider, repositoryId: issue.repositoryId @@ -86,7 +86,7 @@ async function ensureChallengeExists(event, issue, create = true) { number: issue.number, provider: issue.provider, repositoryId: issue.repositoryId - }); + }, true); dbIssue = null; } @@ -94,7 +94,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.scanOne(models.Issue, { + dbIssue = await dbHelper.queryOne(models.Issue, { number: issue.number, provider: issue.provider, repositoryId: issue.repositoryId @@ -551,7 +551,7 @@ async function handleIssueCreate(event, issue, recreate = false) { }// if existing found don't create a project // Check if duplicated - let dbIssue = await dbHelper.scanOne(models.Issue, { + let dbIssue = await dbHelper.queryOne(models.Issue, { number: issue.number, provider: issue.provider, repositoryId: issue.repositoryId @@ -603,7 +603,7 @@ async function handleIssueCreate(event, issue, recreate = false) { number: issue.number, provider: issue.provider, repositoryId: issue.repositoryId - }); + }, true); await eventService.handleEventGracefully(event, issue, e); return; } @@ -745,7 +745,7 @@ async function handleIssueUnAssignment(event, issue) { * @private */ async function handleIssueRecreate(event, issue) { - const dbIssue = await dbHelper.scanOne(models.Issue, { + const dbIssue = await dbHelper.queryOne(models.Issue, { number: issue.number, provider: issue.provider, repositoryId: issue.repositoryId diff --git a/utils/db-helper.js b/utils/db-helper.js index 40fe1c5..6785b5b 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 _ = require('lodash'); const logger = require('./logger'); /** @@ -46,6 +47,36 @@ 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 + * @returns {Promise<void>} + */ +async function queryOne(model, params) { + 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) => { + if (err) { + logger.debug(`queryOne. Error. ${err}`); + return reject(err); + } + logger.debug('queryOne. Result.'); + logger.debug(result); + + return resolve(result); + }); + }); +} + /** * Get single data by scan parameters * @param {Object} model The dynamoose model to scan @@ -132,9 +163,15 @@ 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) { - const dbItem = await scanOne(Model, queryParams); +async function remove(Model, queryParams, withQuery = false) { + let dbItem; + if (withQuery) { + dbItem = await queryOne(Model, queryParams); + } else { + dbItem = await scanOne(Model, queryParams); + } await new Promise((resolve, reject) => { if (dbItem != null) { dbItem.delete((err) => { @@ -155,5 +192,6 @@ module.exports = { updateMany, create, update, - remove + remove, + queryOne };