DevPortalPagoPA



Tabella dei contenuti

Come recuperare i segnali

Requisiti

Si assume che il consumatore sia un aderente fruitore, che possa accedere a un e-service abilitato a Signal Hub, che abbia un client api (vedi i requisiti per l'uso di Signal Hub).
Si assume che il consumatore di segnali abbia acquisito i dati relativi alle modalità di pseudonimizzazione (vedi come ottenere le informazioni crittografiche) e che si trovi ad esempio:
funzione crittografica di hashingseme
sha256f3a7f54e-8e57-4a06-8bca-ac1857b6b045
Si assume che il consumatore di segnali abbia calcolato gli id pseudonimizzati e sia in grado di associarli agli identificativi in chiaro dei soggetti, ad esempio:
Si assume che il consumatore di segnali sia in grado di calcolare gli id pseudonimizzati e sia in grado di associarli agli identificativi in chiaro dei soggetti, ad esempio:
identificativo internoidentificativo in chiaroidentificativo pseudonimizzato
1RSSMRA80A01H501U82e98709e2f96efd...
2FNTPPL62H44D643PF5e0f94f36a5eea4...
3FLZCRN65R02E202N701c4489d6ac7fdb7...

Retention Period e API Polling

Il segnale depositato su Signal Hub ha un retention period (vedi sezione specifica) e oltre questo periodo non sarà più disponibile in lettura. Di conseguenza non potranno essere recuperati segnali che superano il retention period. Vedere la sezione relativa per le regole di polling verso le API di recupero del segnale senza perdere gli aggiornamenti.

Recupero dei segnali

Recupero di un segnale legato all'entità

Il consumatore ottiene il voucher api da PDND (vedi documentazione):
voucher = eyJ4eBMlOiDgdDtqe6P...
Il fruitore legge i segnali invocando il servizio di recupero segnali:
$ curl --request GET \
--url https://api.signalhub.interop.pagopa.it/1.0/pull/signals/b1817321-0486-4c75-89e5-4ee297250418?size=5&signalId=0 \
--header 'Authorization: Bearer eyJ4eBMlOiDgdDtqe6P...'
$ {
"signals": [
{
"signalId": 1,
"signalType": "UPDATE",
"objectId": "dcc7b5b8-1e1a-4014-b765-de17de08e66c",
"eserviceId": "b1817321-0486-4c75-89e5-4ee297250418",
"objectType": "domicilio"
},
{
"signalId": 2,
"signalType": "UPDATE",
"objectId": "9ef0f2bf-8ac4-45d6-8a41-4eacec9b1e8c",
"eserviceId": "b1817321-0486-4c75-89e5-4ee297250418",
"objectType": "domicilio"
},
{
"signalId": 3,
"signalType": "UPDATE",
"objectId": "5f559b8e-7851-469f-9e94-657e1702faea",
"eserviceId": "b1817321-0486-4c75-89e5-4ee297250418",
"objectType": "domicilio"
},
{
"signalId": 4,
"signalType": "UPDATE",
"objectId": "7b0b1ad9-6ac0-4670-86e0-eacadb3aa9d4",
"eserviceId": "b1817321-0486-4c75-89e5-4ee297250418",
"objectType": "domicilio"
},
{
"signalId": 5,
"signalType": "UPDATE",
"objectId": "7b0b1ad9-6ac0-4670-86e0-eacadb3aa9d4",
"eserviceId": "b1817321-0486-4c75-89e5-4ee297250418",
"objectType": "domicilio"
},
],
"lastSignalId": 5
Nella richiesta al servizio dovranno essere presenti le seguenti informazioni (fare riferimento al documento OpenAPI per i valori di default, min, max)
  • eserviceId: l'id del servizio da cui leggere i segnali
  • signalId: l’identificativo del segnale a partire dal quale si desidera ricevere gli ulteriori segnali (escluso): se signalId=0, saranno restituiti i segnali con signalId maggiore di 0, quindi: 1, 2, 3, 4, …
  • size: la quantità di segnali da ottenere nella risposta; se size maggiore del valore massimo, la size viene sovrascritta al valore massimo (in questo caso la risposta avrà un insieme di elementi minore rispetto a quello richiesto, uguale al valore massimo).
Nella risposta sono presenti:
  • i segnali in ordine di signalId crescente, a partire dal signalId successivo al signalId specificato nella richiesta, per una quantità uguale a size specificato nella richiesta
  • il signalId dell’ultimo segnale restituito, denominato lastSignalId
  • Http Status 206 - Partial Content se esistono ancora segnali da leggere: il numero dei segnali totali è maggiore dei segnali presenti nella risposta
  • Http Status 200 - OK se la risposta se non ci sono più segnali da leggere: i segnali presenti nella risposta esauriscono i messaggi totali
Esempio richiesta che non esaurisce i segnali in una chiamata
Se poniamo a 10 il numero totale di segnali presenti, relativi a un e-service
Richiesta n. 1
$ curl --request GET \
--url https://api.signalhub.interop.pagopa.it/v1/pull/signals/b1817321-0486-4c75-89e5-4ee297250418?size=5&signalId=0 \
--header 'Authorization: Bearer eyJ4eBMlOiDgdDtqe6P...'
Risposta n. 1
Http Status 206
$ {
"signals": [
...
],
"lastSignalId": 5
Lo Http Status 206 indica che esistono ancora dei segnali; quindi, il consumatore creerà una nuova richiesta impostando il query param signalId uguale al valore di lastSignalId presente nella risposta:
Richiesta n. 2
$ curl --request GET \
--url https://api.signalhub.interop.pagopa.it/v1/pull/signals/b1817321-0486-4c75-89e5-4ee297250418?size=5&signalId=5 \
--header 'Authorization: Bearer eyJ4eBMlOiDgdDtqe6P...'
Risposta n. 2
Http Status 200
$ {
"signals": [
...
],
"lastSignalId": 10
Lo Http Status 200 indica che, nello stato attuale, non ci sono più segnali da leggere: oltre il "lastSignalId": 10 non esiste un signalId successivo.
In un’ottica di long polling verso il servizio, la nuova richiesta da effettuare sarà:
$ curl --request GET \
--url https://api.signalhub.interop.pagopa.it/v1/pull/signals/b1817321-0486-4c75-89e5-4ee297250418?size=5&signalId=10 \
--header 'Authorization: Bearer eyJ4eBMlOiDgdDtqe6P...'
che otterrebbe questo risultato:
Http Status 200
$ {
"signals": [],
"lastSignalId": null
fino a che la risposta non cambierà (Http Status 206, signals e lastSignalId valorizzati) , cioè fino a quando non ci saranno nuovi segnali.
Esempio richiesta che esaurisce i segnali in una chiamata
Se poniamo a 4 il numero totale di segnali presenti, relativi a un e-service
Richiesta n. 1
$ curl --request GET \
--url https://api.signalhub.interop.pagopa.it/v1/pull/signals/b1817321-0486-4c75-89e5-4ee297250418?size=5&signalId=0 \
--header 'Authorization: Bearer eyJ4eBMlOiDgdDtqe6P...'
Risposta n. 1
Http Status 200
$ {
"signals": [
...
],
"lastSignalId": 4
Lo Http Status 200 indica che, nello stato attuale, non ci sono più segnali da leggere: oltre il "lastSignalId": 4 non esiste un signalId successivo.
In un’ottica di long polling verso il servizio, la nuova richiesta da effettuare sarà:
$ curl --request GET \
--url https://api.signalhub.interop.pagopa.it/v1/pull/signals/b1817321-0486-4c75-89e5-4ee297250418?size=5&signalId=4 \
--header 'Authorization: Bearer eyJ4eBMlOiDgdDtqe6P...'
Otterrebbe questo risultato:
$ {
"signals": [],
"lastSignalId": null
fino a che la risposta non cambierà (signals e lastSignalId valorizzati) , cioè fino a quando non ci saranno nuovi segnali.
Mantenimento del lastSignalId
Il consumatore di segnali deve tenere traccia del valore del lastSignalId presente nella risposta dell’API di recupero segnali. Il lastSignalId consente di ottenere i segnali successivi a partire dal valore specificato. Vedi sezione “Esempio richiesta che non esaurisce i segnali in una chiamata”.

Elaborazione dei segnali e aggiornamento del dato

Una volta recuperata la lista dei segnali dal servizio, il consumatore la elabora attraverso il proprio stato interno per stabilire se un segnale è rilevante oppure no.
Ponendo che il consumatore abbia una propria base dati di questo tipo, capace di associare a un identificativo in chiaro (da usare per interrogare l’e-service) a un identificativo pseudonimizzato.
Ponendo che il consumatore sia capace di associare un identificativo in chiaro (da usare per interrogare l’e-service) a un identificativo pseudonimizzato, ad esempio:
identificativo internoidentificativo in chiaroidentificativo pseudonimizzato
1RSSMRA80A01H501U82e98709e2f96efd...
2FNTPPL62H44D643PF5e0f94f36a5eea4...
3FLZCRN65R02E202N701c4489d6ac7fdb7...
Ponendo che il consumatore abbia ricevuto questa lista di segnali:
signalIdobjectId
1715a9864rt66
20e25dc7684d7
382e98709e2f96efd...
47cb5786140d2
54bdb-8b0bdfd
Il consumatore potrà individuare come rilevante il segnale con signalId = 3, dato che è in grado di associarlo a un proprio identificato pseudonimizzato. Gli altri messaggi saranno ignorati in quanto non rilevanti, relativi a soggetti per cui il consumatore non ha procedimenti amministrativi in corso.
Il consumatore ottiene così una lista degli identificativi in chiaro dei dati soggetti a variazione:
identificativo internoidentificativo in chiaroidentificativo pseudonimizzato
1RSSMRA80A01H501U82e98709e2f96efd...
A partire da questa lista il consumatore invocherà l’e-service con gli identificativi in chiaro, richiedendo per ciascun soggetto il dato aggiornato. Il consumatore potrà attivare, se necessario, ulteriori processi interni dovuti alla variazione dello stato del dato.

Recupero di un segnale di aggiornamento delle informazioni crittografiche (tipo seedUpdate)

Nel caso di segnale di tipo seedUpdate, in base al signalId, il fruitore potrà dedurre che tutti i segnali con signalId maggiore del signalId del seedUpdate saranno impattati dalla modifica al criterio di calcolo dell'objectId. Vedi sezione relativa al deposito segnale di aggiornamento delle informazioni crittografiche.
Ad esempio, in questa sequenza il consumatore di segnali, dopo avere letto il messaggio con signald = 3 dovrà interrogare nuovamente l’e-service per ottenere le informazioni crittografiche, e una volta ottenute ricalcolare tutti gli id pseudonimizzati (vedi come ottenere le informazioni crittografiche).
signalIdobjectIdsignalType

hash
seed
1715a9864domicilio
sha256
f3a7f54e-8e57-4a06-8bca-ac1857b6b045
20e25dc7684d7domicilio
sha256
f3a7f54e-8e57-4a06-8bca-ac1857b6b045
3-seedupdate
47cb5786140d2domicilio
sha512
cbb70351-d2aa-4781-b861-d40c94413247
54bdb-8b0bdomicilio
sha512
cbb70351-d2aa-4781-b861-d40c94413247
\

Hai bisogno di aiuto?

Apri un ticket utilizzando l’apposita funzione all’interno della tua Area Riservata

Dicci cosa ne pensi

Per segnalare problemi o dare feedback, puoi aprire una segnalazione su Github