diff --git a/src/controllers/07-task-controller.ts b/src/controllers/07-task-controller.ts index e51ac45..cf27c43 100644 --- a/src/controllers/07-task-controller.ts +++ b/src/controllers/07-task-controller.ts @@ -15,7 +15,13 @@ import { } from "tsoa"; import prisma from "../db"; import { notFoundError } from "../utils/error"; -import { RequestDataStatus, TaskOrderStatus, TaskStatus } from "@prisma/client"; +import { + Prisma, + RequestDataStatus, + TaskOrderStatus, + TaskStatus, + UserTaskStatus, +} from "@prisma/client"; import { RequestWithUser } from "../interfaces/user"; import { branchRelationPermInclude, @@ -25,6 +31,7 @@ import { import HttpError from "../interfaces/http-error"; import HttpStatus from "../interfaces/http-status"; import { deleteFile, fileLocation, getFile, getPresigned, listFile, setFile } from "../utils/minio"; +import { queryOrNot } from "../utils/relation"; const MANAGE_ROLES = ["system", "head_of_admin", "admin", "document_checker"]; @@ -86,36 +93,38 @@ export class TaskController extends Controller { @Query() query: string = "", @Query() page = 1, @Query() pageSize = 30, - @Query() assignedByUserId?: string, + @Query() assignedUserId?: string, @Query() taskOrderStatus?: TaskOrderStatus, @Body() body?: { code?: string[] }, ) { + const where = { + taskOrderStatus, + registeredBranch: { OR: permissionCondCompany(req.user) }, + taskList: assignedUserId + ? { + some: { + requestWorkStep: { responsibleUserId: assignedUserId }, + }, + } + : undefined, + code: body?.code ? { in: body.code } : undefined, + OR: queryOrNot(query, [ + { code: { contains: query, mode: "insensitive" } }, + { taskName: { contains: query } }, + { contactName: { contains: query } }, + { contactTel: { contains: query } }, + ]), + } satisfies Prisma.TaskOrderWhereInput; + const [result, total] = await prisma.$transaction([ prisma.taskOrder.findMany({ - where: { - taskOrderStatus, - registeredBranch: { OR: permissionCondCompany(req.user) }, - taskList: assignedByUserId - ? { - some: { - requestWorkStep: { responsibleUserId: assignedByUserId }, - }, - } - : undefined, - code: body?.code ? { in: body.code } : undefined, - OR: [ - { code: { contains: query, mode: "insensitive" } }, - { taskName: { contains: query } }, - { contactName: { contains: query } }, - { contactTel: { contains: query } }, - ], - }, + where, include: { institution: true, createdBy: true, }, }), - prisma.taskOrder.count(), + prisma.taskOrder.count({ where }), ]); return { result, total, page, pageSize }; @@ -126,14 +135,14 @@ export class TaskController extends Controller { async getTaskOrder( @Request() req: RequestWithUser, @Path() taskId: string, - @Query() taskAssignedByUserId?: string, + @Query() taskAssignedUserId?: string, ) { const record = await prisma.taskOrder.findFirst({ where: { id: taskId, registeredBranch: { OR: permissionCondCompany(req.user) } }, include: { taskList: { where: { - requestWorkStep: { responsibleUserId: taskAssignedByUserId }, + requestWorkStep: { responsibleUserId: taskAssignedUserId }, }, include: { requestWorkStep: { @@ -379,6 +388,12 @@ export class TaskActionController extends Controller { where: { id: taskId }, data: { taskOrderStatus: TaskOrderStatus.InProgress, + userTask: { + create: { + userId: req.user.sub, + userTaskStatus: UserTaskStatus.Accept, + }, + }, }, }), prisma.task.updateMany({ @@ -487,3 +502,56 @@ export class TaskOrderAttachmentController extends Controller { return await deleteFile(fileLocation.task.attachment(taskId, name)); } } + +@Route("api/v1/user-task") +@Tags("Task Order") +export class UserTaskController extends Controller { + @Get() + @Security("keycloak") + async getUserTask( + @Request() req: RequestWithUser, + @Query() query: string = "", + @Query() page = 1, + @Query() pageSize = 30, + @Query() userTaskStatus?: UserTaskStatus, + ) { + const where = { + taskList: { + some: { + requestWorkStep: { responsibleUserId: req.user.sub }, + }, + }, + userTask: userTaskStatus + ? { + some: + userTaskStatus !== UserTaskStatus.Pending + ? { + userTaskStatus, + userId: req.user.sub, + } + : undefined, + none: userTaskStatus === UserTaskStatus.Pending ? { userId: req.user.sub } : undefined, + } + : undefined, + OR: queryOrNot(query, [ + { code: { contains: query, mode: "insensitive" } }, + { taskName: { contains: query } }, + { contactName: { contains: query } }, + { contactTel: { contains: query } }, + ]), + } satisfies Prisma.TaskOrderWhereInput; + + const [result, total] = await prisma.$transaction([ + prisma.taskOrder.findMany({ + where, + include: { + institution: true, + createdBy: true, + }, + }), + prisma.taskOrder.count({ where }), + ]); + + return { result, page, pageSize, total }; + } +}