From e5c14bf5cc1c67096f4268e52db0efcc4f67b74c Mon Sep 17 00:00:00 2001 From: realrafi Date: Mon, 6 Jul 2026 16:44:19 +0330 Subject: [PATCH] refactor: refactored taskDetailAPI by adding some values --- .../controllers/task.controller.ts | 8 ++++ .../repositories/task.repository.ts | 41 ++++++++++++++----- src/modules/users/enums/permission.enum.ts | 3 +- 3 files changed, 41 insertions(+), 11 deletions(-) diff --git a/src/modules/task-manager/controllers/task.controller.ts b/src/modules/task-manager/controllers/task.controller.ts index 0b1e045..32160ce 100644 --- a/src/modules/task-manager/controllers/task.controller.ts +++ b/src/modules/task-manager/controllers/task.controller.ts @@ -9,6 +9,8 @@ import { AuthGuards } from '../../../common/decorators/auth-guard.decorator'; import { AdminRoute } from '../../../common/decorators/admin.decorator'; import { UserDec } from '../../../common/decorators/user.decorator'; import { ParamDto } from '../../../common/DTO/param.dto'; +import { PermissionsDec } from '../../../common/decorators/permission.decorator'; +import { PermissionEnum } from '../../users/enums/permission.enum'; @AuthGuards() @AdminRoute() @@ -18,6 +20,7 @@ export class TaskController { constructor(private readonly taskService: TaskService) {} @Get() + @PermissionsDec(PermissionEnum.TASK) @ApiOperation({ summary: 'Get all tasks, optionally filtered by phase' }) @ApiQuery({ name: 'taskPhaseId', required: false, description: 'Filter tasks by task phase ID' }) @ApiResponse({ status: 200, description: 'List of tasks', type: [TMTask] }) @@ -27,6 +30,7 @@ export class TaskController { } @Get(':id') + @PermissionsDec(PermissionEnum.TASK) @ApiOperation({ summary: 'Get a task by ID' }) @ApiParam({ name: 'id', description: 'Task ID' }) @ApiResponse({ status: 200, description: 'Task found', type: TMTask }) @@ -36,6 +40,7 @@ export class TaskController { } @Post() + @PermissionsDec(PermissionEnum.TASK) @ApiOperation({ summary: 'Create a new task' }) @ApiResponse({ status: 201, description: 'Task created', type: TMTask }) @ApiResponse({ status: 404, description: 'TaskPhase not found' }) @@ -44,6 +49,7 @@ export class TaskController { } @Patch(':id') + @PermissionsDec(PermissionEnum.TASK) @ApiOperation({ summary: 'Update a task' }) @ApiParam({ name: 'id', description: 'Task ID' }) @ApiResponse({ status: 200, description: 'Task updated', type: TMTask }) @@ -53,6 +59,7 @@ export class TaskController { } @Patch(':id/change-phase') + @PermissionsDec(PermissionEnum.TASK) @ApiOperation({ summary: 'Move a task to a different phase within the same project' }) @ApiParam({ name: 'id', description: 'Task ID' }) @ApiResponse({ status: 200, description: 'Task phase changed', type: TMTask }) @@ -63,6 +70,7 @@ export class TaskController { } @Delete(':id') + @PermissionsDec(PermissionEnum.TASK) @ApiOperation({ summary: 'Delete a task' }) @ApiParam({ name: 'id', description: 'Task ID' }) @ApiResponse({ status: 200, description: 'Task deleted' }) diff --git a/src/modules/task-manager/repositories/task.repository.ts b/src/modules/task-manager/repositories/task.repository.ts index 4a5dff0..26e76b6 100644 --- a/src/modules/task-manager/repositories/task.repository.ts +++ b/src/modules/task-manager/repositories/task.repository.ts @@ -5,18 +5,39 @@ import { TMTask } from "../entities/task.entity"; @Injectable() export class TaskRepository extends Repository { - constructor( - @InjectRepository(TMTask) taskRepository: Repository, - ) { - super(taskRepository.target, taskRepository.manager, taskRepository.queryRunner) + constructor(@InjectRepository(TMTask) taskRepository: Repository) { + super(taskRepository.target, taskRepository.manager, taskRepository.queryRunner); } async getTaskDetail(taskId: string): Promise { - return this.createQueryBuilder('task') - .leftJoinAndSelect('task.remarks', 'remark') - .leftJoinAndSelect('task.attachments', 'attachment') - .leftJoinAndSelect('task.checkListItems', 'checkListItem') - .where('task.id = :taskId', {taskId}) - .getOne(); + return this.createQueryBuilder("task") + .leftJoinAndSelect("task.remarks", "remark") + .leftJoinAndSelect("task.attachments", "attachment") + .leftJoinAndSelect("task.checkListItems", "checkListItem") + .leftJoinAndSelect("task.users", "user") + + .loadRelationCountAndMap("task.checkListItemCount", "task.checkListItems") + + .loadRelationCountAndMap("task.completedCheckListItemCount", "task.checkListItems", "completedCheckListItems", (qb) => + qb.where("completedCheckListItems.isDone = :isDone", { isDone: true }), + ) + + .select(["remark.id", + "remark.title", + "remark.color", + "checkListItem.id", + "checkListItem.title", + "checkListItem.isDone", + "attachment.id", + "attachment.title", + "attachment.type", + "attachment.file", + + "user.id", + "user.firstName", + "user.lastName" + ]) + .where("task.id = :taskId", { taskId }) + .getOne(); } } diff --git a/src/modules/users/enums/permission.enum.ts b/src/modules/users/enums/permission.enum.ts index 363e730..67c3dd8 100755 --- a/src/modules/users/enums/permission.enum.ts +++ b/src/modules/users/enums/permission.enum.ts @@ -27,5 +27,6 @@ export enum PermissionEnum { RESELLER="reseller", WORKSPACE="workspace", PROJECT="project", - TASK_PHASE="task_phase" + TASK_PHASE="task_phase", + TASK="task" }