From f7c916b84a1acb62fa026333632519e9657de60d Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Tue, 11 Jun 2024 13:01:20 +0700 Subject: [PATCH] feat: relation and auto gen code --- .../migration.sql | 25 +++++++++++ prisma/schema.prisma | 19 +++++---- src/controllers/product/group-controller.ts | 28 +++++++++---- src/controllers/product/type-controller.ts | 42 +++++++++++++++---- 4 files changed, 91 insertions(+), 23 deletions(-) create mode 100644 prisma/migrations/20240611060055_change_relation/migration.sql diff --git a/prisma/migrations/20240611060055_change_relation/migration.sql b/prisma/migrations/20240611060055_change_relation/migration.sql new file mode 100644 index 0000000..dc100a6 --- /dev/null +++ b/prisma/migrations/20240611060055_change_relation/migration.sql @@ -0,0 +1,25 @@ +/* + Warnings: + + - You are about to drop the column `productGroupId` on the `Product` table. All the data in the column will be lost. + - Added the required column `productGroupId` to the `ProductType` table without a default value. This is not possible if the table is not empty. + - Added the required column `productId` to the `WorkProduct` table without a default value. This is not possible if the table is not empty. + +*/ +-- DropForeignKey +ALTER TABLE "Product" DROP CONSTRAINT "Product_productGroupId_fkey"; + +-- AlterTable +ALTER TABLE "Product" DROP COLUMN "productGroupId"; + +-- AlterTable +ALTER TABLE "ProductType" ADD COLUMN "productGroupId" TEXT NOT NULL; + +-- AlterTable +ALTER TABLE "WorkProduct" ADD COLUMN "productId" TEXT NOT NULL; + +-- AddForeignKey +ALTER TABLE "WorkProduct" ADD CONSTRAINT "WorkProduct_productId_fkey" FOREIGN KEY ("productId") REFERENCES "Product"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ProductType" ADD CONSTRAINT "ProductType_productGroupId_fkey" FOREIGN KEY ("productGroupId") REFERENCES "ProductGroup"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index f8bf42e..85230f2 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -570,8 +570,10 @@ model Work { model WorkProduct { id String @id @default(uuid()) - work Work @relation(fields: [workId], references: [id], onDelete: Cascade) - workId String + work Work @relation(fields: [workId], references: [id], onDelete: Cascade) + workId String + product Product @relation(fields: [productId], references: [id], onDelete: Cascade) + productId String createdBy String? createdAt DateTime @default(now()) @@ -590,10 +592,11 @@ model ProductGroup { status Status @default(CREATED) createdBy String? - createdAt DateTime @default(now()) + createdAt DateTime @default(now()) updateBy String? - updatedAt DateTime @updatedAt - Product Product[] + updatedAt DateTime @updatedAt + + type ProductType[] } model ProductType { @@ -611,6 +614,9 @@ model ProductType { updateBy String? updatedAt DateTime @updatedAt + productGroup ProductGroup @relation(fields: [productGroupId], references: [id], onDelete: Cascade) + productGroupId String + product Product[] } @@ -630,8 +636,7 @@ model Product { productType ProductType? @relation(fields: [productTypeId], references: [id], onDelete: SetNull) productTypeId String? - productGroup ProductGroup? @relation(fields: [productGroupId], references: [id], onDelete: SetNull) - productGroupId String? + workProduct WorkProduct[] createdBy String? createdAt DateTime @default(now()) diff --git a/src/controllers/product/group-controller.ts b/src/controllers/product/group-controller.ts index cea4f52..eaaa1ab 100644 --- a/src/controllers/product/group-controller.ts +++ b/src/controllers/product/group-controller.ts @@ -20,14 +20,12 @@ import HttpError from "../../interfaces/http-error"; import HttpStatus from "../../interfaces/http-status"; type ProductGroupCreate = { - code: string; name: string; detail: string; remark: string; }; type ProductGroupUpdate = { - code?: string; name?: string; detail?: string; remark?: string; @@ -65,12 +63,26 @@ export class ProductGroup extends Controller { @Post() async createProductGroup(@Request() req: RequestWithUser, @Body() body: ProductGroupCreate) { - const record = await prisma.productGroup.create({ - data: { - ...body, - createdBy: req.user.name, - updateBy: req.user.name, - }, + const record = await prisma.$transaction(async (tx) => { + const last = await tx.runningNo.upsert({ + where: { + key: `PRODGRP`, + }, + create: { + key: `PRODGRP`, + value: 1, + }, + update: { value: { increment: 1 } }, + }); + + return await tx.productGroup.create({ + data: { + ...body, + code: `G${last.value.toString().padStart(2, "0")}`, + createdBy: req.user.name, + updateBy: req.user.name, + }, + }); }); this.setStatus(HttpStatus.CREATED); diff --git a/src/controllers/product/type-controller.ts b/src/controllers/product/type-controller.ts index e1c5bb8..e570a7d 100644 --- a/src/controllers/product/type-controller.ts +++ b/src/controllers/product/type-controller.ts @@ -20,14 +20,14 @@ import HttpError from "../../interfaces/http-error"; import HttpStatus from "../../interfaces/http-status"; type ProductTypeCreate = { - code: string; + productGroupId: string; name: string; detail: string; remark: string; }; type ProductTypeUpdate = { - code?: string; + productGroupId?: string; name?: string; detail?: string; remark?: string; @@ -65,12 +65,38 @@ export class ProductType extends Controller { @Post() async createProductType(@Request() req: RequestWithUser, @Body() body: ProductTypeCreate) { - const record = await prisma.productType.create({ - data: { - ...body, - createdBy: req.user.name, - updateBy: req.user.name, - }, + const productGroup = await prisma.productGroup.findFirst({ + where: { id: body.productGroupId }, + }); + + if (!productGroup) { + throw new HttpError( + HttpStatus.BAD_REQUEST, + "Product group associated cannot be found.", + "missing_or_invalid_parameter", + ); + } + + const record = await prisma.$transaction(async (tx) => { + const last = await tx.runningNo.upsert({ + where: { + key: `PRODTYP_T${productGroup.code}`, + }, + create: { + key: `PRODTYP_T${productGroup.code}`, + value: 1, + }, + update: { value: { increment: 1 } }, + }); + + return await tx.productGroup.create({ + data: { + ...body, + code: `T${productGroup.code}${last.value.toString().padStart(2, "0")}`, + createdBy: req.user.name, + updateBy: req.user.name, + }, + }); }); this.setStatus(HttpStatus.CREATED);