WIP: Load DataProtectionTokenProviderOptions from a row in a Database. #6

Draft
Kocoder wants to merge 6 commits from kh-configuration-from-ef into main
23 changed files with 426 additions and 64 deletions
Showing only changes of commit decb170e7b - Show all commits

View File

@@ -4,7 +4,6 @@ using Oqtane.Databases.Interfaces;
using Oqtane.Migrations; using Oqtane.Migrations;
using SZUAbsolventenverein.Module.AdminModules.Migrations.EntityBuilders; using SZUAbsolventenverein.Module.AdminModules.Migrations.EntityBuilders;
using SZUAbsolventenverein.Module.AdminModules.Repository; using SZUAbsolventenverein.Module.AdminModules.Repository;
using SZUAbsolventenverein.Module.AdminModules.Server.Migrations.EntityBuilders;
namespace SZUAbsolventenverein.Module.AdminModules.Migrations namespace SZUAbsolventenverein.Module.AdminModules.Migrations
{ {
@@ -20,19 +19,12 @@ namespace SZUAbsolventenverein.Module.AdminModules.Migrations
{ {
var massMailingTemplateEntityBuilder = new MassMailingTemplateEntityBuilder(migrationBuilder, ActiveDatabase); var massMailingTemplateEntityBuilder = new MassMailingTemplateEntityBuilder(migrationBuilder, ActiveDatabase);
massMailingTemplateEntityBuilder.Create(); 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) protected override void Down(MigrationBuilder migrationBuilder)
{ {
var entityBuilder = new MassMailingTemplateEntityBuilder(migrationBuilder, ActiveDatabase); var entityBuilder = new MassMailingTemplateEntityBuilder(migrationBuilder, ActiveDatabase);
entityBuilder.Drop(); 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 class AdminModulesContext : DBContextBase, ITransientService, IMultiDatabase
{ {
public virtual DbSet<Models.AdminModules> AdminModules { get; set; } public virtual DbSet<Models.AdminModules> AdminModules { get; set; }
public virtual DbSet<Models.AdminSetting> AdminSettings { get; set; }
public AdminModulesContext(IDBContextDependencies DBContextDependencies) : base(DBContextDependencies) public AdminModulesContext(IDBContextDependencies DBContextDependencies) : base(DBContextDependencies)
{ {
@@ -22,7 +21,6 @@ namespace SZUAbsolventenverein.Module.AdminModules.Repository
base.OnModelCreating(builder); base.OnModelCreating(builder);
builder.Entity<Models.AdminModules>().ToTable(ActiveDatabase.RewriteName("SZUAbsolventenvereinAdminModules")); 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 Microsoft.EntityFrameworkCore;
using System.Linq; using System.Linq;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using System.Runtime.CompilerServices;
using System.Text.Json;
using SZUAbsolventenverein.Module.AdminModules.Models; using SZUAbsolventenverein.Module.AdminModules.Models;
using Oqtane.Modules; using Oqtane.Modules;
@@ -31,25 +34,58 @@ namespace SZUAbsolventenverein.Module.AdminModules.Repository
/// </summary> /// </summary>
public class AdminSettingsRepository : IAdminSettingsRepository, ITransientService public class AdminSettingsRepository : IAdminSettingsRepository, ITransientService
{ {
private readonly IDbContextFactory<AdminModulesContext> _factory; public AdminSettingsRepository()
public AdminSettingsRepository(IDbContextFactory<AdminModulesContext> factory)
{ {
_factory = factory;
} }
public AdminSetting GetAdminSetting() public AdminSetting GetAdminSetting()
Review

Add an 's' at The end of The Method Name...

Add an 's' at The end of The Method Name...
Review

Add comments

Add comments
{ {
using var db = _factory.CreateDbContext(); return AdminSettingsExtensions.LoadSettings();
return db.AdminSettings.First();
} }
public AdminSetting SetAdminSettings(AdminSetting adminSetting) public AdminSetting SetAdminSettings(AdminSetting adminSetting)
Review

Add comments

Add comments
{ {
using var db = _factory.CreateDbContext(); return adminSetting.SaveChanges();
db.Entry(adminSetting).State = EntityState.Modified; }
db.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; 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.Builder;
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Oqtane.Infrastructure; using Oqtane.Infrastructure;
using System; using System;
using SZUAbsolventenverein.Module.AdminModules.Models; using SZUAbsolventenverein.Module.AdminModules.Models;
using SZUAbsolventenverein.Module.AdminModules.Repository; using SZUAbsolventenverein.Module.AdminModules.Repository;
using SZUAbsolventenverein.Module.AdminModules.Server.Startup;
using SZUAbsolventenverein.Module.AdminModules.Services; using SZUAbsolventenverein.Module.AdminModules.Services;
using SZUAbsolventenverein.Module.AdminSettings.Services; using SZUAbsolventenverein.Module.AdminSettings.Services;
@@ -30,10 +27,27 @@ namespace SZUAbsolventenverein.Module.AdminModules.Startup
{ {
services.AddTransient<IAdminModulesService, ServerAdminModulesService>(); services.AddTransient<IAdminModulesService, ServerAdminModulesService>();
services.AddTransient<IAdminSettingsService, ServerAdminSettingsService>(); services.AddTransient<IAdminSettingsService, ServerAdminSettingsService>();
services.AddTransient<IAdminSettingsRepository, AdminSettingsRepository>();
services.AddDbContextFactory<AdminModulesContext>(opt => { }, ServiceLifetime.Transient); services.AddDbContextFactory<AdminModulesContext>(opt => { }, ServiceLifetime.Transient);
services.AddTransient<IConfigureOptions<DataProtectionTokenProviderOptions>, services.Configure<DataProtectionTokenProviderOptions>(options =>
ConfigureDataProtectionTokenProviderOptions>(); {
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);
}
} }
} }
} }