feat: version 4.3.0 -- Sesiones activas y pagina Mi cuenta

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Milton Gonzalez
2026-10-26 16:42:19 -05:00
parent 544928d04a
commit a6cc41666e
34 changed files with 464 additions and 110 deletions
+9 -3
View File
@@ -73,8 +73,12 @@
editables directo por el cliente: actividad con tareas = % de tareas hechas; actividad sin
tareas = manual (0-100); proyecto = promedio del avance de sus actividades.
- `users.password_hash` con bcrypt, nunca texto plano ni reversible.
- `users.session_version` (migración `028`) comienza en 1 y aumenta al cambiar/restablecer clave;
cada JWT de sesión debe tener la misma versión. Aplicar la migración antes de iniciar el backend nuevo.
- `users.session_version` (migración `028`) comienza en 1 y aumenta al restablecer clave;
cada JWT de sesión debe tener la misma versión. Cambiar clave desde la aplicación conserva la sesión actual y revoca las demás.
- `user_sessions` (migración `033`) guarda cada sesión por `public_id` (el `sid` del JWT), usuario,
IP, agente, inicio, última actividad, vencimiento y revocación. Su FK a `users` usa `ON DELETE CASCADE`.
El backend limpia al iniciar sesión las filas vencidas o revocadas hace más de 30 días.
Aplicar `033_user_sessions.sql` antes de iniciar el backend nuevo: los JWT anteriores, sin `sid`, exigirán un nuevo inicio de sesión.
- Migración `029`: `edit_version` comienza en 1 en proyectos, comentarios, actividades, tareas,
departamentos, usuarios, catálogos, notas, tareas recurrentes y equipos. El `UPDATE` de edición
verifica la versión y la incrementa atómicamente; sin coincidencia responde 409. En
@@ -216,7 +220,9 @@ node src/scripts/create-admin.js "Nombre" correo@dominio # solo la primera vez
Método: archivos SQL idempotentes en `backend/database/migrations/00X-nombre.sql`
(`CREATE TABLE IF NOT EXISTS` / `information_schema` guards), aplicados con
`node src/scripts/migrate-db.js`. Siempre backup (`mysqldump --single-transaction`) antes de migrar
`node src/scripts/migrate-db.js`. El runner lee todos los `.sql`, los ordena por nombre y los
ejecuta **todos en cada corrida**; no lleva tabla de historial. Por eso `033_user_sessions.sql`
usa `CREATE TABLE IF NOT EXISTS`. Siempre backup (`mysqldump --single-transaction`) antes de migrar
en producción.
- Equipos (desde v2.15.0, migración `023_devices.sql`): `devices.deviceid` UNIQUE; `assigned_user_id`