From 22b3981aa75dc0ec04cda025d9fc4e7b8dd7d972 Mon Sep 17 00:00:00 2001 From: Methapon Metanipat Date: Thu, 14 Nov 2024 13:15:49 +0700 Subject: [PATCH] feat: add stats by status --- src/controllers/06-request-list-controller.ts | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/controllers/06-request-list-controller.ts b/src/controllers/06-request-list-controller.ts index bb2dbb8..a3b71f9 100644 --- a/src/controllers/06-request-list-controller.ts +++ b/src/controllers/06-request-list-controller.ts @@ -1,7 +1,7 @@ import { Body, Controller, Get, Path, Put, Query, Request, Route, Security, Tags } from "tsoa"; import { RequestWithUser } from "../interfaces/user"; import prisma from "../db"; -import { Prisma, RequestWorkStatus } from "@prisma/client"; +import { Prisma, RequestDataStatus, RequestWorkStatus } from "@prisma/client"; import { createPermCondition } from "../services/permission"; // User in company can see. @@ -10,12 +10,42 @@ const permissionCond = createPermCondition((_) => true); @Route("/api/v1/request-data") @Tags("Request List") export class RequestDataController extends Controller { + @Get("stats") + @Security("keycloak") + async getRequestDataStats(@Request() req: RequestWithUser) { + const where = { + quotation: { + customerBranch: { + customer: { + registeredBranch: { OR: permissionCond(req.user) }, + }, + }, + }, + } satisfies Prisma.RequestDataWhereInput; + + const list = await prisma.requestData.groupBy({ + _count: true, + by: "requestDataStatus", + where: where, + }); + + return list.reduce>( + (a, c) => Object.assign(a, { [c.requestDataStatus]: c._count }), + { + [RequestDataStatus.Pending]: 0, + [RequestDataStatus.InProgress]: 0, + [RequestDataStatus.Completed]: 0, + }, + ); + } + @Get() @Security("keycloak") async getRequestDataList( @Request() req: RequestWithUser, @Query() page: number = 1, @Query() pageSize: number = 30, + @Query() query: string = "", ) { const where = { quotation: {