Adiciona upload/remoção de logo e cor primária por tenant (módulo tenant-profile, armazenamento local atrás de uma interface StorageService trocável por object storage depois) e um endpoint público de tema para a tela de login carregar antes da autenticação. Revisão de segurança: Helmet e CORS explícito (extraídos para security.util.ts, reutilizado pelos testes e2e que verificam os cabeçalhos), Swagger em /docs cobrindo todos os módulos via o plugin oficial, paginação em alert_templates. Corrige um achado real: o reset de senha logava o token em texto puro desde a Etapa 2 — agora envia por e-mail de verdade. Build de produção do Docker validado (imagem sem devDependencies, app e worker rodando contra Postgres/Redis reais) e README consolidado com o processo de deploy. Fecha o backlog com um teste e2e do fluxo completo: master cria tenant → login → customer/produto → venda com parcelas → parcela paga → dashboard financeiro reflete o pagamento. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
50 lines
1.5 KiB
TypeScript
50 lines
1.5 KiB
TypeScript
import {
|
|
Body,
|
|
Controller,
|
|
Get,
|
|
Param,
|
|
ParseUUIDPipe,
|
|
Patch,
|
|
Post,
|
|
Query,
|
|
Req,
|
|
UseGuards,
|
|
} from '@nestjs/common';
|
|
import { Request } from 'express';
|
|
import { CurrentUser } from '../auth/decorators/current-user.decorator';
|
|
import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard';
|
|
import { TenantGuard } from '../auth/guards/tenant.guard';
|
|
import { JwtPayload } from '../auth/types/jwt-payload.type';
|
|
import { ListRecebimentosQueryDto } from './dto/list-recebimentos.query.dto';
|
|
import { MarcarPagoDto } from './dto/marcar-pago.dto';
|
|
import { SalePaymentsService } from './sale-payments.service';
|
|
import { ApiBearerAuth, ApiTags } from '@nestjs/swagger';
|
|
|
|
@UseGuards(JwtAuthGuard, TenantGuard)
|
|
@ApiTags('tenant/recebimentos')
|
|
@ApiBearerAuth('jwt')
|
|
@Controller('tenant/recebimentos')
|
|
export class SalePaymentsController {
|
|
constructor(private readonly salePaymentsService: SalePaymentsService) {}
|
|
|
|
@Get()
|
|
findAll(@Query() query: ListRecebimentosQueryDto) {
|
|
return this.salePaymentsService.findAll(query);
|
|
}
|
|
|
|
@Patch(':id/marcar-pago')
|
|
marcarPago(
|
|
@Param('id', ParseUUIDPipe) id: string,
|
|
@Body() dto: MarcarPagoDto,
|
|
@CurrentUser() user: JwtPayload,
|
|
@Req() req: Request,
|
|
) {
|
|
return this.salePaymentsService.marcarPago(id, dto, user, req.ip);
|
|
}
|
|
|
|
@Post('atualizar-atrasadas')
|
|
atualizarAtrasadas(@CurrentUser() user: JwtPayload, @Req() req: Request) {
|
|
return this.salePaymentsService.atualizarAtrasadas(user, req.ip);
|
|
}
|
|
}
|