From decb170e7bf64461921cec358a6ec1d196ce6b1b Mon Sep 17 00:00:00 2001 From: KoCoder Date: Sun, 7 Dec 2025 12:17:18 +0100 Subject: [PATCH] Saving AdminSettings to a Json File. --- .../Migrations/01000000_InitializeModule.cs | 8 --- .../AdminSettingsEntityBuilder.cs | 34 ------------ Server/Repository/AdminModulesContext.cs | 2 - Server/Repository/AdminSettingsRepository.cs | 54 +++++++++++++++---- ...igureDataProtectionTokenProviderOptions.cs | 50 ----------------- Server/Startup/ServerStartup.cs | 26 ++++++--- 6 files changed, 65 insertions(+), 109 deletions(-) delete mode 100644 Server/Migrations/EntityBuilders/AdminSettingsEntityBuilder.cs delete mode 100644 Server/Startup/ConfigureDataProtectionTokenProviderOptions.cs diff --git a/Server/Migrations/01000000_InitializeModule.cs b/Server/Migrations/01000000_InitializeModule.cs index 56b24d7..eee1cf6 100644 --- a/Server/Migrations/01000000_InitializeModule.cs +++ b/Server/Migrations/01000000_InitializeModule.cs @@ -4,7 +4,6 @@ using Oqtane.Databases.Interfaces; using Oqtane.Migrations; using SZUAbsolventenverein.Module.AdminModules.Migrations.EntityBuilders; using SZUAbsolventenverein.Module.AdminModules.Repository; -using SZUAbsolventenverein.Module.AdminModules.Server.Migrations.EntityBuilders; namespace SZUAbsolventenverein.Module.AdminModules.Migrations { @@ -20,19 +19,12 @@ namespace SZUAbsolventenverein.Module.AdminModules.Migrations { var massMailingTemplateEntityBuilder = new MassMailingTemplateEntityBuilder(migrationBuilder, ActiveDatabase); 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) { var entityBuilder = new MassMailingTemplateEntityBuilder(migrationBuilder, ActiveDatabase); entityBuilder.Drop(); - var adminSettingsEntityBuilder = new AdminSettingsEntityBuilder(migrationBuilder, ActiveDatabase); - adminSettingsEntityBuilder.Drop(); } } } diff --git a/Server/Migrations/EntityBuilders/AdminSettingsEntityBuilder.cs b/Server/Migrations/EntityBuilders/AdminSettingsEntityBuilder.cs deleted file mode 100644 index 6f26079..0000000 --- a/Server/Migrations/EntityBuilders/AdminSettingsEntityBuilder.cs +++ /dev/null @@ -1,34 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Migrations.Operations; -using Microsoft.EntityFrameworkCore.Migrations.Operations.Builders; -using Oqtane.Databases.Interfaces; -using Oqtane.Migrations; -using Oqtane.Migrations.EntityBuilders; -using SZUAbsolventenverein.Module.AdminModules.Migrations.EntityBuilders; - -namespace SZUAbsolventenverein.Module.AdminModules.Server.Migrations.EntityBuilders -{ - public class AdminSettingsEntityBuilder : AuditableBaseEntityBuilder - { - - private const string _entityTableName = "SZUAbsolventenvereinAdminSettings"; - private readonly PrimaryKey _primaryKey = new("PK_SZUAbsolventenvereinAdminSettings", x => x.AdminSettingsId); - - public AdminSettingsEntityBuilder(MigrationBuilder migrationBuilder, IDatabase database) : base(migrationBuilder, database) - { - EntityTableName = _entityTableName; - PrimaryKey = _primaryKey; - } - - protected override AdminSettingsEntityBuilder BuildTable(ColumnsBuilder table) - { - AdminSettingsId = AddAutoIncrementColumn(table, "AdminSettingsId"); - TokenLifetime = AddIntegerColumn(table, "TokenLifetime"); - AddAuditableColumns(table); - return this; - } - - public OperationBuilder AdminSettingsId { get; set; } - public OperationBuilder TokenLifetime { get; set; } - } -} diff --git a/Server/Repository/AdminModulesContext.cs b/Server/Repository/AdminModulesContext.cs index 0460404..6eefc39 100644 --- a/Server/Repository/AdminModulesContext.cs +++ b/Server/Repository/AdminModulesContext.cs @@ -10,7 +10,6 @@ namespace SZUAbsolventenverein.Module.AdminModules.Repository public class AdminModulesContext : DBContextBase, ITransientService, IMultiDatabase { public virtual DbSet AdminModules { get; set; } - public virtual DbSet AdminSettings { get; set; } public AdminModulesContext(IDBContextDependencies DBContextDependencies) : base(DBContextDependencies) { @@ -22,7 +21,6 @@ namespace SZUAbsolventenverein.Module.AdminModules.Repository base.OnModelCreating(builder); builder.Entity().ToTable(ActiveDatabase.RewriteName("SZUAbsolventenvereinAdminModules")); - builder.Entity().ToTable(ActiveDatabase.RewriteName("SZUAbsolventenvereinAdminSettings")); } } } diff --git a/Server/Repository/AdminSettingsRepository.cs b/Server/Repository/AdminSettingsRepository.cs index d2b1189..9be321b 100644 --- a/Server/Repository/AdminSettingsRepository.cs +++ b/Server/Repository/AdminSettingsRepository.cs @@ -1,6 +1,9 @@ using Microsoft.EntityFrameworkCore; using System.Linq; using System.Collections.Generic; +using System.IO; +using System.Runtime.CompilerServices; +using System.Text.Json; using SZUAbsolventenverein.Module.AdminModules.Models; using Oqtane.Modules; @@ -31,25 +34,58 @@ namespace SZUAbsolventenverein.Module.AdminModules.Repository /// public class AdminSettingsRepository : IAdminSettingsRepository, ITransientService { - private readonly IDbContextFactory _factory; - - public AdminSettingsRepository(IDbContextFactory factory) + public AdminSettingsRepository() { - _factory = factory; } public AdminSetting GetAdminSetting() { - using var db = _factory.CreateDbContext(); - return db.AdminSettings.First(); + return AdminSettingsExtensions.LoadSettings(); } public AdminSetting SetAdminSettings(AdminSetting adminSetting) { - using var db = _factory.CreateDbContext(); - db.Entry(adminSetting).State = EntityState.Modified; - db.SaveChanges(); + return adminSetting.SaveChanges(); + } + } + + /// + /// Extension methods for saving and loading admin settings to/from a JSON file. + /// + public static class AdminSettingsExtensions + { + /// + /// Path to the JSON file where admin settings are stored. + /// + private static string path = "AdminSettings.json"; + + /// + /// Saves the adminSettingsObject to a JSON file. + /// + /// Settings to save + /// The same AdminSettings object for chaining of Operations + public static AdminSetting SaveChanges(this AdminSetting adminSetting) + { + string res = JsonSerializer.Serialize(adminSetting); + + File.WriteAllText(path, res); + return adminSetting; } + + /// + /// Loads the admin settings from the JSON file. If the file does not exist, returns a new AdminSetting object with default (0) values. + /// + /// + public static AdminSetting LoadSettings() + { + if (File.Exists(path)) + { + string json = File.ReadAllText(path); + return JsonSerializer.Deserialize(json); + } + + return new AdminSetting(); + } } } diff --git a/Server/Startup/ConfigureDataProtectionTokenProviderOptions.cs b/Server/Startup/ConfigureDataProtectionTokenProviderOptions.cs deleted file mode 100644 index 49f4494..0000000 --- a/Server/Startup/ConfigureDataProtectionTokenProviderOptions.cs +++ /dev/null @@ -1,50 +0,0 @@ -using Microsoft.AspNetCore.Identity; -using Microsoft.Extensions.Options; -using System; -using System.Linq; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.DependencyInjection; -using SZUAbsolventenverein.Module.AdminModules.Models; -using SZUAbsolventenverein.Module.AdminModules.Repository; - -namespace SZUAbsolventenverein.Module.AdminModules.Server.Startup -{ - public class ConfigureDataProtectionTokenProviderOptions : IConfigureOptions - { - private readonly IServiceProvider _serviceProvider; - - public ConfigureDataProtectionTokenProviderOptions(IServiceProvider serviceProvider) - { - _serviceProvider = serviceProvider; - Console.WriteLine("Instatiating DPTPO Configurator"); - } - - public void Configure(DataProtectionTokenProviderOptions options) - { - Console.WriteLine("Configuring DPTPO"); - // default fallback - options.TokenLifespan = TimeSpan.FromHours(2); - - try - { - using var scope = _serviceProvider.CreateScope(); - var _dbContextFactory = scope.ServiceProvider.GetRequiredService>(); - var _ctx = _dbContextFactory.CreateDbContext(); - AdminSetting adminSetting = _ctx.AdminSettings.First(); - - Console.WriteLine("Setting DPTPO: " + adminSetting); - if (adminSetting != null) - { - Console.WriteLine("Setting DPTPO: " + adminSetting.TokenLifetime); - options.TokenLifespan = TimeSpan.FromDays(adminSetting.TokenLifetime); - } - } - catch (Exception ex) - { - Console.WriteLine("DB Not ready, using default DPTPO: " + ex); - // DB not ready / read failed — keep default - // Unable to get Create DB Context because Oqtane's Database Setup is incomplete. - } - } - } -} diff --git a/Server/Startup/ServerStartup.cs b/Server/Startup/ServerStartup.cs index 280df1c..9340509 100644 --- a/Server/Startup/ServerStartup.cs +++ b/Server/Startup/ServerStartup.cs @@ -1,14 +1,11 @@ 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; @@ -30,10 +27,27 @@ namespace SZUAbsolventenverein.Module.AdminModules.Startup { services.AddTransient(); services.AddTransient(); + services.AddTransient(); services.AddDbContextFactory(opt => { }, ServiceLifetime.Transient); - - services.AddTransient, - ConfigureDataProtectionTokenProviderOptions>(); + + services.Configure(options => + { + options.TokenLifespan = TimeSpan.FromDays(2); + }); + + try + { + AdminSetting settings = AdminSettingsExtensions.LoadSettings(); + services.Configure(options => + { + options.TokenLifespan = TimeSpan.FromDays(settings.TokenLifetime); + }); + Console.WriteLine("Saving token lifetime: " + settings.TokenLifetime + " days"); + } + catch (Exception ex) + { + Console.WriteLine(ex); + } } } }