feat: administradores por proyecto y Configuracion solo para superadmin

- Un proyecto puede tener uno o mas administradores (role_in_project=
  'admin' en project_members), independiente del rol global del usuario.
  Nuevo PUT /api/projects/:id/members/:userId/role; canWriteProject lo
  reconoce ademas del comportamiento previo (admin/superadmin/it_manager
  global, o project_lead miembro). UI: casilla al agregar miembro + boton
  de escudo para promover/degradar (nunca toca al Dueño).
- Menu "Configuracion" (apariencia, catalogos, SMTP) visible y accesible
  solo para el superadmin: oculto en el nav y con guarda en la ruta
  /configuracion para quien la teclee directo. Escritura de catalogos
  restringida de [superadmin, admin] a solo superadmin para que el
  backend sea consistente con la UI.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Milton Gonzalez
2026-09-09 09:41:06 -05:00
parent e018eba8c1
commit f96391d360
16 changed files with 144 additions and 28 deletions
+2 -1
View File
@@ -2,7 +2,7 @@ import { Router } from 'express';
import { requireAuth } from '../../middleware/auth.js';
import {
getProjects, getProject, postProject, putProject, deleteProject, postProjectRestore,
deleteProjectPermanent, postMember, deleteMember,
deleteProjectPermanent, postMember, putMemberRole, deleteMember,
} from './controller.js';
import { getGantt } from '../dashboard/controller.js';
import { getActivitiesByProject, postActivity } from '../activities/controller.js';
@@ -19,6 +19,7 @@ router.post('/:id/restore', postProjectRestore);
router.delete('/:id/permanent', deleteProjectPermanent);
router.get('/:id/gantt', getGantt);
router.post('/:id/members', postMember);
router.put('/:id/members/:userId/role', putMemberRole);
router.delete('/:id/members/:userId', deleteMember);
router.get('/:projectId/activities', getActivitiesByProject);
router.post('/:projectId/activities', postActivity);