Files
zod-backend/src/task/controllers/task.controller.ts
Abdalhamid Alhamad 749ee5457f feat: tasks jounrey
2024-12-11 10:27:51 +03:00

76 lines
2.6 KiB
TypeScript

import { Body, Controller, Get, HttpCode, HttpStatus, Param, Patch, Post, Query, UseGuards } from '@nestjs/common';
import { ApiBearerAuth, ApiTags } from '@nestjs/swagger';
import { Roles } from '~/auth/enums';
import { IJwtPayload } from '~/auth/interfaces';
import { AllowedRoles, AuthenticatedUser } from '~/common/decorators';
import { AccessTokenGuard, RolesGuard } from '~/common/guards';
import { CustomParseUUIDPipe } from '~/core/pipes';
import { ResponseFactory } from '~/core/utils';
import { CreateTaskRequestDto, TaskSubmissionRequestDto } from '../dtos/request';
import { TasksFilterOptions } from '../dtos/request/tasks-filter-options.request.dto';
import { TaskResponseDto } from '../dtos/response';
import { TaskService } from '../services';
@Controller('tasks')
@ApiTags('Tasks')
@ApiBearerAuth()
export class TaskController {
constructor(private readonly taskService: TaskService) {}
@Post()
@UseGuards(RolesGuard)
@AllowedRoles(Roles.GUARDIAN)
async createTask(@AuthenticatedUser() { sub }: IJwtPayload, @Body() body: CreateTaskRequestDto) {
const task = await this.taskService.createTask(sub, body);
return ResponseFactory.data(new TaskResponseDto(task));
}
@Get()
@UseGuards(AccessTokenGuard)
async findTasks(@Query() query: TasksFilterOptions, @AuthenticatedUser() user: IJwtPayload) {
const [tasks, itemCount] = await this.taskService.findTasks(user, query);
return ResponseFactory.dataPage(
tasks.map((task) => new TaskResponseDto(task)),
{
page: query.page,
size: query.size,
itemCount,
},
);
}
@Patch(':taskId/submit')
@UseGuards(RolesGuard)
@AllowedRoles(Roles.JUNIOR)
@HttpCode(HttpStatus.NO_CONTENT)
async submitTask(
@AuthenticatedUser() { sub }: IJwtPayload,
@Param('taskId', CustomParseUUIDPipe) taskId: string,
@Body() body: TaskSubmissionRequestDto,
) {
await this.taskService.submitTask(sub, taskId, body);
}
@Patch(':taskId/approve')
@UseGuards(RolesGuard)
@AllowedRoles(Roles.GUARDIAN)
@HttpCode(HttpStatus.NO_CONTENT)
async approveTaskSubmission(
@AuthenticatedUser() { sub }: IJwtPayload,
@Param('taskId', CustomParseUUIDPipe) taskId: string,
) {
await this.taskService.approveTaskSubmission(sub, taskId);
}
@Patch(':taskId/reject')
@UseGuards(RolesGuard)
@AllowedRoles(Roles.GUARDIAN)
@HttpCode(HttpStatus.NO_CONTENT)
async rejectTaskSubmission(
@AuthenticatedUser() { sub }: IJwtPayload,
@Param('taskId', CustomParseUUIDPipe) taskId: string,
) {
await this.taskService.rejectTaskSubmission(sub, taskId);
}
}