Architettura ed evoluzione – Atlas Medical

Ultimo aggiornamento: marzo 2026.

Documento tecnico: architettura attuale, moduli implementati, convenzioni e miglioramenti suggeriti.

1. Architettura attuale

1.1 Stack e entry point

1.2 Core

ComponenteFunzione
RouterMatch path con BASE_URI; GET/POST; all’inizio di dispatch() chiama ReadOnlyGuard se APP_READ_ONLY è attivo. CSRF globale su POST (eccezioni in csrfExempt).
ReadOnlyGuardBlocca mutazioni HTTP (POST non in whitelist, PUT/PATCH/DELETE, …) con risposta JSON o HTML dedicata; eccezioni minime per login, OTP, scelta/switch ruolo.
AuthGuardrequireAuth(), requireDoctor(), requireRole('admin'|'super_admin'|'reception'). Super_admin accede alle aree previste.
ErrorHandlerexpectsJson(), jsonError(), eccezioni/errori/shutdown; log su system_errors in production.
BaseControllerrender(), redirect(), jsonResponse(), jsonError().
CsrfToken in sessione; verifica su POST.

1bis. Modalità sola lettura (APP_READ_ONLY)

1.3 Aree e ruoli

Aree: public, admin, doctor, reception, system (derivate da path e da redirect post-login).

Ruoli: admin, super_admin, reception, doctor. Sessione: auth_user_id, active_role, roles, doctor_id, otp_verified (doctor).

Gli account admin/reception con is_active = 0 non possono fare login (controllo in LoginController).

1.4 Controller (sintesi)

1.5 Modelli e servizi (sintesi)

Modelli dominio: AdminModel, DoctorModel, DoctorAccountModel, PatientModel, VisitModel, BookingModel, SpecializationModel, MedicalReportModel, ReceptionAppointmentModel, DoctorLeavePeriodModel, DoctorSlotTemplateModel, PasswordResetModel, AdminPasswordResetModel.

Modelli System: AdminUserModel, SystemAccessLogModel, SystemErrorModel, SystemDashboardModel, AuditTrailModel.

Servizi: SystemLogger, AuditTrailService, OtpService, SlotRecurringService, servizi Mail.

2. Moduli implementati

2.1 Periodi di assenza

Tabella doctor_leave_periods; model DoctorLeavePeriodModel; controller DoctorLeaveController; integrazione con slot e prenotazioni.

2.2 Slot ricorrenti (template + generazione)

Tabella doctor_slot_templates; DoctorSlotTemplateModel; SlotRecurringService (generazione 90 giorni); controller template e generazione.

2.3 Audit Trail

Tabella audit_trail (old/new, integrity_hash, chain_hash, previous_hash). Servizio e viste System per export e verifica catena. Dettaglio in docs/AUDIT_TRAIL_CHAIN.md.

3. Coerenza e convenzioni

Session: path cookie = BASE_URI; rigenerazione sessione; logout pulisce le chiavi. Logging: system_actions, audit_trail, system_access_logs, security_events. JSON: { success, message, data }. Retention: scripts/cron_retention_logs.php e comandi System.

4. Miglioramenti suggeriti (opzionali)

  1. AdminModel: uso coerente di reader/writer.
  2. Change password: logging tramite SystemLogger dove applicabile.
  3. OtpService resend: cooldown e 429.
  4. CSRF exempt: allineamento completo ai POST pubblici senza sessione.
  5. AuditTrailService: estensione ad altre entità critiche.
  6. ReadOnlyGuard: estendere la whitelist POST solo se necessario in scenari di migrazione.

5. Riferimenti rapidi

Rotte: routes/*.php.

Layout: Views/layouts/ (public, admin, doctor, reception, system).

Guide: docs/Guida-Atlas-Medical.html, docs/Guida-Progettisti-Atlas-Medical.html, questo file; servite dall’app sotto /guide, /guide-progettisti, /guide-architettura.

Documentazione tecnica: docs/ATLAS_MEDICAL_EVOLUTION_ARCHITECTURE.md, docs/AUDIT_TECNICO_PRODUZIONE.md, docs/STORAGE_FLUSSO_E_PATCH.md.

Sola lettura: variabile APP_READ_ONLY; classe Core/ReadOnlyGuard.php.

Retention: script cron; tabelle system_actions, system_access_logs, audit_trail, security_events, system_errors.

Versione estesa in docs/ATLAS_MEDICAL_EVOLUTION_ARCHITECTURE.md.