30 lines
1.2 KiB
TypeScript
30 lines
1.2 KiB
TypeScript
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<typeof bodySchema>;
|
||
|
|
|
||
|
|
/** 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 ?? '');
|
||
|
|
}
|
||
|
|
}
|