From a64bdacbf5584af779b9dd939c8772d4cd9013da Mon Sep 17 00:00:00 2001 From: Konstantin Hintermayer Date: Thu, 4 Dec 2025 07:36:01 +0100 Subject: [PATCH] Bulk: Commit: AdminSettings Module Saving to DB is done, Reading from DB to UI is done. Loading at startup is still missing... --- .../Index.razor | 11 ++--- .../Migrations/01000000_InitializeModule.cs | 3 ++ Server/Repository/AdminSettingsRepository.cs | 25 +++++++++-- Server/Services/AdminSettingsService.cs | 3 +- ...tectionTokenProviderOptionsConfigurator.cs | 44 +++++++++++++++++++ Server/Startup/ServerStartup.cs | 16 ++++--- Shared/Models/AdminSettings.cs | 3 +- 7 files changed, 89 insertions(+), 16 deletions(-) create mode 100644 Server/Startup/DataProtectionTokenProviderOptionsConfigurator.cs diff --git a/Client/Modules/SZUAbsolventenverein.Module.AdminSettings/Index.razor b/Client/Modules/SZUAbsolventenverein.Module.AdminSettings/Index.razor index 153a58c..2826751 100644 --- a/Client/Modules/SZUAbsolventenverein.Module.AdminSettings/Index.razor +++ b/Client/Modules/SZUAbsolventenverein.Module.AdminSettings/Index.razor @@ -13,13 +13,11 @@ } else { - - + + } @code { - public override string RenderMode => RenderModes.Static; - public override List Resources => new List() { new Stylesheet("_content/SZUAbsolventenverein.Module.AdminModules/Module.css"), @@ -41,11 +39,14 @@ else } } - protected async Task Save() + private async Task Save() { + Console.WriteLine("Saving!!!!"); try { + AddModuleMessage("Saved", MessageType.Success); await AdminSettingsService.SetAdminSettingsAsync(_AdminSetting); + AddModuleMessage("Saved", MessageType.Success); } catch (Exception ex) { diff --git a/Server/Migrations/01000000_InitializeModule.cs b/Server/Migrations/01000000_InitializeModule.cs index c72c0e9..56b24d7 100644 --- a/Server/Migrations/01000000_InitializeModule.cs +++ b/Server/Migrations/01000000_InitializeModule.cs @@ -22,6 +22,9 @@ namespace SZUAbsolventenverein.Module.AdminModules.Migrations massMailingTemplateEntityBuilder.Create(); var adminSettingsEntityBuilder = new AdminSettingsEntityBuilder(migrationBuilder, ActiveDatabase); adminSettingsEntityBuilder.Create(); + + // Eine AdminSettings Zeile erstellen, damit die Werte nachher bearbeitet werden können. + migrationBuilder.Sql("INSERT INTO SZUAbsolventenvereinAdminSettings VALUES (1, 1, 'host', time('now'), 'host', time('now'))"); } protected override void Down(MigrationBuilder migrationBuilder) diff --git a/Server/Repository/AdminSettingsRepository.cs b/Server/Repository/AdminSettingsRepository.cs index 4eeef01..d2b1189 100644 --- a/Server/Repository/AdminSettingsRepository.cs +++ b/Server/Repository/AdminSettingsRepository.cs @@ -6,22 +6,39 @@ using Oqtane.Modules; namespace SZUAbsolventenverein.Module.AdminModules.Repository { + /// + /// Repository to manage admin settings in the database. + /// public interface IAdminSettingsRepository { - Models.AdminSetting GetAdminSetting(int AdminModuleId); + /// + /// Retrieves the administrative settings entry from the Database. + /// + /// An object containing the settings for the specified module. Returns if the module is not found. + Models.AdminSetting GetAdminSetting(); + + /// + /// Updates the administrative settings with the specified values. + /// + /// The new administrative settings to apply. Cannot be null. + /// The updated object reflecting the applied changes. Models.AdminSetting SetAdminSettings(Models.AdminSetting adminSetting); } - public class AdminSettingRepository : IAdminSettingsRepository, ITransientService + /// + /// Implementation of the interface for managing admin settings in the database. + /// + public class AdminSettingsRepository : IAdminSettingsRepository, ITransientService { private readonly IDbContextFactory _factory; - public AdminSettingRepository(IDbContextFactory factory) + public AdminSettingsRepository(IDbContextFactory factory) { _factory = factory; } - public AdminSetting GetAdminSetting(int AdminModuleId) + public AdminSetting GetAdminSetting() { using var db = _factory.CreateDbContext(); return db.AdminSettings.First(); diff --git a/Server/Services/AdminSettingsService.cs b/Server/Services/AdminSettingsService.cs index c873c29..e7bb81a 100644 --- a/Server/Services/AdminSettingsService.cs +++ b/Server/Services/AdminSettingsService.cs @@ -50,7 +50,7 @@ namespace SZUAbsolventenverein.Module.AdminModules.Services { if (_userPermissions.IsAuthorized(_accessor.HttpContext.User, _alias.SiteId, EntityNames.Module, ModuleId, PermissionNames.View)) { - return Task.FromResult(_AdminSettingsRepository.GetAdminSetting(ModuleId)); + return Task.FromResult(_AdminSettingsRepository.GetAdminSetting()); } else { @@ -63,6 +63,7 @@ namespace SZUAbsolventenverein.Module.AdminModules.Services { if (_userPermissions.IsAuthorized(_accessor.HttpContext.User, _alias.SiteId, EntityNames.Module, 1, PermissionNames.View)) { + _logger.Log(LogLevel.Critical, this, LogFunction.Update, "Set AdminSettings"); return Task.FromResult(_AdminSettingsRepository.SetAdminSettings(AdminSettings)); } else diff --git a/Server/Startup/DataProtectionTokenProviderOptionsConfigurator.cs b/Server/Startup/DataProtectionTokenProviderOptionsConfigurator.cs new file mode 100644 index 0000000..6fc651e --- /dev/null +++ b/Server/Startup/DataProtectionTokenProviderOptionsConfigurator.cs @@ -0,0 +1,44 @@ +using Microsoft.AspNetCore.Identity; +using Microsoft.Extensions.Options; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using SZUAbsolventenverein.Module.AdminModules.Models; +using SZUAbsolventenverein.Module.AdminModules.Repository; + +namespace SZUAbsolventenverein.Module.AdminModules.Server.Startup +{ + public class DataProtectionTokenOptionsConfigurator : IConfigureOptions + { + private readonly IAdminSettingsRepository _repo; + + public DataProtectionTokenOptionsConfigurator(IAdminSettingsRepository repo) + { + _repo = repo; + } + + public void Configure(DataProtectionTokenProviderOptions options) + { + // default fallback + options.TokenLifespan = TimeSpan.FromHours(2); + + try + { + Console.WriteLine("Setting DPTPO: "); + AdminSetting settings = _repo.GetAdminSetting(); + Console.WriteLine("Setting DPTPO: " + settings); + if (settings != null && settings.TokenLifetime > 0) + { + Console.WriteLine("Setting DPTPO: " + settings.TokenLifetime); + options.TokenLifespan = TimeSpan.FromDays(settings.TokenLifetime); + } + } + catch + { + // DB not ready / read failed — keep default + } + } + } +} diff --git a/Server/Startup/ServerStartup.cs b/Server/Startup/ServerStartup.cs index 42fa326..0e69864 100644 --- a/Server/Startup/ServerStartup.cs +++ b/Server/Startup/ServerStartup.cs @@ -1,10 +1,14 @@ using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Identity; +using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; using Oqtane.Infrastructure; using System; +using SZUAbsolventenverein.Module.AdminModules.Models; using SZUAbsolventenverein.Module.AdminModules.Repository; +using SZUAbsolventenverein.Module.AdminModules.Server.Startup; using SZUAbsolventenverein.Module.AdminModules.Services; using SZUAbsolventenverein.Module.AdminSettings.Services; @@ -24,14 +28,16 @@ namespace SZUAbsolventenverein.Module.AdminModules.Startup public void ConfigureServices(IServiceCollection services) { - services.Configure(options => - { - options.TokenLifespan = TimeSpan.FromDays(14); - }); - services.AddTransient(); services.AddTransient(); services.AddDbContextFactory(opt => { }, ServiceLifetime.Transient); + + services.Configure(options => + { + options.TokenLifespan = TimeSpan.FromHours(2); + }); + + services.AddTransient, DataProtectionTokenOptionsConfigurator>(); } } } diff --git a/Shared/Models/AdminSettings.cs b/Shared/Models/AdminSettings.cs index 6c7f9c1..c93fd69 100644 --- a/Shared/Models/AdminSettings.cs +++ b/Shared/Models/AdminSettings.cs @@ -10,7 +10,8 @@ namespace SZUAbsolventenverein.Module.AdminModules.Models { [Key] public int AdminSettingsId { get; set; } + [NotMapped] public int ModuleId { get; set; } - public int TokenLifeTimeInDays { get; set; } + public int TokenLifetime { get; set; } } }