import { Body, Controller, Get, Param, Patch, Post, Query, } from '@nestjs/common'; import { ApiBearerAuth, ApiTags } from '@nestjs/swagger'; import { TaskPriority, TaskStatus } from '../../generated/prisma'; import { RequirePermission } from '../auth/decorators/require-permission.decorator'; import { CurrentUser } from '../auth/decorators/current-user.decorator'; import type { AuthenticatedUser } from '../auth/types/authenticated-user'; import { CreateTaskDto } from './dto/create-task.dto'; import { UpdateTaskDto } from './dto/update-task.dto'; import { TasksService } from './tasks.service'; import { Idempotent } from '../common/idempotency/idempotent.decorator'; @ApiTags('tasks') @ApiBearerAuth() @Controller('tasks') export class TasksController { constructor(private readonly tasksService: TasksService) {} @RequirePermission('tasks:read') @Get() findAll( @Query('status') status?: TaskStatus, @Query('priority') priority?: TaskPriority, ) { return this.tasksService.findAll({ status, priority }); } @RequirePermission('tasks:read') @Get(':id') findOne(@Param('id') id: string) { return this.tasksService.findById(id); } @RequirePermission('tasks:create') @Idempotent() @Post() create(@Body() dto: CreateTaskDto, @CurrentUser() actor: AuthenticatedUser) { return this.tasksService.create(dto, actor.id); } @RequirePermission('tasks:update') @Patch(':id') update( @Param('id') id: string, @Body() dto: UpdateTaskDto, @CurrentUser() actor: AuthenticatedUser, ) { return this.tasksService.update(id, dto, actor.id); } @RequirePermission('tasks:complete') @Post(':id/complete') complete(@Param('id') id: string, @CurrentUser() actor: AuthenticatedUser) { return this.tasksService.complete(id, actor.id); } }