From 0bd138df6358d4b1a92e299b4453034da43cb1f0 Mon Sep 17 00:00:00 2001 From: ChiaraBm Date: Thu, 19 Feb 2026 08:49:23 +0100 Subject: [PATCH] Switched from self created static constant json options to a source generator options --- .../ContainerHelper/SerializationContext.cs | 18 ++---------- .../Services/ContainerHelperService.cs | 11 ++++---- Moonlight.Frontend/Constants.cs | 28 ------------------- .../Services/RemoteAuthProvider.cs | 4 ++- Moonlight.Frontend/Startup/Startup.Base.cs | 2 +- .../UI/Admin/Modals/CreateApiKeyDialog.razor | 3 +- .../UI/Admin/Modals/CreateRoleDialog.razor | 3 +- .../UI/Admin/Modals/CreateUserDialog.razor | 3 +- .../UI/Admin/Modals/UpdateApiKeyDialog.razor | 3 +- .../UI/Admin/Modals/UpdateInstanceModal.razor | 6 ++-- .../UI/Admin/Modals/UpdateRoleDialog.razor | 3 +- .../UI/Admin/Views/Overview.razor | 3 +- .../UI/Admin/Views/Sys/ApiKeys.razor | 3 +- .../UI/Admin/Views/Sys/Themes/Create.razor | 3 +- .../UI/Admin/Views/Sys/Themes/Index.razor | 5 ++-- .../UI/Admin/Views/Sys/Themes/Update.razor | 3 +- .../UI/Admin/Views/Users/Roles.razor | 3 +- .../UI/Admin/Views/Users/Users.razor | 3 +- .../Components/Auth/Authentication.razor | 5 ++-- Moonlight.Shared/Http/SerializationContext.cs | 18 ++---------- 20 files changed, 46 insertions(+), 84 deletions(-) delete mode 100644 Moonlight.Frontend/Constants.cs diff --git a/Moonlight.Api/Http/Services/ContainerHelper/SerializationContext.cs b/Moonlight.Api/Http/Services/ContainerHelper/SerializationContext.cs index 371fb761..d7674b6c 100644 --- a/Moonlight.Api/Http/Services/ContainerHelper/SerializationContext.cs +++ b/Moonlight.Api/Http/Services/ContainerHelper/SerializationContext.cs @@ -9,21 +9,9 @@ namespace Moonlight.Api.Http.Services.ContainerHelper; [JsonSerializable(typeof(ProblemDetails))] [JsonSerializable(typeof(RebuildEventDto))] [JsonSerializable(typeof(RequestRebuildDto))] + +[JsonSourceGenerationOptions(JsonSerializerDefaults.Web)] public partial class SerializationContext : JsonSerializerContext { - private static JsonSerializerOptions? InternalTunedOptions; - - public static JsonSerializerOptions TunedOptions - { - get - { - if (InternalTunedOptions != null) - return InternalTunedOptions; - - InternalTunedOptions = new JsonSerializerOptions(JsonSerializerDefaults.Web); - InternalTunedOptions.TypeInfoResolverChain.Add(Default); - - return InternalTunedOptions; - } - } + } \ No newline at end of file diff --git a/Moonlight.Api/Services/ContainerHelperService.cs b/Moonlight.Api/Services/ContainerHelperService.cs index 434857bd..2ce921a7 100644 --- a/Moonlight.Api/Services/ContainerHelperService.cs +++ b/Moonlight.Api/Services/ContainerHelperService.cs @@ -1,5 +1,4 @@ -using System.Net.Http.Headers; -using System.Net.Http.Json; +using System.Net.Http.Json; using System.Text.Json; using Moonlight.Api.Http.Services.ContainerHelper; using Moonlight.Api.Http.Services.ContainerHelper.Requests; @@ -42,7 +41,7 @@ public class ContainerHelperService request.Content = JsonContent.Create( new RequestRebuildDto(noBuildCache), null, - SerializationContext.TunedOptions + SerializationContext.Default.Options ); var response = await client.SendAsync( @@ -77,7 +76,7 @@ public class ContainerHelperService continue; var data = line.Trim("data: "); - var deserializedData = JsonSerializer.Deserialize(data, SerializationContext.TunedOptions); + var deserializedData = JsonSerializer.Deserialize(data, SerializationContext.Default.Options); yield return deserializedData; @@ -100,14 +99,14 @@ public class ContainerHelperService var response = await client.PostAsJsonAsync( "api/configuration/version", new SetVersionDto(version), - SerializationContext.TunedOptions + SerializationContext.Default.Options ); if (response.IsSuccessStatusCode) return; var problemDetails = - await response.Content.ReadFromJsonAsync(SerializationContext.TunedOptions); + await response.Content.ReadFromJsonAsync(SerializationContext.Default.Options); if (problemDetails == null) throw new HttpRequestException($"Failed to set version: {response.ReasonPhrase}"); diff --git a/Moonlight.Frontend/Constants.cs b/Moonlight.Frontend/Constants.cs deleted file mode 100644 index 5c42627f..00000000 --- a/Moonlight.Frontend/Constants.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System.Text.Json; -using Moonlight.Shared.Http; - -namespace Moonlight.Frontend; - -public static class Constants -{ - public static JsonSerializerOptions SerializerOptions - { - get - { - if (InternalOptions != null) - return InternalOptions; - - InternalOptions = new() - { - PropertyNameCaseInsensitive = true - }; - - // Add source generated options from shared project - InternalOptions.TypeInfoResolverChain.Add(SerializationContext.Default); - - return InternalOptions; - } - } - - private static JsonSerializerOptions? InternalOptions; -} \ No newline at end of file diff --git a/Moonlight.Frontend/Services/RemoteAuthProvider.cs b/Moonlight.Frontend/Services/RemoteAuthProvider.cs index 8e17d6e4..2ec3a0dd 100644 --- a/Moonlight.Frontend/Services/RemoteAuthProvider.cs +++ b/Moonlight.Frontend/Services/RemoteAuthProvider.cs @@ -3,6 +3,8 @@ using System.Net.Http.Json; using System.Security.Claims; using Microsoft.AspNetCore.Components.Authorization; using Microsoft.Extensions.Logging; +using Microsoft.VisualBasic; +using Moonlight.Shared.Http; using Moonlight.Shared.Http.Responses.Admin.Auth; namespace Moonlight.Frontend.Services; @@ -23,7 +25,7 @@ public class RemoteAuthProvider : AuthenticationStateProvider try { var claimResponses = await HttpClient.GetFromJsonAsync( - "api/auth/claims", Constants.SerializerOptions + "api/auth/claims", SerializationContext.Default.Options ); var claims = claimResponses!.Select(claim => new Claim(claim.Type, claim.Value)); diff --git a/Moonlight.Frontend/Startup/Startup.Base.cs b/Moonlight.Frontend/Startup/Startup.Base.cs index f490ae57..cf145d53 100644 --- a/Moonlight.Frontend/Startup/Startup.Base.cs +++ b/Moonlight.Frontend/Startup/Startup.Base.cs @@ -19,7 +19,7 @@ public partial class Startup builder.RootComponents.Add("head::after"); builder.Services.AddScoped(_ => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) }); - + builder.Services.AddShadcnBlazor(); builder.Services.AddShadcnBlazorExtras(); diff --git a/Moonlight.Frontend/UI/Admin/Modals/CreateApiKeyDialog.razor b/Moonlight.Frontend/UI/Admin/Modals/CreateApiKeyDialog.razor index 37f2b36f..6452d584 100644 --- a/Moonlight.Frontend/UI/Admin/Modals/CreateApiKeyDialog.razor +++ b/Moonlight.Frontend/UI/Admin/Modals/CreateApiKeyDialog.razor @@ -1,5 +1,6 @@ @using Moonlight.Frontend.Helpers @using Moonlight.Frontend.UI.Admin.Components +@using Moonlight.Shared.Http @using Moonlight.Shared.Http.Requests.Admin.ApiKeys @using Moonlight.Shared.Http.Responses @using ShadcnBlazor.Dialogs @@ -77,7 +78,7 @@ var response = await HttpClient.PostAsJsonAsync( "/api/admin/apiKeys", Request, - Constants.SerializerOptions + SerializationContext.Default.Options ); if (!response.IsSuccessStatusCode) diff --git a/Moonlight.Frontend/UI/Admin/Modals/CreateRoleDialog.razor b/Moonlight.Frontend/UI/Admin/Modals/CreateRoleDialog.razor index 942e79b8..442befdb 100644 --- a/Moonlight.Frontend/UI/Admin/Modals/CreateRoleDialog.razor +++ b/Moonlight.Frontend/UI/Admin/Modals/CreateRoleDialog.razor @@ -1,5 +1,6 @@ @using Moonlight.Frontend.Helpers @using Moonlight.Frontend.UI.Admin.Components +@using Moonlight.Shared.Http @using Moonlight.Shared.Http.Requests.Admin.Roles @using ShadcnBlazor.Dialogs @using ShadcnBlazor.Extras.Forms @@ -76,7 +77,7 @@ var response = await HttpClient.PostAsJsonAsync( "api/admin/roles", Request, - Constants.SerializerOptions + SerializationContext.Default.Options ); if (!response.IsSuccessStatusCode) diff --git a/Moonlight.Frontend/UI/Admin/Modals/CreateUserDialog.razor b/Moonlight.Frontend/UI/Admin/Modals/CreateUserDialog.razor index ff9113de..4cff020f 100644 --- a/Moonlight.Frontend/UI/Admin/Modals/CreateUserDialog.razor +++ b/Moonlight.Frontend/UI/Admin/Modals/CreateUserDialog.razor @@ -1,4 +1,5 @@ @using Moonlight.Frontend.Helpers +@using Moonlight.Shared.Http @using Moonlight.Shared.Http.Requests.Admin.Users @using Moonlight.Shared.Http.Responses @using ShadcnBlazor.Dialogs @@ -65,7 +66,7 @@ var response = await HttpClient.PostAsJsonAsync( "/api/admin/users", Request, - Constants.SerializerOptions + SerializationContext.Default.Options ); if (!response.IsSuccessStatusCode) diff --git a/Moonlight.Frontend/UI/Admin/Modals/UpdateApiKeyDialog.razor b/Moonlight.Frontend/UI/Admin/Modals/UpdateApiKeyDialog.razor index 75c75115..7b4995fb 100644 --- a/Moonlight.Frontend/UI/Admin/Modals/UpdateApiKeyDialog.razor +++ b/Moonlight.Frontend/UI/Admin/Modals/UpdateApiKeyDialog.razor @@ -1,6 +1,7 @@ @using Moonlight.Frontend.Helpers @using Moonlight.Frontend.Mappers @using Moonlight.Frontend.UI.Admin.Components +@using Moonlight.Shared.Http @using Moonlight.Shared.Http.Requests.Admin.ApiKeys @using Moonlight.Shared.Http.Responses.Admin.ApiKeys @using ShadcnBlazor.Dialogs @@ -74,7 +75,7 @@ var response = await HttpClient.PatchAsJsonAsync( $"/api/admin/apiKeys/{Key.Id}", Request, - Constants.SerializerOptions + SerializationContext.Default.Options ); if (!response.IsSuccessStatusCode) diff --git a/Moonlight.Frontend/UI/Admin/Modals/UpdateInstanceModal.razor b/Moonlight.Frontend/UI/Admin/Modals/UpdateInstanceModal.razor index 8a79aa15..dc294f4a 100644 --- a/Moonlight.Frontend/UI/Admin/Modals/UpdateInstanceModal.razor +++ b/Moonlight.Frontend/UI/Admin/Modals/UpdateInstanceModal.razor @@ -124,7 +124,7 @@ else await HttpClient.PostAsJsonAsync("api/admin/ch/version", new SetVersionDto() { Version = Version - }, SerializationContext.TunedOptions); + }, SerializationContext.Default.Options); // Starting rebuild task CurrentStep = 2; @@ -136,7 +136,7 @@ else request.Content = JsonContent.Create( new RequestRebuildDto(NoBuildCache), null, - SerializationContext.TunedOptions + SerializationContext.Default.Options ); var response = await HttpClient.SendAsync( @@ -160,7 +160,7 @@ else continue; var data = line.Trim("data: "); - var deserializedData = JsonSerializer.Deserialize(data, Constants.SerializerOptions); + var deserializedData = JsonSerializer.Deserialize(data, SerializationContext.Default.Options); switch (deserializedData.Type) { diff --git a/Moonlight.Frontend/UI/Admin/Modals/UpdateRoleDialog.razor b/Moonlight.Frontend/UI/Admin/Modals/UpdateRoleDialog.razor index 288d8a71..f53b792b 100644 --- a/Moonlight.Frontend/UI/Admin/Modals/UpdateRoleDialog.razor +++ b/Moonlight.Frontend/UI/Admin/Modals/UpdateRoleDialog.razor @@ -1,6 +1,7 @@ @using Moonlight.Frontend.Helpers @using Moonlight.Frontend.Mappers @using Moonlight.Frontend.UI.Admin.Components +@using Moonlight.Shared.Http @using Moonlight.Shared.Http.Requests.Admin.Roles @using Moonlight.Shared.Http.Responses.Admin @using ShadcnBlazor.Dialogs @@ -75,7 +76,7 @@ var response = await HttpClient.PatchAsJsonAsync( $"api/admin/roles/{Role.Id}", Request, - Constants.SerializerOptions + SerializationContext.Default.Options ); if (!response.IsSuccessStatusCode) diff --git a/Moonlight.Frontend/UI/Admin/Views/Overview.razor b/Moonlight.Frontend/UI/Admin/Views/Overview.razor index f8e03c48..57a0a4ab 100644 --- a/Moonlight.Frontend/UI/Admin/Views/Overview.razor +++ b/Moonlight.Frontend/UI/Admin/Views/Overview.razor @@ -1,6 +1,7 @@ @page "/admin" @using LucideBlazor @using Moonlight.Frontend.UI.Admin.Modals +@using Moonlight.Shared.Http @using Moonlight.Shared.Http.Responses.Admin @using ShadcnBlazor.Buttons @using ShadcnBlazor.Cards @@ -155,7 +156,7 @@ if(!firstRender) return; - InfoResponse = await HttpClient.GetFromJsonAsync("api/admin/system/info", Constants.SerializerOptions); + InfoResponse = await HttpClient.GetFromJsonAsync("api/admin/system/info", SerializationContext.Default.Options); IsInfoLoading = false; await InvokeAsync(StateHasChanged); diff --git a/Moonlight.Frontend/UI/Admin/Views/Sys/ApiKeys.razor b/Moonlight.Frontend/UI/Admin/Views/Sys/ApiKeys.razor index a4cfda72..6ce7ec0d 100644 --- a/Moonlight.Frontend/UI/Admin/Views/Sys/ApiKeys.razor +++ b/Moonlight.Frontend/UI/Admin/Views/Sys/ApiKeys.razor @@ -3,6 +3,7 @@ @using Microsoft.AspNetCore.Components.Authorization @using Moonlight.Frontend.UI.Admin.Modals @using Moonlight.Shared +@using Moonlight.Shared.Http @using Moonlight.Shared.Http.Requests @using Moonlight.Shared.Http.Responses @using Moonlight.Shared.Http.Responses.Admin.ApiKeys @@ -126,7 +127,7 @@ var response = await HttpClient.GetFromJsonAsync>( $"api/admin/apiKeys{query}&filterOptions={filterOptions}", - Constants.SerializerOptions + SerializationContext.Default.Options ); return new DataGridResponse(response!.Data, response.TotalLength); diff --git a/Moonlight.Frontend/UI/Admin/Views/Sys/Themes/Create.razor b/Moonlight.Frontend/UI/Admin/Views/Sys/Themes/Create.razor index be2711df..35e38e6e 100644 --- a/Moonlight.Frontend/UI/Admin/Views/Sys/Themes/Create.razor +++ b/Moonlight.Frontend/UI/Admin/Views/Sys/Themes/Create.razor @@ -5,6 +5,7 @@ @using LucideBlazor @using Moonlight.Frontend.Helpers @using Moonlight.Frontend.Services +@using Moonlight.Shared.Http @using Moonlight.Shared.Http.Requests.Admin.Themes @using ShadcnBlazor.Buttons @using ShadcnBlazor.Cards @@ -122,7 +123,7 @@ var response = await HttpClient.PostAsJsonAsync( "/api/admin/themes", Request, - Constants.SerializerOptions + SerializationContext.Default.Options ); if (!response.IsSuccessStatusCode) diff --git a/Moonlight.Frontend/UI/Admin/Views/Sys/Themes/Index.razor b/Moonlight.Frontend/UI/Admin/Views/Sys/Themes/Index.razor index d8683e27..7a434892 100644 --- a/Moonlight.Frontend/UI/Admin/Views/Sys/Themes/Index.razor +++ b/Moonlight.Frontend/UI/Admin/Views/Sys/Themes/Index.razor @@ -2,6 +2,7 @@ @using Microsoft.AspNetCore.Authorization @using Microsoft.AspNetCore.Components.Authorization @using Moonlight.Shared +@using Moonlight.Shared.Http @using Moonlight.Shared.Http.Requests @using Moonlight.Shared.Http.Responses @using Moonlight.Shared.Http.Responses.Admin.Themes @@ -136,7 +137,7 @@ var response = await HttpClient.GetFromJsonAsync>( $"api/admin/themes{query}&filterOptions={filterOptions}", - Constants.SerializerOptions + SerializationContext.Default.Options ); return new DataGridResponse(response!.Data, response.TotalLength); @@ -182,7 +183,7 @@ var importedTheme = await response .Content - .ReadFromJsonAsync(Constants.SerializerOptions); + .ReadFromJsonAsync(SerializationContext.Default.Options); if (importedTheme == null) continue; diff --git a/Moonlight.Frontend/UI/Admin/Views/Sys/Themes/Update.razor b/Moonlight.Frontend/UI/Admin/Views/Sys/Themes/Update.razor index 4c19541f..8ac377b5 100644 --- a/Moonlight.Frontend/UI/Admin/Views/Sys/Themes/Update.razor +++ b/Moonlight.Frontend/UI/Admin/Views/Sys/Themes/Update.razor @@ -6,6 +6,7 @@ @using Moonlight.Frontend.Helpers @using Moonlight.Frontend.Mappers @using Moonlight.Frontend.Services +@using Moonlight.Shared.Http @using Moonlight.Shared.Http.Requests.Admin.Themes @using Moonlight.Shared.Http.Responses.Admin.Themes @using ShadcnBlazor.Buttons @@ -136,7 +137,7 @@ var response = await HttpClient.PatchAsJsonAsync( $"/api/admin/themes/{Theme.Id}", Request, - Constants.SerializerOptions + SerializationContext.Default.Options ); if (!response.IsSuccessStatusCode) diff --git a/Moonlight.Frontend/UI/Admin/Views/Users/Roles.razor b/Moonlight.Frontend/UI/Admin/Views/Users/Roles.razor index a84bf8ba..a6cb1a53 100644 --- a/Moonlight.Frontend/UI/Admin/Views/Users/Roles.razor +++ b/Moonlight.Frontend/UI/Admin/Views/Users/Roles.razor @@ -3,6 +3,7 @@ @using Microsoft.AspNetCore.Components.Authorization @using Moonlight.Frontend.UI.Admin.Modals @using Moonlight.Shared +@using Moonlight.Shared.Http @using Moonlight.Shared.Http.Requests @using Moonlight.Shared.Http.Responses @using Moonlight.Shared.Http.Responses.Admin @@ -123,7 +124,7 @@ var response = await HttpClient.GetFromJsonAsync>( $"api/admin/roles{query}&filterOptions={filterOptions}", - Constants.SerializerOptions + SerializationContext.Default.Options ); return new DataGridResponse(response!.Data, response.TotalLength); diff --git a/Moonlight.Frontend/UI/Admin/Views/Users/Users.razor b/Moonlight.Frontend/UI/Admin/Views/Users/Users.razor index 5ffcdcde..69e4c6b3 100644 --- a/Moonlight.Frontend/UI/Admin/Views/Users/Users.razor +++ b/Moonlight.Frontend/UI/Admin/Views/Users/Users.razor @@ -3,6 +3,7 @@ @using Microsoft.AspNetCore.Components.Authorization @using Moonlight.Frontend.UI.Admin.Modals @using Moonlight.Shared +@using Moonlight.Shared.Http @using ShadcnBlazor.Buttons @using ShadcnBlazor.DataGrids @using ShadcnBlazor.Dropdowns @@ -121,7 +122,7 @@ var response = await HttpClient.GetFromJsonAsync>( $"api/admin/users{query}&filterOptions={filterOptions}", - Constants.SerializerOptions + SerializationContext.Default.Options ); return new DataGridResponse(response!.Data, response.TotalLength); diff --git a/Moonlight.Frontend/UI/Shared/Components/Auth/Authentication.razor b/Moonlight.Frontend/UI/Shared/Components/Auth/Authentication.razor index 22a2f7eb..3187e747 100644 --- a/Moonlight.Frontend/UI/Shared/Components/Auth/Authentication.razor +++ b/Moonlight.Frontend/UI/Shared/Components/Auth/Authentication.razor @@ -1,4 +1,5 @@ -@using Moonlight.Shared.Http.Responses.Admin.Auth +@using Moonlight.Shared.Http +@using Moonlight.Shared.Http.Responses.Admin.Auth @using ShadcnBlazor.Cards @using ShadcnBlazor.Spinners @using ShadcnBlazor.Buttons @@ -48,7 +49,7 @@ return; var schemes = await HttpClient.GetFromJsonAsync( - "api/auth", Constants.SerializerOptions + "api/auth", SerializationContext.Default.Options ); if (schemes == null) diff --git a/Moonlight.Shared/Http/SerializationContext.cs b/Moonlight.Shared/Http/SerializationContext.cs index a77737f8..1e8459ee 100644 --- a/Moonlight.Shared/Http/SerializationContext.cs +++ b/Moonlight.Shared/Http/SerializationContext.cs @@ -58,21 +58,9 @@ namespace Moonlight.Shared.Http; //Misc [JsonSerializable(typeof(VersionDto))] [JsonSerializable(typeof(ProblemDetails))] + +[JsonSourceGenerationOptions(JsonSerializerDefaults.Web)] public partial class SerializationContext : JsonSerializerContext { - private static JsonSerializerOptions? InternalTunedOptions; - - public static JsonSerializerOptions TunedOptions - { - get - { - if (InternalTunedOptions != null) - return InternalTunedOptions; - - InternalTunedOptions = new JsonSerializerOptions(JsonSerializerDefaults.Web); - InternalTunedOptions.TypeInfoResolverChain.Add(Default); - - return InternalTunedOptions; - } - } + } \ No newline at end of file -- 2.49.1