import { Controller, Get, Post, Body, Patch, Param, Delete, UseGuards, Query } from '@nestjs/common'; import { ApiTags, ApiBearerAuth, ApiOperation, ApiBody } from '@nestjs/swagger'; import { InvoiceService } from './invoice.service'; import { CreateInvoiceDto } from './dto/create-invoice.dto'; import { UpdateInvoiceDto } from './dto/update-invoice.dto'; import { AdminAuthGuard } from '../auth/guards/adminAuth.guard'; import { Permissions } from 'src/common/decorators/permissions.decorator'; import { PermissionEnum } from 'src/common/enums/permission.enum'; import { AuthGuard } from '../auth/guards/auth.guard'; import { FindInvoicesDto } from './dto/find-invoices.dto'; import { UserId } from 'src/common/decorators'; @Controller() @ApiTags('invoice') @ApiBearerAuth() export class InvoiceController { constructor(private readonly invoiceService: InvoiceService) { } @Get('public/invoice') @UseGuards(AuthGuard) @ApiOperation({ summary: 'Get all invoices with pagination and filters' }) findAll(@Query() dto: FindInvoicesDto, @UserId() userId: string) { return this.invoiceService.findAll(userId, dto); } @Get('public/invoice/:id') @UseGuards(AuthGuard) @ApiOperation({ summary: 'Get one invoice by id' }) findOne(@Param('id') id: string,@UserId() userId: string) { return this.invoiceService.findOne(id,userId); } @Get('public/invoice/item/:id') @UseGuards(AuthGuard) @ApiOperation({ summary: 'Confirm invoice item by id' }) confirmInvoiceItem(@Param('id') id: string,@UserId() userId: string) { return this.invoiceService.confirmInvoiceItem(id,userId); } //------------------- Admin Routes------------- @Post('admin/invoice') @UseGuards(AdminAuthGuard) @Permissions(PermissionEnum.CREATE_INVOICE) @ApiOperation({ summary: 'Create a new invoice (admin)' }) @ApiBody({ type: CreateInvoiceDto }) create(@Body() dto: CreateInvoiceDto) { return this.invoiceService.create(dto); } @Get('admin/invoice') @UseGuards(AdminAuthGuard) @ApiOperation({ summary: 'Get all invoices with pagination and filters' }) findAllAsAdmin(@Query() dto: FindInvoicesDto) { return this.invoiceService.findAllAsAdmin(dto); } @Patch('admin/invoice/:id') @UseGuards(AdminAuthGuard) @Permissions(PermissionEnum.UPDATE_INVOICE) @ApiOperation({ summary: 'Update an invoice (admin)' }) @ApiBody({ type: UpdateInvoiceDto }) update(@Param('id') id: string, @Body() updateInvoiceDto: UpdateInvoiceDto) { return this.invoiceService.update(id, updateInvoiceDto); } @Delete('admin/invoice/:id') @UseGuards(AdminAuthGuard) @Permissions(PermissionEnum.DELETE_INVOICE) @ApiOperation({ summary: 'Remove an invoice (admin)' }) remove(@Param('id') id: string) { return this.invoiceService.remove(id); } }