import { Body, Controller, Get, Param, Patch, Post, UseGuards } from "@nestjs/common"; import { ApiBearerAuth, ApiTags } from "@nestjs/swagger"; import { ContractsService } from "./contracts.service.js"; import { CreateContractDto } from "./dto/create-contract.dto.js"; import { UpdateContractStatusDto } from "./dto/update-contract-status.dto.js"; import { ContractItemInputDto } from "./dto/contract-item-input.dto.js"; import { ContractPartyInputDto } from "./dto/contract-party-input.dto.js"; import { JwtAuthGuard } from "../auth/jwt-auth.guard.js"; import { PermissionGuard } from "../auth/permission.guard.js"; import { RequirePermission } from "../auth/decorators/require-permission.decorator.js"; import { CurrentUser } from "../auth/decorators/current-user.decorator.js"; import type { EdenAuthenticatedUser } from "../auth/jwt-auth.guard.js"; /** * Contracts as a first-class aggregate — docs/adr/0006-contract-first-class.md. * Every write recalculates monthly_value/contract_total server-side from * the items array (Master Prompt §6.6/§24) — a client-supplied total is * never trusted. */ @ApiTags("contracts") @ApiBearerAuth() @UseGuards(JwtAuthGuard, PermissionGuard) @Controller("v1/contracts") export class ContractsController { constructor(private readonly contracts: ContractsService) {} @Get() @RequirePermission("contracts", "view") list(@CurrentUser() user: EdenAuthenticatedUser) { return this.contracts.list(user); } @Get(":id") @RequirePermission("contracts", "view") get(@Param("id") id: string, @CurrentUser() user: EdenAuthenticatedUser) { return this.contracts.get(id, user); } @Post() @RequirePermission("contracts", "edit") create(@Body() dto: CreateContractDto, @CurrentUser() user: EdenAuthenticatedUser) { return this.contracts.create(dto, user); } @Patch(":id/status") @RequirePermission("contracts", "edit") updateStatus( @Param("id") id: string, @Body() dto: UpdateContractStatusDto, @CurrentUser() user: EdenAuthenticatedUser, ) { return this.contracts.updateStatus(id, dto, user); } @Post(":id/items") @RequirePermission("contracts", "edit") addItem( @Param("id") id: string, @Body() dto: ContractItemInputDto, @CurrentUser() user: EdenAuthenticatedUser, ) { return this.contracts.addItem(id, dto, user); } @Post(":id/parties") @RequirePermission("contracts", "edit") addParty( @Param("id") id: string, @Body() dto: ContractPartyInputDto, @CurrentUser() user: EdenAuthenticatedUser, ) { return this.contracts.addParty(id, dto, user); } }