🍽️ Restaurant23 - TODO Producción
Última actualización: 26 de Diciembre 2025
Estado: Backend 95% completo, Frontend público 95%, Admin 0%
📊 Estado Actual
✅ Completado
| Componente | Estado | Notas |
|---|---|---|
| Frontend Público | ✅ 95% | 28 páginas, 40 imágenes |
| API /availability | ✅ Creado | functions/api/storefront/[id]/availability.js |
| API /reservations | ✅ Creado | functions/api/storefront/[id]/reservations.js |
| API /setup | ✅ Creado | functions/api/storefront/[id]/setup.js |
| API /auth | ✅ Creado | functions/api/storefront/[id]/auth.js |
| API data-rows | ✅ Existía | CRUD completo con filtros |
| API projects | ✅ Existía | CRUD de proyectos |
| Deploy Cloudflare | ✅ Configurado | wrangler.toml listo |
❌ Pendiente
| Componente | Prioridad | Estimación |
|---|---|---|
| Panel Admin UI | P0 | 2-3 días |
| Conectar formulario reservas a API | P0 | 2 horas |
| Configurar storefrontConfig en org | P0 | 30 min |
| Workflows email confirmación | P1 | 1 día |
| TOTAL | ~3-4 días |
1. 🔧 Endpoints Creados (Listos para usar)
1.1 Availability
GET /api/storefront/{storefrontId}/availability
?date=2025-12-28
&partySize=4
&serviceType=dinner
Response:
{
"success": true,
"date": "2025-12-28",
"totalCapacity": 112,
"slots": [
{ "time": "20:00", "available": true, "remaining": 45 },
{ "time": "20:30", "available": true, "remaining": 32 }
]
}
1.2 Reservations
# Crear reserva (público, sin auth)
POST /api/storefront/{storefrontId}/reservations
{
"name": "Juan García",
"phone": "+34612345678",
"email": "[email protected]",
"date": "2025-12-28",
"time": "21:00",
"partySize": 4,
"serviceType": "dinner",
"specialRequests": "Mesa ventana",
"occasion": "birthday"
}
# Consultar reserva
GET /api/storefront/{storefrontId}/reservations
?code=RSV-A7B3C
&phone=+34612345678
# Cancelar reserva
PUT /api/storefront/{storefrontId}/reservations
{
"code": "RSV-A7B3C",
"phone": "+34612345678",
"action": "cancel"
}
1.3 Setup (crear DATA_TABLEs)
# Ver estado
GET /api/storefront/{storefrontId}/setup
# Crear proyectos (requiere auth)
POST /api/storefront/{storefrontId}/setup
Headers: Authorization: Bearer {jwt}
Response:
{
"success": true,
"created": [
{ "key": "rooms", "projectId": "proj_xxx" },
{ "key": "schedules", "projectId": "proj_yyy" },
...
]
}
1.4 Auth (login admin)
POST /api/storefront/{storefrontId}/auth
{
"googleToken": "eyJhbGciOiJSUzI1NiIs..."
}
Response:
{
"success": true,
"token": "eyJ...", // JWT para requests admin
"user": {
"email": "[email protected]",
"role": "owner"
},
"storefront": {
"projectIds": {
"rooms": "proj_xxx",
"schedules": "proj_yyy",
...
}
}
}
2. ⚙️ Configuración Necesaria
2.1 Configurar storefrontConfig en Organization
En la tabla organizations, el campo storefrontConfig debe tener:
{
"id": "restaurant23",
"subdomain": "restaurant23",
"type": "restaurant",
"authorizedEmails": [
"[email protected]",
"[email protected]"
],
"projectIds": {
"config": "proj_config_xxx",
"rooms": "proj_rooms_xxx",
"schedules": "proj_schedules_xxx",
"menus": "proj_menus_xxx",
"carta": "proj_carta_xxx",
"customers": "proj_customers_xxx",
"reservations": "proj_reservations_xxx"
},
"workflowIds": {
"reservationCreated": "wf_xxx",
"reservationReminder": "wf_yyy"
}
}
2.2 Variables de Entorno (.env)
# Ya configurados
PUBLIC_CADENCES_API_URL=https://cadences.pages.dev
PUBLIC_STOREFRONT_ID=restaurant23
# Nuevos (para admin)
PUBLIC_GOOGLE_CLIENT_ID=xxx.apps.googleusercontent.com
3. 📱 Panel Admin - Estructura
3.1 Páginas a crear
src/pages/admin/
├── index.astro # Dashboard
├── login.astro # Login con Google
├── reservas.astro # Calendario de reservas
├── salas.astro # CRUD salas
├── horarios.astro # CRUD horarios
├── carta.astro # CRUD platos
├── menus.astro # CRUD menús
├── clientes.astro # Lista clientes
└── config.astro # Configuración
3.2 Componentes a crear
src/components/admin/
├── AdminLayout.tsx # Layout con sidebar
├── Sidebar.tsx # Navegación
├── DataTable.tsx # Tabla CRUD genérica
├── ReservationCalendar.tsx
├── DishEditor.tsx # Editor multi-idioma
├── MultiLangInput.tsx # Input ES/EN
└── StatsCard.tsx
3.3 Flujo de autenticación
1. Usuario va a /admin
2. Si no hay token → redirect a /admin/login
3. Login con Google → POST /api/storefront/{id}/auth
4. Guardar JWT en localStorage
5. En cada request → enviar Authorization: Bearer {jwt}
6. JWT expira en 24h → re-login automático
4. 🔄 Conectar Formulario de Reservas
El componente ReservationForm.tsx debe:
- Al seleccionar fecha →
GET /api/storefront/restaurant23/availability?date=... - Mostrar slots disponibles
- Al enviar →
POST /api/storefront/restaurant23/reservations - Mostrar confirmación con código
// src/components/reservations/ReservationForm.tsx
const API_URL = 'https://cadences.pages.dev';
const STOREFRONT_ID = 'restaurant23';
async function fetchAvailability(date: string, partySize: number) {
const res = await fetch(
`${API_URL}/api/storefront/${STOREFRONT_ID}/availability?date=${date}&partySize=${partySize}`
);
return res.json();
}
async function createReservation(data: ReservationData) {
const res = await fetch(
`${API_URL}/api/storefront/${STOREFRONT_ID}/reservations`,
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data),
}
);
return res.json();
}
5. 📧 Workflows de Email (Opcional)
5.1 Confirmación de Reserva
Crear workflow en Cadences que se dispare cuando:
- Se inserta nueva row en
restaurant_reservations - status = 'pending' o 'confirmed'
Acciones:
- Enviar email al cliente con código
- Enviar notificación al restaurante
5.2 Recordatorio 24h
Workflow scheduled que:
- Busca reservas para mañana
- Envía email/SMS de recordatorio
6. 📋 Checklist Final
Inmediato (hoy)
- Crear endpoint /availability
- Crear endpoint /reservations
- Crear endpoint /setup
- Crear endpoint /auth
- Configurar storefrontConfig en org
- Probar endpoints con curl/Postman
Esta semana
- Crear /admin/login.astro
- Crear AdminLayout con sidebar
- Dashboard básico con stats
- CRUD reservas funcional
- Conectar ReservationForm a API
Próxima semana
- CRUD completo (salas, horarios, carta, menús)
- Calendario visual de reservas
- Workflows de email
- Tests e2e
7. 📁 Archivos Creados Esta Sesión
functions/api/storefront/[id]/
├── availability.js ✅ NUEVO - Slots disponibles
├── reservations.js ✅ NUEVO - CRUD reservas públicas
├── setup.js ✅ NUEVO - Auto-crear DATA_TABLEs
├── auth.js ✅ NUEVO - Login admin con Google
├── config.js (ya existía)
├── requests.js (ya existía)
├── destinations/ (ya existía)
└── trips/ (ya existía)
Próximo paso: Configurar storefrontConfig en la organización para que los endpoints funcionen.