2026-08-06 — Perfil de admin, 2FA por SMS y notificaciones
Para el panel de administración (back-office).
Summary
El panel gana gestión del perfil del propio admin, un segundo factor por SMS opcional
en el login y una bandeja de notificaciones. Todo aplica al guard admin y es aditivo.
New
Perfil del admin (admin)
| Método | Endpoint | Rol | Para qué sirve |
|---|---|---|---|
| GET | /admin/auth/profile |
admin | Leer el perfil propio. |
| PUT | /admin/auth/profile |
admin | Actualizar el perfil propio. |
- Response (
{ admin }):id,name,email,phone,jobTitle,isSuperAdmin,emailNotifications,twoFactorEnabled. PUT— campos opcionales:name,email(único),phone,jobTitle,emailNotifications(bool),twoFactorEnabled(bool), y para cambiar contraseñacurrentPassword+newPassword(connewPassword_confirmation).- Reglas: activar
twoFactorEnabledexige tenerphone(en el request o ya guardado); cambiar la contraseña exigecurrentPasswordcorrecto. - Errores:
422(validación; uncurrentPasswordincorrecto también responde422).
2FA por SMS en el login (admin)
El login puede pedir un segundo factor cuando el admin tiene twoFactorEnabled y un
phone registrado; en caso contrario devuelve el token directamente.
POST /admin/auth/login— Request:email,password. Response sin 2FA:{ token, admin }. Response con 2FA:{ requires_2fa: true, verify_token }(aún no incluyetoken;verify_tokenvale 5 minutos).POST /admin/auth/2fa/verify— Request:verify_token,code. Response:{ token, admin }.- No hay endpoint de reenvío: repetir
POST /admin/auth/loginreemite elverify_token. - Errores login:
401 InvalidCredentials. Errores verify:401 TokenExpiredOrInvalid·401 AdminNotFound·401 InvalidOtp.
Bandeja de notificaciones del admin (admin)
| Método | Endpoint | Rol | Para qué sirve |
|---|---|---|---|
| GET | /admin/notifications |
admin | Listar notificaciones (cursor). |
| GET | /admin/notifications/unread-count |
admin | Cantidad sin leer. |
| POST | /admin/notifications/read-all |
admin | Marcar todas como leídas. |
| POST | /admin/notifications/{id}/read |
admin | Marcar una como leída. |
| DELETE | /admin/notifications/{id} |
admin | Eliminar una. |
GET /admin/notifications— query:limit(1-100, por defecto 30),cursor,filter(unread). Response:{ items, next_cursor, has_more }. Cada item:id,type,title,body,priority,data,read_at,created_at.GET /admin/notifications/unread-count→{ unread_count }.POST /admin/notifications/{id}/read→{ read_at };404 NotFoundsi no es del admin.read-allyDELETE→{ ok: true }.typede las notificaciones del panel:success,error,warning,info(según el evento: nuevo pedido, entrega, cancelación, KYC enviado, comentario en estación, cola de soporte).