From add770b227a5d2b96efeae35f6b510eb266c028c Mon Sep 17 00:00:00 2001 From: Pat Hartl Date: Sun, 16 Nov 2025 12:31:25 -0600 Subject: [PATCH] Refactor Settings Settings for the server are now combined with the settings from the SDK. This introduces a large breaking change and a migration should be created. This refactor utilizes .NET Configuration and the Options pattern. This will allow for the overriding of any setting using envionment variables. It also means that Settings.yml can be used to override any .NET configuration. A SettingsProvider implementation was created, and any updating of settings was changed from SettingsService.SaveSettings() to SettingsProvider.Update(s => { ... }) --- .../Providers/SettingsProvider.cs | 2 + .../20231103052501_RemoveGameIconProperty.cs | 2 - .../20240220154307_CalculateMediaChecksum.cs | 2 - .../20241011014752_AddStorageLocations.cs | 2 - LANCommander.Server.Data/DatabaseContext.cs | 2 +- .../Enums/DatabaseProvider.cs | 16 ---- .../Enums/ServerEngine.cs | 7 -- .../LANCommander.Server.Data.csproj | 1 + LANCommander.Server.Data/Models/Server.cs | 2 +- .../Abstractions/IGitHubService.cs | 1 + .../Abstractions/IVersionProvider.cs | 1 + LANCommander.Server.Services/ActionService.cs | 3 +- LANCommander.Server.Services/ArchiveClient.cs | 3 +- .../AuthenticationService.cs | 23 ++--- .../CategoryService.cs | 3 +- .../ChatMessageService.cs | 3 +- LANCommander.Server.Services/ChatService.cs | 3 +- .../ChatThreadReadStatusService.cs | 7 +- .../ChatThreadService.cs | 3 +- .../CollectionService.cs | 3 +- .../CompanyService.cs | 3 +- LANCommander.Server.Services/EngineService.cs | 3 +- .../IServiceCollectionExtensions.cs | 7 +- .../GameCustomFieldService.cs | 5 +- .../GameSaveService.cs | 4 +- LANCommander.Server.Services/GameService.cs | 4 +- LANCommander.Server.Services/GenreService.cs | 3 +- LANCommander.Server.Services/GitHubService.cs | 1 + LANCommander.Server.Services/IGDBService.cs | 7 +- .../IPXRelayService.cs | 10 +-- .../Interceptors/BeaconMessageInterceptor.cs | 13 ++- LANCommander.Server.Services/IssueService.cs | 6 +- LANCommander.Server.Services/KeyService.cs | 3 +- .../LANCommander.Server.Services.csproj | 1 + .../LibraryService.cs | 6 +- .../Mappers/MappingProfile.cs | 2 +- .../MediaGrabbers/SteamGridDBMediaGrabber.cs | 6 +- LANCommander.Server.Services/MediaService.cs | 10 ++- .../MultiplayerModeService.cs | 3 +- LANCommander.Server.Services/PageService.cs | 3 +- .../PlatformService.cs | 3 +- .../PlaySessionService.cs | 3 +- .../RedistributableService.cs | 3 +- LANCommander.Server.Services/RoleService.cs | 3 +- .../SavePathService.cs | 3 +- LANCommander.Server.Services/ScriptService.cs | 3 +- .../ServerEngines/DockerServerEngine.cs | 11 +-- .../ServerEngines/LocalServerEngine.cs | 1 + .../ServerHttpPathService.cs | 3 +- .../ServerLogService.cs | 3 +- LANCommander.Server.Services/ServerService.cs | 3 +- .../SettingService.cs | 88 ------------------- LANCommander.Server.Services/SetupService.cs | 4 +- .../SteamCMDService.cs | 31 +++---- .../StorageLocationService.cs | 3 +- LANCommander.Server.Services/TagService.cs | 3 +- LANCommander.Server.Services/UpdateService.cs | 38 ++++---- .../UserCustomFieldService.cs | 3 +- LANCommander.Server.Services/UserService.cs | 17 ++-- .../_BaseDatabaseService.cs | 3 +- LANCommander.Server.Services/_BaseService.cs | 8 +- .../Settings.cs | 1 - .../Enums/AuthenticationProviderType.cs | 8 ++ .../Enums/DatabaseProvider.cs | 9 ++ .../Enums/LauncherArchitecture.cs | 7 ++ .../Enums/LauncherPlatform.cs | 8 ++ .../Enums/LogInterval.cs | 11 +++ .../Enums/LoggingProviderType.cs | 10 +++ .../Enums/ReleaseChannel.cs | 8 ++ .../Enums/ServerEngine.cs | 7 ++ LANCommander.Server.Settings/Enums/Theme.cs | 7 ++ .../LANCommander.Server.Settings.csproj | 18 ++++ .../Models/ArchiveSettings.cs | 8 ++ .../Models/AuthenticationProvider.cs | 26 ++++++ .../Models/AuthenticationSettings.cs | 29 ++++++ .../Models/BackupSettings.cs | 6 ++ .../Models/BeaconSettings.cs | 9 ++ .../Models/ClaimMapping.cs | 7 ++ .../Models/CookiePolicy.cs | 9 ++ .../Models/DatabaseSettings.cs | 9 ++ .../Models/GameServerSettings.cs | 22 +++++ .../Models/HttpSettings.cs | 10 +++ .../Models/IGDBSettings.cs | 7 ++ .../Models/IPXRelaySettings.cs | 9 ++ .../Models/LauncherSettings.cs | 19 ++++ .../Models/LibrarySettings.cs | 6 ++ .../Models/LogSettings.cs | 29 ++++++ .../Models/LoggingProvider.cs | 15 ++++ .../Models/MediaSettings.cs | 86 ++++++++++++++++++ .../Models/MediaTypeSettings.cs | 10 +++ .../Models/MediaTypeThumbnailSettings.cs | 10 +++ .../Models/MetadataSettings.cs | 6 ++ .../Models/RoleSettings.cs | 7 ++ .../Models/ScriptSettings.cs | 7 ++ .../Models/ServerEngineConfiguration.cs | 11 +++ .../Models/ServerSettings.cs | 23 +++++ .../Models/SteamCmdProfile.cs | 7 ++ .../Models/SteamCmdSettings.cs | 8 ++ .../Models/ThumbnailSize.cs | 17 ++++ .../Models/UpdateSettings.cs | 9 ++ .../Models/UserSaveSettings.cs | 7 ++ LANCommander.Server.Settings/Settings.cs | 10 +++ .../Controllers/Api/ArchivesController.cs | 3 +- .../Controllers/Api/AuthController.cs | 11 +-- .../Controllers/Api/DepotController.cs | 5 +- .../Controllers/Api/ExportController.cs | 3 +- .../Controllers/Api/GamesController.cs | 10 +-- .../Controllers/Api/IssueController.cs | 3 +- .../Controllers/Api/KeysController.cs | 9 +- .../Controllers/Api/LauncherController.cs | 8 +- .../Controllers/Api/LibraryController.cs | 5 +- .../Controllers/Api/MediaController.cs | 8 +- .../Controllers/Api/PlaySessionsController.cs | 5 +- .../Controllers/Api/ProfileController.cs | 9 +- .../Api/RedistributablesController.cs | 5 +- .../Controllers/Api/UploadController.cs | 8 +- .../Controllers/Api/_BaseApiController.cs | 10 +-- .../Controllers/GamesController.cs | 5 +- .../Controllers/RedistributablesController.cs | 3 +- .../Controllers/ServerController.cs | 3 +- .../Controllers/UploadController.cs | 9 +- .../Controllers/_BaseController.cs | 9 +- .../Endpoints/SaveEndpoints.cs | 6 +- .../Endpoints/SettingsEndpoints.cs | 9 +- .../Extensions/HttpContextExtensions.cs | 5 +- .../Background/DownloadLauncherArtifacts.cs | 10 +-- .../Jobs/Recurring/AutomaticRepackage.cs | 11 +-- .../LANCommander.Server.csproj | 1 + .../LANCommanderMappingProfile.cs | 2 +- .../Logging/GameServerHubConnection.cs | 62 ------------- .../Logging/LoggingHubConnection.cs | 62 ------------- LANCommander.Server/Program.cs | 22 ++--- .../Providers/VersionProvider.cs | 1 + .../Startup/ApplicationSettings.cs | 46 +++++----- LANCommander.Server/Startup/Authentication.cs | 34 +++---- LANCommander.Server/Startup/Beacon.cs | 11 +-- LANCommander.Server/Startup/Database.cs | 14 +-- LANCommander.Server/Startup/Filesystem.cs | 9 +- LANCommander.Server/Startup/Identity.cs | 37 ++++---- LANCommander.Server/Startup/Kestrel.cs | 14 +-- LANCommander.Server/Startup/Logger.cs | 8 +- LANCommander.Server/Startup/Servers.cs | 1 + LANCommander.Server/Startup/Services.cs | 8 +- LANCommander.Server/UI/App.razor | 34 ++----- .../UI/Components/ArchiveUploader.razor | 9 +- .../UI/Components/AvatarUploader.razor | 5 +- .../UI/Components/MainMenu.razor | 1 + .../UI/Components/RedirectToLogin.razor | 5 +- .../Components/LauncherDownloadButton.razor | 1 + .../UI/Pages/Account/Login.cshtml | 16 +--- .../UI/Pages/Account/Login.cshtml.cs | 13 +-- .../UI/Pages/Account/Register.cshtml | 11 +-- .../UI/Pages/Account/Register.cshtml.cs | 19 ++-- .../Pages/Dashboard/Charts/StorageUsage.razor | 1 - .../TopGamesAverageSessionPlaytime.razor | 4 +- .../Dashboard/Charts/TopGamesPlaytime.razor | 4 +- .../Dashboard/Charts/TopPlayersPlaytime.razor | 4 +- .../UI/Pages/FirstTimeSetup/Database.razor | 48 ++++++---- .../UI/Pages/FirstTimeSetup/Metadata.razor | 29 ++++-- .../UI/Pages/FirstTimeSetup/Paths.razor | 25 +++--- .../Pages/Games/Components/MediaEditor.razor | 11 +-- .../UI/Pages/Profile/ConnectedAccounts.razor | 9 +- .../UI/Pages/Servers/Edit/General.razor | 9 +- .../UI/Pages/Settings/Archives.razor | 20 +++-- .../Components/ClaimMappingsEditor.razor | 3 +- .../Components/ExternalProviderEditor.razor | 4 +- .../Pages/Settings/Authentication/Index.razor | 51 ++++++----- .../UI/Pages/Settings/Beacon.razor | 27 +++--- .../Components/ServerEngineEditor.razor | 13 +-- .../UI/Pages/Settings/General.razor | 44 +++++----- .../UI/Pages/Settings/IPXRelay.razor | 21 +++-- .../Pages/Settings/Integrations/Steam.razor | 30 ++++--- .../UI/Pages/Settings/Launcher.razor | 33 ++++--- .../UI/Pages/Settings/Library.razor | 19 ++-- .../Logs/Components/ProviderEditorPanel.razor | 2 + .../UI/Pages/Settings/Logs/Index.razor | 17 ++-- .../Components/MediaTypeSettingsEditor.razor | 1 + .../UI/Pages/Settings/Media/Index.razor | 20 +++-- .../UI/Pages/Settings/Roles/Index.razor | 18 ++-- .../UI/Pages/Settings/Scripts.razor | 18 ++-- .../UI/Pages/Settings/Servers.razor | 23 ++--- .../Pages/Settings/Tools/OrphanedFiles.razor | 4 +- .../UI/Pages/Settings/Updates.razor | 22 ++--- .../UI/Pages/Settings/UserSaves.razor | 19 ++-- .../UI/Pages/Settings/Users/Index.razor | 11 ++- LANCommander.Server/UI/Pages/_Layout.cshtml | 29 ++---- .../UI/Views/Shared/_LayoutBasic.cshtml | 20 +---- LANCommander.slnx | 1 + 188 files changed, 1271 insertions(+), 919 deletions(-) delete mode 100644 LANCommander.Server.Data/Enums/DatabaseProvider.cs delete mode 100644 LANCommander.Server.Data/Enums/ServerEngine.cs rename {LANCommander.Server => LANCommander.Server.Services}/Interceptors/BeaconMessageInterceptor.cs (54%) delete mode 100644 LANCommander.Server.Services/SettingService.cs rename {LANCommander.Server.Services/Models => LANCommander.Server.Settings.Legacy}/Settings.cs (99%) create mode 100644 LANCommander.Server.Settings/Enums/AuthenticationProviderType.cs create mode 100644 LANCommander.Server.Settings/Enums/DatabaseProvider.cs create mode 100644 LANCommander.Server.Settings/Enums/LauncherArchitecture.cs create mode 100644 LANCommander.Server.Settings/Enums/LauncherPlatform.cs create mode 100644 LANCommander.Server.Settings/Enums/LogInterval.cs create mode 100644 LANCommander.Server.Settings/Enums/LoggingProviderType.cs create mode 100644 LANCommander.Server.Settings/Enums/ReleaseChannel.cs create mode 100644 LANCommander.Server.Settings/Enums/ServerEngine.cs create mode 100644 LANCommander.Server.Settings/Enums/Theme.cs create mode 100644 LANCommander.Server.Settings/LANCommander.Server.Settings.csproj create mode 100644 LANCommander.Server.Settings/Models/ArchiveSettings.cs create mode 100644 LANCommander.Server.Settings/Models/AuthenticationProvider.cs create mode 100644 LANCommander.Server.Settings/Models/AuthenticationSettings.cs create mode 100644 LANCommander.Server.Settings/Models/BackupSettings.cs create mode 100644 LANCommander.Server.Settings/Models/BeaconSettings.cs create mode 100644 LANCommander.Server.Settings/Models/ClaimMapping.cs create mode 100644 LANCommander.Server.Settings/Models/CookiePolicy.cs create mode 100644 LANCommander.Server.Settings/Models/DatabaseSettings.cs create mode 100644 LANCommander.Server.Settings/Models/GameServerSettings.cs create mode 100644 LANCommander.Server.Settings/Models/HttpSettings.cs create mode 100644 LANCommander.Server.Settings/Models/IGDBSettings.cs create mode 100644 LANCommander.Server.Settings/Models/IPXRelaySettings.cs create mode 100644 LANCommander.Server.Settings/Models/LauncherSettings.cs create mode 100644 LANCommander.Server.Settings/Models/LibrarySettings.cs create mode 100644 LANCommander.Server.Settings/Models/LogSettings.cs create mode 100644 LANCommander.Server.Settings/Models/LoggingProvider.cs create mode 100644 LANCommander.Server.Settings/Models/MediaSettings.cs create mode 100644 LANCommander.Server.Settings/Models/MediaTypeSettings.cs create mode 100644 LANCommander.Server.Settings/Models/MediaTypeThumbnailSettings.cs create mode 100644 LANCommander.Server.Settings/Models/MetadataSettings.cs create mode 100644 LANCommander.Server.Settings/Models/RoleSettings.cs create mode 100644 LANCommander.Server.Settings/Models/ScriptSettings.cs create mode 100644 LANCommander.Server.Settings/Models/ServerEngineConfiguration.cs create mode 100644 LANCommander.Server.Settings/Models/ServerSettings.cs create mode 100644 LANCommander.Server.Settings/Models/SteamCmdProfile.cs create mode 100644 LANCommander.Server.Settings/Models/SteamCmdSettings.cs create mode 100644 LANCommander.Server.Settings/Models/ThumbnailSize.cs create mode 100644 LANCommander.Server.Settings/Models/UpdateSettings.cs create mode 100644 LANCommander.Server.Settings/Models/UserSaveSettings.cs create mode 100644 LANCommander.Server.Settings/Settings.cs delete mode 100644 LANCommander.Server/Logging/GameServerHubConnection.cs delete mode 100644 LANCommander.Server/Logging/LoggingHubConnection.cs diff --git a/LANCommander.SDK/Providers/SettingsProvider.cs b/LANCommander.SDK/Providers/SettingsProvider.cs index bbf07ef1..f57476d3 100644 --- a/LANCommander.SDK/Providers/SettingsProvider.cs +++ b/LANCommander.SDK/Providers/SettingsProvider.cs @@ -15,6 +15,8 @@ using Settings = LANCommander.SDK.Models.Settings; public class SettingsProvider : ISettingsProvider where TSettings : Settings, new() { + public const string FileName = "Settings.yaml"; + private readonly string _filePath; private readonly IOptionsMonitor _optionsMonitor; diff --git a/LANCommander.Server.Data.SQLite/Migrations/20231103052501_RemoveGameIconProperty.cs b/LANCommander.Server.Data.SQLite/Migrations/20231103052501_RemoveGameIconProperty.cs index ccf6dc12..8cea6ed8 100644 --- a/LANCommander.Server.Data.SQLite/Migrations/20231103052501_RemoveGameIconProperty.cs +++ b/LANCommander.Server.Data.SQLite/Migrations/20231103052501_RemoveGameIconProperty.cs @@ -12,8 +12,6 @@ namespace LANCommander.Migrations /// protected override void Up(MigrationBuilder migrationBuilder) { - var settings = SettingService.GetSettings(); - // Migrate any old icons from the filesystem if (Directory.Exists("Icon")) foreach (var file in Directory.EnumerateFiles("Icon")) diff --git a/LANCommander.Server.Data.SQLite/Migrations/20240220154307_CalculateMediaChecksum.cs b/LANCommander.Server.Data.SQLite/Migrations/20240220154307_CalculateMediaChecksum.cs index d6c2a409..7202588c 100644 --- a/LANCommander.Server.Data.SQLite/Migrations/20240220154307_CalculateMediaChecksum.cs +++ b/LANCommander.Server.Data.SQLite/Migrations/20240220154307_CalculateMediaChecksum.cs @@ -12,8 +12,6 @@ namespace LANCommander.Migrations /// protected override void Up(MigrationBuilder migrationBuilder) { - var settings = SettingService.GetSettings(); - if (Directory.Exists("Media")) { var files = Directory.EnumerateFiles("Media"); diff --git a/LANCommander.Server.Data.SQLite/Migrations/20241011014752_AddStorageLocations.cs b/LANCommander.Server.Data.SQLite/Migrations/20241011014752_AddStorageLocations.cs index 56e01d0a..bce688ab 100644 --- a/LANCommander.Server.Data.SQLite/Migrations/20241011014752_AddStorageLocations.cs +++ b/LANCommander.Server.Data.SQLite/Migrations/20241011014752_AddStorageLocations.cs @@ -13,8 +13,6 @@ namespace LANCommander.Migrations /// protected override void Up(MigrationBuilder migrationBuilder) { - var settings = SettingService.GetSettings(); - migrationBuilder.AddColumn( name: "StorageLocationId", table: "Media", diff --git a/LANCommander.Server.Data/DatabaseContext.cs b/LANCommander.Server.Data/DatabaseContext.cs index 75264aea..2c21c84c 100644 --- a/LANCommander.Server.Data/DatabaseContext.cs +++ b/LANCommander.Server.Data/DatabaseContext.cs @@ -1,7 +1,7 @@ using LANCommander.Server.Data.Enums; using LANCommander.Server.Data.Interceptors; using LANCommander.Server.Data.Models; -using Microsoft.AspNetCore.Identity; +using LANCommander.Server.Settings.Enums; using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; diff --git a/LANCommander.Server.Data/Enums/DatabaseProvider.cs b/LANCommander.Server.Data/Enums/DatabaseProvider.cs deleted file mode 100644 index 2dfb4a99..00000000 --- a/LANCommander.Server.Data/Enums/DatabaseProvider.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace LANCommander.Server.Data.Enums -{ - public enum DatabaseProvider - { - Unknown, - SQLite, - MySQL, - PostgreSQL - } -} diff --git a/LANCommander.Server.Data/Enums/ServerEngine.cs b/LANCommander.Server.Data/Enums/ServerEngine.cs deleted file mode 100644 index e0ad64c4..00000000 --- a/LANCommander.Server.Data/Enums/ServerEngine.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace LANCommander.Server.Data.Enums; - -public enum ServerEngine -{ - Local, - Docker -} \ No newline at end of file diff --git a/LANCommander.Server.Data/LANCommander.Server.Data.csproj b/LANCommander.Server.Data/LANCommander.Server.Data.csproj index c0a5ad69..268cb67f 100644 --- a/LANCommander.Server.Data/LANCommander.Server.Data.csproj +++ b/LANCommander.Server.Data/LANCommander.Server.Data.csproj @@ -18,6 +18,7 @@ + diff --git a/LANCommander.Server.Data/Models/Server.cs b/LANCommander.Server.Data/Models/Server.cs index d1eff347..b0666212 100644 --- a/LANCommander.Server.Data/Models/Server.cs +++ b/LANCommander.Server.Data/Models/Server.cs @@ -2,7 +2,7 @@ using LANCommander.SDK.Enums; using System.ComponentModel.DataAnnotations.Schema; using System.Text.Json.Serialization; -using LANCommander.Server.Data.Enums; +using LANCommander.Server.Settings.Enums; namespace LANCommander.Server.Data.Models { diff --git a/LANCommander.Server.Services/Abstractions/IGitHubService.cs b/LANCommander.Server.Services/Abstractions/IGitHubService.cs index f88c5da1..eb076271 100644 --- a/LANCommander.Server.Services/Abstractions/IGitHubService.cs +++ b/LANCommander.Server.Services/Abstractions/IGitHubService.cs @@ -1,4 +1,5 @@ using LANCommander.Server.Services.Models; +using LANCommander.Server.Settings.Enums; using Octokit; using Semver; diff --git a/LANCommander.Server.Services/Abstractions/IVersionProvider.cs b/LANCommander.Server.Services/Abstractions/IVersionProvider.cs index c48a8971..a8e1938b 100644 --- a/LANCommander.Server.Services/Abstractions/IVersionProvider.cs +++ b/LANCommander.Server.Services/Abstractions/IVersionProvider.cs @@ -1,4 +1,5 @@ using LANCommander.Server.Services.Models; +using LANCommander.Server.Settings.Enums; using Semver; namespace LANCommander.Server.Services.Abstractions; diff --git a/LANCommander.Server.Services/ActionService.cs b/LANCommander.Server.Services/ActionService.cs index 8b0dccd5..755ef339 100644 --- a/LANCommander.Server.Services/ActionService.cs +++ b/LANCommander.Server.Services/ActionService.cs @@ -11,10 +11,11 @@ namespace LANCommander.Server.Services { public sealed class ActionService( ILogger logger, + SettingsProvider settingsProvider, IFusionCache cache, IMapper mapper, IHttpContextAccessor httpContextAccessor, - IDbContextFactory contextFactory) : BaseDatabaseService(logger, cache, mapper, httpContextAccessor, contextFactory) + IDbContextFactory contextFactory) : BaseDatabaseService(logger, settingsProvider, cache, mapper, httpContextAccessor, contextFactory) { public override async Task AddAsync(Action entity) { diff --git a/LANCommander.Server.Services/ArchiveClient.cs b/LANCommander.Server.Services/ArchiveClient.cs index 29f77ee0..d300e321 100644 --- a/LANCommander.Server.Services/ArchiveClient.cs +++ b/LANCommander.Server.Services/ArchiveClient.cs @@ -21,11 +21,12 @@ namespace LANCommander.Server.Services { public sealed class ArchiveClient( ILogger logger, + SettingsProvider settingsProvider, IFusionCache cache, IMapper mapper, IHttpContextAccessor httpContextAccessor, IDbContextFactory dbContextFactory, - StorageLocationService storageLocationService) : BaseDatabaseService(logger, cache, mapper, httpContextAccessor, dbContextFactory), IArchiveClient + StorageLocationService storageLocationService) : BaseDatabaseService(logger, settingsProvider, cache, mapper, httpContextAccessor, dbContextFactory), IArchiveClient { public async Task GetLatestArchive(Expression> predicate) { diff --git a/LANCommander.Server.Services/AuthenticationService.cs b/LANCommander.Server.Services/AuthenticationService.cs index f95ad63a..3b5bb6a2 100644 --- a/LANCommander.Server.Services/AuthenticationService.cs +++ b/LANCommander.Server.Services/AuthenticationService.cs @@ -17,11 +17,12 @@ namespace LANCommander.Server.Services public class AuthenticationService( ILogger logger, IMapper mapper, + SettingsProvider settingsProvider, UserService userService, RoleService roleService, ScriptService scriptService, ITokenProvider tokenProvider, - SDK.Services.ScriptClient scriptClient) : BaseService(logger) + SDK.Services.ScriptClient scriptClient) : BaseService(logger, settingsProvider) { public async Task LoginAsync(string userName, string password) { @@ -62,7 +63,7 @@ namespace LANCommander.Server.Services _logger?.LogDebug("Password check for user {UserName} was successful", user.UserName); - if (_settings.Authentication.RequireApproval && !user.Approved && !await userService.IsInRoleAsync(user, RoleService.AdministratorRoleName)) + if (_settingsProvider.CurrentValue.Server.Authentication.RequireApproval && !user.Approved && !await userService.IsInRoleAsync(user, RoleService.AdministratorRoleName)) throw new UserAuthenticationException("Account must be approved by an administrator"); var userRoles = await userService.GetRolesAsync(user); @@ -85,7 +86,7 @@ namespace LANCommander.Server.Services var refreshToken = GenerateRefreshToken(); user.RefreshToken = refreshToken; - user.RefreshTokenExpiration = DateTime.UtcNow.AddDays(_settings.Authentication.TokenLifetime); + user.RefreshTokenExpiration = DateTime.UtcNow.AddDays(_settingsProvider.CurrentValue.Server.Authentication.TokenLifetime); await userService.UpdateAsync(user); @@ -171,9 +172,9 @@ namespace LANCommander.Server.Services try { - if (_settings.Roles.DefaultRoleId == Guid.Empty) + if (_settingsProvider.CurrentValue.Server.Roles.DefaultRoleId == Guid.Empty) { - var defaultRole = await roleService.GetAsync(_settings.Roles.DefaultRoleId); + var defaultRole = await roleService.GetAsync(_settingsProvider.CurrentValue.Server.Roles.DefaultRoleId); if (defaultRole != null) await userService.AddToRoleAsync(user.UserName, defaultRole.Name); @@ -221,7 +222,7 @@ namespace LANCommander.Server.Services ValidateAudience = false, ValidateIssuer = false, ValidateIssuerSigningKey = true, - IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_settings.Authentication.TokenSecret)), + IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_settingsProvider.CurrentValue.Server.Authentication.TokenSecret)), ValidateLifetime = false }; @@ -247,10 +248,10 @@ namespace LANCommander.Server.Services private JwtSecurityToken GetToken(List authClaims) { - var authSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_settings.Authentication.TokenSecret)); + var authSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_settingsProvider.CurrentValue.Server.Authentication.TokenSecret)); var token = new JwtSecurityToken( - expires: DateTime.UtcNow.AddDays(_settings.Authentication.TokenLifetime), + expires: DateTime.UtcNow.AddDays(_settingsProvider.CurrentValue.Server.Authentication.TokenLifetime), claims: authClaims, signingCredentials: new SigningCredentials(authSigningKey, SecurityAlgorithms.HmacSha256) ); @@ -258,11 +259,11 @@ namespace LANCommander.Server.Services return token; } - public static async Task> GetAuthenticationProviderTemplatesAsync() + public static async Task> GetAuthenticationProviderTemplatesAsync() { var files = Directory.GetFiles(@"Templates/AuthenticationProviders", "*.yml", SearchOption.AllDirectories); - var externalProviders = new List(); + var externalProviders = new List(); var deserializer = new DeserializerBuilder() @@ -275,7 +276,7 @@ namespace LANCommander.Server.Services { var contents = await File.ReadAllTextAsync(file); - externalProviders.Add(deserializer.Deserialize(contents)); + externalProviders.Add(deserializer.Deserialize(contents)); } catch { } } diff --git a/LANCommander.Server.Services/CategoryService.cs b/LANCommander.Server.Services/CategoryService.cs index 740203e1..e54d4581 100644 --- a/LANCommander.Server.Services/CategoryService.cs +++ b/LANCommander.Server.Services/CategoryService.cs @@ -10,10 +10,11 @@ namespace LANCommander.Server.Services { public sealed class CategoryService( ILogger logger, + SettingsProvider settingsProvider, IFusionCache cache, IMapper mapper, IHttpContextAccessor httpContextAccessor, - IDbContextFactory context) : BaseDatabaseService(logger, cache, mapper, httpContextAccessor, context) + IDbContextFactory context) : BaseDatabaseService(logger, settingsProvider, cache, mapper, httpContextAccessor, context) { public override async Task AddAsync(Category entity) { diff --git a/LANCommander.Server.Services/ChatMessageService.cs b/LANCommander.Server.Services/ChatMessageService.cs index ab1a26b8..2f155db5 100644 --- a/LANCommander.Server.Services/ChatMessageService.cs +++ b/LANCommander.Server.Services/ChatMessageService.cs @@ -10,10 +10,11 @@ namespace LANCommander.Server.Services { public sealed class ChatMessageService( ILogger logger, + SettingsProvider settingsProvider, IFusionCache cache, IMapper mapper, IHttpContextAccessor httpContextAccessor, - IDbContextFactory context) : BaseDatabaseService(logger, cache, mapper, httpContextAccessor, context) + IDbContextFactory context) : BaseDatabaseService(logger, settingsProvider, cache, mapper, httpContextAccessor, context) { public override async Task AddAsync(ChatMessage entity) { diff --git a/LANCommander.Server.Services/ChatService.cs b/LANCommander.Server.Services/ChatService.cs index 304a802f..1ce4cb51 100644 --- a/LANCommander.Server.Services/ChatService.cs +++ b/LANCommander.Server.Services/ChatService.cs @@ -8,11 +8,12 @@ namespace LANCommander.Server.Services { public sealed class ChatService( ILogger logger, + SettingsProvider settingsProvider, IFusionCache cache, ChatMessageService chatMessageService, ChatThreadService chatThreadService, ChatThreadReadStatusService chatThreadReadStatusService, - UserService userService) : BaseService(logger) + UserService userService) : BaseService(logger, settingsProvider) { private readonly ConcurrentDictionary _locks = new(); private readonly int _maxCachedMessages = 200; diff --git a/LANCommander.Server.Services/ChatThreadReadStatusService.cs b/LANCommander.Server.Services/ChatThreadReadStatusService.cs index 533f4828..67082457 100644 --- a/LANCommander.Server.Services/ChatThreadReadStatusService.cs +++ b/LANCommander.Server.Services/ChatThreadReadStatusService.cs @@ -1,11 +1,6 @@ -using AutoMapper; -using LANCommander.Server.Data; +using LANCommander.Server.Data; using LANCommander.Server.Data.Models; -using Microsoft.AspNetCore.Http; using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.ChangeTracking; -using Microsoft.Extensions.Logging; -using ZiggyCreatures.Caching.Fusion; namespace LANCommander.Server.Services { diff --git a/LANCommander.Server.Services/ChatThreadService.cs b/LANCommander.Server.Services/ChatThreadService.cs index 61402137..dcda4a4a 100644 --- a/LANCommander.Server.Services/ChatThreadService.cs +++ b/LANCommander.Server.Services/ChatThreadService.cs @@ -10,10 +10,11 @@ namespace LANCommander.Server.Services { public sealed class ChatThreadService( ILogger logger, + SettingsProvider settingsProvider, IFusionCache cache, IMapper mapper, IHttpContextAccessor httpContextAccessor, - IDbContextFactory context) : BaseDatabaseService(logger, cache, mapper, httpContextAccessor, context) + IDbContextFactory context) : BaseDatabaseService(logger, settingsProvider, cache, mapper, httpContextAccessor, context) { public override async Task AddAsync(ChatThread entity) { diff --git a/LANCommander.Server.Services/CollectionService.cs b/LANCommander.Server.Services/CollectionService.cs index b97023de..93d93d81 100644 --- a/LANCommander.Server.Services/CollectionService.cs +++ b/LANCommander.Server.Services/CollectionService.cs @@ -10,10 +10,11 @@ namespace LANCommander.Server.Services { public sealed class CollectionService( ILogger logger, + SettingsProvider settingsProvider, IFusionCache cache, IMapper mapper, IHttpContextAccessor httpContextAccessor, - IDbContextFactory contextFactory) : BaseDatabaseService(logger, cache, mapper, httpContextAccessor, contextFactory) + IDbContextFactory contextFactory) : BaseDatabaseService(logger, settingsProvider, cache, mapper, httpContextAccessor, contextFactory) { public override async Task AddAsync(Collection entity) { diff --git a/LANCommander.Server.Services/CompanyService.cs b/LANCommander.Server.Services/CompanyService.cs index afbc3257..cf2b54ea 100644 --- a/LANCommander.Server.Services/CompanyService.cs +++ b/LANCommander.Server.Services/CompanyService.cs @@ -10,10 +10,11 @@ namespace LANCommander.Server.Services { public sealed class CompanyService( ILogger logger, + SettingsProvider settingsProvider, IFusionCache cache, IMapper mapper, IHttpContextAccessor httpContextAccessor, - IDbContextFactory contextFactory) : BaseDatabaseService(logger, cache, mapper, httpContextAccessor, contextFactory) + IDbContextFactory contextFactory) : BaseDatabaseService(logger, settingsProvider, cache, mapper, httpContextAccessor, contextFactory) { public override async Task AddAsync(Company entity) { diff --git a/LANCommander.Server.Services/EngineService.cs b/LANCommander.Server.Services/EngineService.cs index 6ebb1163..8bee6063 100644 --- a/LANCommander.Server.Services/EngineService.cs +++ b/LANCommander.Server.Services/EngineService.cs @@ -10,10 +10,11 @@ namespace LANCommander.Server.Services { public sealed class EngineService( ILogger logger, + SettingsProvider settingsProvider, IFusionCache cache, IMapper mapper, IHttpContextAccessor httpContextAccessor, - IDbContextFactory contextFactory) : BaseDatabaseService(logger, cache, mapper, httpContextAccessor, contextFactory) + IDbContextFactory contextFactory) : BaseDatabaseService(logger, settingsProvider, cache, mapper, httpContextAccessor, contextFactory) { public override async Task AddAsync(Engine entity) { diff --git a/LANCommander.Server.Services/Extensions/IServiceCollectionExtensions.cs b/LANCommander.Server.Services/Extensions/IServiceCollectionExtensions.cs index 9e1a0b72..6f0f4bbc 100644 --- a/LANCommander.Server.Services/Extensions/IServiceCollectionExtensions.cs +++ b/LANCommander.Server.Services/Extensions/IServiceCollectionExtensions.cs @@ -1,21 +1,21 @@ using LANCommander.SDK; +using LANCommander.SDK.Interceptors; using LANCommander.SDK.Models; using LANCommander.Server.Services.Abstractions; using LANCommander.Server.Services.Factories; +using LANCommander.Server.Services.Interceptors; using LANCommander.Server.Services.MediaGrabbers; using LANCommander.Server.Services.ServerEngines; using Microsoft.Extensions.DependencyInjection; -using Settings = LANCommander.Server.Services.Models.Settings; namespace LANCommander.Server.Services.Extensions; public static class IServiceCollectionExtensions { - public static IServiceCollection AddLANCommanderServer(this IServiceCollection services, Settings settings) + public static IServiceCollection AddLANCommanderServer(this IServiceCollection services) { services.AddScoped(); services.AddScoped(); - services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); @@ -63,6 +63,7 @@ public static class IServiceCollectionExtensions services.AddSingleton(provider => provider.GetService()); services.AddSingleton(); + services.AddSingleton(); services.AddAutoMapper(cfg => { }, typeof(MappingProfile)); services.AddFusionCache(); diff --git a/LANCommander.Server.Services/GameCustomFieldService.cs b/LANCommander.Server.Services/GameCustomFieldService.cs index 7052bfce..6d38b357 100644 --- a/LANCommander.Server.Services/GameCustomFieldService.cs +++ b/LANCommander.Server.Services/GameCustomFieldService.cs @@ -2,8 +2,6 @@ using LANCommander.Server.Data; using LANCommander.Server.Data.Models; using LANCommander.Server.Services.Extensions; -using LANCommander.SDK; -using LANCommander.SDK.Enums; using System.Linq.Expressions; using ZiggyCreatures.Caching.Fusion; using LANCommander.Server.Services.Models; @@ -15,10 +13,11 @@ namespace LANCommander.Server.Services { public class GameCustomFieldService( ILogger logger, + SettingsProvider settingsProvider, IFusionCache cache, IMapper mapper, IHttpContextAccessor httpContextAccessor, - IDbContextFactory contextFactory) : BaseDatabaseService(logger, cache, mapper, httpContextAccessor, contextFactory) + IDbContextFactory contextFactory) : BaseDatabaseService(logger, settingsProvider, cache, mapper, httpContextAccessor, contextFactory) { public override async Task AddAsync(GameCustomField entity) { diff --git a/LANCommander.Server.Services/GameSaveService.cs b/LANCommander.Server.Services/GameSaveService.cs index 05c051a9..684ddc7a 100644 --- a/LANCommander.Server.Services/GameSaveService.cs +++ b/LANCommander.Server.Services/GameSaveService.cs @@ -3,7 +3,6 @@ using LANCommander.Server.Data; using LANCommander.Server.Data.Models; using LANCommander.Helpers; using LANCommander.SDK.Enums; -using LANCommander.Server.Models; using Microsoft.AspNetCore.Http; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; @@ -13,11 +12,12 @@ namespace LANCommander.Server.Services { public sealed class GameSaveService( ILogger logger, + SettingsProvider settingsProvider, IFusionCache cache, IMapper mapper, IHttpContextAccessor httpContextAccessor, IDbContextFactory contextFactory, - StorageLocationService storageLocationService) : BaseDatabaseService(logger, cache, mapper, httpContextAccessor, contextFactory) + StorageLocationService storageLocationService) : BaseDatabaseService(logger, settingsProvider, cache, mapper, httpContextAccessor, contextFactory) { public override async Task AddAsync(GameSave entity) { diff --git a/LANCommander.Server.Services/GameService.cs b/LANCommander.Server.Services/GameService.cs index ee95a578..f304e3f3 100644 --- a/LANCommander.Server.Services/GameService.cs +++ b/LANCommander.Server.Services/GameService.cs @@ -6,7 +6,6 @@ using LANCommander.Server.Services.Extensions; using LANCommander.SDK; using LANCommander.SDK.Enums; using System.Linq.Expressions; -using LANCommander.SDK.Services; using ZiggyCreatures.Caching.Fusion; using LANCommander.Server.Services.Models; using Microsoft.Extensions.Logging; @@ -17,13 +16,14 @@ namespace LANCommander.Server.Services { public class GameService( ILogger logger, + SettingsProvider settingsProvider, IFusionCache cache, IMapper mapper, IHttpContextAccessor httpContextAccessor, IDbContextFactory contextFactory, ArchiveClient archiveClient, MediaService mediaService, - SDK.Services.ScriptClient scriptClient) : BaseDatabaseService(logger, cache, mapper, httpContextAccessor, contextFactory) + SDK.Services.ScriptClient scriptClient) : BaseDatabaseService(logger, settingsProvider, cache, mapper, httpContextAccessor, contextFactory) { public override async Task AddAsync(Game entity) { diff --git a/LANCommander.Server.Services/GenreService.cs b/LANCommander.Server.Services/GenreService.cs index 9dc00716..7753ddc9 100644 --- a/LANCommander.Server.Services/GenreService.cs +++ b/LANCommander.Server.Services/GenreService.cs @@ -10,10 +10,11 @@ namespace LANCommander.Server.Services { public sealed class GenreService( ILogger logger, + SettingsProvider settingsProvider, IFusionCache cache, IMapper mapper, IHttpContextAccessor httpContextAccessor, - IDbContextFactory contextFactory) : BaseDatabaseService(logger, cache, mapper, httpContextAccessor, contextFactory) + IDbContextFactory contextFactory) : BaseDatabaseService(logger, settingsProvider, cache, mapper, httpContextAccessor, contextFactory) { public override async Task AddAsync(Genre entity) { diff --git a/LANCommander.Server.Services/GitHubService.cs b/LANCommander.Server.Services/GitHubService.cs index cd0ac0e5..43d26a37 100644 --- a/LANCommander.Server.Services/GitHubService.cs +++ b/LANCommander.Server.Services/GitHubService.cs @@ -1,5 +1,6 @@ using LANCommander.Server.Services.Abstractions; using LANCommander.Server.Services.Models; +using LANCommander.Server.Settings.Enums; using Microsoft.Extensions.Logging; using Octokit; using Semver; diff --git a/LANCommander.Server.Services/IGDBService.cs b/LANCommander.Server.Services/IGDBService.cs index 3a81dd2d..ea90acb1 100644 --- a/LANCommander.Server.Services/IGDBService.cs +++ b/LANCommander.Server.Services/IGDBService.cs @@ -11,11 +11,12 @@ namespace LANCommander.Server.Services { public class IGDBService( ILogger logger, + SettingsProvider settingsProvider, GameService gameService, EngineService engineService, CompanyService companyService, GenreService genreService, - TagService tagService) : BaseService(logger), IDisposable + TagService tagService) : BaseService(logger, settingsProvider), IDisposable { private const string DefaultFields = "*"; private IGDBClient Client; @@ -32,8 +33,8 @@ namespace LANCommander.Server.Services public void Authenticate() { - ClientId = _settings.IGDBClientId; - ClientSecret = _settings.IGDBClientSecret; + ClientId = _settingsProvider.CurrentValue.Server.IGDB.ClientId; + ClientSecret = _settingsProvider.CurrentValue.Server.IGDB.ClientSecret; try { diff --git a/LANCommander.Server.Services/IPXRelayService.cs b/LANCommander.Server.Services/IPXRelayService.cs index 7c2be849..a0df7d67 100644 --- a/LANCommander.Server.Services/IPXRelayService.cs +++ b/LANCommander.Server.Services/IPXRelayService.cs @@ -9,23 +9,21 @@ namespace LANCommander.Server.Services private Task? _relayTask; private IPXRelay? _relay; - public IPXRelayService(ILogger logger) : base(logger) + public IPXRelayService(ILogger logger, SettingsProvider settingsProvider) : base(logger, settingsProvider) { Init(logger); } public void Init(ILogger logger) { - var settings = SettingService.GetSettings(); - StopAsync().Wait(); - _relay = new IPXRelay(settings.IPXRelay.Port, logger); + _relay = new IPXRelay(_settingsProvider.CurrentValue.Server.IPXRelay.Port, logger); - if (!settings.IPXRelay.Logging) + if (!_settingsProvider.CurrentValue.Server.IPXRelay.Logging) _relay.DisableLogging(); - if (settings.IPXRelay.Enabled) + if (_settingsProvider.CurrentValue.Server.IPXRelay.Enabled) { _relayCts = new CancellationTokenSource(); _relayTask = Task.Run(async () => diff --git a/LANCommander.Server/Interceptors/BeaconMessageInterceptor.cs b/LANCommander.Server.Services/Interceptors/BeaconMessageInterceptor.cs similarity index 54% rename from LANCommander.Server/Interceptors/BeaconMessageInterceptor.cs rename to LANCommander.Server.Services/Interceptors/BeaconMessageInterceptor.cs index 37187354..b3ccecd1 100644 --- a/LANCommander.Server/Interceptors/BeaconMessageInterceptor.cs +++ b/LANCommander.Server.Services/Interceptors/BeaconMessageInterceptor.cs @@ -1,22 +1,19 @@ using System.Net; using LANCommander.SDK.Interceptors; using LANCommander.SDK.Models; -using LANCommander.Server.Services; -namespace LANCommander.Server.Interceptors; +namespace LANCommander.Server.Services.Interceptors; -public class BeaconMessageInterceptor : IBeaconMessageInterceptor +public class BeaconMessageInterceptor(SettingsProvider settingsProvider) : IBeaconMessageInterceptor { public async Task ExecuteAsync(BeaconMessage message, IPEndPoint interfaceEndPoint) { if (String.IsNullOrWhiteSpace(message.Address)) { - var settings = SettingService.GetSettings(); - - if (settings.UseSSL) - message.Address = $"https://{interfaceEndPoint.Address.ToString()}:{settings.SSLPort}"; + if (settingsProvider.CurrentValue.Server.Http.UseSSL) + message.Address = $"https://{interfaceEndPoint.Address.ToString()}:{settingsProvider.CurrentValue.Server.Http.SSLPort}"; else - message.Address = $"http://{interfaceEndPoint.Address.ToString()}:{settings.Port}"; + message.Address = $"http://{interfaceEndPoint.Address.ToString()}:{settingsProvider.CurrentValue.Server.Http.Port}"; } return message; diff --git a/LANCommander.Server.Services/IssueService.cs b/LANCommander.Server.Services/IssueService.cs index 53d1e865..a032119e 100644 --- a/LANCommander.Server.Services/IssueService.cs +++ b/LANCommander.Server.Services/IssueService.cs @@ -1,4 +1,5 @@ -using LANCommander.Server.Data; +using System.Configuration; +using LANCommander.Server.Data; using LANCommander.Server.Data.Models; using AutoMapper; using Microsoft.AspNetCore.Http; @@ -10,10 +11,11 @@ namespace LANCommander.Server.Services { public sealed class IssueService( ILogger logger, + SettingsProvider settingsProvider, IFusionCache cache, IMapper mapper, IHttpContextAccessor httpContextAccessor, - IDbContextFactory contextFactory) : BaseDatabaseService(logger, cache, mapper, httpContextAccessor, contextFactory) + IDbContextFactory contextFactory) : BaseDatabaseService(logger, settingsProvider, cache, mapper, httpContextAccessor, contextFactory) { public override async Task AddAsync(Issue entity) { diff --git a/LANCommander.Server.Services/KeyService.cs b/LANCommander.Server.Services/KeyService.cs index df36018c..4df16807 100644 --- a/LANCommander.Server.Services/KeyService.cs +++ b/LANCommander.Server.Services/KeyService.cs @@ -11,10 +11,11 @@ namespace LANCommander.Server.Services { public sealed class KeyService( ILogger logger, + SettingsProvider settingsProvider, IFusionCache cache, IMapper mapper, IHttpContextAccessor httpContextAccessor, - IDbContextFactory contextFactory) : BaseDatabaseService(logger, cache, mapper, httpContextAccessor, contextFactory) + IDbContextFactory contextFactory) : BaseDatabaseService(logger, settingsProvider, cache, mapper, httpContextAccessor, contextFactory) { public override async Task AddAsync(Key entity) { diff --git a/LANCommander.Server.Services/LANCommander.Server.Services.csproj b/LANCommander.Server.Services/LANCommander.Server.Services.csproj index 7781d811..4cd6a32e 100644 --- a/LANCommander.Server.Services/LANCommander.Server.Services.csproj +++ b/LANCommander.Server.Services/LANCommander.Server.Services.csproj @@ -29,6 +29,7 @@ + diff --git a/LANCommander.Server.Services/LibraryService.cs b/LANCommander.Server.Services/LibraryService.cs index f436a70e..e2248732 100644 --- a/LANCommander.Server.Services/LibraryService.cs +++ b/LANCommander.Server.Services/LibraryService.cs @@ -1,4 +1,5 @@ -using LANCommander.Server.Data; +using System.Configuration; +using LANCommander.Server.Data; using LANCommander.Server.Data.Models; using Microsoft.Extensions.Logging; using AutoMapper; @@ -11,12 +12,13 @@ namespace LANCommander.Server.Services { public sealed class LibraryService( ILogger logger, + SettingsProvider settingsProvider, IFusionCache cache, IMapper mapper, IHttpContextAccessor httpContextAccessor, IDbContextFactory contextFactory, GameService gameService, - UserService userService) : BaseDatabaseService(logger, cache, mapper, httpContextAccessor, contextFactory) + UserService userService) : BaseDatabaseService(logger, settingsProvider, cache, mapper, httpContextAccessor, contextFactory) { public override async Task AddAsync(Library entity) { diff --git a/LANCommander.Server.Services/Mappers/MappingProfile.cs b/LANCommander.Server.Services/Mappers/MappingProfile.cs index 72306f71..17c92d60 100644 --- a/LANCommander.Server.Services/Mappers/MappingProfile.cs +++ b/LANCommander.Server.Services/Mappers/MappingProfile.cs @@ -53,7 +53,7 @@ namespace LANCommander.Server dest.Cover, opt => opt.MapFrom(src => src.Media.Where(m => m.Type == SDK.Enums.MediaType.Cover).FirstOrDefault())); - CreateMap(); + CreateMap(); CreateMap() .ForMember(dest => dest.Name, diff --git a/LANCommander.Server.Services/MediaGrabbers/SteamGridDBMediaGrabber.cs b/LANCommander.Server.Services/MediaGrabbers/SteamGridDBMediaGrabber.cs index 82788610..9d2fc82c 100644 --- a/LANCommander.Server.Services/MediaGrabbers/SteamGridDBMediaGrabber.cs +++ b/LANCommander.Server.Services/MediaGrabbers/SteamGridDBMediaGrabber.cs @@ -20,11 +20,9 @@ namespace LANCommander.Server.Services.MediaGrabbers SteamGridDbFormats.Webp }; - public SteamGridDBMediaGrabber() + public SteamGridDBMediaGrabber(SettingsProvider settingsProvider) { - var settings = SettingService.GetSettings(); - - SteamGridDb = new SteamGridDb(settings.Media.SteamGridDbApiKey); + SteamGridDb = new SteamGridDb(settingsProvider.CurrentValue.Server.Media.SteamGridDbApiKey); SteamClient = new SteamClient(); } diff --git a/LANCommander.Server.Services/MediaService.cs b/LANCommander.Server.Services/MediaService.cs index bcace099..2c4f0362 100644 --- a/LANCommander.Server.Services/MediaService.cs +++ b/LANCommander.Server.Services/MediaService.cs @@ -1,4 +1,5 @@ -using LANCommander.Server.Data; +using System.Configuration; +using LANCommander.Server.Data; using LANCommander.Server.Data.Models; using LANCommander.Helpers; using Syncfusion.PdfToImageConverter; @@ -20,11 +21,12 @@ namespace LANCommander.Server.Services { public sealed class MediaService( ILogger logger, + SettingsProvider settingsProvider, IFusionCache cache, IMapper mapper, IHttpContextAccessor httpContextAccessor, IDbContextFactory contextFactory, - StorageLocationService storageLocationService) : BaseDatabaseService(logger, cache, mapper, httpContextAccessor, contextFactory) + StorageLocationService storageLocationService) : BaseDatabaseService(logger, settingsProvider, cache, mapper, httpContextAccessor, contextFactory) { public override async Task AddAsync(Media entity) { @@ -118,7 +120,7 @@ namespace LANCommander.Server.Services public string GetThumbnailPath(Media media) { - var config = _settings.Media.GetMediaTypeConfig(media.Type); + var config = _settingsProvider.CurrentValue.Server.Media.GetMediaTypeConfig(media.Type); if (config != null && config.Thumbnails.Enabled) return $"{GetMediaPath(media)}.Thumb"; @@ -175,7 +177,7 @@ namespace LANCommander.Server.Services if (!File.Exists(source)) return String.Empty; - var config = _settings.Media.GetMediaTypeConfig(media.Type); + var config = _settingsProvider.CurrentValue.Server.Media.GetMediaTypeConfig(media.Type); Stream stream = null; diff --git a/LANCommander.Server.Services/MultiplayerModeService.cs b/LANCommander.Server.Services/MultiplayerModeService.cs index 40605461..c8552b6c 100644 --- a/LANCommander.Server.Services/MultiplayerModeService.cs +++ b/LANCommander.Server.Services/MultiplayerModeService.cs @@ -10,10 +10,11 @@ namespace LANCommander.Server.Services { public sealed class MultiplayerModeService( ILogger logger, + SettingsProvider settingsProvider, IFusionCache cache, IMapper mapper, IHttpContextAccessor httpContextAccessor, - IDbContextFactory contextFactory) : BaseDatabaseService(logger, cache, mapper, httpContextAccessor, contextFactory) + IDbContextFactory contextFactory) : BaseDatabaseService(logger, settingsProvider, cache, mapper, httpContextAccessor, contextFactory) { public override async Task AddAsync(MultiplayerMode entity) { diff --git a/LANCommander.Server.Services/PageService.cs b/LANCommander.Server.Services/PageService.cs index a2745c93..206bd417 100644 --- a/LANCommander.Server.Services/PageService.cs +++ b/LANCommander.Server.Services/PageService.cs @@ -15,10 +15,11 @@ namespace LANCommander.Server.Services { public sealed class PageService( ILogger logger, + SettingsProvider settingsProvider, IFusionCache cache, IMapper mapper, IHttpContextAccessor httpContextAccessor, - IDbContextFactory contextFactory) : BaseDatabaseService(logger, cache, mapper, httpContextAccessor, contextFactory) + IDbContextFactory contextFactory) : BaseDatabaseService(logger, settingsProvider, cache, mapper, httpContextAccessor, contextFactory) { public override async Task AddAsync(Page entity) { diff --git a/LANCommander.Server.Services/PlatformService.cs b/LANCommander.Server.Services/PlatformService.cs index da7c4d45..6e7e90c3 100644 --- a/LANCommander.Server.Services/PlatformService.cs +++ b/LANCommander.Server.Services/PlatformService.cs @@ -10,10 +10,11 @@ namespace LANCommander.Server.Services { public sealed class PlatformService( ILogger logger, + SettingsProvider settingsProvider, IFusionCache cache, IMapper mapper, IHttpContextAccessor httpContextAccessor, - IDbContextFactory contextFactory) : BaseDatabaseService(logger, cache, mapper, httpContextAccessor, contextFactory) + IDbContextFactory contextFactory) : BaseDatabaseService(logger, settingsProvider, cache, mapper, httpContextAccessor, contextFactory) { public override async Task AddAsync(Platform entity) { diff --git a/LANCommander.Server.Services/PlaySessionService.cs b/LANCommander.Server.Services/PlaySessionService.cs index 4229eceb..4cabeee6 100644 --- a/LANCommander.Server.Services/PlaySessionService.cs +++ b/LANCommander.Server.Services/PlaySessionService.cs @@ -11,11 +11,12 @@ namespace LANCommander.Server.Services { public sealed class PlaySessionService( ILogger logger, + SettingsProvider settingsProvider, IFusionCache cache, IMapper mapper, IHttpContextAccessor httpContextAccessor, IDbContextFactory contextFactory, - ServerService serverService) : BaseDatabaseService(logger, cache, mapper, httpContextAccessor, contextFactory) + ServerService serverService) : BaseDatabaseService(logger, settingsProvider, cache, mapper, httpContextAccessor, contextFactory) { public override async Task AddAsync(PlaySession entity) { diff --git a/LANCommander.Server.Services/RedistributableService.cs b/LANCommander.Server.Services/RedistributableService.cs index 810d11c3..7c94f237 100644 --- a/LANCommander.Server.Services/RedistributableService.cs +++ b/LANCommander.Server.Services/RedistributableService.cs @@ -11,10 +11,11 @@ namespace LANCommander.Server.Services { public sealed class RedistributableService( ILogger logger, + SettingsProvider settingsProvider, IFusionCache cache, IMapper mapper, IHttpContextAccessor httpContextAccessor, - IDbContextFactory contextFactory) : BaseDatabaseService(logger, cache, mapper, httpContextAccessor, contextFactory) + IDbContextFactory contextFactory) : BaseDatabaseService(logger, settingsProvider, cache, mapper, httpContextAccessor, contextFactory) { public override async Task AddAsync(Redistributable entity) { diff --git a/LANCommander.Server.Services/RoleService.cs b/LANCommander.Server.Services/RoleService.cs index 8f36f666..b824d9c2 100644 --- a/LANCommander.Server.Services/RoleService.cs +++ b/LANCommander.Server.Services/RoleService.cs @@ -14,13 +14,14 @@ namespace LANCommander.Server.Services { public sealed class RoleService( ILogger logger, + SettingsProvider settingsProvider, IFusionCache cache, IMapper mapper, IHttpContextAccessor httpContextAccessor, IDbContextFactory contextFactory, CollectionService collectionService, IdentityContextFactory identityContextFactory, - RoleManager roleManager) : BaseDatabaseService(logger, cache, mapper, httpContextAccessor, contextFactory) + RoleManager roleManager) : BaseDatabaseService(logger, settingsProvider, cache, mapper, httpContextAccessor, contextFactory) { public const string AdministratorRoleName = "Administrator"; diff --git a/LANCommander.Server.Services/SavePathService.cs b/LANCommander.Server.Services/SavePathService.cs index 33069b57..7d9f652b 100644 --- a/LANCommander.Server.Services/SavePathService.cs +++ b/LANCommander.Server.Services/SavePathService.cs @@ -10,10 +10,11 @@ namespace LANCommander.Server.Services { public sealed class SavePathService( ILogger logger, + SettingsProvider settingsProvider, IFusionCache cache, IMapper mapper, IHttpContextAccessor httpContextAccessor, - IDbContextFactory contextFactory) : BaseDatabaseService(logger, cache, mapper, httpContextAccessor, contextFactory) + IDbContextFactory contextFactory) : BaseDatabaseService(logger, settingsProvider, cache, mapper, httpContextAccessor, contextFactory) { public override async Task AddAsync(SavePath entity) { diff --git a/LANCommander.Server.Services/ScriptService.cs b/LANCommander.Server.Services/ScriptService.cs index 59abfdfc..99272d3c 100644 --- a/LANCommander.Server.Services/ScriptService.cs +++ b/LANCommander.Server.Services/ScriptService.cs @@ -13,10 +13,11 @@ namespace LANCommander.Server.Services { public sealed class ScriptService( ILogger logger, + SettingsProvider settingsProvider, IFusionCache cache, IMapper mapper, IHttpContextAccessor httpContextAccessor, - IDbContextFactory contextFactory) : BaseDatabaseService @@ -77,7 +61,7 @@ @code { protected override async Task OnInitializedAsync() { - if (DatabaseContext.Provider == Data.Enums.DatabaseProvider.Unknown && !NavigationManager.Uri.Contains("/FirstTimeSetup")) + if (DatabaseContext.Provider == DatabaseProvider.Unknown && !NavigationManager.Uri.Contains("/FirstTimeSetup")) { NavigationManager.NavigateTo("/FirstTimeSetup", true); } diff --git a/LANCommander.Server/UI/Components/ArchiveUploader.razor b/LANCommander.Server/UI/Components/ArchiveUploader.razor index e882c4af..734d7d1e 100644 --- a/LANCommander.Server/UI/Components/ArchiveUploader.razor +++ b/LANCommander.Server/UI/Components/ArchiveUploader.razor @@ -2,8 +2,7 @@ @using LANCommander.SDK.Enums @using LANCommander.Server.Jobs.Background; @inject ArchiveClient ArchiveClient -@inject HttpClient HttpClient -@inject NavigationManager Navigator +@inject SettingsProvider SettingsProvider @inject IMessageService MessageService @inject IJSRuntime JS @inject ILogger Logger @@ -134,16 +133,14 @@ Archive? lastArchive = null; - var settings = SettingService.GetSettings(); - - if (settings.Archives.EnablePatching) + if (SettingsProvider.CurrentValue.Server.Archives.EnablePatching) { if (Archive.GameId != Guid.Empty) lastArchive = await ArchiveClient.GetLatestArchive(a => a.Id != Archive.Id && a.GameId == Archive.GameId); else if (Archive.RedistributableId != Guid.Empty) lastArchive = await ArchiveClient.GetLatestArchive(a => a.Id != Archive.Id && a.RedistributableId == Archive.RedistributableId); - if (lastArchive != null && settings.Archives.EnablePatching) + if (lastArchive != null && SettingsProvider.CurrentValue.Server.Archives.EnablePatching) BackgroundJob.Enqueue(x => x.Execute(lastArchive.Id, Archive.Id)); } diff --git a/LANCommander.Server/UI/Components/AvatarUploader.razor b/LANCommander.Server/UI/Components/AvatarUploader.razor index fce0ea2a..36c4116e 100644 --- a/LANCommander.Server/UI/Components/AvatarUploader.razor +++ b/LANCommander.Server/UI/Components/AvatarUploader.razor @@ -2,6 +2,7 @@ @inherits OwningComponentBase @inject UserService UserService @inject MediaService MediaService +@inject SettingsProvider SettingsProvider @inject IMessageService MessageService