Saltar a contenido

Diagrama de Arquitectura

Esquema visual de la arquitectura del sistema.


Diagrama de capas

graph TD
    subgraph Client["Client Layer"]
        WA[Web App]
        MA[Mobile App<br/>Android]
        SW[Swagger UI]
    end

    subgraph Controller["Controller Layer (REST)"]
        AUTH["/auth/*"]
        ADMIN["/api/admin/*"]
        PSI["/api/psicologo/*"]
        PAC["/api/paciente/*"]
        WS["/ws"]
    end

    subgraph Service["Service Layer"]
        AS[Auth Service]
        CS[Cita Service]
        US[Usuario Service]
        ES[Email Service]
        FS[Firebase Notif]
        MS[Mensaje Service]
        EV[Application Events<br/>CitaCreadaEvent → Listeners]
    end

    subgraph Repository["Repository Layer (JPA)"]
        UR[UsuarioRepo]
        CR[CitaRepo]
        MR[MensajeRepo]
    end

    subgraph DB["Database Layer"]
        PG[(PostgreSQL<br/>psicologia_app)]
    end

    Client --> Controller
    Controller --> Service
    Service --> Repository
    Repository --> DB

Flujo de autenticación

sequenceDiagram
    participant C as Cliente
    participant S as Servidor
    participant DB as Base de datos

    C->>S: POST /auth/login
    S->>DB: Validar credenciales (BCrypt)
    DB-->>S: Usuario encontrado
    S->>S: Generar JWT (HS256, 24h)
    Note over S: Claims: email, rol
    S-->>C: { token, idUsuario, rol }

Flujo WebSocket

sequenceDiagram
    participant C as Cliente
    participant S as Servidor

    C->>S: CONNECT /ws (STOMP handshake)
    C->>S: SUBSCRIBE /topic/mensajes
    C->>S: SEND /app/chat
    S->>S: Broadcast /topic/mensajes
    S-->>C: MESSAGE /topic/mensajes

Flujo de notificaciones

flowchart LR
    E[ApplicationEvent] --> L["@TransactionalEventListener"]
    L --> EMAIL[EmailService → SMTP]
    L --> FCM[FirebaseNotificationService → FCM]

    subgraph Eventos
        E1[CitaCreadaEvent]
        E2[CitaCanceladaEvent]
        E3[CitaRecordatorioEvent]
    end

    E1 --> L
    E2 --> L
    E3 --> L

Flujo de seguridad

flowchart TD
    REQ[Request] --> JWT[JwtAuthFilter]
    JWT --> EXT[Extraer token]
    EXT --> VAL[Validar firma JWT]
    VAL --> UD[Obtener UserDetails]
    UD --> SEC[SecurityFilterChain]
    SEC --> PUB{¿Endpoint público?}
    PUB -->|Sí| PERMIT[PermitAll]
    PUB -->|No| ROLE{¿Rol autorizado?}
    ROLE -->|Sí| CTRL[Controller]
    ROLE -->|No| DENY[403 Forbidden]

Relación Entidad-Entidad (ER)

erDiagram
    USUARIO ||--o| PACIENTE : tiene
    USUARIO ||--o| PSICOLOGO : tiene
    PACIENTE }o--|| PSICOLOGO : asignado_a
    PACIENTE ||--o{ CITA : agenda
    PSICOLOGO ||--o{ CITA : atiende
    CITA ||--o| SESION : genera
    PACIENTE ||--o{ DIARIO_EMOCIONES : registra
    PACIENTE ||--o{ MENSAJE : envia
    PACIENTE ||--o{ HISTORIAL_CLINICO : tiene
    PACIENTE ||--o{ DIRECCION : posee

    USUARIO {
        bigint id_usuario PK
        varchar nombre
        varchar email UK
        varchar password
        enum rol
        boolean activo
    }

    PACIENTE {
        bigint id_paciente PK
        bigint id_usuario FK
        bigint id_psicologo FK
        date fecha_nacimiento
        varchar genero
    }

    PSICOLOGO {
        bigint id_psicologo PK
        bigint id_usuario FK
        varchar especialidad
        int experiencia
    }

    CITA {
        bigint id_cita PK
        bigint id_paciente FK
        bigint id_psicologo FK
        timestamp start_datetime
        enum estado
    }

Patrones implementados

Patrón Uso en Amani
Layered Architecture Controller → Service → Repository → Model
Dependency Injection Spring @Autowired en todos los services
DTO Pattern DTOs separados por rol y propósito
Event-Driven @TransactionalEventListener para notificaciones
Decorator FileStorageService wrap de Files.copy
Strategy PasswordEncoder (BCrypt)
Template Method Abstract classes con métodos comunes
Singleton @Service y @Component por defecto