Arquitectura del Sistema¶
Visión general de la arquitectura de la plataforma Amani.
Patrón arquitectónico¶
La API sigue una arquitectura por capas con separación por roles:
graph TD
A[Client Layer<br/>Web App · Mobile App · Swagger UI] --> B[Controller Layer<br/>Endpoints REST con anotaciones OpenAPI]
B --> C[Service Layer<br/>Lógica de negocio · Transacciones · Eventos]
C --> D[Repository Layer<br/>Acceso a datos con Spring Data JPA]
D --> E[Database Layer<br/>PostgreSQL · Esquema psicologia_app] Capas detalladas¶
1. Configuration Layer¶
Ubicación: src/main/java/com/amani/amaniapirest/configuration/
| Clase | Responsabilidad |
|---|---|
SecurityConfig | Configuración de Spring Security + JWT |
JwtUtil | Generación y validación de tokens JWT |
JwtAuthFilter | Filtro para validar tokens en requests |
WebSocketConfig | Configuración WebSocket STOMP |
FirebaseConfig | Cliente Firebase Admin SDK |
OpenApiConfig | Configuración Swagger/OpenAPI |
ErrorResponse | Estructura de respuestas de error |
GlobalExceptionHandler | Manejo global de excepciones |
2. Controller Layer¶
Ubicación: src/main/java/com/amani/amaniapirest/controllers/
Por rol:
controladorAdministador/— endpoints admincontroladorPsicologo/— endpoints psicólogocontroladorPaciente/— endpoints paciente
Por funcionalidad:
login/— autenticaciónchat/— WebSocketpreguntasController/— test inicialprofileController/— fotos de perfilsituacionController/— catálogo de situaciones
3. Service Layer¶
Ubicación: src/main/java/com/amani/amaniapirest/services/
Servicios generales:
UsuarioService— gestión usuariosEmailService— envío de emailsFirebaseNotificationService— notificaciones pushWebSocketPresenceTracker— tracking de usuarios online
Por rol:
paciente/— DiarioEmocionService, MensajeService, ProgresoEmocionalServicepsicologo/— MensajePsicologoService, PsicologoSelfServiceserviceAdmin/— DireccionAdminService, PacienteAdminService
Servicios de login:
serviciosLogin/AuthService— login, registro, tokens
4. Repository Layer¶
Ubicación: src/main/java/com/amani/amaniapirest/repository/
Repositorios JPA: UsuarioRepository, PacientesRepository, CitaRepository, etc.
5. Models Layer¶
Ubicación: src/main/java/com/amani/amaniapirest/models/
Entidades JPA: Usuario, Paciente, Psicologo, Cita, Sesion, Mensaje, etc.
Seguridad¶
Autenticación JWT¶
sequenceDiagram
participant C as Cliente
participant S as Servidor
C->>S: POST /auth/login (email, password)
S->>S: Validar credenciales (BCrypt)
S->>S: Generar token JWT (HS256, 24h)
S-->>C: { token, idUsuario, rol } Roles y permisos¶
| Rol | Descripción | Endpoints |
|---|---|---|
ADMIN | Acceso completo | /api/admin/** |
PSICOLOGO | Gestión clínica | /api/psicologo/** |
PACIENTE | Acceso propio | /api/paciente/** |
Endpoints públicos¶
POST /auth/loginPOST /auth/register-pacienteGET /api/situacionesGET /api/psicologo/pacientes/*/psicologo(pacientes solo)/docs/**,/v3/api-docs/**,/swagger-ui/**
Event-Driven Architecture¶
Patrón usado para notificaciones: @TransactionalEventListener
Eventos¶
| Evento | Descripción | Listeners |
|---|---|---|
CitaCreadaEvent | Nueva cita creada | Email, Push |
CitaCanceladaEvent | Cita cancelada | Email, Push |
CitaRecordatorioEvent | 24h antes de cita | |
UsuarioRegistradoEvent | Nuevo usuario registrado |
Patrón de uso¶
// En el service
eventPublisher.publishEvent(new CitaCreadaEvent(this, cita));
// En el listener
@TransactionalEventListener(phase = TransactionalEventListenerPhase.AFTER_COMMIT)
public void onCitaCreada(CitaCreadaEvent event) {
emailService.enviarCitaCreada(event.getCita());
}
WebSocket (STOMP)¶
Configuración¶
- Endpoint:
/ws - Broker:
/topic,/queue - Prefijo apps:
/app
Usos¶
- Mensajería en tiempo real entre usuarios
- Notificaciones push (si no online → Firebase)
- Estado de sesión (online/offline tracking)
Base de datos¶
PostgreSQL con esquema psicologia_app.
Tablas principales:
usuarios— cuenta de usuariopacientes— perfil pacientepsicologos— perfil psicólogocitas— agendas y citassesiones— sesiones de terapiadiario_emociones— registro diariomensajes— chathistorial_clinico— historial médico
Ver: Base de datos