# agenda-viva-grupo6/agenda-viva architecture

> Architecture diagram of the GitHub repository agenda-viva-grupo6/agenda-viva, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-12). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/agenda-viva-grupo6/agenda-viva
- Repository: https://github.com/agenda-viva-grupo6/agenda-viva

## Overview

Agenda Viva lets clinic staff manage patients and appointments, with its central workflow pairing same-day slots across two areas, ranking options by predicted absence risk, then reserving both atomically. Separate agenda and monitor workflows show booked-turn risk and expected weekly absences. The Java service owns domain operations and PostgreSQL state; its optional Python analytics service predicts risk from four anonymized numeric attributes. The README documents graceful chronological fallback when analytics is unavailable. Some subsystems are represented by their exact source directories because their implementation was not sampled.

Main entry points: [`front/js/api.js`](https://github.com/agenda-viva-grupo6/agenda-viva/blob/main/front/js/api.js) (Browser app), [`ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/servicio/ConcertacionService.java`](https://github.com/agenda-viva-grupo6/agenda-viva/blob/main/ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/servicio/ConcertacionService.java) (Pair and reserve), [`ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/servicio/AgendaService.java`](https://github.com/agenda-viva-grupo6/agenda-viva/blob/main/ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/servicio/AgendaService.java) (Agenda operations), [`ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/web/AgendaController.java`](https://github.com/agenda-viva-grupo6/agenda-viva/blob/main/ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/web/AgendaController.java) (Agenda API)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Web interface"]
  node_browser["Browser app<br/>[api.js]"]
  node_patient_ui["Patient management<br/>[pacientes.js]"]
  node_concert_ui["Concertation screen<br/>[concertar.js]"]
  node_agenda_ui["Agenda screen<br/>[agenda.js]"]
  node_login_ui["Login screen<br/>[login.js]"]
end

subgraph group_clinic["Clinic operations"]
  node_patient_api["Patient API"]
  node_patient_service["Patient operations"]
  node_concert_api["Concertation API"]
  node_concert_service["Pair and reserve"]
  node_agenda_api["Agenda API"]
  node_agenda_service["Agenda operations<br/>[AgendaService.java]"]
  node_monitor["Absence monitor"]
  node_clinical_data["Clinical catalog"]
end

subgraph group_identity["Identity and access"]
  node_auth_api["Authentication API"]
  node_auth_service["Authentication service<br/>[AuthService.java]"]
  node_jwt["JWT services<br/>[JwtService.java]"]
  node_security["Request security<br/>[JwtAuthFilter.java]"]
end

subgraph group_analytics["Risk analytics"]
  node_analytics_client["Analytics client"]
  node_attributes["Anonymized attributes<br/>[Atributos.java]"]
  node_analytics_api["Prediction endpoint<br/>[main.py]"]
  node_risk_model["Risk model<br/>[modelo.py]"]
end

subgraph group_state["Persistent state"]
  node_pg[("PostgreSQL")]
end

node_staff(("Clinic staff"))

node_staff -->|"uses"| node_browser
node_browser -->|"calls"| node_auth_api
node_browser -->|"calls"| node_patient_api
node_browser -->|"calls"| node_concert_api
node_browser -->|"calls"| node_agenda_api
node_login_ui -->|"submits login"| node_auth_api
node_patient_ui -->|"manages patients"| node_patient_api
node_concert_ui -->|"requests options"| node_concert_api
node_agenda_ui -->|"loads agenda"| node_agenda_api
node_auth_api -->|"delegates to"| node_auth_service
node_auth_service -->|"issues token"| node_jwt
node_security -->|"verifies token"| node_jwt
node_auth_service -->|"reads and writes"| node_pg
node_patient_api -->|"delegates to"| node_patient_service
node_patient_service -.->|"stores records"| node_pg
node_concert_api -->|"delegates to"| node_concert_service
node_concert_service -->|"checks permissions"| node_agenda_service
node_concert_service -->|"builds features"| node_attributes
node_concert_service -->|"requests predictions"| node_analytics_client
node_concert_service -->|"reads and reserves"| node_pg
node_agenda_api -->|"delegates to"| node_agenda_service
node_agenda_service -->|"builds features"| node_attributes
node_agenda_service -->|"requests prediction"| node_analytics_client
node_agenda_service -->|"reads and updates"| node_pg
node_agenda_api -.->|"serves monitor"| node_monitor
node_monitor -->|"queries risk totals"| node_pg
node_analytics_client -->|"posts predictions"| node_analytics_api
node_analytics_api -->|"loads model"| node_risk_model
node_clinical_data -.->|"persists entities"| node_pg

click node_browser "https://github.com/agenda-viva-grupo6/agenda-viva/blob/main/front/js/api.js"
click node_patient_ui "https://github.com/agenda-viva-grupo6/agenda-viva/blob/main/front/js/pacientes.js"
click node_concert_ui "https://github.com/agenda-viva-grupo6/agenda-viva/blob/main/front/js/concertar.js"
click node_agenda_ui "https://github.com/agenda-viva-grupo6/agenda-viva/blob/main/front/js/agenda.js"
click node_login_ui "https://github.com/agenda-viva-grupo6/agenda-viva/blob/main/front/js/login.js"
click node_auth_api "https://github.com/agenda-viva-grupo6/agenda-viva/blob/main/ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/web/AuthController.java"
click node_auth_service "https://github.com/agenda-viva-grupo6/agenda-viva/blob/main/ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/servicio/AuthService.java"
click node_jwt "https://github.com/agenda-viva-grupo6/agenda-viva/blob/main/ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/config/JwtService.java"
click node_security "https://github.com/agenda-viva-grupo6/agenda-viva/blob/main/ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/config/JwtAuthFilter.java"
click node_patient_api "https://github.com/agenda-viva-grupo6/agenda-viva/blob/main/ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/web/PacienteController.java"
click node_patient_service "https://github.com/agenda-viva-grupo6/agenda-viva/blob/main/ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/servicio/PacienteService.java"
click node_concert_api "https://github.com/agenda-viva-grupo6/agenda-viva/blob/main/ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/web/ConcertacionController.java"
click node_concert_service "https://github.com/agenda-viva-grupo6/agenda-viva/blob/main/ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/servicio/ConcertacionService.java"
click node_agenda_api "https://github.com/agenda-viva-grupo6/agenda-viva/blob/main/ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/web/AgendaController.java"
click node_agenda_service "https://github.com/agenda-viva-grupo6/agenda-viva/blob/main/ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/servicio/AgendaService.java"
click node_monitor "https://github.com/agenda-viva-grupo6/agenda-viva/blob/main/ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/servicio/MonitorService.java"
click node_clinical_data "https://github.com/agenda-viva-grupo6/agenda-viva/tree/main/ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/modelo"
click node_analytics_client "https://github.com/agenda-viva-grupo6/agenda-viva/blob/main/ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/servicio/AnaliticaClient.java"
click node_attributes "https://github.com/agenda-viva-grupo6/agenda-viva/blob/main/ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/servicio/Atributos.java"
click node_analytics_api "https://github.com/agenda-viva-grupo6/agenda-viva/blob/main/ms-analitica/app/main.py"
click node_risk_model "https://github.com/agenda-viva-grupo6/agenda-viva/blob/main/ms-analitica/app/modelo.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_browser,node_patient_ui,node_concert_ui,node_agenda_ui,node_login_ui toneBlue
class node_patient_api,node_patient_service,node_concert_api,node_concert_service,node_agenda_api,node_agenda_service,node_monitor,node_clinical_data toneAmber
class node_auth_api,node_auth_service,node_jwt,node_security toneMint
class node_analytics_client,node_attributes,node_analytics_api,node_risk_model toneRose
class node_pg,node_staff toneIndigo
```

## Components

### Web interface

- [Browser app](https://github.com/agenda-viva-grupo6/agenda-viva/blob/main/front/js/api.js): `front/js/api.js`
- [Patient management](https://github.com/agenda-viva-grupo6/agenda-viva/blob/main/front/js/pacientes.js): `front/js/pacientes.js`
- [Concertation screen](https://github.com/agenda-viva-grupo6/agenda-viva/blob/main/front/js/concertar.js): `front/js/concertar.js`
- [Agenda screen](https://github.com/agenda-viva-grupo6/agenda-viva/blob/main/front/js/agenda.js): `front/js/agenda.js`
- [Login screen](https://github.com/agenda-viva-grupo6/agenda-viva/blob/main/front/js/login.js): `front/js/login.js`

### Clinic operations

- [Patient API](https://github.com/agenda-viva-grupo6/agenda-viva/blob/main/ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/web/PacienteController.java): `ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/web/PacienteController.java`
- [Patient operations](https://github.com/agenda-viva-grupo6/agenda-viva/blob/main/ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/servicio/PacienteService.java): `ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/servicio/PacienteService.java`
- [Concertation API](https://github.com/agenda-viva-grupo6/agenda-viva/blob/main/ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/web/ConcertacionController.java): `ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/web/ConcertacionController.java`
- [Pair and reserve](https://github.com/agenda-viva-grupo6/agenda-viva/blob/main/ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/servicio/ConcertacionService.java): `ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/servicio/ConcertacionService.java`
- [Agenda API](https://github.com/agenda-viva-grupo6/agenda-viva/blob/main/ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/web/AgendaController.java): `ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/web/AgendaController.java`
- [Agenda operations](https://github.com/agenda-viva-grupo6/agenda-viva/blob/main/ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/servicio/AgendaService.java): `ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/servicio/AgendaService.java`
- [Absence monitor](https://github.com/agenda-viva-grupo6/agenda-viva/blob/main/ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/servicio/MonitorService.java): `ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/servicio/MonitorService.java`
- [Clinical catalog](https://github.com/agenda-viva-grupo6/agenda-viva/tree/main/ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/modelo): `ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/modelo`

### Identity and access

- [Authentication API](https://github.com/agenda-viva-grupo6/agenda-viva/blob/main/ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/web/AuthController.java): `ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/web/AuthController.java`
- [Authentication service](https://github.com/agenda-viva-grupo6/agenda-viva/blob/main/ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/servicio/AuthService.java): `ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/servicio/AuthService.java`
- [JWT services](https://github.com/agenda-viva-grupo6/agenda-viva/blob/main/ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/config/JwtService.java): `ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/config/JwtService.java`
- [Request security](https://github.com/agenda-viva-grupo6/agenda-viva/blob/main/ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/config/JwtAuthFilter.java): `ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/config/JwtAuthFilter.java`

### Risk analytics

- [Analytics client](https://github.com/agenda-viva-grupo6/agenda-viva/blob/main/ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/servicio/AnaliticaClient.java): `ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/servicio/AnaliticaClient.java`
- [Anonymized attributes](https://github.com/agenda-viva-grupo6/agenda-viva/blob/main/ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/servicio/Atributos.java): `ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/servicio/Atributos.java`
- [Prediction endpoint](https://github.com/agenda-viva-grupo6/agenda-viva/blob/main/ms-analitica/app/main.py): `ms-analitica/app/main.py`
- [Risk model](https://github.com/agenda-viva-grupo6/agenda-viva/blob/main/ms-analitica/app/modelo.py): `ms-analitica/app/modelo.py`

### Persistent state

- **PostgreSQL**

### Other components

- **Clinic staff**

## Connections

- Clinic staff → Browser app: uses (evidence: `README.md`)
- Browser app → Authentication API: calls (evidence: `README.md`)
- Browser app → Patient API: calls (evidence: `README.md`)
- Browser app → Concertation API: calls (evidence: `README.md`)
- Browser app → Agenda API: calls (evidence: `README.md`)
- Login screen → Authentication API: submits login (evidence: `README.md`)
- Patient management → Patient API: manages patients (evidence: `README.md`)
- Concertation screen → Concertation API: requests options (evidence: `README.md`)
- Agenda screen → Agenda API: loads agenda (evidence: `README.md`)
- Authentication API → Authentication service: delegates to (evidence: `ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/servicio/AuthService.java`)
- Authentication service → JWT services: issues token (evidence: `ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/servicio/AuthService.java`)
- Request security → JWT services: verifies token (evidence: `ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/config/JwtService.java`)
- Authentication service → PostgreSQL: reads and writes (evidence: `ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/servicio/AuthService.java`)
- Patient API → Patient operations: delegates to (evidence: `ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/web/PacienteController.java`)
- Patient operations → PostgreSQL: stores records
- Concertation API → Pair and reserve: delegates to (evidence: `ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/web/ConcertacionController.java`)
- Pair and reserve → Agenda operations: checks permissions (evidence: `ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/servicio/ConcertacionService.java`)
- Pair and reserve → Anonymized attributes: builds features (evidence: `ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/servicio/ConcertacionService.java`)
- Pair and reserve → Analytics client: requests predictions (evidence: `ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/servicio/ConcertacionService.java`)
- Pair and reserve → PostgreSQL: reads and reserves (evidence: `ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/servicio/ConcertacionService.java`)
- Agenda API → Agenda operations: delegates to (evidence: `ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/web/AgendaController.java`)
- Agenda operations → Anonymized attributes: builds features (evidence: `ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/servicio/AgendaService.java`)
- Agenda operations → Analytics client: requests prediction (evidence: `ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/servicio/AgendaService.java`)
- Agenda operations → PostgreSQL: reads and updates (evidence: `ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/servicio/AgendaService.java`)
- Agenda API → Absence monitor: serves monitor
- Absence monitor → PostgreSQL: queries risk totals (evidence: `ms-clinica/src/main/java/ar/edu/ciudad/agendaviva/servicio/MonitorService.java`)
- Analytics client → Prediction endpoint: posts predictions (evidence: `README.md`)
- Prediction endpoint → Risk model: loads model (evidence: `ms-analitica/app/main.py`)
- Clinical catalog → PostgreSQL: persists entities
