import { Body, Controller, Delete, Get, Param, Patch, Post, Query, UseGuards, } from '@nestjs/common'; import { JwtAuthGuard } from '../auth/jwt-auth.guard'; import { CurrentUser } from '../auth/current-user.decorator'; import { CreateInvoiceDto, CreatePaymentDto, ListInvoicesQueryDto, UpdateInvoiceDto, } from './dto'; import { InvoicesService } from './invoices.service'; type AuthUser = { organizationId: string; userId: string; role: string }; @Controller('invoices') @UseGuards(JwtAuthGuard) export class InvoicesController { constructor(private readonly invoicesService: InvoicesService) {} @Get() list( @CurrentUser() user: AuthUser, @Query() query: ListInvoicesQueryDto, ) { return this.invoicesService.list(user.organizationId, user, { q: query.q, status: query.status, kind: query.kind, dealId: query.dealId, personId: query.personId, companyId: query.companyId, quoteId: query.quoteId, from: query.from, to: query.to, amountMin: query.amountMin, amountMax: query.amountMax, page: query.page ?? 1, limit: query.limit ?? 50, }); } @Get(':id') get(@CurrentUser() user: AuthUser, @Param('id') id: string) { return this.invoicesService.get(user.organizationId, id, user); } @Post() create(@CurrentUser() user: AuthUser, @Body() dto: CreateInvoiceDto) { return this.invoicesService.create(user.organizationId, user.userId, dto); } @Patch(':id') update( @CurrentUser() user: AuthUser, @Param('id') id: string, @Body() dto: UpdateInvoiceDto, ) { return this.invoicesService.update(user.organizationId, id, user, dto); } @Delete(':id') async remove(@CurrentUser() user: AuthUser, @Param('id') id: string) { await this.invoicesService.remove(user.organizationId, id, user); return { ok: true }; } @Post(':id/payments') addPayment( @CurrentUser() user: AuthUser, @Param('id') id: string, @Body() dto: CreatePaymentDto, ) { return this.invoicesService.addPayment( user.organizationId, id, user, dto, ); } @Delete(':id/payments/:paymentId') removePayment( @CurrentUser() user: AuthUser, @Param('id') id: string, @Param('paymentId') paymentId: string, ) { return this.invoicesService.removePayment( user.organizationId, id, paymentId, user, ); } }