Skip to content

Commit 664f8f2

Browse files
authored
feature: legacy challenge definitions (#2)
* feat: add project, resource, payment schema * fix: use id_column, id_sequence from schema definition * feat: use @topcoder-framework/lib-client for rdb types * feat: switch to @topcoder-framework/lib-common and @topcoder-framwork/client-relational Signed-off-by: Rakib Ansary <rakibansary@gmail.com> * feat: add type information to schema * feat(legacy-challenge): use client-rdb from topcoder-framework --------- Signed-off-by: Rakib Ansary <rakibansary@gmail.com>
1 parent ca79250 commit 664f8f2

38 files changed

+2938
-155
lines changed

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616
"license": "ISC",
1717
"dependencies": {
1818
"@grpc/grpc-js": "^1.7.1",
19-
"@topcoder-framework/client-relational": "^0.4.23-ci.0",
20-
"@topcoder-framework/lib-common": "^0.4.23-ci.0",
19+
"@topcoder-framework/client-relational": "^0.4.24-ci.0",
20+
"@topcoder-framework/lib-common": "^0.4.24-ci.0",
2121
"dayjs": "^1.11.5",
2222
"dotenv": "^16.0.3",
2323
"grpc-server-reflection": "^0.1.5",

src/domain/LegacyChallenge.ts

Lines changed: 57 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,76 +1,75 @@
1-
import { ColumnType, Operator, QueryRequest } from "@topcoder-framework/client-relational";
2-
import { Value } from "@topcoder-framework/lib-common";
3-
import { QueryRunner } from "../common/QueryRunner";
4-
import { CheckChallengeExistsResponse } from "../models/domain-layer/legacy/challenge";
5-
import { Project } from "../schema/project/Project";
1+
import { Operator, QueryBuilder } from "@topcoder-framework/client-relational";
2+
import { queryRunner } from "../helper/QueryRunner";
3+
import {
4+
CheckChallengeExistsResponse,
5+
CreateChallengeInput,
6+
} from "../models/domain-layer/legacy/challenge";
7+
import { ProjectSchema } from "../schema/project/Project";
68

79
class LegacyChallengeDomain {
810
public async checkChallengeExists(
911
legacyChallengeId: number
1012
): Promise<CheckChallengeExistsResponse> {
11-
const challenges = (await new QueryRunner(Project)
12-
.select([Project.columns.projectId])
13-
.where({
14-
key: "project_id",
15-
operator: Operator.OPERATOR_EQUAL,
13+
const { projectId } = ProjectSchema.columns;
14+
15+
const query = new QueryBuilder(ProjectSchema)
16+
.select(projectId)
17+
.where(projectId, Operator.OPERATOR_EQUAL, {
1618
value: {
17-
value: {
18-
$case: "intValue",
19-
intValue: legacyChallengeId,
20-
},
19+
$case: "intValue",
20+
intValue: legacyChallengeId,
2121
},
2222
})
2323
.limit(1)
24-
.offset(0)
25-
.exec()) as [
26-
{
27-
values: {
28-
projectId: Value;
29-
};
30-
}
31-
];
24+
.build();
25+
26+
const { rows } = await queryRunner.run(query);
3227

3328
return {
34-
exists: challenges.length == 1,
29+
exists: rows?.length == 1,
3530
};
3631
}
3732

38-
public async listAvailableChallengeInfoTypes(key: string): Promise<number> {
39-
const queryRequest: QueryRequest = {
40-
query: {
41-
query: {
42-
$case: "select",
43-
select: {
44-
table: "project_info_type_lu",
45-
join: [],
46-
column: [
47-
{
48-
name: "",
49-
type: ColumnType.COLUMN_TYPE_INT,
50-
},
51-
],
52-
where: [
53-
{
54-
key: "name",
55-
operator: Operator.OPERATOR_EQUAL,
56-
value: {
57-
value: {
58-
$case: "stringValue",
59-
stringValue: key,
60-
},
61-
},
62-
},
63-
],
64-
groupBy: [],
65-
orderBy: [],
66-
limit: 1,
67-
offset: 0,
68-
},
69-
},
70-
},
71-
};
72-
return Promise.resolve(10);
33+
public async createLegacyChallenge(input: CreateChallengeInput): Promise<number> {
34+
return Promise.resolve(123);
7335
}
36+
37+
// public async listAvailableChallengeInfoTypes(key: string): Promise<number> {
38+
// const queryRequest: QueryRequest = {
39+
// query: {
40+
// query: {
41+
// $case: "select",
42+
// select: {
43+
// table: "project_info_type_lu",
44+
// join: [],
45+
// column: [
46+
// {
47+
// name: "",
48+
// type: ColumnType.COLUMN_TYPE_INT,
49+
// },
50+
// ],
51+
// where: [
52+
// {
53+
// key: "name",
54+
// operator: Operator.OPERATOR_EQUAL,
55+
// value: {
56+
// value: {
57+
// $case: "stringValue",
58+
// stringValue: key,
59+
// },
60+
// },
61+
// },
62+
// ],
63+
// groupBy: [],
64+
// orderBy: [],
65+
// limit: 1,
66+
// offset: 0,
67+
// },
68+
// },
69+
// },
70+
// };
71+
// return Promise.resolve(10);
72+
// }
7473
}
7574

7675
export default new LegacyChallengeDomain();

src/domain/LegacyChallengePhase.ts

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
import { QueryRunner } from "../common/QueryRunner";
2-
import { Value } from "@topcoder-framework/client-relational";
1+
import { QueryBuilder } from "@topcoder-framework/client-relational";
2+
import { CreateResult } from "@topcoder-framework/lib-common";
3+
import { queryRunner } from "../helper/QueryRunner";
34
import { CreatePhaseInput, PhaseTypeList } from "../models/domain-layer/legacy/challenge_phase";
4-
import { PhaseType } from "../schema/project/PhaseType";
5+
import { PhaseTypeSchema } from "../schema/project/PhaseType";
56
import { ProjectPhaseSchema } from "../schema/project/ProjectPhase";
6-
import { CreateResult } from "@topcoder-framework/lib-common";
77

88
class LegacyChallengePhaseDomain {
99
public async create(input: CreatePhaseInput): Promise<CreateResult> {
@@ -13,34 +13,28 @@ class LegacyChallengePhaseDomain {
1313
modifyUser: 22838965, // tcwebservice | TODO: Get using grpc interceptor
1414
};
1515

16-
const phaseId = (await new QueryRunner(ProjectPhaseSchema)
17-
.insert(createInput)
18-
.exec()) as number;
16+
const { lastInsertId: phaseId } = await queryRunner.run(
17+
new QueryBuilder(ProjectPhaseSchema).insert(createInput).build()
18+
);
1919

2020
return {
2121
kind: {
2222
$case: "integerId",
23-
integerId: phaseId,
23+
integerId: phaseId!,
2424
},
2525
};
2626
}
2727

2828
public async getPhaseTypes(): Promise<PhaseTypeList> {
29-
const projectPhases = (await new QueryRunner(PhaseType)
30-
.select([PhaseType.columns.phaseTypeId, PhaseType.columns.name])
29+
const query = new QueryBuilder(PhaseTypeSchema)
30+
.select(PhaseTypeSchema.columns.phaseTypeId, PhaseTypeSchema.columns.name)
3131
.limit(500)
32-
.offset(0)
33-
.exec()) as [
34-
{
35-
values: {
36-
phase_type_id: Value;
37-
name: Value;
38-
};
39-
}
40-
];
32+
.build();
33+
34+
const { rows: projectPhases } = await queryRunner.run(query);
4135

4236
const list: PhaseTypeList = {
43-
items: projectPhases.map(({ values }) => {
37+
items: projectPhases!.map(({ values }) => {
4438
return {
4539
phaseTypeId:
4640
values.phase_type_id.value?.$case === "intValue"

src/domain/Prize.ts

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
import { QueryBuilder } from "@topcoder-framework/client-relational";
2+
import { CreateResult, ScanCriteria } from "@topcoder-framework/lib-common";
3+
import { queryRunner } from "../helper/QueryRunner";
4+
import { CreatePrizeInput, Prize, PrizeList } from "../models/domain-layer/legacy/prize";
5+
import { PrizeSchema } from "../schema/project_payment/Prize";
6+
7+
class PrizeDomain {
8+
public async create(input: CreatePrizeInput): Promise<CreateResult> {
9+
const createInput: Partial<Prize> = {
10+
...input,
11+
createUser: 22838965, // tcwebservice | TODO: Get using grpc interceptor
12+
modifyUser: 22838965, // tcwebservice | TODO: Get using grpc interceptor
13+
};
14+
15+
const { lastInsertId: prizeId } = await queryRunner.run(
16+
new QueryBuilder<CreatePrizeInput>(PrizeSchema).insert(createInput).build()
17+
);
18+
19+
return {
20+
kind: {
21+
$case: "integerId",
22+
integerId: prizeId!,
23+
},
24+
};
25+
}
26+
27+
public async scan(criteria: ScanCriteria): Promise<PrizeList> {
28+
const { rows: prizes } = await queryRunner.run(
29+
new QueryBuilder(PrizeSchema)
30+
.select(
31+
PrizeSchema.columns.prizeId,
32+
PrizeSchema.columns.prizeTypeId,
33+
PrizeSchema.columns.prizeAmount,
34+
PrizeSchema.columns.place,
35+
PrizeSchema.columns.numberOfSubmissions,
36+
PrizeSchema.columns.projectId,
37+
PrizeSchema.columns.createDate,
38+
PrizeSchema.columns.createUser,
39+
PrizeSchema.columns.modifyDate,
40+
PrizeSchema.columns.modifyUser
41+
)
42+
.build()
43+
);
44+
45+
// const prizes = (await new QueryRunner(PrizeSchema).select([]).limit(10).offset(0).exec()) as [
46+
// {
47+
// values: {
48+
// prize_id: Value;
49+
// prize_type_id: number;
50+
// prize_amount: Value;
51+
// place: number;
52+
// number_of_submissions: number;
53+
// prize_description: string;
54+
// project_id: number;
55+
// create_date: number;
56+
// create_user: number;
57+
// modify_date: number;
58+
// modify_user: number;
59+
// };
60+
// }
61+
// ];
62+
63+
console.log("prizes", prizes);
64+
65+
const list: PrizeList = {
66+
prizes: [],
67+
// prizes: prizes!.map(({ values }) => {
68+
// return {
69+
// place: values.place,
70+
// numberOfSubmissions: values.number_of_submissions,
71+
// prizeDescription: values.prize_description,
72+
// projectId: values.project_id,
73+
// createDate: values.create_date,
74+
// createUser: values.create_user,
75+
// modifyDate: values.modify_date,
76+
// modifyUser: values.modify_user,
77+
// };
78+
// }),
79+
};
80+
81+
return list;
82+
}
83+
}
84+
85+
export default new PrizeDomain();

src/helper/QueryRunner.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
const { GRPC_RDB_SERVER_HOST, GRPC_RDB_SERVER_PORT } = process.env;
2+
3+
import { QueryRunner } from "@topcoder-framework/client-relational";
4+
5+
export const queryRunner = new QueryRunner(
6+
GRPC_RDB_SERVER_HOST!,
7+
parseInt(GRPC_RDB_SERVER_PORT!, 10)
8+
);

0 commit comments

Comments
 (0)