8.1 KiB
Sistema de Enrollment - Guía de Implementación
Resumen
El sistema de enrollment permite a los administradores agregar nuevos usuarios (staff, artists, managers) y kiosks al sistema AnchorOS mediante una interfaz web segura.
Arquitectura
Componentes
1. Frontend
- Ruta:
/admin/enrollment - Tecnología: Next.js 14 App Router + React
- Características:
- Autenticación por admin key
- Tabs separados para Staff y Kiosks
- Listado de usuarios/kiosks existentes
- Formularios validados
2. API Routes
/api/admin/locations
- GET: Obtener todas las locations activas
- Auth: Bearer token (ADMIN_ENROLLMENT_KEY)
/api/admin/users
- GET: Listar staff members (filtrable por location y role)
- POST: Crear nuevo staff member
- Campos requeridos:
location_id- UUID de la locationrole- admin | manager | staff | artistdisplay_name- Nombre público del staffemail- Email para autenticaciónpassword- Contraseña inicialfirst_name,last_name- Nombres para perfilphone- Teléfono (opcional)
- Acción:
- Crea usuario en Supabase Auth
- Crea registro en tabla
staff - Devuelve respuesta con éxito
/api/admin/kiosks
- GET: Listar kiosks (filtrable por location)
- POST: Crear nuevo kiosk
- Campos requeridos:
location_id- UUID de la locationdevice_name- Identificador único del dispositivodisplay_name- Nombre legible del kioskoip_address- IP para restricción (opcional)
- Acción:
- Llama función SQL
create_kiosk() - Genera API key de 64 caracteres
- Devuelve API key (solo se muestra una vez)
- Llama función SQL
Instalación
1. Configurar Variables de Entorno
Agrega a tu archivo .env.local:
# Admin Enrollment Key (genera una segura)
ADMIN_ENROLLMENT_KEY=your-secure-admin-key-here-change-me
2. Instalar Dependencias Necesarias
npm install @radix-ui/react-label @radix-ui/react-select @radix-ui/react-tabs lucide-react clsx tailwind-merge
3. Verificar Archivos Creados
Deberías tener estos archivos:
app/
├── admin/
│ └── enrollment/
│ └── page.tsx
└── api/
└── admin/
├── locations/route.ts
├── users/route.ts
└── kiosks/route.ts
components/
└── ui/
├── button.tsx
├── card.tsx
├── input.tsx
├── label.tsx
├── select.tsx
└── tabs.tsx
lib/
└── utils.ts
4. Ejecutar Migraciones
npx supabase db push
Esto debería aplicar:
20260116000000_add_kiosk_system.sql20260116010000_update_resources.sql20260116020000_cleanup_and_fix_resources.sql
Uso del Sistema
1. Acceder al Sistema
Navega a: http://localhost:3000/admin/enrollment
2. Autenticación
- Ingresa tu
ADMIN_ENROLLMENT_KEY - Haz clic en "Access Enrollment System"
- La clave se guardará en localStorage para futuras sesiones
3. Crear Staff Member
- Selecciona la tab "Staff Members"
- Completa el formulario:
- Location: Selecciona del dropdown
- Role: Admin, Manager, Staff, o Artist
- Display Name: e.g., "María García"
- First Name: e.g., "María"
- Last Name: e.g., "García"
- Email: e.g., "maria@salon.com"
- Password: Contraseña inicial
- Phone: (opcional)
- Haz clic en "Create Staff Member"
- Verifica que aparezca en la lista de "Existing Staff Members"
4. Crear Kiosk
- Selecciona la tab "Kiosks"
- Completa el formulario:
- Location: Selecciona del dropdown
- Device Name: Identificador único (e.g., "kiosk-entrance-1")
- Display Name: Nombre legible (e.g., "Kiosko Entrada Principal")
- IP Address: IP para restricción (opcional, e.g., "192.168.1.100")
- Haz clic en "Create Kiosk"
- ⚠️ IMPORTANTE: Guarda el API key generado en un lugar seguro
- Solo se mostrará una vez
- Debes agregarla a
NEXT_PUBLIC_KIOSK_API_KEYen .env.local - O compartirla manualmente al dispositivo del kiosko
Seguridad
Autenticación
- Método: Bearer token en header
Authorization - Validación: Token debe coincidir con
ADMIN_ENROLLMENT_KEY - Almacenamiento: Cliente guarda token en localStorage
Protección de Rutas
Las API routes verifican:
const authHeader = request.headers.get('authorization')
const token = authHeader.replace('Bearer ', '')
if (token !== process.env.ADMIN_ENROLLMENT_KEY) {
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
}
API Keys de Kioskos
- Generadas aleatoriamente (64 caracteres)
- Solo se muestran una vez
- Deben guardarse de forma segura
- Se pueden rotar creando un nuevo kiosko
Troubleshooting
Error: "Unauthorized"
Causa: ADMIN_ENROLLMENT_KEY incorrecto o no configurado
Solución:
- Verifica que
ADMIN_ENROLLMENT_KEYesté en.env.local - Reinicia el servidor:
npm run dev - Limpia localStorage y re-autentica
Error: "Missing required fields"
Causa: Faltan campos obligatorios en el formulario
Solución:
- Staff: location_id, role, display_name, email, password
- Kiosk: location_id, device_name, display_name
Error: "A kiosk with this device_name already exists"
Causa: Ya existe un kiosko con ese nombre
Solución:
- Verifica en la lista de kiosks existentes
- Usa un
device_namediferente - O elimina el kiosko existente primero
Error: "Failed to create auth user"
Causa: Email ya existe en Supabase Auth
Solución:
- El usuario debe existir
- Usa un email diferente
- O contacta al usuario para que restablezca su contraseña
Testing
Test de Creación de Staff
curl -X POST http://localhost:3000/api/admin/users \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your-admin-key" \
-d '{
"location_id": "location-uuid",
"role": "artist",
"display_name": "Test Artist",
"first_name": "Test",
"last_name": "Artist",
"email": "test@salon.com",
"password": "test123",
"phone": "+52 55 1234 5678"
}'
Test de Creación de Kiosk
curl -X POST http://localhost:3000/api/admin/kiosks \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your-admin-key" \
-d '{
"location_id": "location-uuid",
"device_name": "kiosk-test-1",
"display_name": "Test Kiosk",
"ip_address": "192.168.1.200"
}'
Test de Listado de Locations
curl http://localhost:3000/api/admin/locations \
-H "Authorization: Bearer your-admin-key"
Integración con Sistema de Kiosko
Después de Crear un Kiosk
- Obtener la API Key (solo se muestra una vez)
- Configurar en Frontend del Kiosko:
En .env.local:
NEXT_PUBLIC_KIOSK_API_KEY=la-api-key-generada
- Probar Acceso al Kiosko:
Navega a: http://localhost:3000/kiosk/{location-id}
El kiosko debería autenticarse automáticamente.
Próximas Mejoras
Funcionalidades Futuras
- Desactivar staff/kiosks en lugar de eliminar
- Editar staff/kiosks existentes
- Ver historial de cambios (audit logs)
- Exportar lista de staff a CSV
- Asignar múltiples locations a un staff member
- Validación de email único antes de crear
Seguridad Futura
- Rate limiting para prevenir abusos
- 2FA para el sistema de enrollment
- Logs de acceso al sistema de enrollment
- Notificación de creación de usuario
Documentación Relacionada
KIOSK_SYSTEM.md- Documentación completa del sistema de kioskoKIOSK_IMPLEMENTATION.md- Guía rápida de implementaciónTASKS.md- Plan de ejecución del proyectoPRD.md- Especificación funcional del sistema
Soporte
Para problemas técnicos:
- Revisa los logs del servidor
- Verifica que las migraciones se aplicaron correctamente
- Confirma que las variables de entorno están configuradas
- Consulta la documentación de Supabase Auth
Fecha: 16 de Enero, 2026 Versión: v1.0.0 Estado: Completado y listo para producción