Skip to content

Commit adcb9c4

Browse files
committed
refactor: challenge interfaces
2 parents 3ee328f + 5809268 commit adcb9c4

30 files changed

+2848
-326
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
"lodash": "^4.17.21",
2525
"moment": "^2.29.4",
2626
"source-map-support": "^0.5.21",
27-
"topcoder-interface": "github:topcoder-platform/plat-interface-definition#v0.0.13",
27+
"topcoder-interface": "github:topcoder-platform/plat-interface-definition#v0.0.14",
2828
"uuidv4": "^6.2.13"
2929
},
3030
"devDependencies": {

src/config/constants.ts

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,48 @@ export const ProjectCategories = {
1616
};
1717

1818
export const ResourceRoleTypeIds = {
19-
IterativeReviewer: 21,
19+
Submitter: 1,
20+
PrimaryScreener: 2,
21+
Screener: 3,
2022
Reviewer: 4,
23+
Approver: 10,
24+
Designer: 11,
25+
Observer: 12,
26+
Manager: 13,
27+
Copilot: 14,
28+
ClientManager: 15,
29+
PostMortemReviewer: 16,
2130
SpecificationSubmitter: 17,
2231
SpecificationReviewer: 18,
32+
CheckpointScreener: 19,
33+
CheckpointReviewer: 20,
34+
IterativeReviewer: 21,
35+
};
36+
37+
export const ResourceInfoTypeIds = {
38+
ExternalReferenceId: 1,
39+
Handle: 2,
40+
Email: 3,
41+
Rating: 4,
42+
Reliability: 5,
43+
RegistrationDate: 6,
44+
Payment: 7,
45+
PaymentStatus: 8,
46+
ScreeningScore: 9,
47+
InitialScore: 10,
48+
FinalScore: 11,
49+
Placement: 12,
50+
AppealsCompletedEarly: 13,
51+
SVNPermissionAdded: 14,
52+
ManualPayments: 15,
2353
};
54+
55+
export type ResourceInfoTypeIds = keyof typeof ResourceInfoTypeIds;
56+
57+
export const ObserverResourceInfoToAdd: ResourceInfoTypeIds[] = [
58+
"ExternalReferenceId",
59+
"Handle",
60+
"RegistrationDate",
61+
"PaymentStatus",
62+
"AppealsCompletedEarly",
63+
];

src/domain/LegacyChallenge.ts

Lines changed: 153 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,19 @@ import {
22
Operator as RelationalOperator,
33
QueryBuilder,
44
} from "@topcoder-framework/client-relational";
5-
import { Operator, CheckExistsResult } from "@topcoder-framework/lib-common";
5+
import { CheckExistsResult, CreateResult, Operator } from "@topcoder-framework/lib-common";
66
import _ from "lodash";
77
import moment from "moment";
88
import {
99
PhaseStatusIds,
1010
PhaseTypeIds,
1111
ProjectCategories,
12+
ResourceInfoTypeIds,
1213
ResourceRoleTypeIds,
1314
} from "../config/constants";
15+
import ChallengeHelper from "../helper/ChallengeHelper";
1416
import { queryRunner } from "../helper/QueryRunner";
17+
import UserHelper from "../helper/UserHelper";
1518
import {
1619
CloseChallengeInput,
1720
CreateChallengeInput,
@@ -20,12 +23,14 @@ import {
2023
UpdateChallengeInput,
2124
} from "../models/domain-layer/legacy/challenge";
2225
import { ProjectSchema } from "../schema/project/Project";
23-
import LegacyPhaseDomain from "./Phase";
26+
import LegacyPhaseDomain from "./LegacyPhase";
2427
import LegacyPrizeDomain from "./Prize";
2528
import LegacyProjectInfoDomain from "./ProjectInfo";
2629
import LegacyResourceDomain from "./Resource";
2730
import LegacyReviewDomain from "./Review";
2831

32+
const TCWEBSERVICE: number = 22838965;
33+
2934
class LegacyChallengeDomain {
3035
public async activateChallenge(input: LegacyChallengeId) {
3136
// update challenge status
@@ -394,6 +399,151 @@ class LegacyChallengeDomain {
394399
}
395400
}
396401

402+
public async create(input: CreateChallengeInput): Promise<CreateResult> {
403+
const transaction = queryRunner.beginTransaction();
404+
405+
// insert record in project
406+
const createProjectQuery = ChallengeHelper.getChallengeCreateQuery(
407+
{
408+
projectCategoryId: input.projectCategoryId,
409+
projectStatusId: input.projectStatusId,
410+
tcDirectProjectId: input.tcDirectProjectId,
411+
},
412+
TCWEBSERVICE
413+
);
414+
415+
const createQueryResult = await transaction.add(createProjectQuery);
416+
417+
if (createQueryResult instanceof Error) {
418+
transaction.rollback();
419+
throw createQueryResult;
420+
}
421+
422+
const projectId = createQueryResult.lastInsertId!;
423+
424+
// insert record(s) in prize
425+
const createPrizeQueries = ChallengeHelper.getPrizeCreateQueries(
426+
projectId,
427+
input.winnerPrizes,
428+
TCWEBSERVICE
429+
);
430+
431+
for (const q of createPrizeQueries) {
432+
await transaction.add(q);
433+
}
434+
435+
// insert record(s) in project_info
436+
const createProjectInfoQueries = ChallengeHelper.getChallengeInfoCreateQueries(
437+
projectId,
438+
input.projectInfo,
439+
TCWEBSERVICE
440+
);
441+
442+
for (const q of createProjectInfoQueries) {
443+
await transaction.add(q);
444+
}
445+
446+
// insert record(s) in project_phase
447+
for (const phase of input.phases) {
448+
const createPhaseQuery = ChallengeHelper.getPhaseCreateQuery(projectId, phase, TCWEBSERVICE);
449+
const createPhaseResult = await transaction.add(createPhaseQuery);
450+
if (createPhaseResult instanceof Error) {
451+
transaction.rollback();
452+
throw createPhaseResult;
453+
}
454+
const projectPhaseId = createPhaseResult.lastInsertId!;
455+
// insert record(s) into phase_criteria
456+
const createPhaseCriteriaQueries = ChallengeHelper.getPhaseCriteriaCreateQueries(
457+
projectPhaseId,
458+
phase.phaseCriteria,
459+
TCWEBSERVICE
460+
);
461+
for (const q of createPhaseCriteriaQueries) {
462+
await transaction.add(q);
463+
}
464+
}
465+
466+
const getObserversToAddQuery = ChallengeHelper.getDirectProjectListUserQuery(
467+
input.tcDirectProjectId
468+
);
469+
const getObserversToAddResult = await transaction.add(getObserversToAddQuery);
470+
if (getObserversToAddResult instanceof Error) {
471+
transaction.rollback();
472+
throw getObserversToAddResult;
473+
}
474+
475+
const adminsToAdd = getObserversToAddResult?.rows
476+
?.map((o) => ({
477+
userId: o["user_id"],
478+
handle: o["handle"],
479+
role: ResourceRoleTypeIds.Observer,
480+
}))
481+
.concat([
482+
{ userId: 22770213, handle: "Applications", role: ResourceRoleTypeIds.Manager },
483+
{ userId: TCWEBSERVICE, handle: "tcwebservice", role: ResourceRoleTypeIds.Manager },
484+
]);
485+
486+
const copilot = input.copilot;
487+
488+
if (copilot != null) {
489+
const getCopilotHandleQuery = UserHelper.getUserHandleQuery(copilot.userId);
490+
const getCopilotHandleResult = await transaction.add(getCopilotHandleQuery);
491+
if (getCopilotHandleResult instanceof Error || getCopilotHandleResult.rows?.length != 1) {
492+
transaction.rollback();
493+
throw getCopilotHandleResult;
494+
}
495+
adminsToAdd?.push({
496+
userId: copilot.userId,
497+
handle: getCopilotHandleResult.rows[0].handleLower,
498+
role: ResourceRoleTypeIds.Copilot,
499+
});
500+
}
501+
502+
for (const { userId, handle, role } of adminsToAdd!) {
503+
const createResourceQuery = ChallengeHelper.getResourceCreateQuery(
504+
projectId,
505+
userId,
506+
role,
507+
undefined,
508+
TCWEBSERVICE
509+
);
510+
const result = await transaction.add(createResourceQuery);
511+
if (result instanceof Error) {
512+
transaction.rollback();
513+
throw result;
514+
}
515+
const resourceId = result.lastInsertId!;
516+
const createResourceInfoQueries = ChallengeHelper.getObserverResourceInfoCreateQueries(
517+
resourceId,
518+
userId,
519+
handle,
520+
TCWEBSERVICE
521+
);
522+
523+
for (const q of createResourceInfoQueries) {
524+
await transaction.add(q);
525+
}
526+
if (role === ResourceRoleTypeIds.Copilot && copilot != null) {
527+
const createCopilotResourceInfoQuery = ChallengeHelper.getResourceInfoCreateQuery(
528+
resourceId,
529+
ResourceInfoTypeIds.Payment,
530+
"" + copilot.fee,
531+
TCWEBSERVICE
532+
);
533+
await transaction.add(createCopilotResourceInfoQuery);
534+
}
535+
}
536+
537+
transaction.commit();
538+
539+
return {
540+
kind: {
541+
$case: "integerId",
542+
integerId: projectId,
543+
},
544+
};
545+
}
546+
397547
public async update(input: UpdateChallengeInput) {
398548
await queryRunner.run(
399549
new QueryBuilder(ProjectSchema)
@@ -426,7 +576,7 @@ class LegacyChallengeDomain {
426576
return LegacyChallenge.fromPartial(rows[0] as LegacyChallenge);
427577
}
428578

429-
public async checkChallengeExists(legacyChallengeId: number): Promise<CheckExistsResult> {
579+
public async checkExists(legacyChallengeId: number): Promise<CheckExistsResult> {
430580
const { projectId } = ProjectSchema.columns;
431581

432582
const query = new QueryBuilder(ProjectSchema)
@@ -446,30 +596,6 @@ class LegacyChallengeDomain {
446596
exists: rows?.length == 1,
447597
};
448598
}
449-
450-
public async createLegacyChallenge(input: CreateChallengeInput): Promise<number> {
451-
const transaction = queryRunner.beginTransaction();
452-
453-
const createLegacyChallengeQuery = new QueryBuilder(ProjectSchema)
454-
.insert({
455-
projectStatusId: input.projectStatusId,
456-
projectCategoryId: input.projectCategoryId,
457-
tcDirectProjectId: input.tcDirectProjectId,
458-
})
459-
.build();
460-
461-
const createLegacyChallengeQueryResult = await transaction.add(createLegacyChallengeQuery);
462-
if (createLegacyChallengeQueryResult instanceof Error) {
463-
transaction.rollback();
464-
return Promise.reject({
465-
message: "Failed to create legacy challenge",
466-
});
467-
}
468-
469-
const { lastInsertId: legacyChallengeId } = createLegacyChallengeQueryResult;
470-
471-
return Promise.resolve(legacyChallengeId!);
472-
}
473599
}
474600

475601
export default new LegacyChallengeDomain();

src/domain/LegacyChallengePayment.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
LegacyChallengePayment,
1010
LegacyChallengePaymentList,
1111
UpdateLegacyChallengePaymentInput,
12-
} from "../../dist/models/domain-layer/legacy/challenge_payment";
12+
} from "../models/domain-layer/legacy/challenge_payment";
1313
import { ProjectPaymentSchema } from "../schema/project_payment/ProjectPayment";
1414

1515
class LegacyPaymentDomain {
File renamed without changes.

src/domain/Term.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
ProjectRoleTermsOfUseXref,
1010
ProjectRoleTermsOfUseXrefList,
1111
} from "../models/domain-layer/legacy/term";
12-
import { ProjectRoleTermsOfUseXrefSchema } from "../schema/term/Term";
12+
import { ProjectRoleTermsOfUseXrefSchema } from "../schema/Term/Term";
1313

1414
class LegacyTermDomain {
1515
public async getProjectRoleTermsOfUseXrefs(

0 commit comments

Comments
 (0)