05 — Modelo de datos · ATRIO
Diagrama ER (simplificado)
Exhibition 1───* VisitRequest
Exhibition
| Campo | Tipo | Notas |
|---|---|---|
| id | cuid PK | |
| slug | string unique | URL |
| title, subtitle | string | |
| summary, body | text | listado / detalle |
| coverImage | string | path público /images/… |
| type | enum TEMPORARY|PERMANENT|INSTALLATION | |
| status | enum CURRENT|UPCOMING|PAST | |
| startsOn | date | |
| endsOn | date? | null permanente |
| room, curator | string? | |
| published | boolean default true | |
| createdAt, updatedAt | datetime |
Índices: slug unique; (published, status); startsOn.
VisitRequest
| Campo | Tipo | Notas |
|---|---|---|
| id | cuid PK | |
| name, email | string | PII |
| phone | string? | PII |
| visitDate | date? | |
| partySize | int | 1–200 |
| requestType | enum INDIVIDUAL|GROUP|SCHOOL | |
| message | text? | |
| status | enum NEW|CONTACTED|CLOSED default NEW | |
| exhibitionId | FK? | |
| createdAt | datetime |
Índices: status+createdAt; email (búsqueda futura).
VisitInfo
Config estática en API (no tabla v1): horarios, precios, dirección, a11y, contacto.
Privacidad y retención
- VisitRequest = datos personales: base servicio público + consentimiento form.
- Retención propuesta: 24 meses luego borrado o anonimización.
- TLS; no logs de body en prod; staff key no es sustituto de IAM completo.
Datos sensibles
| Dato | Clasificación | Control |
|---|---|---|
| email, phone, name | PII | acceso staff + BD |
| STAFF_KEY | secreto | env only |
| DATABASE_URL | secreto | env only |