import { Body, Controller, Get, HttpCode, Param, Post, Req } from '@nestjs/common'; import { z } from 'zod'; import type { AuthenticatedRequest } from '../auth/auth.types.js'; import { ZodValidationPipe } from '../common/zod-validation.pipe.js'; import { SapDbService } from './sapdb.service.js'; const nameSchema = z.string().regex(/^[a-z0-9][a-z0-9-]{0,59}$/, 'Nombre de consulta inválido'); const bodySchema = z.object({ params: z.record(z.string(), z.union([z.string().max(200), z.number()])).default({}) }); type Body_ = z.infer; /** Consultas de solo lectura a la base de datos de SAP (las registradas; el permiso lo declara cada una). */ @Controller('sapdb') export class SapDbController { constructor(private readonly sapdb: SapDbService) {} @Get('queries') queries(@Req() req: AuthenticatedRequest) { return this.sapdb.available(req.user); } @Post('queries/:name') @HttpCode(200) run( @Req() req: AuthenticatedRequest, @Param('name', new ZodValidationPipe(nameSchema)) name: string, @Body(new ZodValidationPipe(bodySchema)) body: Body_, ) { return this.sapdb.run(req.user, name, body.params, req.ip ?? ''); } }