|
| 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