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; -}; 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/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/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/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/LegacyChallenge.ts b/src/service/LegacyChallenge.ts index 19365a8..5ce39ef 100644 --- a/src/service/LegacyChallenge.ts +++ b/src/service/LegacyChallenge.ts @@ -4,12 +4,12 @@ import { CheckChallengeExistsResponse, CreateChallengeInput, LegacyChallengeId, - LegacyChallengeList + LegacyChallengeList, } from "../models/domain-layer/legacy/challenge"; import { LegacyChallengeServer, - LegacyChallengeService + LegacyChallengeService, } from "../models/domain-layer/legacy/services/challenge"; import { CreateResult, LookupCriteria } from "@topcoder-framework/lib-common"; 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)); }; } diff --git a/yarn.lock b/yarn.lock index fa14752..fe6ecbb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10,17 +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== + 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" @@ -107,24 +99,16 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== -<<<<<<< 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== -======= -"@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== ->>>>>>> main 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 "@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" @@ -132,15 +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": - 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" ->>>>>>> main rimraf "^3.0.2" topcoder-interface "github:topcoder-platform/plat-interface-definition#v0.0.10" tslib "^2.4.1" @@ -181,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" @@ -517,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" @@ -578,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"