Saving AdminSettings to a Json File.

This commit is contained in:
2025-12-07 12:17:18 +01:00
parent 0b541373c2
commit decb170e7b
6 changed files with 65 additions and 109 deletions

View File

@@ -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();
}
}
}

View File

@@ -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<AdminSettingsEntityBuilder>
{
private const string _entityTableName = "SZUAbsolventenvereinAdminSettings";
private readonly PrimaryKey<AdminSettingsEntityBuilder> _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<AddColumnOperation> AdminSettingsId { get; set; }
public OperationBuilder<AddColumnOperation> TokenLifetime { get; set; }
}
}

View File

@@ -10,7 +10,6 @@ namespace SZUAbsolventenverein.Module.AdminModules.Repository
public class AdminModulesContext : DBContextBase, ITransientService, IMultiDatabase
{
public virtual DbSet<Models.AdminModules> AdminModules { get; set; }
public virtual DbSet<Models.AdminSetting> AdminSettings { get; set; }
public AdminModulesContext(IDBContextDependencies DBContextDependencies) : base(DBContextDependencies)
{
@@ -22,7 +21,6 @@ namespace SZUAbsolventenverein.Module.AdminModules.Repository
base.OnModelCreating(builder);
builder.Entity<Models.AdminModules>().ToTable(ActiveDatabase.RewriteName("SZUAbsolventenvereinAdminModules"));
builder.Entity<Models.AdminSetting>().ToTable(ActiveDatabase.RewriteName("SZUAbsolventenvereinAdminSettings"));
}
}
}

View File

@@ -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
/// </summary>
public class AdminSettingsRepository : IAdminSettingsRepository, ITransientService
{
private readonly IDbContextFactory<AdminModulesContext> _factory;
public AdminSettingsRepository(IDbContextFactory<AdminModulesContext> 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();
}
}
/// <summary>
/// Extension methods for saving and loading admin settings to/from a JSON file.
/// </summary>
public static class AdminSettingsExtensions
{
/// <summary>
/// Path to the JSON file where admin settings are stored.
/// </summary>
private static string path = "AdminSettings.json";
/// <summary>
/// Saves the adminSettingsObject to a JSON file.
/// </summary>
/// <param name="adminSetting">Settings to save</param>
/// <returns>The same AdminSettings object for chaining of Operations</returns>
public static AdminSetting SaveChanges(this AdminSetting adminSetting)
{
string res = JsonSerializer.Serialize(adminSetting);
File.WriteAllText(path, res);
return adminSetting;
}
/// <summary>
/// Loads the admin settings from the JSON file. If the file does not exist, returns a new AdminSetting object with default (0) values.
/// </summary>
/// <returns></returns>
public static AdminSetting LoadSettings()
{
if (File.Exists(path))
{
string json = File.ReadAllText(path);
return JsonSerializer.Deserialize<AdminSetting>(json);
}
return new AdminSetting();
}
}
}

View File

@@ -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<DataProtectionTokenProviderOptions>
{
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<IDbContextFactory<AdminModulesContext>>();
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.
}
}
}
}

View File

@@ -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<IAdminModulesService, ServerAdminModulesService>();
services.AddTransient<IAdminSettingsService, ServerAdminSettingsService>();
services.AddTransient<IAdminSettingsRepository, AdminSettingsRepository>();
services.AddDbContextFactory<AdminModulesContext>(opt => { }, ServiceLifetime.Transient);
services.AddTransient<IConfigureOptions<DataProtectionTokenProviderOptions>,
ConfigureDataProtectionTokenProviderOptions>();
services.Configure<DataProtectionTokenProviderOptions>(options =>
{
options.TokenLifespan = TimeSpan.FromDays(2);
});
try
{
AdminSetting settings = AdminSettingsExtensions.LoadSettings();
services.Configure<DataProtectionTokenProviderOptions>(options =>
{
options.TokenLifespan = TimeSpan.FromDays(settings.TokenLifetime);
});
Console.WriteLine("Saving token lifetime: " + settings.TokenLifetime + " days");
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
}
}