|
| 1 | +// eslint-disable-line max-lines |
| 2 | +const _ = require('lodash'); |
1 | 3 | const logger = require('./logger'); |
| 4 | +const models = require('../models'); |
2 | 5 |
|
3 | 6 | /* |
4 | 7 | * Copyright (c) 2018 TopCoder, Inc. All rights reserved. |
@@ -67,6 +70,50 @@ async function scan(model, scanParams) { |
67 | 70 | }); |
68 | 71 | } |
69 | 72 |
|
| 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 | + |
70 | 117 | /** |
71 | 118 | * Get single data by query parameters |
72 | 119 | * @param {Object} model The dynamoose model to query |
@@ -171,16 +218,16 @@ async function queryOneUserMappingByTCUsername(model, tcusername) { |
171 | 218 | */ |
172 | 219 | async function queryOneActiveProject(model, repoUrl) { |
173 | 220 | 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 | + }); |
184 | 231 | }); |
185 | 232 | }); |
186 | 233 | } |
@@ -268,18 +315,16 @@ async function queryOneUserTeamMapping(model, teamId, githubUserName, githubOrgI |
268 | 315 | */ |
269 | 316 | async function queryOneActiveProjectWithFilter(model, repoUrl, projectIdToFilter) { |
270 | 317 | 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 | + }); |
283 | 328 | }); |
284 | 329 | }); |
285 | 330 | } |
@@ -387,22 +432,138 @@ async function queryOneOrganisation(model, organisation) { |
387 | 432 | }); |
388 | 433 | } |
389 | 434 |
|
| 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 | + |
390 | 544 | module.exports = { |
391 | 545 | getById, |
392 | 546 | getByKey, |
393 | 547 | scan, |
| 548 | + scanAll, |
| 549 | + scanAllWithSearch, |
394 | 550 | create, |
395 | 551 | update, |
396 | 552 | removeById, |
397 | 553 | removeUser, |
| 554 | + populateRepoUrls, |
| 555 | + queryActiveRepositoriesExcludeByProjectId, |
398 | 556 | queryOneActiveCopilotPayment, |
399 | 557 | queryOneActiveProject, |
400 | 558 | queryOneActiveProjectWithFilter, |
| 559 | + queryOneActiveRepository, |
401 | 560 | queryOneOrganisation, |
402 | 561 | queryOneIssue, |
403 | 562 | queryOneUserByType, |
404 | 563 | queryOneUserByTypeAndRole, |
405 | 564 | queryOneUserGroupMapping, |
406 | 565 | queryOneUserTeamMapping, |
407 | | - queryOneUserMappingByTCUsername |
| 566 | + queryOneUserMappingByTCUsername, |
| 567 | + queryRepositoriesByProjectId, |
| 568 | + queryRepositoryByProjectIdFilterUrl |
408 | 569 | }; |
0 commit comments