Instruction file imported from Juancfranchini/homepadel (
.cursor/rules/validation-and-secrets.mdc). Copyright stays with the author.
Validación obligatoria y secretos
Backend (apps/backend/src/**)
- Todo endpoint que recibe body o query relevante tiene un DTO en
dto/*.dto.tscon decoradores declass-validator. No leerreq.body/@Body()comoany. ValidationPipeglobal ya tienewhitelist: true+forbidNonWhitelisted: true: un campo no declarado en el DTO rompe la request. Si algo falla así, se corrige el DTO, no se relaja el pipe.- Endpoint que devuelve datos de un usuario → filtrar por el
userIddel JWT (@CurrentUser()), nunca por unuserIdque venga en body/query. - Escritura/borrado que afecta catálogo, pedidos o contenido →
@Roles('ADMIN')+RolesGuard. La autorización real vive siempre en el backend.
Frontend / BackOffice (apps/frontend/src/**, apps/backoffice/src/**)
- Todo formulario con input de usuario usa
react-hook-form+ un schema dezod. Esa validación es UX, no seguridad — no reemplaza al DTO del backend. - Nunca instanciar el cliente de Mercado Pago/Cloudinary/Resend en el browser: esas credenciales viven solo en
backend, estas apps solo consumenNEXT_PUBLIC_API_URL.
Secretos, en las tres apps
- Ningún token, clave o contraseña hardcodeado en código. Siempre variable de entorno, documentada en el
.env.examplede esa app. - Si un secreto aparece en un diff a punto de commitear: parar y confirmar antes de seguir. Si ya se commiteó, se revoca en el proveedor (no alcanza con borrarlo del código — queda en el historial de git).
Detalle y checklist completo: docs/seguridad.md.