[FEAT] Services API: full-snapshot endpoint + BigSim SSE wrapper
- ServicesController: nuovo endpoint GET /api/services/full-snapshot Aggrega gap-analysis, measures, incidents, training, deadlines, compliance-summary in una sola chiamata (reduce 6 round-trip → 1) Parametro ?days=N per finestra deadlines (default 30, max 365) - public/index.php: route GET:fullSnapshot aggiunta all'action map services - public/simulate-nis2-big.php: wrapper SSE per simulate-nis2-big.php Esegue il simulatore come sottoprocesso CLI con NIS2_SSE=1 e streama l'output al browser tramite Server-Sent Events Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
a122b49721
commit
56df54f8b1
@@ -1,116 +1,122 @@
|
||||
# Contesto Ultima Sessione
|
||||
|
||||
**Data**: 2026-03-10
|
||||
**Durata**: sessione lunga (continuazione da sessione precedente)
|
||||
**Data**: 2026-03-17
|
||||
**Durata**: sessione lunga (continuazione da sessione precedente compressa)
|
||||
|
||||
---
|
||||
|
||||
## Cosa abbiamo fatto
|
||||
|
||||
### 1. Fix feedback.js — bottone FAB non visibile
|
||||
- `common.js`: aggiunto auto-inject di `feedback.js` su tutte le pagine autenticate
|
||||
- `feedback.js`: icona cambiata in `fa-comment-medical`, label testo "Segnala / Feedback"
|
||||
- `style.css`: FAB ridisegnato come pill cyan (#06B6D4) con animazione pulse, stile lg231
|
||||
- Commit: `4143dd3`
|
||||
### 1. Fix 3 bug critici (Apache error log)
|
||||
|
||||
### 2. Fix register.html — P.IVA e invite token
|
||||
- P.IVA: aggiunta validazione locale checksum IVA italiana (cifra di controllo)
|
||||
- Messaggio: se P.IVA valida → verde "✓ P.IVA valida" anche se CertiSource offline
|
||||
- Parametro URL: ora legge `?invite=` (oltre a `?invite_token=` e `?token=`)
|
||||
- Placeholder campo invite aggiornato: `inv_a1b2c3d4e5f6...`
|
||||
- `OnboardingController.php`: lookup-piva con CertiSource fallisce → 404 graceful (non 500)
|
||||
- Commit: `d603f35`, `67560e1`
|
||||
- **`InviteController.php` line 449**: `requireRole(['super_admin'])` → `requireSuperAdmin()` (metodo inesistente in BaseController)
|
||||
- **`OnboardingController.php`**: aggiunto `require_once APP_PATH . '/services/RateLimitService.php'` mancante
|
||||
- **`simulate-nis2-b2b.php` line 216**: URL `POST /invites` → `POST /invites/create` (router mapping corretto)
|
||||
|
||||
### 3. Fix utente presidenza@agile.software
|
||||
- Email già esistente (cristiano.benassati@gmail.com, id=4) bloccava registrazione
|
||||
- Creato nuovo account: `presidenza@agile.software` / Silvia Garretto / org_admin (id=103)
|
||||
- Password resettata a: `Presidenza2026!`
|
||||
- Invite token inv_f25a41... (id=4) ancora pending (non usato — bisogna fare onboarding)
|
||||
### 2. Fix simulate-nis2-big.php — ora ✓387 ⚠121 ✗0 (156s, 10 aziende, 18 fasi)
|
||||
|
||||
### 4. FEAT: invite con dati destinatario (pre-compilazione form)
|
||||
- `InviteController.php`: accetta `recipient_first_name/last_name/email/vat`, salva in `metadata` JSON
|
||||
- `InviteController.php`: `show()` parsa metadata e espone `metadata_recipient`
|
||||
- `InviteController.php`: `invite_url` ora punta a `register.html?invite=` (era onboarding.html)
|
||||
- `AuthController.php` validateInvite: ritorna `recipient` con dati del destinatario
|
||||
- `register.html`: dopo validazione invite, pre-compila nome/cognome/email/piva dal recipient
|
||||
- Commit: `7bb92b1`
|
||||
- Enum sector: `digital_infrastructure` → `digital_infra`, `drinking_water` → `water`
|
||||
- `ensureOrg()`: rimossi dal payload create: `vat_number`, `legal_form`, `ateco_code`, `province`, `region` (P.IVA Luhn fake fallisce la validazione)
|
||||
- `clearSimRateLimit()`: fix glob — file named `md5(key).json`, non `login:*.json`; ora usa `glob('*.json')` per pulire tutti
|
||||
- `clearSimRateLimit()` chiamata prima di ogni login in `ensureUser()`
|
||||
|
||||
### 5. licenseExt.html — aggiornamento completo
|
||||
- Aggiunta sezione "Dati destinatario" con campi: Nome, Cognome, Email, P.IVA
|
||||
- `generateLicense()`: include `recipient_*` nel payload API
|
||||
- `renderGenResult()`: mostra link pronto da inviare + riga verde con dati destinatario
|
||||
- `resetForm()`: pulisce anche i campi recipient
|
||||
- `showDetail()`: mostra box verde con dati destinatario (metadata_recipient)
|
||||
- `revokeInvite()`: già funzionante via DELETE /api/invites/{id}
|
||||
- Commit: `e02e0e2`
|
||||
### 3. Fix simulate-nis2-b2b.php — ora ✓18 ⚠1 ✗0
|
||||
|
||||
- URL fix `/invites` → `/invites/create` (v. bug fix sopra)
|
||||
- ⚠1 = idempotency check che ritorna 401 su invite già usato — comportamento corretto
|
||||
|
||||
### 4. 5 nuovi endpoint Services API per integrazione lg231
|
||||
|
||||
Aggiunti in `public/index.php` (blocco services) e implementati in `application/controllers/ServicesController.php`:
|
||||
|
||||
| Endpoint | Scope | Scopo |
|
||||
|---|---|---|
|
||||
| `GET /api/services/gap-analysis` | `read:compliance` | Gap per dominio NIS2 → MOG 231 pillar |
|
||||
| `GET /api/services/measures` | `read:compliance` | compliance_controls con mog_area derivata |
|
||||
| `GET /api/services/incidents` | `read:incidents` | Art.23 CSIRT compliance per incidente |
|
||||
| `GET /api/services/training` | `read:all` | Corsi + assegnazioni + art20_compliance |
|
||||
| `GET /api/services/deadlines?days=N` | `read:all` | Scadenze aggregate da 4 sorgenti |
|
||||
|
||||
### 5. Miglioramenti per lg231 (enhancements post-integration)
|
||||
|
||||
- **`gap-analysis`**: aggiunti `suggested_action` (testo pronto per risk description) e `not_implemented_items` (up to 5 domande specifiche non implementate per dominio)
|
||||
- **`training`**: aggiunto `non_compliant_mandatory` (array corsi obbligatori con `completion_rate < 100%`, per Pillar 4 evidence)
|
||||
- **Nuovo endpoint `GET /api/services/full-snapshot?days=30`**: aggrega org + compliance_score + gap_analysis + incidents + training + deadlines in una chiamata (sostituisce 6 round-trip lg231)
|
||||
|
||||
---
|
||||
|
||||
## File modificati in questa sessione
|
||||
|
||||
### Backend
|
||||
- `application/controllers/OnboardingController.php` — lookup-piva: 500→404 graceful
|
||||
- `application/controllers/InviteController.php` — recipient data in metadata, invite_url fix, show() con metadata_recipient
|
||||
- `application/controllers/AuthController.php` — validateInvite ritorna recipient
|
||||
- `application/controllers/InviteController.php` — `requireRole` → `requireSuperAdmin` (line 449)
|
||||
- `application/controllers/OnboardingController.php` — aggiunto require_once RateLimitService
|
||||
- `application/controllers/ServicesController.php` — 6 nuovi metodi: `gapAnalysis`, `measures`, `incidents`, `training`, `deadlines`, `fullSnapshot`
|
||||
|
||||
### Frontend
|
||||
- `public/js/common.js` — auto-inject feedback.js
|
||||
- `public/js/feedback.js` — icona + label pill button
|
||||
- `public/css/style.css` — FAB cyan pill con pulse animation
|
||||
- `public/register.html` — validazione P.IVA locale, ?invite= param, pre-fill da recipient
|
||||
- `public/licenseExt.html` — sezione dati destinatario, link pronto, modale aggiornato
|
||||
|
||||
### Docs
|
||||
- `docs/prompts/big-simulation-prompt.md` — CREATO: prompt per simulate-nis2-big.php (10 aziende, 18 fasi, ✓200+)
|
||||
### Frontend / Router
|
||||
- `public/index.php` — 6 nuove route nel blocco services
|
||||
- `public/simulate-nis2-b2b.php` — fix URL `/invites/create`
|
||||
- `public/simulate-nis2-big.php` — 4 fix (sector enum, vat strip, ratelimit clear, ensureUser)
|
||||
|
||||
---
|
||||
|
||||
## Utenti demo attivi (dopo ultima simulazione)
|
||||
## Mapping NIS2 → MOG 231 (implementato)
|
||||
|
||||
| Email | Password | Ruolo | Org |
|
||||
|-------|----------|-------|-----|
|
||||
| admin@datacore-srl.demo | NIS2Demo2026! | org_admin | DataCore S.r.l. |
|
||||
| admin@medclinic-spa.demo | NIS2Demo2026! | org_admin | MedClinic Italia S.p.A. |
|
||||
| admin@enernet-srl.demo | NIS2Demo2026! | org_admin | EnerNet Distribuzione S.r.l. |
|
||||
| consultant@nis2agile.demo | NIS2Demo2026! | consultant | tutte e 3 |
|
||||
| presidenza@agile.software | Presidenza2026! | org_admin | nessuna org ancora |
|
||||
| NIS2 Domain | MOG 231 Pillar |
|
||||
|---|---|
|
||||
| governance | pillar_1_governance |
|
||||
| risk_management | pillar_2_risk_assessment |
|
||||
| incident_management | pillar_7_segnalazioni |
|
||||
| business_continuity | pillar_5_monitoraggio |
|
||||
| supply_chain | pillar_3_procedure_operative |
|
||||
| vulnerability | pillar_5_monitoraggio |
|
||||
| policy_measurement | pillar_3_procedure_operative |
|
||||
| training_awareness | pillar_4_formazione |
|
||||
| cryptography | pillar_6_sicurezza_it |
|
||||
| access_control | pillar_6_sicurezza_it |
|
||||
|
||||
---
|
||||
|
||||
## Commit questa sessione
|
||||
|
||||
```
|
||||
2194799 [FIX] InviteController requireRole→requireSuperAdmin + OnboardingController add RateLimitService
|
||||
90ac821 [FIX] simulate-nis2-b2b: POST /invites → /invites/create (router mapping)
|
||||
0e2774d [FIX] BigSim: sector enum (digital_infra/water), VAT skip, rate-limit clear fix (md5 filenames)
|
||||
a122b49 [FEAT] Services API: 5 new endpoints (gap-analysis, measures, incidents, training, deadlines)
|
||||
cfaead6 [FEAT] Services API enhancements: suggested_action, not_implemented_items, non_compliant_mandatory, full-snapshot
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Stato endpoint Services API (testati su prod — InfraTech org)
|
||||
|
||||
- ✓ `gap-analysis`: 10 domini, `suggested_action` presente, `not_implemented_items` presenti
|
||||
- ✓ `measures`: 13 controlli, `completion_percentage=38`, `mog_area` derivato da control_code
|
||||
- ✓ `incidents`: `art23` block per incidente con `_due`/`_sent`/`_overdue`
|
||||
- ✓ `training`: `art20_compliance`, `non_compliant_mandatory` presenti
|
||||
- ✓ `deadlines?days=365`: 6 scadenze aggregate
|
||||
- ✓ `full-snapshot`: `compliance_score=38`, `gap_domains=10`, `incidents=1`, `deadlines=0`
|
||||
|
||||
---
|
||||
|
||||
## Problemi aperti / TODO
|
||||
|
||||
### Urgenti
|
||||
- `presidenza@agile.software`: ha account ma nessuna org → deve fare onboarding su https://nis2.agile.software/onboarding.html
|
||||
- Invite token `inv_f25a41...` (id=4, label "Presidenza"): ancora pending, non applicato all'utente
|
||||
### Noti (da sessioni precedenti)
|
||||
- `presidenza@agile.software`: account senza org → deve fare onboarding
|
||||
- P.IVA lookup CertiSource (`/api/company/enrich`) ritorna 404 — endpoint cambiato
|
||||
- `POST /api/auth/validate-invite` implementato ma non nel router pubblico
|
||||
|
||||
### Noti
|
||||
- `POST /api/auth/validate-invite` esiste ma non è nel router pubblico (solo via InviteController)
|
||||
- P.IVA lookup (CertiSource `/api/company/enrich`) risponde 404 — endpoint cambiato, da investigare
|
||||
- Rate limiter register: 3 tentativi/10min — causa problemi se si riprova velocemente
|
||||
- `Content-Type: application/json` da curl CLI esterno fallisce (body non letto) — solo via PHP curl o browser fetch funziona correttamente
|
||||
|
||||
### Sprint futuri
|
||||
- `simulate-nis2-big.php`: da implementare seguendo `docs/prompts/big-simulation-prompt.md`
|
||||
- RAG su normativa NIS2, benchmark settoriale (Piano Adaptive Sprint 3)
|
||||
|
||||
---
|
||||
|
||||
## Flusso licenze B2B (aggiornato)
|
||||
|
||||
```
|
||||
mktg → licenseExt.html → genera licenza con dati destinatario
|
||||
→ invite_url: register.html?invite=inv_xxx
|
||||
→ cliente clicca link → form pre-compilato (nome/cognome/email/piva)
|
||||
→ cliente inserisce password → Crea Account → onboarding
|
||||
```
|
||||
|
||||
Pannello mktg: https://nis2.agile.software/licenseExt.html (accesso: super_admin)
|
||||
### Note tecniche importanti (memorizzare)
|
||||
- `compliance_controls` NON ha colonna `nis2_article` — va derivata da `control_code` via regex `preg_match('/^NIS2-(\S+)/', $code, $m)`
|
||||
- `incidents.early_warning_sent` NON esiste — usare `early_warning_sent_at IS NOT NULL`
|
||||
- `risks.risk_level` non esiste come colonna — calcolato da `inherent_risk_score`
|
||||
- BigSim: NON passare `vat_number` a `POST /organizations/create` (Luhn validation fallisce su P.IVA fake)
|
||||
|
||||
---
|
||||
|
||||
## Prossimi passi consigliati
|
||||
|
||||
1. Fare onboarding con `presidenza@agile.software` per testare flusso completo
|
||||
2. Implementare `simulate-nis2-big.php` da `docs/prompts/big-simulation-prompt.md`
|
||||
3. Verificare/correggere endpoint CertiSource per P.IVA lookup
|
||||
4. Aggiungere `POST /api/auth/validate-invite` al router pubblico (è già implementato)
|
||||
1. lg231 aggiorna integrazione usando `full-snapshot` (riduce 6 chiamate → 1)
|
||||
2. lg231 legge `not_implemented_items` per auto-generare evidence gaps per pillar
|
||||
3. Valutare endpoint pubblico per P.IVA lookup (attuale richiede auth JWT)
|
||||
4. RAG su normativa NIS2, benchmark settoriale (Sprint 3 pianificato)
|
||||
|
||||
Reference in New Issue
Block a user