diff --git a/src/common/enums/message.enum.ts b/src/common/enums/message.enum.ts index 8bf57e4..64b887c 100755 --- a/src/common/enums/message.enum.ts +++ b/src/common/enums/message.enum.ts @@ -939,5 +939,6 @@ export const enum TaskPhaseMessage { export const enum TaskMessage { TASK_NOT_FOUND = "تسک مورد نظر پیدا نشد!", - USERS_ASSIGNED_TO_TASK_NOT_PROJECT_MEMBER = "حداقل یکی از کاربران تعیین شده عضو پروژه نیستند!" + USERS_ASSIGNED_TO_TASK_NOT_PROJECT_MEMBER = "حداقل یکی از کاربران تعیین شده عضو پروژه نیستند!", + USER_NOT_TASK_MEMBER = "شما عضو این تسک نیستید!" } \ No newline at end of file diff --git a/src/modules/task-manager/controllers/task.controller.ts b/src/modules/task-manager/controllers/task.controller.ts index c0fa93d..0b1e045 100644 --- a/src/modules/task-manager/controllers/task.controller.ts +++ b/src/modules/task-manager/controllers/task.controller.ts @@ -5,7 +5,13 @@ import { CreateTaskDto } from '../dto/task/create-task.dto'; import { UpdateTaskDto } from '../dto/task/update-task.dto'; import { ChangeTaskPhaseDto } from '../dto/task/change-task-phase.dto'; import { TMTask } from '../entities/task.entity'; +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'; +@AuthGuards() +@AdminRoute() @ApiTags('Task Manager - Tasks') @Controller('task-manager/tasks') export class TaskController { @@ -64,4 +70,16 @@ export class TaskController { remove(@Param('id') id: string): Promise { return this.taskService.remove(id); } + + @Get('detail/:id') + @ApiOperation({summary: 'Get Task Detail'}) + @ApiParam({ name: 'id', description: 'Task ID' }) + @ApiResponse({ status: 200, description: 'Task detail received!' }) + @ApiResponse({ status: 404, description: 'Task not found' }) + getTaskDetail( + @UserDec('id') userId: string, + @Param() paramDto: ParamDto + ): Promise { + return this.taskService.getTaskDetail(userId, paramDto.id); + } } \ No newline at end of file diff --git a/src/modules/task-manager/providers/task.service.ts b/src/modules/task-manager/providers/task.service.ts index 2be9e15..e46f02e 100644 --- a/src/modules/task-manager/providers/task.service.ts +++ b/src/modules/task-manager/providers/task.service.ts @@ -1,4 +1,4 @@ -import { BadRequestException, Injectable, NotFoundException } from "@nestjs/common"; +import { BadRequestException, ForbiddenException, Injectable, NotFoundException } from "@nestjs/common"; import { InjectRepository } from "@nestjs/typeorm"; import { In, Repository } from "typeorm"; import { TaskRepository } from "../repositories/task.repository"; @@ -35,6 +35,7 @@ export class TaskService { where: { id }, relations: { taskPhase: true, + users: true }, }); if (!task) throw new NotFoundException(TaskMessage.TASK_NOT_FOUND); @@ -123,4 +124,14 @@ export class TaskService { await this.findOneOrFail(id); await this.taskRepository.delete(id); } + + async getTaskDetail(userId: string, taskId: string): Promise { + const task = await this.findOneOrFail(taskId); + + const isTaskMember = task.users.some((user) => user.id === userId); + if(!isTaskMember) throw new ForbiddenException(TaskMessage.USER_NOT_TASK_MEMBER); + + const taskDetail = await this.taskRepository.getTaskDetail(taskId); + return taskDetail; + } } diff --git a/src/modules/task-manager/repositories/task.repository.ts b/src/modules/task-manager/repositories/task.repository.ts index 5f07518..4a5dff0 100644 --- a/src/modules/task-manager/repositories/task.repository.ts +++ b/src/modules/task-manager/repositories/task.repository.ts @@ -10,4 +10,13 @@ export class TaskRepository extends 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(); + } }