Overview
I numeri (#1, #2, …) identificano lo step da citare in modifiche / ticket.
flowchart TD
START(["#1 Schermata Login
email OPPURE telefono"]) --> TYPE{"#2 Cosa inserisce?"} TYPE -->|Telefono| P1b TYPE -->|Email| E_OTP1 subgraph PHONE["Percorso TELEFONO"] P1b["#13 otp_generate
solo SMS"] P1b --> P2["#14 Schermata OTP"] P2 --> P3["#15 verify_otp"] P3 --> P4{"#16 OTP ok?"} P4 -->|No| P2 P4 -->|Sì| P5["#17 search_user
conferma utente"] P5 --> P6{"#18 Utente esiste?"} P6 -->|Sì| P7["#19 access_token"] P7 --> P7b["login-ingestion
in QN*"] P7b --> POK(["#90 Schermata OK loggato
token in cookie"]) P6 -->|No| R1 end subgraph REG["Registrazione nuovo utente da telefono"] R1["#20 Schermata solo email"] R1 --> R3["#22 otp_generate
solo email
(richiede phone_proof)"] R3 --> R3a["#23 Schermata OTP email"] R3a --> R3b["#24 verify_otp email"] R3b --> R3c["#24b email verificata
register_proof firmato"] R3c --> R4["#25 Schermata profilo + consensi
nome, cognome, data nascita, città"] R4 --> R2["#21 QNRegister + profilo + consensi
register + doi + update"] R2 --> R5a["#27 Piano identity
first_name last_name"] R2 --> R5b["#28 Piano custom JSON
otp_phone city birth_date"] R5a --> R6["#29 access_token
cookie __utp"] R5b --> R6 R6 --> R6b["login-ingestion-user-collector"] R6b --> POK end subgraph EMAIL["Percorso EMAIL"] E_OTP1["#32 otp_generate
solo email"] E_OTP1 --> E_OTP2["#33 Schermata OTP email"] E_OTP2 --> E_OTP3["#34 verify_otp"] E_OTP3 --> E_OTP_OK{"#34b OTP ok?"} E_OTP_OK -->|No| E_OTP2 E_OTP_OK -->|Sì → email_proof| E1["#30 get_user_email"] E1 --> E1a{"#31 Utente esiste?"} E1a -->|No| E_NEW6["#37 Schermata telefono"] E_NEW6 --> E_NEW7["#38 otp_generate SMS"] E_NEW7 --> E_NEW8["#39 verify_otp telefono
→ register_proof"] E_NEW8 --> E_NEW10["#41 Schermata profilo + consensi"] E_NEW10 --> E_NEW11["#35+#36 QNRegister
register+DOI+update #40+#42"] E_NEW11 --> E_NEW12["#43 access_token"] E_NEW12 --> E_NEW12b["login-ingestion in QN*"] E_NEW12b --> POK E1a -->|Sì| E2{"#50 Ha otp_phone?"} E2 -->|Sì| E9["#65 access_token"] E9 --> E9b["login-ingestion in QN*"] E9b --> POK E2 -->|No| E5["#61 Schermata richiesta telefono"] E5 --> E6["#62 otp_generate + verify_otp"] E6 --> E7["#63 Schermata = #25
nome, cognome, data, città
(precompilati se presenti)"] E7 --> E8["#64 update_profile"] E8 --> E9 end
email OPPURE telefono"]) --> TYPE{"#2 Cosa inserisce?"} TYPE -->|Telefono| P1b TYPE -->|Email| E_OTP1 subgraph PHONE["Percorso TELEFONO"] P1b["#13 otp_generate
solo SMS"] P1b --> P2["#14 Schermata OTP"] P2 --> P3["#15 verify_otp"] P3 --> P4{"#16 OTP ok?"} P4 -->|No| P2 P4 -->|Sì| P5["#17 search_user
conferma utente"] P5 --> P6{"#18 Utente esiste?"} P6 -->|Sì| P7["#19 access_token"] P7 --> P7b["login-ingestion
in QN*"] P7b --> POK(["#90 Schermata OK loggato
token in cookie"]) P6 -->|No| R1 end subgraph REG["Registrazione nuovo utente da telefono"] R1["#20 Schermata solo email"] R1 --> R3["#22 otp_generate
solo email
(richiede phone_proof)"] R3 --> R3a["#23 Schermata OTP email"] R3a --> R3b["#24 verify_otp email"] R3b --> R3c["#24b email verificata
register_proof firmato"] R3c --> R4["#25 Schermata profilo + consensi
nome, cognome, data nascita, città"] R4 --> R2["#21 QNRegister + profilo + consensi
register + doi + update"] R2 --> R5a["#27 Piano identity
first_name last_name"] R2 --> R5b["#28 Piano custom JSON
otp_phone city birth_date"] R5a --> R6["#29 access_token
cookie __utp"] R5b --> R6 R6 --> R6b["login-ingestion-user-collector"] R6b --> POK end subgraph EMAIL["Percorso EMAIL"] E_OTP1["#32 otp_generate
solo email"] E_OTP1 --> E_OTP2["#33 Schermata OTP email"] E_OTP2 --> E_OTP3["#34 verify_otp"] E_OTP3 --> E_OTP_OK{"#34b OTP ok?"} E_OTP_OK -->|No| E_OTP2 E_OTP_OK -->|Sì → email_proof| E1["#30 get_user_email"] E1 --> E1a{"#31 Utente esiste?"} E1a -->|No| E_NEW6["#37 Schermata telefono"] E_NEW6 --> E_NEW7["#38 otp_generate SMS"] E_NEW7 --> E_NEW8["#39 verify_otp telefono
→ register_proof"] E_NEW8 --> E_NEW10["#41 Schermata profilo + consensi"] E_NEW10 --> E_NEW11["#35+#36 QNRegister
register+DOI+update #40+#42"] E_NEW11 --> E_NEW12["#43 access_token"] E_NEW12 --> E_NEW12b["login-ingestion in QN*"] E_NEW12b --> POK E1a -->|Sì| E2{"#50 Ha otp_phone?"} E2 -->|Sì| E9["#65 access_token"] E9 --> E9b["login-ingestion in QN*"] E9b --> POK E2 -->|No| E5["#61 Schermata richiesta telefono"] E5 --> E6["#62 otp_generate + verify_otp"] E6 --> E7["#63 Schermata = #25
nome, cognome, data, città
(precompilati se presenti)"] E7 --> E8["#64 update_profile"] E8 --> E9 end
A) Inserimento TELEFONO
sequenceDiagram
participant UI as Frontend
participant BE as Backend
participant Piano as Piano.io
participant UC as User Collector
Note over UI: #1 Login - telefono
Note over UI: #10/#11/#12 rimossi — sempre OTP SMS
UI->>BE: #13 POST QNLogin → otp_generate { phone } solo SMS
BE-->>UI: otp solo via SMS
Note over UI: #14 Schermata OTP
UI->>BE: #15 POST QNVerifyOtp { phone, otp_code, flow: phone }
BE-->>UI: valid=true
Note over BE: #17 search_user (dopo OTP)
BE->>Piano: /api/v3/publisher/user/search
alt Utente esiste
BE->>Piano: /api/v3/publisher/user/search
Piano-->>BE: users[] + uid
UI->>BE: #19 QNVerifyOtp → access_token { uid }
BE->>Piano: /publisher/token
BE->>UC: login ingest {uid, accessToken}
BE-->>UI: access_token
Note over UI: #90 OK - cookie __utp
else Utente NON esiste → registrazione
Note over UI: #20 Schermata solo email (consensi a #25)
Note over UI: Telefono verificato → phone_proof (no sessione)
UI->>BE: #22 POST QNRegister phase=email_otp { email, phone, phone_proof }
BE-->>UI: OTP email + pending_proof
Note over UI: #23 Schermata OTP email
UI->>BE: #24 POST QNVerifyOtp { email, otp_code, pending_proof, flow: phone_register }
Note over UI: #24b email verificata → register_proof
Note over UI: #25 Schermata profilo + consensi (prima del register)
UI->>BE: #21 POST QNRegister phase=register { register_proof, consents, profilo }
BE->>Piano: /identity/register
BE->>Piano: /identity/doi/status confirmed
BE->>Piano: #27/#28 update identity + custom (otp_phone+anagrafica)
BE->>Piano: #29 access_token
BE->>UC: login ingest {uid, accessToken}
Note over UI: #90 Cookie __utp · Schermata OK
end
B) Inserimento EMAIL
sequenceDiagram
participant UI as Frontend
participant BE as Backend
participant Piano as Piano.io
participant UC as User Collector
Note over UI: #1 Login - email
UI->>BE: #32 POST QNLogin → otp_generate solo email
BE-->>UI: OTP email
Note over UI: #33 Schermata OTP email
UI->>BE: #34 POST QNVerifyOtp { email, flow: email_verify }
alt #34b OTP non valido
BE-->>UI: valid=false
Note over UI: resta su #33
else #34b OTP ok → email_proof
BE->>Piano: #30 get_user_email
alt #31 Utente NON esiste
BE-->>UI: next_step 37 + email_proof
Note over UI: #37 Schermata telefono + OTP SMS
UI->>BE: #38/#39 QNAddPhone + QNVerifyOtp { phone, email_proof }
Note over UI: #41 profilo + consensi → #35 QNRegister
UI->>BE: #35 POST QNRegister { register_proof, consents, profilo }
BE->>Piano: register + doi + update + #43 token
BE->>UC: login ingest
Note over UI: #90 OK
else #31 Utente esiste
alt #50 Ha otp_phone
BE->>Piano: #65 access_token
BE->>UC: login ingest
BE-->>UI: next_step 90 + token
Note over UI: #90 OK
else #50 No telefono
BE-->>UI: next_step 61 + uid + email_proof
Note over UI: #61 Schermata telefono
UI->>BE: #62/#63 QNAddPhone + verify → profilo
UI->>BE: #64/#65 QNUpdateProfile → token
BE->>UC: login ingest
Note over UI: #90 OK
end
end
end
Schermate e API
| # | Schermata | Azione utente | Chiamata backend |
|---|---|---|---|
| 1–2 | Login | Inserisce telefono | QNLogin → otp_generate solo SMS (#13) |
| 14–19 | OTP | Verifica codice | QNVerifyOtp → search_user (#17) → token o register |
| 20 | Solo email | Nuovo utente da telefono | QNRegister phase=email_otp (#22) — no register ancora |
| 22–24b | OTP email | Verifica mail prima del register | otp_generate → verify_otp → register_proof (#24b) |
| 25 | Profilo + consensi (prima di #21) | Anagrafica + termini | FE raccoglie dati + consensi (con register_proof) |
| 21 / 26–29 | Commit register | Dopo profilo #25 | QNRegister = register + DOI + update (identity+custom #40+#42) + token |
| 32–34 | OTP email | Sempre, prima di sapere se l’utente esiste | QNLogin → QNVerifyOtp (#34). Se OTP ko → resta #33; se ok → email_proof e #30 |
| 30–31 / 50 | — (backend) | Dopo OTP email | get_user_email → branch #37 / #61 / #65 |
| 37–43 | Telefono + profilo + register | Email nuova (#31 no) | OTP SMS → profilo (#41) → QNRegister (#35) → token |
| 50 → 65 | OK | Email esistente con otp_phone | dopo #34 → access_token (#65) |
| 61–65 | Telefono → profilo | Email esistente senza telefono | QNAddPhone → OTP → QNUpdateProfile → token |
| 90 | OK loggato | — | cookie __utp |
Regole chiave
- #13–19 Telefono = da login (#2) direttamente
otp_generatesolo SMS (#13) → schermata OTP (#14) →verify_otp→search_user(#17) per login vs registrazione. Niente #10/#11/#12. - #20–29 Registrazione da telefono = solo email (#20) → OTP email (#22–24) →
register_proof(#24b) → profilo + consensi (#25) → unicaQNRegister(#21) = register + DOI + update + token. Proof:phone_proof→pending_proof→register_proof. - #32–43 Email = OTP email (#32–34): se OTP ko torna a #33; se ok →
get_user_email(#30/#31). Se nuovo → telefono (#37–41) →QNRegister(#35). Se esiste con telefono (#50 sì) → token (#65). Se esiste senza telefono (#50 no) → raccolta telefono (#61–65). - #26 update_profile = una chiamata frontend; backend fa 1 o 2 POST Piano: identity (nome/cognome) e/o custom JSON (otp_phone, city, birth_date).
- #90 Fine di ogni percorso ok = access token in cookie
__utp(Piano ID). Nelle APIQN*(QNVerifyOtp,QNRegister,QNUpdateProfile), subito dopo l’emissione del token il backend chiama User Collector ingest/login con{ uid, accessToken }(senza Piano access/list). Non è una chiamata FE.