Skip to content

Commit 56eda4e

Browse files
ThomasKranitsasrakibansary
authored andcommitted
fix(domain-acl): complete activateChallenge
1 parent 480070f commit 56eda4e

File tree

4 files changed

+223
-6
lines changed

4 files changed

+223
-6
lines changed

src/config/constants.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,23 @@
11
export const PhaseStatusIds = {
22
Scheduled: 1,
33
Open: 2,
4-
Closed: 3
4+
Closed: 3,
55
};
66

77
export const PhaseTypeIds = {
88
Submission: 2,
99
Review: 4,
10-
IterativeReview: 18
10+
IterativeReview: 18,
11+
SpecificationSubmission: 13,
1112
};
1213

1314
export const ProjectCategories = {
1415
First2Finish: 38,
15-
}
16+
};
1617

1718
export const ResourceRoleTypeIds = {
1819
IterativeReviewer: 21,
19-
Reviewer: 4
20-
}
20+
Reviewer: 4,
21+
SpecificationSubmitter: 17,
22+
SpecificationReviewer: 18,
23+
};

src/domain/LegacyChallenge.ts

Lines changed: 125 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,136 @@ import {
2323
import { ProjectSchema } from "../schema/project/Project";
2424
import LegacyPhaseDomain from "./Phase";
2525
import LegacyPrizeDomain from "./Prize";
26+
import LegacyProjectInfoDomain from "./ProjectInfo";
2627
import LegacyResourceDomain from "./Resource";
2728
import LegacyReviewDomain from "./Review";
2829

2930
class LegacyChallengeDomain {
3031
public async activateChallenge(input: LegacyChallengeId) {
31-
// TODO: Activate
32+
// update challenge status
33+
await this.update({
34+
projectId: input.legacyChallengeId,
35+
projectStatusId: 1,
36+
modifyUser: 22838965,
37+
}); // TODO: extract user from interceptors
38+
await LegacyProjectInfoDomain.create({
39+
projectInfoTypeId: 62, // Project activate date
40+
value: moment().format("MM.dd.yyyy hh:mm a"),
41+
projectId: input.legacyChallengeId,
42+
});
43+
const { projectPhases } = await LegacyPhaseDomain.getProjectPhases({
44+
projectId: input.legacyChallengeId,
45+
});
46+
const specificationSubmissionPhase = _.find(
47+
projectPhases,
48+
(p) => p.phaseTypeId === PhaseTypeIds.SpecificationSubmission
49+
);
50+
if (specificationSubmissionPhase) {
51+
// Start spec review
52+
await LegacyPhaseDomain.updateProjectPhase({
53+
projectPhaseId: specificationSubmissionPhase.projectPhaseId,
54+
fixedStartTime: "CURRENT",
55+
scheduledStartTime: "CURRENT",
56+
// TODO: @ThomasKranitsas please double check this - I added this line since this required field was missing
57+
phaseStatusId: PhaseStatusIds.Open,
58+
scheduledEndTime: moment()
59+
.add(specificationSubmissionPhase.duration, "milliseconds")
60+
.format("MM-dd-yyyy hh:mm:ss"),
61+
});
62+
// Check if specification submitter doesn't exist
63+
const { resources } = await LegacyResourceDomain.getResources({
64+
projectId: input.legacyChallengeId,
65+
resourceRoleId: ResourceRoleTypeIds.SpecificationSubmitter,
66+
});
67+
if (resources.length === 0) {
68+
// Create spec submitter
69+
const createResourceRes = await LegacyResourceDomain.createResource({
70+
projectId: input.legacyChallengeId,
71+
resourceRoleId: ResourceRoleTypeIds.SpecificationSubmitter,
72+
userId: 22838965, // TODO: extract user from interceptors
73+
});
74+
const specSubmitterId = createResourceRes.kind
75+
? _.get(createResourceRes.kind, createResourceRes.kind?.$case, undefined)
76+
: undefined;
77+
if (!specSubmitterId) throw new Error("Failed to create specification submitter");
78+
79+
// create resource_info
80+
await LegacyResourceDomain.createResourceInfos({
81+
resourceId: specSubmitterId,
82+
resourceInfoTypeId: 2,
83+
value: "tcwebservice", // TODO: Extract from RPC interceptor
84+
});
85+
await LegacyResourceDomain.createResourceInfos({
86+
resourceId: specSubmitterId,
87+
resourceInfoTypeId: 7,
88+
value: "null",
89+
});
90+
await LegacyResourceDomain.createResourceInfos({
91+
resourceId: specSubmitterId,
92+
resourceInfoTypeId: 8,
93+
value: "N/A",
94+
});
95+
await LegacyResourceDomain.createResourceInfos({
96+
resourceId: specSubmitterId,
97+
resourceInfoTypeId: 1,
98+
value: "22838965", // TODO: Extract from RPC interceptor
99+
});
100+
await LegacyResourceDomain.createResourceInfos({
101+
resourceId: specSubmitterId,
102+
resourceInfoTypeId: 6,
103+
value: moment().add().format("MM-dd-yyyy hh:mm:ss"),
104+
});
105+
106+
// create upload
107+
const upload = await LegacyReviewDomain.createUpload({
108+
projectId: input.legacyChallengeId,
109+
uploadStatusId: 1,
110+
uploadTypeId: 1,
111+
parameter: "parameter", // dummy upload so there is no actual file uploaded
112+
resourceId: specSubmitterId,
113+
projectPhaseId: specificationSubmissionPhase.projectPhaseId,
114+
});
115+
// create submission
116+
const uploadId = upload.kind
117+
? _.get(upload.kind, upload.kind?.$case, undefined)
118+
: undefined;
119+
if (!uploadId) throw new Error("Failed to create upload");
120+
const createSubmissionRes = await LegacyReviewDomain.createSubmission({
121+
uploadId,
122+
submissionStatusId: 1,
123+
submissionTypeId: 2,
124+
});
125+
// resource_submission
126+
const submissionId = createSubmissionRes.kind
127+
? _.get(createSubmissionRes.kind, createSubmissionRes.kind?.$case, undefined)
128+
: undefined;
129+
if (!submissionId) throw new Error("Failed to create submission");
130+
await LegacyReviewDomain.createResourceSubmission({
131+
resourceId: specSubmitterId,
132+
submissionId,
133+
});
134+
// update project_info to set autopilot to On
135+
const { projectInfos } = await LegacyProjectInfoDomain.getProjectInfo({
136+
projectId: input.legacyChallengeId,
137+
projectInfoTypeId: 9,
138+
});
139+
if (projectInfos.length === 0) {
140+
await LegacyProjectInfoDomain.create({
141+
projectId: input.legacyChallengeId,
142+
projectInfoTypeId: 9,
143+
value: "On",
144+
createUser: 22838965, // TODO: Extract from RPC interceptors
145+
});
146+
} else {
147+
await LegacyProjectInfoDomain.update({
148+
projectId: input.legacyChallengeId,
149+
projectInfoTypeId: 9,
150+
value: "On",
151+
modifyUser: 22838965, // TODO: Extract from RPC interceptors
152+
});
153+
}
154+
}
155+
}
32156
}
33157

34158
public async closeChallenge(input: CloseChallengeInput) {

src/domain/Review.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { Operator, QueryBuilder } from "@topcoder-framework/client-relational";
22
import { CreateResult } from "@topcoder-framework/lib-common";
33
import _ from "lodash";
44
import { queryRunner } from "../helper/QueryRunner";
5+
import { CreateResourceSubmissionInput } from "../models/domain-layer/legacy/resource_submission";
56
import {
67
CreateReviewInput,
78
CreateReviewItemCommentInput,
@@ -27,6 +28,7 @@ import { ScorecardGroupSchema } from "../schema/project/ScorecardGroup";
2728
import { ScorecardSectionSchema } from "../schema/project/ScorecardSection";
2829
import { SubmissionSchema } from "../schema/project/Submission";
2930
import { UploadSchema } from "../schema/project/Upload";
31+
import { ResourceSubmissionSchema } from "../schema/resource/ResourceSubmission";
3032

3133
class LegacyReviewDomain {
3234
public async createUpload(input: CreateUploadInput): Promise<CreateResult> {
@@ -133,6 +135,25 @@ class LegacyReviewDomain {
133135
};
134136
}
135137

138+
public async createResourceSubmission(
139+
input: CreateResourceSubmissionInput
140+
): Promise<CreateResult> {
141+
const createInput = {
142+
...input,
143+
createUser: 22838965, // tcwebservice | TODO: Get using grpc interceptor
144+
modifyUser: 22838965, // tcwebservice | TODO: Get using grpc interceptor
145+
};
146+
const { lastInsertId } = await queryRunner.run(
147+
new QueryBuilder(ResourceSubmissionSchema).insert(createInput).build()
148+
);
149+
return {
150+
kind: {
151+
$case: "integerId",
152+
integerId: lastInsertId!,
153+
},
154+
};
155+
}
156+
136157
public async createReview(input: CreateReviewInput): Promise<CreateResult> {
137158
const createInput = {
138159
...input,

src/models/domain-layer/legacy/resource_submission.ts

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ export interface ResourceSubmission {
1111
modifyDate: number;
1212
}
1313

14+
export interface CreateResourceSubmissionInput {
15+
resourceId: number;
16+
submissionId: number;
17+
}
18+
1419
function createBaseResourceSubmission(): ResourceSubmission {
1520
return { resourceId: 0, submissionId: 0, createUser: 0, createDate: 0, modifyUser: 0, modifyDate: 0 };
1621
}
@@ -109,6 +114,70 @@ export const ResourceSubmission = {
109114
},
110115
};
111116

117+
function createBaseCreateResourceSubmissionInput(): CreateResourceSubmissionInput {
118+
return { resourceId: 0, submissionId: 0 };
119+
}
120+
121+
export const CreateResourceSubmissionInput = {
122+
encode(message: CreateResourceSubmissionInput, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
123+
if (message.resourceId !== 0) {
124+
writer.uint32(8).int32(message.resourceId);
125+
}
126+
if (message.submissionId !== 0) {
127+
writer.uint32(16).int32(message.submissionId);
128+
}
129+
return writer;
130+
},
131+
132+
decode(input: _m0.Reader | Uint8Array, length?: number): CreateResourceSubmissionInput {
133+
const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input);
134+
let end = length === undefined ? reader.len : reader.pos + length;
135+
const message = createBaseCreateResourceSubmissionInput();
136+
while (reader.pos < end) {
137+
const tag = reader.uint32();
138+
switch (tag >>> 3) {
139+
case 1:
140+
message.resourceId = reader.int32();
141+
break;
142+
case 2:
143+
message.submissionId = reader.int32();
144+
break;
145+
default:
146+
reader.skipType(tag & 7);
147+
break;
148+
}
149+
}
150+
return message;
151+
},
152+
153+
fromJSON(object: any): CreateResourceSubmissionInput {
154+
return {
155+
resourceId: isSet(object.resourceId) ? Number(object.resourceId) : 0,
156+
submissionId: isSet(object.submissionId) ? Number(object.submissionId) : 0,
157+
};
158+
},
159+
160+
toJSON(message: CreateResourceSubmissionInput): unknown {
161+
const obj: any = {};
162+
message.resourceId !== undefined && (obj.resourceId = Math.round(message.resourceId));
163+
message.submissionId !== undefined && (obj.submissionId = Math.round(message.submissionId));
164+
return obj;
165+
},
166+
167+
create<I extends Exact<DeepPartial<CreateResourceSubmissionInput>, I>>(base?: I): CreateResourceSubmissionInput {
168+
return CreateResourceSubmissionInput.fromPartial(base ?? {});
169+
},
170+
171+
fromPartial<I extends Exact<DeepPartial<CreateResourceSubmissionInput>, I>>(
172+
object: I,
173+
): CreateResourceSubmissionInput {
174+
const message = createBaseCreateResourceSubmissionInput();
175+
message.resourceId = object.resourceId ?? 0;
176+
message.submissionId = object.submissionId ?? 0;
177+
return message;
178+
},
179+
};
180+
112181
declare var self: any | undefined;
113182
declare var window: any | undefined;
114183
declare var global: any | undefined;

0 commit comments

Comments
 (0)