64 lines
2 KiB
Markdown
64 lines
2 KiB
Markdown
|
|
# Schemas Zod compartidos (TICKET-003)
|
||
|
|
|
||
|
|
**Estado:** Completado
|
||
|
|
**Ubicación:** `backend/src/shared/schemas/`
|
||
|
|
|
||
|
|
## Contenido
|
||
|
|
|
||
|
|
- **common.ts:** Enums y validaciones comunes (contentStatus, contentPriority, slug, uuid, isoDate, etc.).
|
||
|
|
- **content.ts:** ContentItem, create/update/list Content, contentId/contentUuid.
|
||
|
|
- **drugs.ts:** Drug, create/update/list Drugs, validateDose, calculatePediatricDose.
|
||
|
|
- **glossary.ts:** GlossaryTerm, create/update/list Glossary, searchGlossary.
|
||
|
|
- **media.ts:** MediaResource, create/update/list Media, uploadMedia.
|
||
|
|
- **validation.ts:** Revisión médica (submitForReview, approve, reject, publish, pendingContent).
|
||
|
|
|
||
|
|
Todos los tipos TypeScript se exportan desde `index.ts`. Además se exportan aliases de entidad: `ContentItem`, `Drug`, `GlossaryTerm`, `MediaResource`.
|
||
|
|
|
||
|
|
## Uso en backend
|
||
|
|
|
||
|
|
```ts
|
||
|
|
import {
|
||
|
|
createContentSchema,
|
||
|
|
type CreateContentInput,
|
||
|
|
type ContentItem,
|
||
|
|
} from '../shared/schemas/content.js';
|
||
|
|
// o desde el barrel:
|
||
|
|
import { createContentSchema, type ContentItem } from '../shared/schemas/index.js';
|
||
|
|
```
|
||
|
|
|
||
|
|
## Uso en frontend
|
||
|
|
|
||
|
|
El frontend puede reutilizar los mismos schemas mediante el alias `@shared/schemas` (Vite y tsconfig).
|
||
|
|
|
||
|
|
```ts
|
||
|
|
import {
|
||
|
|
createContentSchema,
|
||
|
|
listContentQuerySchema,
|
||
|
|
type CreateContentInput,
|
||
|
|
type ContentItem,
|
||
|
|
} from '@shared/schemas';
|
||
|
|
```
|
||
|
|
|
||
|
|
Validar datos de formulario o query params:
|
||
|
|
|
||
|
|
```ts
|
||
|
|
const result = createContentSchema.safeParse(formData);
|
||
|
|
if (!result.success) {
|
||
|
|
// result.error.issues
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## Tests
|
||
|
|
|
||
|
|
Tests de validación Zod en `backend/src/shared/schemas/__tests__/schemas.validation.test.ts`. Ejecutar desde backend:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
cd backend && npm run test
|
||
|
|
```
|
||
|
|
|
||
|
|
Cobertura: casos válidos e inválidos para common, content, drugs, glossary, media y validation.
|
||
|
|
|
||
|
|
## Nota técnica
|
||
|
|
|
||
|
|
- `updateContentSchema` en content no usa `.partial()` sobre `createContentSchema` porque Zod 4 no permite `.partial()` en schemas que tienen refinements. Se define como objeto con todos los campos opcionales más `id` obligatorio y `superRefine` para type/content.
|