import { Body, Controller, HttpCode, Inject, Param, Post, Put, Req } from "@nestjs/common"; import type { Request } from "express"; import { UploadsService } from "./uploads.service.js"; import { ZodValidate } from "../../common/pipes/zod-validation.pipe.js"; import { requireActor } from "../../common/types.js"; import { CancelUploadDto, type CancelUploadInput, CompleteUploadDto, type CompleteUploadInput, CreateUploadDto, type CreateUploadInput, } from "./dto.js"; /** * TASK-0101 — upload sessions: * POST /files/uploads open a session (201, signed PUT URL) * PUT /files/uploads/:id/complete verify + SCANNING + enqueue pipeline * POST /files/uploads/:id/cancel delete partial object + row */ @Controller() export class UploadsController { constructor(@Inject(UploadsService) private readonly uploads: UploadsService) {} @Post("files/uploads") create(@Body(ZodValidate(CreateUploadDto)) body: CreateUploadInput, @Req() req: Request) { return this.uploads.create(requireActor(req), body, req); } @Put("files/uploads/:id/complete") complete( @Param("id") id: string, @Body(ZodValidate(CompleteUploadDto)) body: CompleteUploadInput, @Req() req: Request, ) { return this.uploads.complete(id, requireActor(req), body, req); } /** Cancel deletes state (partial object + row); a successful deletion is * 200 (the `{ deleted: true }` body confirms it), not 201. */ @HttpCode(200) @Post("files/uploads/:id/cancel") cancel( @Param("id") id: string, @Body(ZodValidate(CancelUploadDto)) body: CancelUploadInput, @Req() req: Request, ) { return this.uploads.cancel(id, requireActor(req), body, req); } }