feat: autorregistro con verificacion de correo + aprobacion, superadmin y SMTP
- POST /api/auth/register: primer usuario del sistema -> superadmin con sesion directa (bootstrap, sin correo ni aprobacion); los siguientes quedan pending_verification y reciben un correo con enlace de un solo uso (24h). - GET /api/auth/verify-email: pasa a pending_approval y notifica in-app a los admin/superadmin activos. - admin/superadmin aprueban (POST /api/users/:id/approve, eligen rol y departamento) o rechazan (POST /api/users/:id/reject, borra y audita el email) desde Organizacion -> Usuarios (nuevo badge de estado + acciones). - login() da mensaje especifico segun el status de la cuenta en vez del generico "credenciales invalidas". - Recuperacion de clave (forgot/reset-password): respuesta siempre generica, token de 1 hora de un solo uso. - Nuevo modulo settings: SMTP configurable SOLO por superadmin desde Configuracion -> Correo (SMTP); clave cifrada AES-256-GCM (ENCRYPTION_KEY) en la tabla system_settings, nunca expuesta por la API. sendMail() degrada a modo dev (loguea en vez de enviar) si no hay SMTP configurado, y nunca deja que un fallo de envio tumbe al que lo llama. - Migracion 002_registration_and_smtp.sql: rol superadmin, columnas de ciclo de vida en users (status, tokens), tabla system_settings, y promueve al usuario mas antiguo del sistema a superadmin. - Fix: React.StrictMode disparaba el efecto de VerifyEmailPage dos veces; la segunda llamada (token ya consumido) mostraba "enlace invalido" pese a que la verificacion ya habia funcionado. Se agrega una guarda por token. - Fix (deuda tecnica v1.0.0): se reordena el montaje de rutas en app.js — subtasksRoutes (mount generico en /api) va al final, para no interceptar con su requireAuth interno una request sin token dirigida a un router mas especifico registrado despues. - Documentacion actualizada: AGENTS.md, SPEC.md, API.md, BASE_DE_DATOS.md, CONFIGURACION.md, ESTADO.md, CHANGELOG.md. Version 1.1.0. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -3,7 +3,7 @@
|
||||
## Base URL
|
||||
|
||||
- Desarrollo: `http://localhost:4019/api`
|
||||
- Producción: `https://project.linkedcorp.net/api` (pendiente de deploy)
|
||||
- Producción: `https://project.linkedcorp.net/api`
|
||||
|
||||
## Autenticacion
|
||||
|
||||
@@ -23,12 +23,22 @@
|
||||
## Endpoints principales
|
||||
|
||||
### Auth
|
||||
- `POST /api/auth/login` — `{ email, password }` → `{ token, user }`
|
||||
- `POST /api/auth/login` — `{ email, password }` → `{ token, user }`. Si el usuario no esta
|
||||
`active` (`pending_verification`/`pending_approval`) o `is_active=0`, `403` con mensaje especifico.
|
||||
- `POST /api/auth/register` — público. `{ name, email, password }` → si es el primer usuario del
|
||||
sistema: `{ bootstrap: true, token, user }` (superadmin, sesion directa); si no:
|
||||
`{ bootstrap: false }` y se envia (o loguea, sin SMTP) un correo de verificación.
|
||||
- `GET /api/auth/verify-email?token=...` — público. Pasa el usuario a `pending_approval` y notifica
|
||||
in-app a los `admin`/`superadmin` activos.
|
||||
- `POST /api/auth/forgot-password` — público. `{ email }` → respuesta **siempre genérica**.
|
||||
- `POST /api/auth/reset-password` — público. `{ token, password }`.
|
||||
- `POST /api/auth/logout`
|
||||
- `GET /api/auth/me` — usuario actual
|
||||
|
||||
### Usuarios (`/api/users`) — solo Administrador
|
||||
- `GET /api/users` · `POST /api/users` · `GET /api/users/:id` · `PUT /api/users/:id` · `PATCH /api/users/:id/active`
|
||||
### Usuarios (`/api/users`) — lectura para cualquier autenticado; escritura solo Administrador/Superadministrador
|
||||
- `GET /api/users` · `POST /api/users` · `PUT /api/users/:id` · `PATCH /api/users/:id/active`
|
||||
- `POST /api/users/:id/approve` — `{ roleId?, departmentId? }`, solo sobre usuarios `pending_approval`
|
||||
- `POST /api/users/:id/reject` — borra al usuario `pending_approval` (se audita el email antes)
|
||||
|
||||
### Departamentos (`/api/departments`)
|
||||
- `GET /api/departments` (árbol) · `POST /api/departments` · `PUT /api/departments/:id` · `DELETE /api/departments/:id`
|
||||
@@ -67,9 +77,13 @@
|
||||
- `GET/POST/PUT/DELETE /api/catalogs/priorities`
|
||||
- `GET/POST/PUT/DELETE /api/catalogs/project-types`
|
||||
|
||||
### Auditoría (`/api/audit`) — solo Administrador / Jefe de TI
|
||||
### Auditoría (`/api/audit`) — solo Superadministrador / Administrador / Jefe de TI
|
||||
- `GET /api/audit?entityType=project&entityId=1`
|
||||
|
||||
### Configuración SMTP (`/api/settings`) — solo Superadministrador
|
||||
- `GET /api/settings/smtp` — `{ host, port, user, from, configured }` (nunca la clave)
|
||||
- `PUT /api/settings/smtp` — `{ host, port, user, from, pass? }` (`pass` vacío = no cambiarla)
|
||||
|
||||
## Errores esperados
|
||||
|
||||
- `400` validación
|
||||
|
||||
Reference in New Issue
Block a user