MACOEV.Glpi.Client 26.8.1.5
MACOEV.Glpi.Client
Client .NET per le API REST di GLPI 10+, condiviso fra il portale di ticketing ASL Roma 1 / PTV e il modulo Inventario Semplificato.
Target: net8.0 e net10.0.
Perche' esiste
L'integrazione GLPI viveva dentro l'applicazione Blazor di ticketing, in un unico file da 1188 righe non riusabile da fuori. Questa libreria la estrae e ne sana i difetti strutturali:
| Prima | Adesso |
|---|---|
new HttpClient() a ogni chiamata (~45 volte, alcune non disposte) |
un solo client dalla factory, con pipeline di resilienza |
Sessione Scoped: una per circuito Blazor, mai chiusa |
IGlpiSessionProvider singleton, thread-safe, con scadenza e killSession |
| Nessuna reazione al 401: la sessione scaduta faceva fallire tutto | rinnovo automatico e un solo ritentativo |
Console.WriteLine |
ILogger |
| Termini di ricerca interpolati in query string | GlpiHttpClient.Escape |
| Errori GLPI opachi | GlpiApiException con ErrorCode tipizzato |
Uso
builder.Services.AddGlpiClient(builder.Configuration);
{
"Glpi": {
"BaseUri": "https://glpi.aslroma1.it",
"AppToken": "...",
"UserToken": "...",
"SessionLifetime": "00:20:00"
}
}
Oppure in codice:
builder.Services.AddGlpiClient(options =>
{
options.BaseUri = "https://glpi.aslroma1.it";
options.AppToken = appToken;
options.UserToken = userToken;
});
BaseUri e' la radice dell'istanza GLPI senza /apirest.php.
Nota sulla sessione
Le credenziali sono quelle di un service account: la sessione aperta dal client non e'
quella dell'utente finale. Di conseguenza glpiactiveprofile restituito da initSession
descrive il service account e non e' utilizzabile per autorizzare l'utente applicativo.
Per i ruoli vanno interrogati Group_User / Profile_User sull'utente autenticato.
Modelli
I DTO vivono tutti nel namespace unico Macoev.Glpi.Client.Models, organizzati in cartelle
(Common, Session, Users, Tickets, Dropdowns, Assets, Documents, Knowbase):
un solo using per il consumatore.
I nomi JSON sono il contratto con GLPI e sono coperti da test di contratto
(ModelContractTests): un refuso in un JsonPropertyName non produce errori di
compilazione, quindi la verifica non puo' che essere automatica.
Cosa resta fuori, di proposito
| Non migrato | Perche' |
|---|---|
UserModel.Initials / FullName, DevicesSearchModel.ImageUrl, TicketInputModel.UserInfoContent |
Presentazione: dipendono da tema, logo e lingua dell'applicazione ospite |
TicketInputModel (form completo), TicketInputMoveDetailModel |
Form model con stato UI (recapiti, consensi a tre stati, edificio/piano). La libreria espone il solo TicketInput, che porta i campi che finiscono davvero sul filo |
Glpiactiveprofile, Glpiprofiles, GLPI_SessionModel, AuthenticationModel |
~600 righe senza alcun uso: la proprieta' session che le conteneva e' commentata. Descrivono comunque il service account, non l'utente applicativo |
Sviluppo
dotnet test
Rilascio
La pubblicazione e' automatica su GitHub Actions ed e' legata al tag, non al branch:
git tag v26.8.1 && git push origin v26.8.1
Il workflow publish.yml ricava la versione dal tag (v26.8.1 -> 26.8.1), la inietta con
-p:Version=, esegue i test, impacchetta e pubblica sul feed. Richiede il secret di repository
NUGET_FEED_API_KEY. In alternativa si puo' lanciare a mano da Actions > Publish NuGet >
Run workflow indicando la versione.
Versionamento YY.M.patch.build, coerente con gli altri pacchetti MACOEV.
Attenzione alla normalizzazione NuGet: una quarta cifra a zero viene rimossa, quindi
26.8.1.0viene pubblicato come26.8.1. Conviene taggare direttamente nella forma normalizzata, per non avere tag e pacchetto con nomi diversi.
Directory.Build.targets allinea AssemblyVersion e FileVersion alla Version finale,
qualunque sia la sua provenienza.
No packages depend on MACOEV.Glpi.Client.
.NET 10.0
- Microsoft.Extensions.Http.Resilience (>= 10.9.0)
- Microsoft.Extensions.Options.DataAnnotations (>= 10.0.11)
.NET 8.0
- Microsoft.Extensions.Http.Resilience (>= 10.9.0)
- Microsoft.Extensions.Options.DataAnnotations (>= 10.0.11)
| Version | Downloads | Last updated |
|---|---|---|
| 26.14.0 | 9 | 10/20/2026 |
| 26.13.0 | 6 | 10/08/2026 |
| 26.12.1 | 5 | 10/07/2026 |
| 26.12.0 | 6 | 09/29/2026 |
| 26.11.1 | 3 | 09/28/2026 |
| 26.11.0 | 14 | 09/09/2026 |
| 26.10.1 | 1 | 09/08/2026 |
| 26.9.2 | 1 | 09/08/2026 |
| 26.9.1 | 2 | 09/08/2026 |
| 26.9.0 | 0 | 09/08/2026 |
| 26.8.9 | 1 | 09/03/2026 |
| 26.8.8 | 2 | 09/02/2026 |
| 26.8.7 | 0 | 09/02/2026 |
| 26.8.6 | 2 | 08/27/2026 |
| 26.8.5 | 2 | 08/27/2026 |
| 26.8.4 | 1 | 08/26/2026 |
| 26.8.3 | 1 | 08/26/2026 |
| 26.8.2 | 1 | 08/26/2026 |
| 26.8.1.5 | 0 | 08/26/2026 |