import { Body, Controller, Delete, Get, Inject, Param, Patch, Post, Query, Req } from "@nestjs/common"; import type { Request } from "express"; import { TasksService } from "./tasks.service.js"; import { ZodValidate } from "../../common/pipes/zod-validation.pipe.js"; import { requireActor } from "../../common/types.js"; import { CreateTaskDto, type CreateTaskInput, ListTasksQuery, type ListTasksQueryInput, UpdateTaskDto, type UpdateTaskInput } from "./dto.js"; /** * T-159
T-161 — Task routes. * * Workspace-scoped: `GET/POST /workspaces/:workspaceId/tasks` (the inbox / * all list + create) and `GET/PATCH/DELETE /workspaces/:workspaceId/tasks/:id`. * These are 3–4 path segments, so they never collide with the workspaces * controller's 2-segment `@Get(":id")` (Express params match one segment). * A task's PAGE lives at `/pages/:id` (kind=task) — the task routes address * the sidecar's task id; the page routes address the page id. */ @Controller() export class TasksController { constructor(@Inject(TasksService) private readonly tasks: TasksService) {} // ---------- list / create ---------- @Get("workspaces/:workspaceId/tasks") list( @Param("workspaceId") workspaceId: string, @Query(ZodValidate(ListTasksQuery)) query: ListTasksQueryInput, @Req() req: Request ) { return this.tasks.list( workspaceId, requireActor(req), { scope: query.scope, status: query.status, dueBefore: query.dueBefore, dueAfter: query.dueAfter, month: query.month, overdue: query.overdue, cursor: query.cursor, limit: String(query.limit) } ); } @Post("workspaces/:workspaceId/tasks") create( @Param("workspaceId") workspaceId: string, @Body(ZodValidate(CreateTaskDto)) body: CreateTaskInput, @Req() req: Request ) { return this.tasks.create(workspaceId, requireActor(req), body, req); } // ---------- single task ---------- @Get("workspaces/:workspaceId/tasks/:id") get(@Param("workspaceId") workspaceId: string, @Param("id") id: string, @Req() req: Request) { return this.tasks.get(workspaceId, id, requireActor(req)); } @Patch("workspaces/:workspaceId/tasks/:id") update( @Param("workspaceId") workspaceId: string, @Param("id") id: string, @Body(ZodValidate(UpdateTaskDto)) body: UpdateTaskInput, @Req() req: Request ) { return this.tasks.update(workspaceId, id, requireActor(req), body, req); } @Delete("workspaces/:workspaceId/tasks/:id") remove(@Param("workspaceId") workspaceId: string, @Param("id") id: string, @Req() req: Request) { return this.tasks.remove(workspaceId, id, requireActor(req), req); } }