From 3bbfc097d25d489945a011d8671386b70ebc06e3 Mon Sep 17 00:00:00 2001 From: Rakib Ansary Date: Fri, 27 Jan 2023 04:38:54 +0600 Subject: [PATCH 1/7] feat: add project, resource, payment schema --- src/common/QueryRunner.ts | 269 -------------------------------------- src/common/TableColumn.ts | 10 -- 2 files changed, 279 deletions(-) delete mode 100644 src/common/QueryRunner.ts delete mode 100644 src/common/TableColumn.ts diff --git a/src/common/QueryRunner.ts b/src/common/QueryRunner.ts deleted file mode 100644 index de0d7d5..0000000 --- a/src/common/QueryRunner.ts +++ /dev/null @@ -1,269 +0,0 @@ -const { GRPC_RDB_SERVER_HOST, GRPC_RDB_SERVER_PORT } = process.env; - -import { - ColumnType, - Operator, - Query, - QueryRequest, - RelationalClient, - Value, -} from "@topcoder-framework/client-relational"; -import { TableColumn, TableColumns } from "./TableColumn"; - -export type Schema = { - dbSchema: string; - tableName: string; - idColumn?: string; - idSequence?: string; - idTable?: string; - columns: TableColumns; -}; - -interface ExecuteSqlQuery { - exec(): Promise; -} - -type JoinAndWhereClause = JoinClause & WhereClause & ExecuteSqlQuery; -type JoinWhereLimitAndOffset = JoinAndWhereClause & LimitClause & OffsetClause; - -export interface SelectQuery { - select(columns: TableColumn[]): JoinWhereLimitAndOffset; -} - -export interface JoinClause { - join(): JoinAndWhereClause; -} - -export interface WhereClause { - where(whereCriteria: { key: string; operator: Operator; value: Value }): JoinWhereLimitAndOffset; -} - -export interface LimitClause { - limit(limit: number): OffsetClause & ExecuteSqlQuery; -} - -export interface OffsetClause { - offset(offset: number): ExecuteSqlQuery; -} - -export interface InsertQuery { - insert(input: CreateInput): ExecuteSqlQuery; -} - -export interface UpdateQuery { - update(lookupCriteria: { [key: string]: unknown }, input: UpdateInput): ExecuteSqlQuery; -} - -export interface DeleteQuery { - delete(): ExecuteSqlQuery; -} - -export class QueryRunner< - T, - CreateInput extends { [key: string]: unknown }, - UpdateInput extends { [key: string]: unknown } -> implements - SelectQuery, - JoinClause, - WhereClause, - LimitClause, - OffsetClause, - InsertQuery, - UpdateQuery, - DeleteQuery, - ExecuteSqlQuery -{ - #query: Query | null = null; - #client: RelationalClient; - - constructor(private schema: Schema) { - console.log("Connecting to GRPC server at", GRPC_RDB_SERVER_HOST, GRPC_RDB_SERVER_PORT, "..."); - this.#client = new RelationalClient(GRPC_RDB_SERVER_HOST!, parseInt(GRPC_RDB_SERVER_PORT!)); - } - - select(columns: TableColumn[]): JoinWhereLimitAndOffset { - this.#query = { - query: { - $case: "select", - select: { - schema: this.schema.dbSchema, - table: this.schema.tableName, - column: columns.map((col) => ({ - tableName: this.schema.tableName, - name: col.name, - type: col.type, - })), - where: [], - join: [], - groupBy: [], - orderBy: [], - limit: 100, - offset: 0, - }, - }, - }; - - console.log("Query", JSON.stringify(this.#query, null, 2)); - return this; - } - - // TODO: use "convenience" methods from lib-util to build the clause - where(whereCriteria: { key: string; operator: Operator; value: Value }): JoinWhereLimitAndOffset { - if (this.#query?.query?.$case != "select") { - throw new Error("Cannot set where clause on a non-select query"); - } - - this.#query.query.select.where.push(whereCriteria); - return this; - } - - join(): JoinAndWhereClause { - // TODO: Implement join clause - return this; - } - - limit(limit: number): OffsetClause & ExecuteSqlQuery { - if (this.#query?.query?.$case != "select") { - throw new Error("Cannot set limit on a non-select query"); - } - this.#query.query.select.limit = limit; - return this; - } - - offset(offset: number): ExecuteSqlQuery { - if (this.#query?.query?.$case != "select") { - throw new Error("Cannot set offset on a non-select query"); - } - this.#query.query.select.offset = offset; - return this; - } - - insert(input: CreateInput): ExecuteSqlQuery { - this.#query = { - query: { - $case: "insert", - insert: { - schema: this.schema.dbSchema, - table: this.schema.tableName, - columnValue: [ - { - column: "create_date", - value: { - value: { - $case: "datetimeValue", - datetimeValue: "CURRENT", - }, - }, - }, - { - column: "modify_date", - value: { - value: { - $case: "datetimeValue", - datetimeValue: "CURRENT", - }, - }, - }, - ...Object.entries(input) - .filter(([_key, value]) => value !== undefined) - .map(([key, value]) => ({ - column: this.schema.columns[key].name, - value: this.toValue(key, value), - })), - ], - idTable: this.schema.tableName, - idColumn: this.schema.idColumn ?? undefined, - idSequence: this.schema.idSequence ?? undefined, - }, - }, - }; - - return this; - } - - update(input: Record): ExecuteSqlQuery { - return this; - } - - delete(): ExecuteSqlQuery { - return this; - } - - async exec(): Promise { - if (!this.#query) { - throw new Error("No query to execute"); - } - - const queryRequest: QueryRequest = { - query: this.#query, - }; - - const queryResponse = await this.#client.query(queryRequest); - - switch (this.#query.query?.$case) { - case "select": - if (queryResponse.result?.$case != "selectResult") { - throw new Error("Unexpected result type"); - } - return queryResponse.result.selectResult.rows.map((row) => { - return row as T; - }); - case "insert": - if (queryResponse.result?.$case != "insertResult") { - throw new Error("Unexpected result type"); - } - console.log("running insert query"); - return queryResponse.result.insertResult.lastInsertId; - case "update": - if (queryResponse.result?.$case != "updateResult") { - throw new Error("Unexpected result type"); - } - return queryResponse.result.updateResult.affectedRows; - case "delete": - if (queryResponse.result?.$case != "deleteResult") { - throw new Error("Unexpected result type"); - } - return queryResponse.result.deleteResult.affectedRows; - default: - throw new Error("Unexpected query type"); - } - } - - private toValue(key: string, value: unknown): Value { - const dataType: ColumnType = this.schema.columns[key].type; - - if (dataType == null) { - throw new Error(`Unknown column ${key}`); - } - - if (dataType === ColumnType.COLUMN_TYPE_INT) { - return { value: { $case: "intValue", intValue: value as number } }; - } - - if (dataType === ColumnType.COLUMN_TYPE_FLOAT) { - return { value: { $case: "floatValue", floatValue: value as number } }; - } - - if (dataType === ColumnType.COLUMN_TYPE_DATE) { - return { value: { $case: "dateValue", dateValue: value as string } }; - } - - if (dataType == ColumnType.COLUMN_TYPE_DATETIME) { - return { - value: { $case: "datetimeValue", datetimeValue: value as string }, - }; - } - - if (dataType == ColumnType.COLUMN_TYPE_STRING) { - return { value: { $case: "stringValue", stringValue: value as string } }; - } - - if (dataType == ColumnType.COLUMN_TYPE_BOOLEAN) { - return { - value: { $case: "booleanValue", booleanValue: value as boolean }, - }; - } - - throw new Error(`Unsupported data type ${dataType}`); - } -} diff --git a/src/common/TableColumn.ts b/src/common/TableColumn.ts deleted file mode 100644 index 82f2a62..0000000 --- a/src/common/TableColumn.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { ColumnType } from "@topcoder-framework/client-relational"; - -export type TableColumn = { - name: string; - type: ColumnType; -}; - -export type TableColumns = { - [key: string]: TableColumn; -}; From 41bc730d5e4a68f080db5ad6e6e8b102459eff3e Mon Sep 17 00:00:00 2001 From: Rakib Ansary Date: Fri, 27 Jan 2023 04:41:07 +0600 Subject: [PATCH 2/7] fix: use id_column, id_sequence from schema definition --- src/common/QueryRunner.ts | 272 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 272 insertions(+) create mode 100644 src/common/QueryRunner.ts diff --git a/src/common/QueryRunner.ts b/src/common/QueryRunner.ts new file mode 100644 index 0000000..ef46b2b --- /dev/null +++ b/src/common/QueryRunner.ts @@ -0,0 +1,272 @@ +/* TODO: + 1. Move this to @topcoder-framework + 2. Cleanup the exported interfaces + 3. Make "Client" a constructor parameter that implements a "Client" interface + 4 "ExecuteSqlQuery" should return a Promise where T is the type of the result for "read" queries, but should return "number" for "write" queries indicating either + a) the number of rows affected or + b) the ID of the row insertede +*/ + +import { ColumnType, Operator, Query, QueryRequest, Value } from "../grpc/models/rdb/relational"; + +import { relationalClient } from "../grpc/client/relational"; +import { TableColumns, TableColumn } from "./TableColumn"; + +export type Schema = { + dbSchema: string; + tableName: string; + idColumn?: string; + idSequence?: string; + idTable?: string; + columns: TableColumns; +}; + +interface ExecuteSqlQuery { + exec(): Promise; +} + +type JoinAndWhereClause = JoinClause & WhereClause & ExecuteSqlQuery; + +export interface SelectQuery { + select(columns: TableColumn[]): JoinAndWhereClause & LimitClause & OffsetClause; +} + +export interface JoinClause { + join(): JoinAndWhereClause; +} + +export interface WhereClause { + where(whereCriteria: { + key: string; + operator: Operator; + value: Value; + }): JoinAndWhereClause & LimitClause & OffsetClause; +} + +export interface LimitClause { + limit(limit: number): OffsetClause & ExecuteSqlQuery; +} + +export interface OffsetClause { + offset(offset: number): ExecuteSqlQuery; +} + +export interface InsertQuery { + insert(input: CreateInput): ExecuteSqlQuery; +} + +export interface UpdateQuery { + update(lookupCriteria: { [key: string]: unknown }, input: UpdateInput): ExecuteSqlQuery; +} + +export interface DeleteQuery { + delete(): ExecuteSqlQuery; +} + +export class QueryRunner< + T, + CreateInput extends { [key: string]: unknown }, + UpdateInput extends { [key: string]: unknown } +> implements + SelectQuery, + JoinClause, + WhereClause, + LimitClause, + OffsetClause, + InsertQuery, + UpdateQuery, + DeleteQuery, + ExecuteSqlQuery +{ + #query: Query | null = null; + + constructor(private schema: Schema) {} + + select(columns: TableColumn[]): JoinAndWhereClause & LimitClause & OffsetClause { + this.#query = { + query: { + $case: "select", + select: { + schema: this.schema.dbSchema, + table: this.schema.tableName, + column: columns.map((col) => ({ + tableName: this.schema.tableName, + name: col.name, + type: col.type, + })), + where: [], + join: [], + groupBy: [], + orderBy: [], + limit: 100, + offset: 0, + }, + }, + }; + return this; + } + + // TODO: use "convenience" methods from lib-util to build the clause + where(whereCriteria: { + key: string; + operator: Operator; + value: Value; + }): JoinAndWhereClause & LimitClause & OffsetClause { + if (this.#query?.query?.$case != "select") { + throw new Error("Cannot set where clause on a non-select query"); + } + + this.#query.query.select.where.push(whereCriteria); + return this; + } + + join(): JoinAndWhereClause { + // TODO: Implement join clause + return this; + } + + limit(limit: number): OffsetClause & ExecuteSqlQuery { + if (this.#query?.query?.$case != "select") { + throw new Error("Cannot set limit on a non-select query"); + } + this.#query.query.select.limit = limit; + return this; + } + + offset(offset: number): ExecuteSqlQuery { + if (this.#query?.query?.$case != "select") { + throw new Error("Cannot set offset on a non-select query"); + } + this.#query.query.select.offset = offset; + return this; + } + + insert(input: CreateInput): ExecuteSqlQuery { + this.#query = { + query: { + $case: "insert", + insert: { + schema: this.schema.dbSchema, + table: this.schema.tableName, + columnValue: [ + { + column: "create_date", + value: { + value: { + $case: "datetimeValue", + datetimeValue: "CURRENT", + }, + }, + }, + { + column: "modify_date", + value: { + value: { + $case: "datetimeValue", + datetimeValue: "CURRENT", + }, + }, + }, + ...Object.entries(input) + .filter(([_key, value]) => value !== undefined) + .map(([key, value]) => ({ + column: this.schema.columns[key].name, + value: this.toValue(key, value), + })), + ], + idTable: this.schema.tableName, + idColumn: this.schema.idColumn ?? undefined, + idSequence: this.schema.idSequence ?? undefined, + }, + }, + }; + + return this; + } + + update(input: Record): ExecuteSqlQuery { + return this; + } + + delete(): ExecuteSqlQuery { + return this; + } + + async exec(): Promise { + if (!this.#query) { + throw new Error("No query to execute"); + } + + const queryRequest: QueryRequest = { + query: this.#query, + }; + + const queryResponse = await relationalClient.query(queryRequest); + + switch (this.#query.query?.$case) { + case "select": + if (queryResponse.result?.$case != "selectResult") { + throw new Error("Unexpected result type"); + } + return queryResponse.result.selectResult.rows.map((row) => { + return row as T; + }); + case "insert": + if (queryResponse.result?.$case != "insertResult") { + throw new Error("Unexpected result type"); + } + console.log("running insert query"); + return queryResponse.result.insertResult.lastInsertId; + case "update": + if (queryResponse.result?.$case != "updateResult") { + throw new Error("Unexpected result type"); + } + return queryResponse.result.updateResult.affectedRows; + case "delete": + if (queryResponse.result?.$case != "deleteResult") { + throw new Error("Unexpected result type"); + } + return queryResponse.result.deleteResult.affectedRows; + default: + throw new Error("Unexpected query type"); + } + } + + private toValue(key: string, value: unknown): Value { + const dataType: ColumnType = this.schema.columns[key].type; + + if (dataType == null) { + throw new Error(`Unknown column ${key}`); + } + + if (dataType === ColumnType.COLUMN_TYPE_INT) { + return { value: { $case: "intValue", intValue: value as number } }; + } + + if (dataType === ColumnType.COLUMN_TYPE_FLOAT) { + return { value: { $case: "floatValue", floatValue: value as number } }; + } + + if (dataType === ColumnType.COLUMN_TYPE_DATE) { + return { value: { $case: "dateValue", dateValue: value as string } }; + } + + if (dataType == ColumnType.COLUMN_TYPE_DATETIME) { + return { + value: { $case: "datetimeValue", datetimeValue: value as string }, + }; + } + + if (dataType == ColumnType.COLUMN_TYPE_STRING) { + return { value: { $case: "stringValue", stringValue: value as string } }; + } + + if (dataType == ColumnType.COLUMN_TYPE_BOOLEAN) { + return { + value: { $case: "booleanValue", booleanValue: value as boolean }, + }; + } + + throw new Error(`Unsupported data type ${dataType}`); + } +} From 10e1ef1d43a1665a39759496874b761d44ed5d57 Mon Sep 17 00:00:00 2001 From: Rakib Ansary Date: Mon, 30 Jan 2023 02:41:29 +0600 Subject: [PATCH 3/7] feat: use @topcoder-framework/lib-client for rdb types --- src/common/QueryRunner.ts | 51 +++++++++---------- src/common/TableColumn.ts | 10 ++++ .../domain-layer/legacy/challenge_phase.ts | 35 +++++++++++++ .../legacy/services/legacy_challenge_phase.ts | 33 ++++++++++++ yarn.lock | 21 ++++++++ 5 files changed, 123 insertions(+), 27 deletions(-) create mode 100644 src/common/TableColumn.ts create mode 100644 src/models/domain-layer/legacy/services/legacy_challenge_phase.ts diff --git a/src/common/QueryRunner.ts b/src/common/QueryRunner.ts index ef46b2b..de0d7d5 100644 --- a/src/common/QueryRunner.ts +++ b/src/common/QueryRunner.ts @@ -1,16 +1,14 @@ -/* TODO: - 1. Move this to @topcoder-framework - 2. Cleanup the exported interfaces - 3. Make "Client" a constructor parameter that implements a "Client" interface - 4 "ExecuteSqlQuery" should return a Promise where T is the type of the result for "read" queries, but should return "number" for "write" queries indicating either - a) the number of rows affected or - b) the ID of the row insertede -*/ - -import { ColumnType, Operator, Query, QueryRequest, Value } from "../grpc/models/rdb/relational"; - -import { relationalClient } from "../grpc/client/relational"; -import { TableColumns, TableColumn } from "./TableColumn"; +const { GRPC_RDB_SERVER_HOST, GRPC_RDB_SERVER_PORT } = process.env; + +import { + ColumnType, + Operator, + Query, + QueryRequest, + RelationalClient, + Value, +} from "@topcoder-framework/client-relational"; +import { TableColumn, TableColumns } from "./TableColumn"; export type Schema = { dbSchema: string; @@ -26,9 +24,10 @@ interface ExecuteSqlQuery { } type JoinAndWhereClause = JoinClause & WhereClause & ExecuteSqlQuery; +type JoinWhereLimitAndOffset = JoinAndWhereClause & LimitClause & OffsetClause; export interface SelectQuery { - select(columns: TableColumn[]): JoinAndWhereClause & LimitClause & OffsetClause; + select(columns: TableColumn[]): JoinWhereLimitAndOffset; } export interface JoinClause { @@ -36,11 +35,7 @@ export interface JoinClause { } export interface WhereClause { - where(whereCriteria: { - key: string; - operator: Operator; - value: Value; - }): JoinAndWhereClause & LimitClause & OffsetClause; + where(whereCriteria: { key: string; operator: Operator; value: Value }): JoinWhereLimitAndOffset; } export interface LimitClause { @@ -79,10 +74,14 @@ export class QueryRunner< ExecuteSqlQuery { #query: Query | null = null; + #client: RelationalClient; - constructor(private schema: Schema) {} + constructor(private schema: Schema) { + console.log("Connecting to GRPC server at", GRPC_RDB_SERVER_HOST, GRPC_RDB_SERVER_PORT, "..."); + this.#client = new RelationalClient(GRPC_RDB_SERVER_HOST!, parseInt(GRPC_RDB_SERVER_PORT!)); + } - select(columns: TableColumn[]): JoinAndWhereClause & LimitClause & OffsetClause { + select(columns: TableColumn[]): JoinWhereLimitAndOffset { this.#query = { query: { $case: "select", @@ -103,15 +102,13 @@ export class QueryRunner< }, }, }; + + console.log("Query", JSON.stringify(this.#query, null, 2)); return this; } // TODO: use "convenience" methods from lib-util to build the clause - where(whereCriteria: { - key: string; - operator: Operator; - value: Value; - }): JoinAndWhereClause & LimitClause & OffsetClause { + where(whereCriteria: { key: string; operator: Operator; value: Value }): JoinWhereLimitAndOffset { if (this.#query?.query?.$case != "select") { throw new Error("Cannot set where clause on a non-select query"); } @@ -201,7 +198,7 @@ export class QueryRunner< query: this.#query, }; - const queryResponse = await relationalClient.query(queryRequest); + const queryResponse = await this.#client.query(queryRequest); switch (this.#query.query?.$case) { case "select": diff --git a/src/common/TableColumn.ts b/src/common/TableColumn.ts new file mode 100644 index 0000000..82f2a62 --- /dev/null +++ b/src/common/TableColumn.ts @@ -0,0 +1,10 @@ +import { ColumnType } from "@topcoder-framework/client-relational"; + +export type TableColumn = { + name: string; + type: ColumnType; +}; + +export type TableColumns = { + [key: string]: TableColumn; +}; diff --git a/src/models/domain-layer/legacy/challenge_phase.ts b/src/models/domain-layer/legacy/challenge_phase.ts index 85dccc5..af87f39 100644 --- a/src/models/domain-layer/legacy/challenge_phase.ts +++ b/src/models/domain-layer/legacy/challenge_phase.ts @@ -463,7 +463,11 @@ export const PhaseTypeList = { }, }; +<<<<<<< HEAD:src/models/domain-layer/legacy/challenge_phase.ts function createBaseCreatePhaseInput(): CreatePhaseInput { +======= +function createBaseCreateLegacyChallengePhaseInput(): CreateLegacyChallengePhaseInput { +>>>>>>> 72cf261 (feat: use @topcoder-framework/lib-client for rdb types):src/models/domain-layer/legacy/legacy_challenge_phase.ts return { projectId: 0, phaseTypeId: 0, @@ -479,8 +483,13 @@ function createBaseCreatePhaseInput(): CreatePhaseInput { }; } +<<<<<<< HEAD:src/models/domain-layer/legacy/challenge_phase.ts export const CreatePhaseInput = { encode(message: CreatePhaseInput, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +======= +export const CreateLegacyChallengePhaseInput = { + encode(message: CreateLegacyChallengePhaseInput, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { +>>>>>>> 72cf261 (feat: use @topcoder-framework/lib-client for rdb types):src/models/domain-layer/legacy/legacy_challenge_phase.ts if (message.projectId !== 0) { writer.uint32(8).int64(message.projectId); } @@ -517,10 +526,17 @@ export const CreatePhaseInput = { return writer; }, +<<<<<<< HEAD:src/models/domain-layer/legacy/challenge_phase.ts decode(input: _m0.Reader | Uint8Array, length?: number): CreatePhaseInput { const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCreatePhaseInput(); +======= + decode(input: _m0.Reader | Uint8Array, length?: number): CreateLegacyChallengePhaseInput { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseCreateLegacyChallengePhaseInput(); +>>>>>>> 72cf261 (feat: use @topcoder-framework/lib-client for rdb types):src/models/domain-layer/legacy/legacy_challenge_phase.ts while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { @@ -565,7 +581,11 @@ export const CreatePhaseInput = { return message; }, +<<<<<<< HEAD:src/models/domain-layer/legacy/challenge_phase.ts fromJSON(object: any): CreatePhaseInput { +======= + fromJSON(object: any): CreateLegacyChallengePhaseInput { +>>>>>>> 72cf261 (feat: use @topcoder-framework/lib-client for rdb types):src/models/domain-layer/legacy/legacy_challenge_phase.ts return { projectId: isSet(object.projectId) ? Number(object.projectId) : 0, phaseTypeId: isSet(object.phaseTypeId) ? Number(object.phaseTypeId) : 0, @@ -581,7 +601,11 @@ export const CreatePhaseInput = { }; }, +<<<<<<< HEAD:src/models/domain-layer/legacy/challenge_phase.ts toJSON(message: CreatePhaseInput): unknown { +======= + toJSON(message: CreateLegacyChallengePhaseInput): unknown { +>>>>>>> 72cf261 (feat: use @topcoder-framework/lib-client for rdb types):src/models/domain-layer/legacy/legacy_challenge_phase.ts const obj: any = {}; message.projectId !== undefined && (obj.projectId = Math.round(message.projectId)); message.phaseTypeId !== undefined && (obj.phaseTypeId = Math.round(message.phaseTypeId)); @@ -597,12 +621,23 @@ export const CreatePhaseInput = { return obj; }, +<<<<<<< HEAD:src/models/domain-layer/legacy/challenge_phase.ts create, I>>(base?: I): CreatePhaseInput { return CreatePhaseInput.fromPartial(base ?? {}); }, fromPartial, I>>(object: I): CreatePhaseInput { const message = createBaseCreatePhaseInput(); +======= + create, I>>(base?: I): CreateLegacyChallengePhaseInput { + return CreateLegacyChallengePhaseInput.fromPartial(base ?? {}); + }, + + fromPartial, I>>( + object: I, + ): CreateLegacyChallengePhaseInput { + const message = createBaseCreateLegacyChallengePhaseInput(); +>>>>>>> 72cf261 (feat: use @topcoder-framework/lib-client for rdb types):src/models/domain-layer/legacy/legacy_challenge_phase.ts message.projectId = object.projectId ?? 0; message.phaseTypeId = object.phaseTypeId ?? 0; message.phaseStatusId = object.phaseStatusId ?? 0; diff --git a/src/models/domain-layer/legacy/services/legacy_challenge_phase.ts b/src/models/domain-layer/legacy/services/legacy_challenge_phase.ts new file mode 100644 index 0000000..0bc01e1 --- /dev/null +++ b/src/models/domain-layer/legacy/services/legacy_challenge_phase.ts @@ -0,0 +1,33 @@ +/* eslint-disable */ +import { handleUnaryCall, UntypedServiceImplementation } from "@grpc/grpc-js"; +import { CreateResult } from "../../../common/common"; +import { Empty } from "../../../google/protobuf/empty"; +import { CreateLegacyChallengePhaseInput, PhaseTypeList } from "../legacy_challenge_phase"; + +export type LegacyChallengePhaseService = typeof LegacyChallengePhaseService; +export const LegacyChallengePhaseService = { + create: { + path: "/topcoder.domain.legacy_challenge_phase_service.LegacyChallengePhase/Create", + requestStream: false, + responseStream: false, + requestSerialize: (value: CreateLegacyChallengePhaseInput) => + Buffer.from(CreateLegacyChallengePhaseInput.encode(value).finish()), + requestDeserialize: (value: Buffer) => CreateLegacyChallengePhaseInput.decode(value), + responseSerialize: (value: CreateResult) => Buffer.from(CreateResult.encode(value).finish()), + responseDeserialize: (value: Buffer) => CreateResult.decode(value), + }, + getPhaseTypes: { + path: "/topcoder.domain.legacy_challenge_phase_service.LegacyChallengePhase/GetPhaseTypes", + requestStream: false, + responseStream: false, + requestSerialize: (value: Empty) => Buffer.from(Empty.encode(value).finish()), + requestDeserialize: (value: Buffer) => Empty.decode(value), + responseSerialize: (value: PhaseTypeList) => Buffer.from(PhaseTypeList.encode(value).finish()), + responseDeserialize: (value: Buffer) => PhaseTypeList.decode(value), + }, +} as const; + +export interface LegacyChallengePhaseServer extends UntypedServiceImplementation { + create: handleUnaryCall; + getPhaseTypes: handleUnaryCall; +} diff --git a/yarn.lock b/yarn.lock index fa14752..5e75bbf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -25,6 +25,14 @@ "@grpc/proto-loader" "^0.7.0" "@types/node" ">=12.12.47" +"@grpc/grpc-js@^1.8.0": + version "1.8.7" + resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.8.7.tgz#2154fc0134462ad45f4134e8b54682a25ed05956" + integrity sha512-dRAWjRFN1Zy9mzPNLkFFIWT8T6C9euwluzCHZUKuhC+Bk3MayNPcpgDRyG+sg+n2sitEUySKxUynirVpu9ItKw== + dependencies: + "@grpc/proto-loader" "^0.7.0" + "@types/node" ">=12.12.47" + "@grpc/proto-loader@^0.7.0": version "0.7.4" resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.4.tgz#4946a84fbf47c3ddd4e6a97acb79d69a9f47ebf2" @@ -107,23 +115,30 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== +<<<<<<< HEAD <<<<<<< HEAD "@topcoder-framework/client-relational@^0.4.22-ci.0", "@topcoder-framework/client-relational@^0.4.24-ci.0": version "0.4.24-ci.0" resolved "http://localhost:4873/@topcoder-framework%2fclient-relational/-/client-relational-0.4.24-ci.0.tgz#ada970a70f7c9c34371752523ce20cbf734a40a7" integrity sha512-cnyzp4414BQuFml//y2A9Vgo0ULMSFEEnKjrq8kdpitvncVIenkowai6Geic37tOvnwZG3xxBNtmiHpDw3u/4A== ======= +======= +>>>>>>> 72cf261 (feat: use @topcoder-framework/lib-client for rdb types) "@topcoder-framework/client-relational@0.4.23-ci.0", "@topcoder-framework/client-relational@^0.4.23-ci.0": version "0.4.23-ci.0" resolved "http://localhost:4873/@topcoder-framework%2fclient-relational/-/client-relational-0.4.23-ci.0.tgz#73e5dc1a5fa0c92f0dc79f62042cd6f2b988fa02" integrity sha512-tRGCA//dqqc952KOSPoNBmN//ry+Vp3Yi9zm29zdDqIdKdUpyQn0yKNyVJ9ZhYSFXymW4c3vGt8O7el48wEjLg== +<<<<<<< HEAD >>>>>>> main +======= +>>>>>>> 72cf261 (feat: use @topcoder-framework/lib-client for rdb types) dependencies: "@grpc/grpc-js" "^1.8.0" "@topcoder-framework/lib-common" "0.4.23-ci.0" topcoder-interface "github:topcoder-platform/plat-interface-definition#v0.0.10" tslib "^2.4.1" +<<<<<<< HEAD <<<<<<< HEAD "@topcoder-framework/lib-common@0.4.23-ci.0", "@topcoder-framework/lib-common@^0.4.24-ci.0": version "0.4.24-ci.0" @@ -134,13 +149,19 @@ "@topcoder-framework/client-relational" "^0.4.22-ci.0" ======= "@topcoder-framework/lib-common@0.4.23-ci.0", "@topcoder-framework/lib-common@^0.4.23-ci.0": +======= +"@topcoder-framework/lib-common@0.4.23-ci.0": +>>>>>>> 72cf261 (feat: use @topcoder-framework/lib-client for rdb types) version "0.4.23-ci.0" resolved "http://localhost:4873/@topcoder-framework%2flib-common/-/lib-common-0.4.23-ci.0.tgz#b2728bc27fca017cca5982b53eebcdfb90e04acc" integrity sha512-t3uvwmr5qE2VKcil9XMzh+0Z0lGihdltojhX8Cq4zqpeJHK9zrgBhU1WFXlPwBjNu3RglI5qaeTwvENE6ktR6w== dependencies: "@grpc/grpc-js" "^1.8.0" "@topcoder-framework/client-relational" "0.4.23-ci.0" +<<<<<<< HEAD >>>>>>> main +======= +>>>>>>> 72cf261 (feat: use @topcoder-framework/lib-client for rdb types) rimraf "^3.0.2" topcoder-interface "github:topcoder-platform/plat-interface-definition#v0.0.10" tslib "^2.4.1" From 79f37b7ab2ba2a0873df72c2ae075939af439f82 Mon Sep 17 00:00:00 2001 From: Rakib Ansary Date: Wed, 1 Feb 2023 03:27:30 +0600 Subject: [PATCH 4/7] feat: switch to @topcoder-framework/lib-common and @topcoder-framwork/client-relational Signed-off-by: Rakib Ansary --- src/domain/LegacyChallenge.ts | 2 +- .../domain-layer/legacy/challenge_phase.ts | 35 --- src/models/domain-layer/legacy/prize.ts | 242 ++++++++++++++++++ .../legacy/services/legacy_challenge_phase.ts | 33 --- .../domain-layer/legacy/services/prize.ts | 20 +- src/service/LegacyChallenge.ts | 2 +- yarn.lock | 70 +---- 7 files changed, 271 insertions(+), 133 deletions(-) delete mode 100644 src/models/domain-layer/legacy/services/legacy_challenge_phase.ts diff --git a/src/domain/LegacyChallenge.ts b/src/domain/LegacyChallenge.ts index e2dff1a..389302c 100644 --- a/src/domain/LegacyChallenge.ts +++ b/src/domain/LegacyChallenge.ts @@ -2,7 +2,7 @@ import { Operator, QueryBuilder } from "@topcoder-framework/client-relational"; import { queryRunner } from "../helper/QueryRunner"; import { CheckChallengeExistsResponse, - CreateChallengeInput, + CreateChallengeInput } from "../models/domain-layer/legacy/challenge"; import { ProjectSchema } from "../schema/project/Project"; diff --git a/src/models/domain-layer/legacy/challenge_phase.ts b/src/models/domain-layer/legacy/challenge_phase.ts index af87f39..85dccc5 100644 --- a/src/models/domain-layer/legacy/challenge_phase.ts +++ b/src/models/domain-layer/legacy/challenge_phase.ts @@ -463,11 +463,7 @@ export const PhaseTypeList = { }, }; -<<<<<<< HEAD:src/models/domain-layer/legacy/challenge_phase.ts function createBaseCreatePhaseInput(): CreatePhaseInput { -======= -function createBaseCreateLegacyChallengePhaseInput(): CreateLegacyChallengePhaseInput { ->>>>>>> 72cf261 (feat: use @topcoder-framework/lib-client for rdb types):src/models/domain-layer/legacy/legacy_challenge_phase.ts return { projectId: 0, phaseTypeId: 0, @@ -483,13 +479,8 @@ function createBaseCreateLegacyChallengePhaseInput(): CreateLegacyChallengePhase }; } -<<<<<<< HEAD:src/models/domain-layer/legacy/challenge_phase.ts export const CreatePhaseInput = { encode(message: CreatePhaseInput, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { -======= -export const CreateLegacyChallengePhaseInput = { - encode(message: CreateLegacyChallengePhaseInput, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { ->>>>>>> 72cf261 (feat: use @topcoder-framework/lib-client for rdb types):src/models/domain-layer/legacy/legacy_challenge_phase.ts if (message.projectId !== 0) { writer.uint32(8).int64(message.projectId); } @@ -526,17 +517,10 @@ export const CreateLegacyChallengePhaseInput = { return writer; }, -<<<<<<< HEAD:src/models/domain-layer/legacy/challenge_phase.ts decode(input: _m0.Reader | Uint8Array, length?: number): CreatePhaseInput { const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input); let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCreatePhaseInput(); -======= - decode(input: _m0.Reader | Uint8Array, length?: number): CreateLegacyChallengePhaseInput { - const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseCreateLegacyChallengePhaseInput(); ->>>>>>> 72cf261 (feat: use @topcoder-framework/lib-client for rdb types):src/models/domain-layer/legacy/legacy_challenge_phase.ts while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { @@ -581,11 +565,7 @@ export const CreateLegacyChallengePhaseInput = { return message; }, -<<<<<<< HEAD:src/models/domain-layer/legacy/challenge_phase.ts fromJSON(object: any): CreatePhaseInput { -======= - fromJSON(object: any): CreateLegacyChallengePhaseInput { ->>>>>>> 72cf261 (feat: use @topcoder-framework/lib-client for rdb types):src/models/domain-layer/legacy/legacy_challenge_phase.ts return { projectId: isSet(object.projectId) ? Number(object.projectId) : 0, phaseTypeId: isSet(object.phaseTypeId) ? Number(object.phaseTypeId) : 0, @@ -601,11 +581,7 @@ export const CreateLegacyChallengePhaseInput = { }; }, -<<<<<<< HEAD:src/models/domain-layer/legacy/challenge_phase.ts toJSON(message: CreatePhaseInput): unknown { -======= - toJSON(message: CreateLegacyChallengePhaseInput): unknown { ->>>>>>> 72cf261 (feat: use @topcoder-framework/lib-client for rdb types):src/models/domain-layer/legacy/legacy_challenge_phase.ts const obj: any = {}; message.projectId !== undefined && (obj.projectId = Math.round(message.projectId)); message.phaseTypeId !== undefined && (obj.phaseTypeId = Math.round(message.phaseTypeId)); @@ -621,23 +597,12 @@ export const CreateLegacyChallengePhaseInput = { return obj; }, -<<<<<<< HEAD:src/models/domain-layer/legacy/challenge_phase.ts create, I>>(base?: I): CreatePhaseInput { return CreatePhaseInput.fromPartial(base ?? {}); }, fromPartial, I>>(object: I): CreatePhaseInput { const message = createBaseCreatePhaseInput(); -======= - create, I>>(base?: I): CreateLegacyChallengePhaseInput { - return CreateLegacyChallengePhaseInput.fromPartial(base ?? {}); - }, - - fromPartial, I>>( - object: I, - ): CreateLegacyChallengePhaseInput { - const message = createBaseCreateLegacyChallengePhaseInput(); ->>>>>>> 72cf261 (feat: use @topcoder-framework/lib-client for rdb types):src/models/domain-layer/legacy/legacy_challenge_phase.ts message.projectId = object.projectId ?? 0; message.phaseTypeId = object.phaseTypeId ?? 0; message.phaseStatusId = object.phaseStatusId ?? 0; diff --git a/src/models/domain-layer/legacy/prize.ts b/src/models/domain-layer/legacy/prize.ts index b047174..e2a0e00 100644 --- a/src/models/domain-layer/legacy/prize.ts +++ b/src/models/domain-layer/legacy/prize.ts @@ -36,6 +36,24 @@ export interface CreatePrizeInput { projectId: number; } +export interface UpdatePrizeInput { + updateCriteria?: UpdatePrizeInput_UpdateCriteria; + updateInput?: UpdatePrizeInput_UpdateInput; +} + +export interface UpdatePrizeInput_UpdateInput { + place?: number | undefined; + prizeAmount?: number | undefined; + prizeTypeId?: number | undefined; + numberOfSubmissions?: number | undefined; +} + +export interface UpdatePrizeInput_UpdateCriteria { + projectId?: number | undefined; + place?: number | undefined; + prizeId?: number | undefined; +} + function createBasePrize(): Prize { return { prizeId: 0, @@ -444,6 +462,230 @@ export const CreatePrizeInput = { }, }; +function createBaseUpdatePrizeInput(): UpdatePrizeInput { + return { updateCriteria: undefined, updateInput: undefined }; +} + +export const UpdatePrizeInput = { + encode(message: UpdatePrizeInput, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.updateCriteria !== undefined) { + UpdatePrizeInput_UpdateCriteria.encode(message.updateCriteria, writer.uint32(10).fork()).ldelim(); + } + if (message.updateInput !== undefined) { + UpdatePrizeInput_UpdateInput.encode(message.updateInput, writer.uint32(18).fork()).ldelim(); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): UpdatePrizeInput { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseUpdatePrizeInput(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.updateCriteria = UpdatePrizeInput_UpdateCriteria.decode(reader, reader.uint32()); + break; + case 2: + message.updateInput = UpdatePrizeInput_UpdateInput.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }, + + fromJSON(object: any): UpdatePrizeInput { + return { + updateCriteria: isSet(object.updateCriteria) + ? UpdatePrizeInput_UpdateCriteria.fromJSON(object.updateCriteria) + : undefined, + updateInput: isSet(object.updateInput) ? UpdatePrizeInput_UpdateInput.fromJSON(object.updateInput) : undefined, + }; + }, + + toJSON(message: UpdatePrizeInput): unknown { + const obj: any = {}; + message.updateCriteria !== undefined && (obj.updateCriteria = message.updateCriteria + ? UpdatePrizeInput_UpdateCriteria.toJSON(message.updateCriteria) + : undefined); + message.updateInput !== undefined && + (obj.updateInput = message.updateInput ? UpdatePrizeInput_UpdateInput.toJSON(message.updateInput) : undefined); + return obj; + }, + + create, I>>(base?: I): UpdatePrizeInput { + return UpdatePrizeInput.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): UpdatePrizeInput { + const message = createBaseUpdatePrizeInput(); + message.updateCriteria = (object.updateCriteria !== undefined && object.updateCriteria !== null) + ? UpdatePrizeInput_UpdateCriteria.fromPartial(object.updateCriteria) + : undefined; + message.updateInput = (object.updateInput !== undefined && object.updateInput !== null) + ? UpdatePrizeInput_UpdateInput.fromPartial(object.updateInput) + : undefined; + return message; + }, +}; + +function createBaseUpdatePrizeInput_UpdateInput(): UpdatePrizeInput_UpdateInput { + return { place: undefined, prizeAmount: undefined, prizeTypeId: undefined, numberOfSubmissions: undefined }; +} + +export const UpdatePrizeInput_UpdateInput = { + encode(message: UpdatePrizeInput_UpdateInput, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.place !== undefined) { + writer.uint32(8).int32(message.place); + } + if (message.prizeAmount !== undefined) { + writer.uint32(21).float(message.prizeAmount); + } + if (message.prizeTypeId !== undefined) { + writer.uint32(24).int32(message.prizeTypeId); + } + if (message.numberOfSubmissions !== undefined) { + writer.uint32(32).int32(message.numberOfSubmissions); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): UpdatePrizeInput_UpdateInput { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseUpdatePrizeInput_UpdateInput(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.place = reader.int32(); + break; + case 2: + message.prizeAmount = reader.float(); + break; + case 3: + message.prizeTypeId = reader.int32(); + break; + case 4: + message.numberOfSubmissions = reader.int32(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }, + + fromJSON(object: any): UpdatePrizeInput_UpdateInput { + return { + place: isSet(object.place) ? Number(object.place) : undefined, + prizeAmount: isSet(object.prizeAmount) ? Number(object.prizeAmount) : undefined, + prizeTypeId: isSet(object.prizeTypeId) ? Number(object.prizeTypeId) : undefined, + numberOfSubmissions: isSet(object.numberOfSubmissions) ? Number(object.numberOfSubmissions) : undefined, + }; + }, + + toJSON(message: UpdatePrizeInput_UpdateInput): unknown { + const obj: any = {}; + message.place !== undefined && (obj.place = Math.round(message.place)); + message.prizeAmount !== undefined && (obj.prizeAmount = message.prizeAmount); + message.prizeTypeId !== undefined && (obj.prizeTypeId = Math.round(message.prizeTypeId)); + message.numberOfSubmissions !== undefined && (obj.numberOfSubmissions = Math.round(message.numberOfSubmissions)); + return obj; + }, + + create, I>>(base?: I): UpdatePrizeInput_UpdateInput { + return UpdatePrizeInput_UpdateInput.fromPartial(base ?? {}); + }, + + fromPartial, I>>(object: I): UpdatePrizeInput_UpdateInput { + const message = createBaseUpdatePrizeInput_UpdateInput(); + message.place = object.place ?? undefined; + message.prizeAmount = object.prizeAmount ?? undefined; + message.prizeTypeId = object.prizeTypeId ?? undefined; + message.numberOfSubmissions = object.numberOfSubmissions ?? undefined; + return message; + }, +}; + +function createBaseUpdatePrizeInput_UpdateCriteria(): UpdatePrizeInput_UpdateCriteria { + return { projectId: undefined, place: undefined, prizeId: undefined }; +} + +export const UpdatePrizeInput_UpdateCriteria = { + encode(message: UpdatePrizeInput_UpdateCriteria, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.projectId !== undefined) { + writer.uint32(8).uint32(message.projectId); + } + if (message.place !== undefined) { + writer.uint32(16).uint32(message.place); + } + if (message.prizeId !== undefined) { + writer.uint32(24).uint32(message.prizeId); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): UpdatePrizeInput_UpdateCriteria { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseUpdatePrizeInput_UpdateCriteria(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.projectId = reader.uint32(); + break; + case 2: + message.place = reader.uint32(); + break; + case 3: + message.prizeId = reader.uint32(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }, + + fromJSON(object: any): UpdatePrizeInput_UpdateCriteria { + return { + projectId: isSet(object.projectId) ? Number(object.projectId) : undefined, + place: isSet(object.place) ? Number(object.place) : undefined, + prizeId: isSet(object.prizeId) ? Number(object.prizeId) : undefined, + }; + }, + + toJSON(message: UpdatePrizeInput_UpdateCriteria): unknown { + const obj: any = {}; + message.projectId !== undefined && (obj.projectId = Math.round(message.projectId)); + message.place !== undefined && (obj.place = Math.round(message.place)); + message.prizeId !== undefined && (obj.prizeId = Math.round(message.prizeId)); + return obj; + }, + + create, I>>(base?: I): UpdatePrizeInput_UpdateCriteria { + return UpdatePrizeInput_UpdateCriteria.fromPartial(base ?? {}); + }, + + fromPartial, I>>( + object: I, + ): UpdatePrizeInput_UpdateCriteria { + const message = createBaseUpdatePrizeInput_UpdateCriteria(); + message.projectId = object.projectId ?? undefined; + message.place = object.place ?? undefined; + message.prizeId = object.prizeId ?? undefined; + return message; + }, +}; + declare var self: any | undefined; declare var window: any | undefined; declare var global: any | undefined; diff --git a/src/models/domain-layer/legacy/services/legacy_challenge_phase.ts b/src/models/domain-layer/legacy/services/legacy_challenge_phase.ts deleted file mode 100644 index 0bc01e1..0000000 --- a/src/models/domain-layer/legacy/services/legacy_challenge_phase.ts +++ /dev/null @@ -1,33 +0,0 @@ -/* eslint-disable */ -import { handleUnaryCall, UntypedServiceImplementation } from "@grpc/grpc-js"; -import { CreateResult } from "../../../common/common"; -import { Empty } from "../../../google/protobuf/empty"; -import { CreateLegacyChallengePhaseInput, PhaseTypeList } from "../legacy_challenge_phase"; - -export type LegacyChallengePhaseService = typeof LegacyChallengePhaseService; -export const LegacyChallengePhaseService = { - create: { - path: "/topcoder.domain.legacy_challenge_phase_service.LegacyChallengePhase/Create", - requestStream: false, - responseStream: false, - requestSerialize: (value: CreateLegacyChallengePhaseInput) => - Buffer.from(CreateLegacyChallengePhaseInput.encode(value).finish()), - requestDeserialize: (value: Buffer) => CreateLegacyChallengePhaseInput.decode(value), - responseSerialize: (value: CreateResult) => Buffer.from(CreateResult.encode(value).finish()), - responseDeserialize: (value: Buffer) => CreateResult.decode(value), - }, - getPhaseTypes: { - path: "/topcoder.domain.legacy_challenge_phase_service.LegacyChallengePhase/GetPhaseTypes", - requestStream: false, - responseStream: false, - requestSerialize: (value: Empty) => Buffer.from(Empty.encode(value).finish()), - requestDeserialize: (value: Buffer) => Empty.decode(value), - responseSerialize: (value: PhaseTypeList) => Buffer.from(PhaseTypeList.encode(value).finish()), - responseDeserialize: (value: Buffer) => PhaseTypeList.decode(value), - }, -} as const; - -export interface LegacyChallengePhaseServer extends UntypedServiceImplementation { - create: handleUnaryCall; - getPhaseTypes: handleUnaryCall; -} diff --git a/src/models/domain-layer/legacy/services/prize.ts b/src/models/domain-layer/legacy/services/prize.ts index 943d396..aa9f64a 100644 --- a/src/models/domain-layer/legacy/services/prize.ts +++ b/src/models/domain-layer/legacy/services/prize.ts @@ -1,12 +1,12 @@ /* eslint-disable */ import { handleUnaryCall, UntypedServiceImplementation } from "@grpc/grpc-js"; -import { CreateResult, Empty, ScanCriteria } from "@topcoder-framework/lib-common"; -import { CreatePrizeInput, PrizeList, PrizeTypeList } from "../prize"; +import { CreateResult, Empty, ScanCriteria, UpdateResult } from "@topcoder-framework/lib-common"; +import { CreatePrizeInput, PrizeList, PrizeTypeList, UpdatePrizeInput } from "../prize"; export type PrizeServiceService = typeof PrizeServiceService; export const PrizeServiceService = { create: { - path: "/topcoder.domain.prize_service.PrizeService/Create", + path: "/topcoder.domain.legacy_prize_service.PrizeService/Create", requestStream: false, responseStream: false, requestSerialize: (value: CreatePrizeInput) => Buffer.from(CreatePrizeInput.encode(value).finish()), @@ -15,7 +15,7 @@ export const PrizeServiceService = { responseDeserialize: (value: Buffer) => CreateResult.decode(value), }, scan: { - path: "/topcoder.domain.prize_service.PrizeService/Scan", + path: "/topcoder.domain.legacy_prize_service.PrizeService/Scan", requestStream: false, responseStream: false, requestSerialize: (value: ScanCriteria) => Buffer.from(ScanCriteria.encode(value).finish()), @@ -23,8 +23,17 @@ export const PrizeServiceService = { responseSerialize: (value: PrizeList) => Buffer.from(PrizeList.encode(value).finish()), responseDeserialize: (value: Buffer) => PrizeList.decode(value), }, + update: { + path: "/topcoder.domain.legacy_prize_service.PrizeService/Update", + requestStream: false, + responseStream: false, + requestSerialize: (value: UpdatePrizeInput) => Buffer.from(UpdatePrizeInput.encode(value).finish()), + requestDeserialize: (value: Buffer) => UpdatePrizeInput.decode(value), + responseSerialize: (value: UpdateResult) => Buffer.from(UpdateResult.encode(value).finish()), + responseDeserialize: (value: Buffer) => UpdateResult.decode(value), + }, getPrizeTypes: { - path: "/topcoder.domain.prize_service.PrizeService/GetPrizeTypes", + path: "/topcoder.domain.legacy_prize_service.PrizeService/GetPrizeTypes", requestStream: false, responseStream: false, requestSerialize: (value: Empty) => Buffer.from(Empty.encode(value).finish()), @@ -37,5 +46,6 @@ export const PrizeServiceService = { export interface PrizeServiceServer extends UntypedServiceImplementation { create: handleUnaryCall; scan: handleUnaryCall; + update: handleUnaryCall; getPrizeTypes: handleUnaryCall; } diff --git a/src/service/LegacyChallenge.ts b/src/service/LegacyChallenge.ts index 19365a8..146d4bc 100644 --- a/src/service/LegacyChallenge.ts +++ b/src/service/LegacyChallenge.ts @@ -9,11 +9,11 @@ import { import { LegacyChallengeServer, - LegacyChallengeService } from "../models/domain-layer/legacy/services/challenge"; import { CreateResult, LookupCriteria } from "@topcoder-framework/lib-common"; import LegacyChallengeDomain from "../domain/LegacyChallenge"; +import { LookupCriteria } from "@topcoder-framework/lib-common"; class LegacyChallengeServerImpl implements LegacyChallengeServer { create: handleUnaryCall = ( diff --git a/yarn.lock b/yarn.lock index 5e75bbf..fe6ecbb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10,25 +10,9 @@ "@jridgewell/trace-mapping" "0.3.9" "@grpc/grpc-js@^1.7.1", "@grpc/grpc-js@^1.8.0": - version "1.8.7" - resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.8.7.tgz#2154fc0134462ad45f4134e8b54682a25ed05956" - integrity sha512-dRAWjRFN1Zy9mzPNLkFFIWT8T6C9euwluzCHZUKuhC+Bk3MayNPcpgDRyG+sg+n2sitEUySKxUynirVpu9ItKw== - dependencies: - "@grpc/proto-loader" "^0.7.0" - "@types/node" ">=12.12.47" - -"@grpc/grpc-js@^1.8.0": - version "1.8.7" - resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.8.7.tgz#2154fc0134462ad45f4134e8b54682a25ed05956" - integrity sha512-dRAWjRFN1Zy9mzPNLkFFIWT8T6C9euwluzCHZUKuhC+Bk3MayNPcpgDRyG+sg+n2sitEUySKxUynirVpu9ItKw== - dependencies: - "@grpc/proto-loader" "^0.7.0" - "@types/node" ">=12.12.47" - -"@grpc/grpc-js@^1.8.0": - version "1.8.7" - resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.8.7.tgz#2154fc0134462ad45f4134e8b54682a25ed05956" - integrity sha512-dRAWjRFN1Zy9mzPNLkFFIWT8T6C9euwluzCHZUKuhC+Bk3MayNPcpgDRyG+sg+n2sitEUySKxUynirVpu9ItKw== + version "1.8.8" + resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.8.8.tgz#a7c6765d0302f47ba67c0ce3cb79718d6b028248" + integrity sha512-4gfDqMLXTrorvYTKA1jL22zLvVwiHJ73t6Re1OHwdCFRjdGTDOVtSJuaWhtHaivyeDGg0LeCkmU77MTKoV3wPA== dependencies: "@grpc/proto-loader" "^0.7.0" "@types/node" ">=12.12.47" @@ -115,31 +99,16 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== -<<<<<<< HEAD -<<<<<<< HEAD "@topcoder-framework/client-relational@^0.4.22-ci.0", "@topcoder-framework/client-relational@^0.4.24-ci.0": version "0.4.24-ci.0" resolved "http://localhost:4873/@topcoder-framework%2fclient-relational/-/client-relational-0.4.24-ci.0.tgz#ada970a70f7c9c34371752523ce20cbf734a40a7" integrity sha512-cnyzp4414BQuFml//y2A9Vgo0ULMSFEEnKjrq8kdpitvncVIenkowai6Geic37tOvnwZG3xxBNtmiHpDw3u/4A== -======= -======= ->>>>>>> 72cf261 (feat: use @topcoder-framework/lib-client for rdb types) -"@topcoder-framework/client-relational@0.4.23-ci.0", "@topcoder-framework/client-relational@^0.4.23-ci.0": - version "0.4.23-ci.0" - resolved "http://localhost:4873/@topcoder-framework%2fclient-relational/-/client-relational-0.4.23-ci.0.tgz#73e5dc1a5fa0c92f0dc79f62042cd6f2b988fa02" - integrity sha512-tRGCA//dqqc952KOSPoNBmN//ry+Vp3Yi9zm29zdDqIdKdUpyQn0yKNyVJ9ZhYSFXymW4c3vGt8O7el48wEjLg== -<<<<<<< HEAD ->>>>>>> main -======= ->>>>>>> 72cf261 (feat: use @topcoder-framework/lib-client for rdb types) dependencies: "@grpc/grpc-js" "^1.8.0" "@topcoder-framework/lib-common" "0.4.23-ci.0" topcoder-interface "github:topcoder-platform/plat-interface-definition#v0.0.10" tslib "^2.4.1" -<<<<<<< HEAD -<<<<<<< HEAD "@topcoder-framework/lib-common@0.4.23-ci.0", "@topcoder-framework/lib-common@^0.4.24-ci.0": version "0.4.24-ci.0" resolved "http://localhost:4873/@topcoder-framework%2flib-common/-/lib-common-0.4.24-ci.0.tgz#3f32ce108fa799bb5522200f21c4173e1328f816" @@ -147,21 +116,6 @@ dependencies: "@grpc/grpc-js" "^1.8.0" "@topcoder-framework/client-relational" "^0.4.22-ci.0" -======= -"@topcoder-framework/lib-common@0.4.23-ci.0", "@topcoder-framework/lib-common@^0.4.23-ci.0": -======= -"@topcoder-framework/lib-common@0.4.23-ci.0": ->>>>>>> 72cf261 (feat: use @topcoder-framework/lib-client for rdb types) - version "0.4.23-ci.0" - resolved "http://localhost:4873/@topcoder-framework%2flib-common/-/lib-common-0.4.23-ci.0.tgz#b2728bc27fca017cca5982b53eebcdfb90e04acc" - integrity sha512-t3uvwmr5qE2VKcil9XMzh+0Z0lGihdltojhX8Cq4zqpeJHK9zrgBhU1WFXlPwBjNu3RglI5qaeTwvENE6ktR6w== - dependencies: - "@grpc/grpc-js" "^1.8.0" - "@topcoder-framework/client-relational" "0.4.23-ci.0" -<<<<<<< HEAD ->>>>>>> main -======= ->>>>>>> 72cf261 (feat: use @topcoder-framework/lib-client for rdb types) rimraf "^3.0.2" topcoder-interface "github:topcoder-platform/plat-interface-definition#v0.0.10" tslib "^2.4.1" @@ -202,9 +156,9 @@ integrity sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA== "@types/node@>=12.12.47", "@types/node@>=13.7.0": - version "18.11.19" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.19.tgz#35e26df9ec441ab99d73e99e9aca82935eea216d" - integrity sha512-YUgMWAQBWLObABqrvx8qKO1enAvBUdjZOAWQ5grBAkp5LQv45jBvYKZ3oFS9iKRCQyFjqw6iuEa1vmFqtxYLZw== + version "18.13.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.13.0.tgz#0400d1e6ce87e9d3032c19eb6c58205b0d3f7850" + integrity sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg== "@types/object-hash@^1.3.0": version "1.3.4" @@ -538,9 +492,9 @@ minimatch@^3.1.1: brace-expansion "^1.1.7" minimist@^1.2.6: - version "1.2.7" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" - integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== mkdirp@^1.0.4: version "1.0.4" @@ -599,9 +553,9 @@ protobufjs@^6.11.3, protobufjs@^6.8.8: long "^4.0.0" protobufjs@^7.0.0: - version "7.2.1" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.2.1.tgz#939e76a8e69fd5c70b13f7dd78565d65ce20cdcb" - integrity sha512-L3pCItypTnPK27+CS8nuhZMYtsY+i8dqdq2vZsYHlG17CnWp1DWPQ/sos0vOKrj1fHEAzo3GBqSHLaeZyKUCDA== + version "7.2.2" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.2.2.tgz#2af401d8c547b9476fb37ffc65782cf302342ca3" + integrity sha512-++PrQIjrom+bFDPpfmqXfAGSQs40116JRrqqyf53dymUMvvb5d/LMRyicRoF1AUKoXVS1/IgJXlEgcpr4gTF3Q== dependencies: "@protobufjs/aspromise" "^1.1.2" "@protobufjs/base64" "^1.1.2" From f69be6d54a4adda62b21bddc897d850d88440088 Mon Sep 17 00:00:00 2001 From: Rakib Ansary Date: Sat, 4 Feb 2023 03:03:32 +0600 Subject: [PATCH 5/7] feat: add type information to schema --- src/common/QueryRunner.ts | 18 +++++++++--------- src/common/TableColumn.ts | 4 ++-- src/domain/LegacyChallenge.ts | 2 +- src/service/LegacyChallenge.ts | 4 ++-- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/common/QueryRunner.ts b/src/common/QueryRunner.ts index de0d7d5..c202eb3 100644 --- a/src/common/QueryRunner.ts +++ b/src/common/QueryRunner.ts @@ -10,13 +10,13 @@ import { } from "@topcoder-framework/client-relational"; import { TableColumn, TableColumns } from "./TableColumn"; -export type Schema = { +export type Schema> = { dbSchema: string; tableName: string; idColumn?: string; idSequence?: string; idTable?: string; - columns: TableColumns; + columns: TableColumns; }; interface ExecuteSqlQuery { @@ -51,7 +51,7 @@ export interface InsertQuery { } export interface UpdateQuery { - update(lookupCriteria: { [key: string]: unknown }, input: UpdateInput): ExecuteSqlQuery; + update(lookupCriteria: Record, input: UpdateInput): ExecuteSqlQuery; } export interface DeleteQuery { @@ -59,9 +59,9 @@ export interface DeleteQuery { } export class QueryRunner< - T, - CreateInput extends { [key: string]: unknown }, - UpdateInput extends { [key: string]: unknown } + T extends Record, + CreateInput extends Record, + UpdateInput extends Record > implements SelectQuery, JoinClause, @@ -76,7 +76,7 @@ export class QueryRunner< #query: Query | null = null; #client: RelationalClient; - constructor(private schema: Schema) { + constructor(private schema: Schema) { console.log("Connecting to GRPC server at", GRPC_RDB_SERVER_HOST, GRPC_RDB_SERVER_PORT, "..."); this.#client = new RelationalClient(GRPC_RDB_SERVER_HOST!, parseInt(GRPC_RDB_SERVER_PORT!)); } @@ -167,7 +167,7 @@ export class QueryRunner< ...Object.entries(input) .filter(([_key, value]) => value !== undefined) .map(([key, value]) => ({ - column: this.schema.columns[key].name, + column: this.schema.columns[key]?.name ?? key, value: this.toValue(key, value), })), ], @@ -206,7 +206,7 @@ export class QueryRunner< throw new Error("Unexpected result type"); } return queryResponse.result.selectResult.rows.map((row) => { - return row as T; + return row as unknown as T; }); case "insert": if (queryResponse.result?.$case != "insertResult") { diff --git a/src/common/TableColumn.ts b/src/common/TableColumn.ts index 82f2a62..4289ae7 100644 --- a/src/common/TableColumn.ts +++ b/src/common/TableColumn.ts @@ -5,6 +5,6 @@ export type TableColumn = { type: ColumnType; }; -export type TableColumns = { - [key: string]: TableColumn; +export type TableColumns> = { + [Property in keyof T]: TableColumn; }; diff --git a/src/domain/LegacyChallenge.ts b/src/domain/LegacyChallenge.ts index 389302c..e2dff1a 100644 --- a/src/domain/LegacyChallenge.ts +++ b/src/domain/LegacyChallenge.ts @@ -2,7 +2,7 @@ import { Operator, QueryBuilder } from "@topcoder-framework/client-relational"; import { queryRunner } from "../helper/QueryRunner"; import { CheckChallengeExistsResponse, - CreateChallengeInput + CreateChallengeInput, } from "../models/domain-layer/legacy/challenge"; import { ProjectSchema } from "../schema/project/Project"; diff --git a/src/service/LegacyChallenge.ts b/src/service/LegacyChallenge.ts index 146d4bc..5ce39ef 100644 --- a/src/service/LegacyChallenge.ts +++ b/src/service/LegacyChallenge.ts @@ -4,16 +4,16 @@ import { CheckChallengeExistsResponse, CreateChallengeInput, LegacyChallengeId, - LegacyChallengeList + LegacyChallengeList, } from "../models/domain-layer/legacy/challenge"; import { LegacyChallengeServer, + LegacyChallengeService, } from "../models/domain-layer/legacy/services/challenge"; import { CreateResult, LookupCriteria } from "@topcoder-framework/lib-common"; import LegacyChallengeDomain from "../domain/LegacyChallenge"; -import { LookupCriteria } from "@topcoder-framework/lib-common"; class LegacyChallengeServerImpl implements LegacyChallengeServer { create: handleUnaryCall = ( From b62932263991d7309384ef9b0d4c28da5cb10224 Mon Sep 17 00:00:00 2001 From: Rakib Ansary Date: Mon, 6 Feb 2023 19:02:48 +0600 Subject: [PATCH 6/7] feat(legacy-challenge): use client-rdb from topcoder-framework --- src/common/QueryRunner.ts | 269 -------------------------------------- src/common/TableColumn.ts | 10 -- 2 files changed, 279 deletions(-) delete mode 100644 src/common/QueryRunner.ts delete mode 100644 src/common/TableColumn.ts diff --git a/src/common/QueryRunner.ts b/src/common/QueryRunner.ts deleted file mode 100644 index c202eb3..0000000 --- a/src/common/QueryRunner.ts +++ /dev/null @@ -1,269 +0,0 @@ -const { GRPC_RDB_SERVER_HOST, GRPC_RDB_SERVER_PORT } = process.env; - -import { - ColumnType, - Operator, - Query, - QueryRequest, - RelationalClient, - Value, -} from "@topcoder-framework/client-relational"; -import { TableColumn, TableColumns } from "./TableColumn"; - -export type Schema> = { - dbSchema: string; - tableName: string; - idColumn?: string; - idSequence?: string; - idTable?: string; - columns: TableColumns; -}; - -interface ExecuteSqlQuery { - exec(): Promise; -} - -type JoinAndWhereClause = JoinClause & WhereClause & ExecuteSqlQuery; -type JoinWhereLimitAndOffset = JoinAndWhereClause & LimitClause & OffsetClause; - -export interface SelectQuery { - select(columns: TableColumn[]): JoinWhereLimitAndOffset; -} - -export interface JoinClause { - join(): JoinAndWhereClause; -} - -export interface WhereClause { - where(whereCriteria: { key: string; operator: Operator; value: Value }): JoinWhereLimitAndOffset; -} - -export interface LimitClause { - limit(limit: number): OffsetClause & ExecuteSqlQuery; -} - -export interface OffsetClause { - offset(offset: number): ExecuteSqlQuery; -} - -export interface InsertQuery { - insert(input: CreateInput): ExecuteSqlQuery; -} - -export interface UpdateQuery { - update(lookupCriteria: Record, input: UpdateInput): ExecuteSqlQuery; -} - -export interface DeleteQuery { - delete(): ExecuteSqlQuery; -} - -export class QueryRunner< - T extends Record, - CreateInput extends Record, - UpdateInput extends Record -> implements - SelectQuery, - JoinClause, - WhereClause, - LimitClause, - OffsetClause, - InsertQuery, - UpdateQuery, - DeleteQuery, - ExecuteSqlQuery -{ - #query: Query | null = null; - #client: RelationalClient; - - constructor(private schema: Schema) { - console.log("Connecting to GRPC server at", GRPC_RDB_SERVER_HOST, GRPC_RDB_SERVER_PORT, "..."); - this.#client = new RelationalClient(GRPC_RDB_SERVER_HOST!, parseInt(GRPC_RDB_SERVER_PORT!)); - } - - select(columns: TableColumn[]): JoinWhereLimitAndOffset { - this.#query = { - query: { - $case: "select", - select: { - schema: this.schema.dbSchema, - table: this.schema.tableName, - column: columns.map((col) => ({ - tableName: this.schema.tableName, - name: col.name, - type: col.type, - })), - where: [], - join: [], - groupBy: [], - orderBy: [], - limit: 100, - offset: 0, - }, - }, - }; - - console.log("Query", JSON.stringify(this.#query, null, 2)); - return this; - } - - // TODO: use "convenience" methods from lib-util to build the clause - where(whereCriteria: { key: string; operator: Operator; value: Value }): JoinWhereLimitAndOffset { - if (this.#query?.query?.$case != "select") { - throw new Error("Cannot set where clause on a non-select query"); - } - - this.#query.query.select.where.push(whereCriteria); - return this; - } - - join(): JoinAndWhereClause { - // TODO: Implement join clause - return this; - } - - limit(limit: number): OffsetClause & ExecuteSqlQuery { - if (this.#query?.query?.$case != "select") { - throw new Error("Cannot set limit on a non-select query"); - } - this.#query.query.select.limit = limit; - return this; - } - - offset(offset: number): ExecuteSqlQuery { - if (this.#query?.query?.$case != "select") { - throw new Error("Cannot set offset on a non-select query"); - } - this.#query.query.select.offset = offset; - return this; - } - - insert(input: CreateInput): ExecuteSqlQuery { - this.#query = { - query: { - $case: "insert", - insert: { - schema: this.schema.dbSchema, - table: this.schema.tableName, - columnValue: [ - { - column: "create_date", - value: { - value: { - $case: "datetimeValue", - datetimeValue: "CURRENT", - }, - }, - }, - { - column: "modify_date", - value: { - value: { - $case: "datetimeValue", - datetimeValue: "CURRENT", - }, - }, - }, - ...Object.entries(input) - .filter(([_key, value]) => value !== undefined) - .map(([key, value]) => ({ - column: this.schema.columns[key]?.name ?? key, - value: this.toValue(key, value), - })), - ], - idTable: this.schema.tableName, - idColumn: this.schema.idColumn ?? undefined, - idSequence: this.schema.idSequence ?? undefined, - }, - }, - }; - - return this; - } - - update(input: Record): ExecuteSqlQuery { - return this; - } - - delete(): ExecuteSqlQuery { - return this; - } - - async exec(): Promise { - if (!this.#query) { - throw new Error("No query to execute"); - } - - const queryRequest: QueryRequest = { - query: this.#query, - }; - - const queryResponse = await this.#client.query(queryRequest); - - switch (this.#query.query?.$case) { - case "select": - if (queryResponse.result?.$case != "selectResult") { - throw new Error("Unexpected result type"); - } - return queryResponse.result.selectResult.rows.map((row) => { - return row as unknown as T; - }); - case "insert": - if (queryResponse.result?.$case != "insertResult") { - throw new Error("Unexpected result type"); - } - console.log("running insert query"); - return queryResponse.result.insertResult.lastInsertId; - case "update": - if (queryResponse.result?.$case != "updateResult") { - throw new Error("Unexpected result type"); - } - return queryResponse.result.updateResult.affectedRows; - case "delete": - if (queryResponse.result?.$case != "deleteResult") { - throw new Error("Unexpected result type"); - } - return queryResponse.result.deleteResult.affectedRows; - default: - throw new Error("Unexpected query type"); - } - } - - private toValue(key: string, value: unknown): Value { - const dataType: ColumnType = this.schema.columns[key].type; - - if (dataType == null) { - throw new Error(`Unknown column ${key}`); - } - - if (dataType === ColumnType.COLUMN_TYPE_INT) { - return { value: { $case: "intValue", intValue: value as number } }; - } - - if (dataType === ColumnType.COLUMN_TYPE_FLOAT) { - return { value: { $case: "floatValue", floatValue: value as number } }; - } - - if (dataType === ColumnType.COLUMN_TYPE_DATE) { - return { value: { $case: "dateValue", dateValue: value as string } }; - } - - if (dataType == ColumnType.COLUMN_TYPE_DATETIME) { - return { - value: { $case: "datetimeValue", datetimeValue: value as string }, - }; - } - - if (dataType == ColumnType.COLUMN_TYPE_STRING) { - return { value: { $case: "stringValue", stringValue: value as string } }; - } - - if (dataType == ColumnType.COLUMN_TYPE_BOOLEAN) { - return { - value: { $case: "booleanValue", booleanValue: value as boolean }, - }; - } - - throw new Error(`Unsupported data type ${dataType}`); - } -} diff --git a/src/common/TableColumn.ts b/src/common/TableColumn.ts deleted file mode 100644 index 4289ae7..0000000 --- a/src/common/TableColumn.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { ColumnType } from "@topcoder-framework/client-relational"; - -export type TableColumn = { - name: string; - type: ColumnType; -}; - -export type TableColumns> = { - [Property in keyof T]: TableColumn; -}; From 0897388f09beb912644e339f7e334fe4ae2b3b02 Mon Sep 17 00:00:00 2001 From: Rakib Ansary Date: Fri, 10 Feb 2023 07:19:45 +0600 Subject: [PATCH 7/7] feat: add prize crud operations Signed-off-by: Rakib Ansary --- src/common/Util.ts | 14 +++++ src/domain/LegacyChallenge.ts | 22 ++++++- src/domain/LegacyChallengeInfo.ts | 3 + src/domain/Prize.ts | 82 +++++++++++---------------- src/schema/project/Project.ts | 3 + src/schema/project/ProjectInfoType.ts | 0 src/service/Prize.ts | 18 +++++- 7 files changed, 88 insertions(+), 54 deletions(-) create mode 100644 src/common/Util.ts create mode 100644 src/domain/LegacyChallengeInfo.ts create mode 100644 src/schema/project/ProjectInfoType.ts diff --git a/src/common/Util.ts b/src/common/Util.ts new file mode 100644 index 0000000..d41c391 --- /dev/null +++ b/src/common/Util.ts @@ -0,0 +1,14 @@ +import { Operator, ScanCriteria, Value } from "@topcoder-framework/lib-common"; + +export class Util { + public static toScanCriteria(criteria: { [key: string]: any }): ScanCriteria[] { + return Object.entries(criteria).map( + ([key, value]) => + ({ + key, + operator: Operator.OPERATOR_EQUAL, + value: Value.wrap(value), + } as ScanCriteria) + ); + } +} diff --git a/src/domain/LegacyChallenge.ts b/src/domain/LegacyChallenge.ts index e2dff1a..99d81f0 100644 --- a/src/domain/LegacyChallenge.ts +++ b/src/domain/LegacyChallenge.ts @@ -31,7 +31,27 @@ class LegacyChallengeDomain { } public async createLegacyChallenge(input: CreateChallengeInput): Promise { - return Promise.resolve(123); + const transaction = queryRunner.beginTransaction(); + + const createLegacyChallengeQuery = new QueryBuilder(ProjectSchema) + .insert({ + projectStatusId: input.projectStatusId, + projectCategoryId: input.projectCategoryId, + tcDirectProjectId: input.tcDirectProjectId, + }) + .build(); + + const createLegacyChallengeQueryResult = await transaction.add(createLegacyChallengeQuery); + if (createLegacyChallengeQueryResult instanceof Error) { + transaction.rollback(); + return Promise.reject({ + message: "Failed to create legacy challenge", + }); + } + + const { lastInsertId: legacyChallengeId } = createLegacyChallengeQueryResult; + + return Promise.resolve(legacyChallengeId!); } // public async listAvailableChallengeInfoTypes(key: string): Promise { diff --git a/src/domain/LegacyChallengeInfo.ts b/src/domain/LegacyChallengeInfo.ts new file mode 100644 index 0000000..6cd01dc --- /dev/null +++ b/src/domain/LegacyChallengeInfo.ts @@ -0,0 +1,3 @@ +class LegacyChallengeInfo {} + +export default new LegacyChallengeInfo(); diff --git a/src/domain/Prize.ts b/src/domain/Prize.ts index 929510c..24e7e2a 100644 --- a/src/domain/Prize.ts +++ b/src/domain/Prize.ts @@ -1,7 +1,13 @@ -import { QueryBuilder } from "@topcoder-framework/client-relational"; -import { CreateResult, ScanCriteria } from "@topcoder-framework/lib-common"; +import { Query, QueryBuilder } from "@topcoder-framework/client-relational"; +import { CreateResult, ScanCriteria, UpdateResult, Value } from "@topcoder-framework/lib-common"; +import { Util } from "../common/Util"; import { queryRunner } from "../helper/QueryRunner"; -import { CreatePrizeInput, Prize, PrizeList } from "../models/domain-layer/legacy/prize"; +import { + CreatePrizeInput, + Prize, + PrizeList, + UpdatePrizeInput, +} from "../models/domain-layer/legacy/prize"; import { PrizeSchema } from "../schema/project_payment/Prize"; class PrizeDomain { @@ -25,61 +31,37 @@ class PrizeDomain { } public async scan(criteria: ScanCriteria): Promise { - const { rows: prizes } = await queryRunner.run( - new QueryBuilder(PrizeSchema) - .select( - PrizeSchema.columns.prizeId, - PrizeSchema.columns.prizeTypeId, - PrizeSchema.columns.prizeAmount, - PrizeSchema.columns.place, - PrizeSchema.columns.numberOfSubmissions, - PrizeSchema.columns.projectId, - PrizeSchema.columns.createDate, - PrizeSchema.columns.createUser, - PrizeSchema.columns.modifyDate, - PrizeSchema.columns.modifyUser - ) - .build() - ); + criteria.value = Value.wrap(criteria.value); // TODO: We shouldn't have to do this, check why scanCriteria.value is a Value - // const prizes = (await new QueryRunner(PrizeSchema).select([]).limit(10).offset(0).exec()) as [ - // { - // values: { - // prize_id: Value; - // prize_type_id: number; - // prize_amount: Value; - // place: number; - // number_of_submissions: number; - // prize_description: string; - // project_id: number; - // create_date: number; - // create_user: number; - // modify_date: number; - // modify_user: number; - // }; - // } - // ]; + const query: Query = new QueryBuilder(PrizeSchema) + .select(...Object.values(PrizeSchema.columns)) + .where(criteria) + .build(); - console.log("prizes", prizes); + const { rows: prizes } = await queryRunner.run(query); const list: PrizeList = { - prizes: [], - // prizes: prizes!.map(({ values }) => { - // return { - // place: values.place, - // numberOfSubmissions: values.number_of_submissions, - // prizeDescription: values.prize_description, - // projectId: values.project_id, - // createDate: values.create_date, - // createUser: values.create_user, - // modifyDate: values.modify_date, - // modifyUser: values.modify_user, - // }; - // }), + prizes: prizes!.map((prize) => Prize.fromPartial(prize as Prize)), }; return list; } + + public async update(updateInput: UpdatePrizeInput): Promise { + const { updateInput: input, updateCriteria: criteria } = updateInput; + + const query: Query = new QueryBuilder(PrizeSchema) + .update({ ...input }) + .where(...Util.toScanCriteria({ ...criteria })) + .build(); + + console.log("Query", query); + const { affectedRows } = await queryRunner.run(query); + + return { + updatedCount: affectedRows!, + }; + } } export default new PrizeDomain(); diff --git a/src/schema/project/Project.ts b/src/schema/project/Project.ts index d5db06d..8a6c8c1 100644 --- a/src/schema/project/Project.ts +++ b/src/schema/project/Project.ts @@ -5,6 +5,9 @@ import { AuditColumns } from "../common/AuditColumns"; export const ProjectSchema: Schema = { dbSchema: "tcs_catalog", tableName: "project", + idSequence: "project_id_seq", + idColumn: "projectId", + idTable: "project", columns: { projectId: { name: "project_id", type: ColumnType.COLUMN_TYPE_INT }, projectStatusId: { name: "project_status_id", type: ColumnType.COLUMN_TYPE_INT }, diff --git a/src/schema/project/ProjectInfoType.ts b/src/schema/project/ProjectInfoType.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/service/Prize.ts b/src/service/Prize.ts index 1fc19a5..4ebb327 100644 --- a/src/service/Prize.ts +++ b/src/service/Prize.ts @@ -1,6 +1,11 @@ import { handleUnaryCall, sendUnaryData, ServerUnaryCall, UntypedHandleCall } from "@grpc/grpc-js"; -import { CreateResult, ScanCriteria, Empty } from "@topcoder-framework/lib-common"; -import { CreatePrizeInput, PrizeList, PrizeTypeList } from "../models/domain-layer/legacy/prize"; +import { CreateResult, ScanCriteria, Empty, UpdateResult } from "@topcoder-framework/lib-common"; +import { + CreatePrizeInput, + UpdatePrizeInput, + PrizeList, + PrizeTypeList, +} from "../models/domain-layer/legacy/prize"; import { PrizeServiceServer, @@ -36,8 +41,15 @@ class PrizeServerImpl implements PrizeServiceServer { getPrizeTypes: handleUnaryCall = ( call: ServerUnaryCall, callback: sendUnaryData + ) => {}; + + update: handleUnaryCall = ( + call: ServerUnaryCall, + callback: sendUnaryData ) => { - console.log("TODO"); + PrizeDomain.update(call.request) + .then((result) => callback(null, result)) + .catch((err) => callback(err, null)); }; }