From bb30c7fb421fee3d5354789fc3c97a30e485a5a1 Mon Sep 17 00:00:00 2001 From: Konstantin Hintermayer Date: Thu, 27 Nov 2025 12:49:36 +0100 Subject: [PATCH] TEST --- .../Edit.razor | 2 +- .../Index.razor | 2 +- .../ModuleInfo.cs | 19 +++++ .../Send.razor | 39 +++------ .../Settings.razor | 2 +- .../Index.razor | 56 +++++++++++++ .../ModuleInfo.cs | 12 +-- .../Settings.razor | 47 +++++++++++ ...enverein.Module.AdminModules.Client.csproj | 10 +-- Client/Services/AdminSettingsService.cs | 37 +++++++++ Client/Startup/ClientStartup.cs | 5 ++ ...ntenverein.Module.AdminModules.1.0.6.nupkg | Bin 0 -> 87722 bytes ...solventenverein.Module.AdminModules.nuspec | 2 +- Server/Manager/AdminModulesManager.cs | 4 +- .../Migrations/01000000_InitializeModule.cs | 11 ++- .../AdminSettingsEntityBuilder.cs | 34 ++++++++ ...cs => MassMailingTemplateEntityBuilder.cs} | 10 +-- Server/Repository/AdminModulesContext.cs | 2 + Server/Repository/AdminSettingsRepository.cs | 38 +++++++++ ...enverein.Module.AdminModules.Server.csproj | 8 +- Server/Services/AdminModulesService.cs | 2 +- Server/Services/AdminSettingsService.cs | 75 ++++++++++++++++++ Server/Startup/ServerStartup.cs | 9 +++ Shared/Models/AdminSettings.cs | 16 ++++ 24 files changed, 386 insertions(+), 56 deletions(-) rename Client/Modules/{SZUAbsolventenverein.Module.AdminModules => SZUAbsolventenverein.Module.AdminMassMailing}/Edit.razor (98%) rename Client/Modules/{SZUAbsolventenverein.Module.AdminModules => SZUAbsolventenverein.Module.AdminMassMailing}/Index.razor (98%) create mode 100644 Client/Modules/SZUAbsolventenverein.Module.AdminMassMailing/ModuleInfo.cs rename Client/Modules/{SZUAbsolventenverein.Module.AdminModules => SZUAbsolventenverein.Module.AdminMassMailing}/Send.razor (76%) rename Client/Modules/{SZUAbsolventenverein.Module.AdminModules => SZUAbsolventenverein.Module.AdminMassMailing}/Settings.razor (96%) create mode 100644 Client/Modules/SZUAbsolventenverein.Module.AdminSettings/Index.razor rename Client/Modules/{SZUAbsolventenverein.Module.AdminModules => SZUAbsolventenverein.Module.AdminSettings}/ModuleInfo.cs (60%) create mode 100644 Client/Modules/SZUAbsolventenverein.Module.AdminSettings/Settings.razor create mode 100644 Client/Services/AdminSettingsService.cs create mode 100644 Package/SZUAbsolventenverein.Module.AdminModules.1.0.6.nupkg create mode 100644 Server/Migrations/EntityBuilders/AdminSettingsEntityBuilder.cs rename Server/Migrations/EntityBuilders/{AdminModulesEntityBuilder.cs => MassMailingTemplateEntityBuilder.cs} (63%) create mode 100644 Server/Repository/AdminSettingsRepository.cs create mode 100644 Server/Services/AdminSettingsService.cs create mode 100644 Shared/Models/AdminSettings.cs diff --git a/Client/Modules/SZUAbsolventenverein.Module.AdminModules/Edit.razor b/Client/Modules/SZUAbsolventenverein.Module.AdminMassMailing/Edit.razor similarity index 98% rename from Client/Modules/SZUAbsolventenverein.Module.AdminModules/Edit.razor rename to Client/Modules/SZUAbsolventenverein.Module.AdminMassMailing/Edit.razor index b275a06..da24bf3 100644 --- a/Client/Modules/SZUAbsolventenverein.Module.AdminModules/Edit.razor +++ b/Client/Modules/SZUAbsolventenverein.Module.AdminMassMailing/Edit.razor @@ -2,7 +2,7 @@ @using SZUAbsolventenverein.Module.AdminModules.Services @using SZUAbsolventenverein.Module.AdminModules.Models -@namespace SZUAbsolventenverein.Module.AdminModules +@namespace SZUAbsolventenverein.Module.AdminMassMailing @inherits ModuleBase @inject IAdminModulesService AdminModulesService @inject NavigationManager NavigationManager diff --git a/Client/Modules/SZUAbsolventenverein.Module.AdminModules/Index.razor b/Client/Modules/SZUAbsolventenverein.Module.AdminMassMailing/Index.razor similarity index 98% rename from Client/Modules/SZUAbsolventenverein.Module.AdminModules/Index.razor rename to Client/Modules/SZUAbsolventenverein.Module.AdminMassMailing/Index.razor index 92f39d0..e20f25c 100644 --- a/Client/Modules/SZUAbsolventenverein.Module.AdminModules/Index.razor +++ b/Client/Modules/SZUAbsolventenverein.Module.AdminMassMailing/Index.razor @@ -1,7 +1,7 @@ @using SZUAbsolventenverein.Module.AdminModules.Services @using SZUAbsolventenverein.Module.AdminModules.Models -@namespace SZUAbsolventenverein.Module.AdminModules +@namespace SZUAbsolventenverein.Module.AdminMassMailing @inherits ModuleBase @inject IAdminModulesService AdminModulesService @inject NavigationManager NavigationManager diff --git a/Client/Modules/SZUAbsolventenverein.Module.AdminMassMailing/ModuleInfo.cs b/Client/Modules/SZUAbsolventenverein.Module.AdminMassMailing/ModuleInfo.cs new file mode 100644 index 0000000..ddc4fa5 --- /dev/null +++ b/Client/Modules/SZUAbsolventenverein.Module.AdminMassMailing/ModuleInfo.cs @@ -0,0 +1,19 @@ +using Oqtane.Models; +using Oqtane.Modules; + +namespace SZUAbsolventenverein.Module.AdminMassMailing +{ + public class ModuleInfo : IModule + { + public ModuleDefinition ModuleDefinition => new ModuleDefinition + { + Name = "AdminMassMailing", + Description = "Mass Mailing Tool", + Version = "1.0.7", + ServerManagerType = "SZUAbsolventenverein.Module.AdminModules.Manager.AdminModulesManager, SZUAbsolventenverein.Module.AdminModules.Server.Oqtane", + ReleaseVersions = "1.0.0,1.0.1,1.0.2,1.0.3,1.0.4,1.0.5,1.0.6,1.0.7", + Dependencies = "SZUAbsolventenverein.Module.AdminModules.Shared.Oqtane", + PackageName = "SZUAbsolventenverein.Module.AdminMassMailing" + }; + } +} diff --git a/Client/Modules/SZUAbsolventenverein.Module.AdminModules/Send.razor b/Client/Modules/SZUAbsolventenverein.Module.AdminMassMailing/Send.razor similarity index 76% rename from Client/Modules/SZUAbsolventenverein.Module.AdminModules/Send.razor rename to Client/Modules/SZUAbsolventenverein.Module.AdminMassMailing/Send.razor index f7f794b..42d2ffa 100644 --- a/Client/Modules/SZUAbsolventenverein.Module.AdminModules/Send.razor +++ b/Client/Modules/SZUAbsolventenverein.Module.AdminMassMailing/Send.razor @@ -3,7 +3,7 @@ @using SZUAbsolventenverein.Module.AdminModules.Models @using Microsoft.AspNetCore.Components.Forms; -@namespace SZUAbsolventenverein.Module.AdminModules +@namespace SZUAbsolventenverein.Module.AdminMassMailing @inherits ModuleBase @inject IAdminModulesService AdminModulesService @inject NavigationManager NavigationManager @@ -11,12 +11,6 @@
-
- -
- -
-
@@ -40,10 +34,17 @@ }

- + @if(userCount != null) + { + + } @Localizer["Cancel"] -

- @code { @@ -77,13 +78,7 @@ private bool validated = false; private int _id; - private string _name; - private string _richText; - private string _createdby; - private DateTime _createdon; - private string _modifiedby; - private DateTime _modifiedon; - + private async void RefetchUserCount() { EmailFields ef = new EmailFields(); @@ -103,16 +98,6 @@ if (PageState.Action == "Send") { _id = Int32.Parse(PageState.QueryString["id"]); - AdminModules AdminModules = await AdminModulesService.GetAdminModulesAsync(_id, ModuleState.ModuleId); - if (AdminModules != null) - { - _name = AdminModules.Name; - _richText = AdminModules.Content; - _createdby = AdminModules.CreatedBy; - _createdon = AdminModules.CreatedOn; - _modifiedby = AdminModules.ModifiedBy; - _modifiedon = AdminModules.ModifiedOn; - } roles = await AdminModulesService.GetRoles(ModuleState.ModuleId); } } diff --git a/Client/Modules/SZUAbsolventenverein.Module.AdminModules/Settings.razor b/Client/Modules/SZUAbsolventenverein.Module.AdminMassMailing/Settings.razor similarity index 96% rename from Client/Modules/SZUAbsolventenverein.Module.AdminModules/Settings.razor rename to Client/Modules/SZUAbsolventenverein.Module.AdminMassMailing/Settings.razor index c604eb1..2fa6067 100644 --- a/Client/Modules/SZUAbsolventenverein.Module.AdminModules/Settings.razor +++ b/Client/Modules/SZUAbsolventenverein.Module.AdminMassMailing/Settings.razor @@ -1,4 +1,4 @@ -@namespace SZUAbsolventenverein.Module.AdminModules +@namespace SZUAbsolventenverein.Module.AdminMassMailing @inherits ModuleBase @inject ISettingService SettingService @inject IStringLocalizer Localizer diff --git a/Client/Modules/SZUAbsolventenverein.Module.AdminSettings/Index.razor b/Client/Modules/SZUAbsolventenverein.Module.AdminSettings/Index.razor new file mode 100644 index 0000000..153a58c --- /dev/null +++ b/Client/Modules/SZUAbsolventenverein.Module.AdminSettings/Index.razor @@ -0,0 +1,56 @@ +@using SZUAbsolventenverein.Module.AdminSettings.Services +@using SZUAbsolventenverein.Module.AdminModules.Models + +@namespace SZUAbsolventenverein.Module.AdminSettings +@inherits ModuleBase +@inject IAdminSettingsService AdminSettingsService +@inject NavigationManager NavigationManager +@inject IStringLocalizer Localizer + +@if (_AdminSetting == null) +{ +

Loading...

+} +else +{ + + +} + +@code { + public override string RenderMode => RenderModes.Static; + + public override List Resources => new List() + { + new Stylesheet("_content/SZUAbsolventenverein.Module.AdminModules/Module.css"), + new Script("_content/SZUAbsolventenverein.Module.AdminModules/Module.js") + }; + + private AdminSetting _AdminSetting; + + protected override async Task OnInitializedAsync() + { + try + { + _AdminSetting = await AdminSettingsService.GetAdminSettingsAsync(ModuleState.ModuleId); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Loading AdminSettings {Error}", ex.Message); + AddModuleMessage(Localizer["Message.LoadError"], MessageType.Error); + } + } + + protected async Task Save() + { + try + { + await AdminSettingsService.SetAdminSettingsAsync(_AdminSetting); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Saving AdminSettings {Error}", ex.Message); + AddModuleMessage(Localizer["Message.LoadError"], MessageType.Error); + } + } +} \ No newline at end of file diff --git a/Client/Modules/SZUAbsolventenverein.Module.AdminModules/ModuleInfo.cs b/Client/Modules/SZUAbsolventenverein.Module.AdminSettings/ModuleInfo.cs similarity index 60% rename from Client/Modules/SZUAbsolventenverein.Module.AdminModules/ModuleInfo.cs rename to Client/Modules/SZUAbsolventenverein.Module.AdminSettings/ModuleInfo.cs index 2316f20..34f58a7 100644 --- a/Client/Modules/SZUAbsolventenverein.Module.AdminModules/ModuleInfo.cs +++ b/Client/Modules/SZUAbsolventenverein.Module.AdminSettings/ModuleInfo.cs @@ -1,19 +1,19 @@ using Oqtane.Models; using Oqtane.Modules; -namespace SZUAbsolventenverein.Module.AdminModules +namespace SZUAbsolventenverein.Module.AdminSettings { public class ModuleInfo : IModule { public ModuleDefinition ModuleDefinition => new ModuleDefinition { - Name = "AdminModules", - Description = "Admin Tools", - Version = "1.0.2", + Name = "Admin - Settings", + Description = "Einstellungen in Oqtane", + Version = "1.0.0", ServerManagerType = "SZUAbsolventenverein.Module.AdminModules.Manager.AdminModulesManager, SZUAbsolventenverein.Module.AdminModules.Server.Oqtane", - ReleaseVersions = "1.0.0,1.0.1,1.0.2", + ReleaseVersions = "1.0.0", Dependencies = "SZUAbsolventenverein.Module.AdminModules.Shared.Oqtane", - PackageName = "SZUAbsolventenverein.Module.AdminModules" + PackageName = "SZUAbsolventenverein.Module.AdminSettings" }; } } diff --git a/Client/Modules/SZUAbsolventenverein.Module.AdminSettings/Settings.razor b/Client/Modules/SZUAbsolventenverein.Module.AdminSettings/Settings.razor new file mode 100644 index 0000000..52c6cb7 --- /dev/null +++ b/Client/Modules/SZUAbsolventenverein.Module.AdminSettings/Settings.razor @@ -0,0 +1,47 @@ +@namespace SZUAbsolventenverein.Module.AdminSettings +@inherits ModuleBase +@inject ISettingService SettingService +@inject IStringLocalizer Localizer + +
+
+ +
+ +
+
+
+ +@code { + private string resourceType = "SZUAbsolventenverein.Module.AdminSettings.Settings, SZUAbsolventenverein.Module.AdminSettings.Client.Oqtane"; // for localization + public override string Title => "Admin - Settings Settings"; + + string _value; + + protected override async Task OnInitializedAsync() + { + try + { + Dictionary settings = await SettingService.GetModuleSettingsAsync(ModuleState.ModuleId); + _value = SettingService.GetSetting(settings, "SettingName", ""); + } + catch (Exception ex) + { + AddModuleMessage(ex.Message, MessageType.Error); + } + } + + public async Task UpdateSettings() + { + try + { + Dictionary settings = await SettingService.GetModuleSettingsAsync(ModuleState.ModuleId); + SettingService.SetSetting(settings, "SettingName", _value); + await SettingService.UpdateModuleSettingsAsync(settings, ModuleState.ModuleId); + } + catch (Exception ex) + { + AddModuleMessage(ex.Message, MessageType.Error); + } + } +} diff --git a/Client/SZUAbsolventenverein.Module.AdminModules.Client.csproj b/Client/SZUAbsolventenverein.Module.AdminModules.Client.csproj index 2d4f077..4febe22 100644 --- a/Client/SZUAbsolventenverein.Module.AdminModules.Client.csproj +++ b/Client/SZUAbsolventenverein.Module.AdminModules.Client.csproj @@ -13,11 +13,11 @@ - - - - - + + + + + diff --git a/Client/Services/AdminSettingsService.cs b/Client/Services/AdminSettingsService.cs new file mode 100644 index 0000000..6d44967 --- /dev/null +++ b/Client/Services/AdminSettingsService.cs @@ -0,0 +1,37 @@ +using Oqtane.Models; +using Oqtane.Services; +using Oqtane.Shared; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Http; +using System.Reflection; +using System.Threading.Tasks; +using SZUAbsolventenverein.Module.AdminModules.Models; + +namespace SZUAbsolventenverein.Module.AdminSettings.Services +{ + public interface IAdminSettingsService + { + Task GetAdminSettingsAsync(int ModuleId); + + Task SetAdminSettingsAsync(AdminSetting AdminSettings); + } + + public class AdminSettingsService : ServiceBase, IAdminSettingsService + { + public AdminSettingsService(HttpClient http, SiteState siteState) : base(http, siteState) { } + + private string Apiurl => CreateApiUrl("AdminSettings"); + + public async Task GetAdminSettingsAsync(int ModuleId) + { + return await GetJsonAsync(CreateAuthorizationPolicyUrl($"{Apiurl}?moduleid={ModuleId}", EntityNames.Module, ModuleId), null); + } + + public async Task SetAdminSettingsAsync(AdminSetting AdminSettings) + { + return await PostJsonAsync(CreateAuthorizationPolicyUrl($"{Apiurl}", EntityNames.Module, AdminSettings.ModuleId), AdminSettings); + } + } +} diff --git a/Client/Startup/ClientStartup.cs b/Client/Startup/ClientStartup.cs index 08c22eb..7c42342 100644 --- a/Client/Startup/ClientStartup.cs +++ b/Client/Startup/ClientStartup.cs @@ -2,6 +2,7 @@ using Microsoft.Extensions.DependencyInjection; using System.Linq; using Oqtane.Services; using SZUAbsolventenverein.Module.AdminModules.Services; +using SZUAbsolventenverein.Module.AdminSettings.Services; namespace SZUAbsolventenverein.Module.AdminModules.Startup { @@ -13,6 +14,10 @@ namespace SZUAbsolventenverein.Module.AdminModules.Startup { services.AddScoped(); } + if (!services.Any(s => s.ServiceType == typeof(IAdminSettingsService))) + { + services.AddScoped(); + } } } } diff --git a/Package/SZUAbsolventenverein.Module.AdminModules.1.0.6.nupkg b/Package/SZUAbsolventenverein.Module.AdminModules.1.0.6.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..fabcd98290fe1f338de6e8dcf0b0ad956064f142 GIT binary patch literal 87722 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 $projectname$ - 1.0.2 + 1.0.6 SZUAbsolventenverein SZUAbsolventenverein AdminModules diff --git a/Server/Manager/AdminModulesManager.cs b/Server/Manager/AdminModulesManager.cs index 1f46bee..6c8eeb7 100644 --- a/Server/Manager/AdminModulesManager.cs +++ b/Server/Manager/AdminModulesManager.cs @@ -16,11 +16,13 @@ namespace SZUAbsolventenverein.Module.AdminModules.Manager public class AdminModulesManager : MigratableModuleBase, IInstallable, IPortable, ISearchable { private readonly IAdminModulesRepository _AdminModulesRepository; + private readonly IAdminSettingsRepository _AdminSettingsRepository; private readonly IDBContextDependencies _DBContextDependencies; - public AdminModulesManager(IAdminModulesRepository AdminModulesRepository, IDBContextDependencies DBContextDependencies) + public AdminModulesManager(IAdminModulesRepository AdminModulesRepository, IAdminSettingsRepository AdminSettingsRepository, IDBContextDependencies DBContextDependencies) { _AdminModulesRepository = AdminModulesRepository; + _AdminSettingsRepository = AdminSettingsRepository; _DBContextDependencies = DBContextDependencies; } diff --git a/Server/Migrations/01000000_InitializeModule.cs b/Server/Migrations/01000000_InitializeModule.cs index 8e340eb..c72c0e9 100644 --- a/Server/Migrations/01000000_InitializeModule.cs +++ b/Server/Migrations/01000000_InitializeModule.cs @@ -4,6 +4,7 @@ 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 { @@ -17,14 +18,18 @@ namespace SZUAbsolventenverein.Module.AdminModules.Migrations protected override void Up(MigrationBuilder migrationBuilder) { - var entityBuilder = new AdminModulesEntityBuilder(migrationBuilder, ActiveDatabase); - entityBuilder.Create(); + var massMailingTemplateEntityBuilder = new MassMailingTemplateEntityBuilder(migrationBuilder, ActiveDatabase); + massMailingTemplateEntityBuilder.Create(); + var adminSettingsEntityBuilder = new AdminSettingsEntityBuilder(migrationBuilder, ActiveDatabase); + adminSettingsEntityBuilder.Create(); } protected override void Down(MigrationBuilder migrationBuilder) { - var entityBuilder = new AdminModulesEntityBuilder(migrationBuilder, ActiveDatabase); + 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 new file mode 100644 index 0000000..6f26079 --- /dev/null +++ b/Server/Migrations/EntityBuilders/AdminSettingsEntityBuilder.cs @@ -0,0 +1,34 @@ +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/Migrations/EntityBuilders/AdminModulesEntityBuilder.cs b/Server/Migrations/EntityBuilders/MassMailingTemplateEntityBuilder.cs similarity index 63% rename from Server/Migrations/EntityBuilders/AdminModulesEntityBuilder.cs rename to Server/Migrations/EntityBuilders/MassMailingTemplateEntityBuilder.cs index cbcae20..69f1e66 100644 --- a/Server/Migrations/EntityBuilders/AdminModulesEntityBuilder.cs +++ b/Server/Migrations/EntityBuilders/MassMailingTemplateEntityBuilder.cs @@ -7,20 +7,20 @@ using Oqtane.Migrations.EntityBuilders; namespace SZUAbsolventenverein.Module.AdminModules.Migrations.EntityBuilders { - public class AdminModulesEntityBuilder : AuditableBaseEntityBuilder + public class MassMailingTemplateEntityBuilder : AuditableBaseEntityBuilder { private const string _entityTableName = "SZUAbsolventenvereinAdminModules"; - private readonly PrimaryKey _primaryKey = new("PK_SZUAbsolventenvereinAdminModules", x => x.AdminModulesId); - private readonly ForeignKey _moduleForeignKey = new("FK_SZUAbsolventenvereinAdminModules_Module", x => x.ModuleId, "Module", "ModuleId", ReferentialAction.Cascade); + private readonly PrimaryKey _primaryKey = new("PK_SZUAbsolventenvereinAdminModules", x => x.AdminModulesId); + private readonly ForeignKey _moduleForeignKey = new("FK_SZUAbsolventenvereinAdminModules_Module", x => x.ModuleId, "Module", "ModuleId", ReferentialAction.Cascade); - public AdminModulesEntityBuilder(MigrationBuilder migrationBuilder, IDatabase database) : base(migrationBuilder, database) + public MassMailingTemplateEntityBuilder(MigrationBuilder migrationBuilder, IDatabase database) : base(migrationBuilder, database) { EntityTableName = _entityTableName; PrimaryKey = _primaryKey; ForeignKeys.Add(_moduleForeignKey); } - protected override AdminModulesEntityBuilder BuildTable(ColumnsBuilder table) + protected override MassMailingTemplateEntityBuilder BuildTable(ColumnsBuilder table) { AdminModulesId = AddAutoIncrementColumn(table,"AdminModulesId"); ModuleId = AddIntegerColumn(table,"ModuleId"); diff --git a/Server/Repository/AdminModulesContext.cs b/Server/Repository/AdminModulesContext.cs index 6eefc39..0460404 100644 --- a/Server/Repository/AdminModulesContext.cs +++ b/Server/Repository/AdminModulesContext.cs @@ -10,6 +10,7 @@ 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) { @@ -21,6 +22,7 @@ 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 new file mode 100644 index 0000000..4eeef01 --- /dev/null +++ b/Server/Repository/AdminSettingsRepository.cs @@ -0,0 +1,38 @@ +using Microsoft.EntityFrameworkCore; +using System.Linq; +using System.Collections.Generic; +using SZUAbsolventenverein.Module.AdminModules.Models; +using Oqtane.Modules; + +namespace SZUAbsolventenverein.Module.AdminModules.Repository +{ + public interface IAdminSettingsRepository + { + Models.AdminSetting GetAdminSetting(int AdminModuleId); + Models.AdminSetting SetAdminSettings(Models.AdminSetting adminSetting); + } + + public class AdminSettingRepository : IAdminSettingsRepository, ITransientService + { + private readonly IDbContextFactory _factory; + + public AdminSettingRepository(IDbContextFactory factory) + { + _factory = factory; + } + + public AdminSetting GetAdminSetting(int AdminModuleId) + { + using var db = _factory.CreateDbContext(); + return db.AdminSettings.First(); + } + + public AdminSetting SetAdminSettings(AdminSetting adminSetting) + { + using var db = _factory.CreateDbContext(); + db.Entry(adminSetting).State = EntityState.Modified; + db.SaveChanges(); + return adminSetting; + } + } +} diff --git a/Server/SZUAbsolventenverein.Module.AdminModules.Server.csproj b/Server/SZUAbsolventenverein.Module.AdminModules.Server.csproj index e2b1ae3..093cdc1 100644 --- a/Server/SZUAbsolventenverein.Module.AdminModules.Server.csproj +++ b/Server/SZUAbsolventenverein.Module.AdminModules.Server.csproj @@ -19,10 +19,10 @@ - - - - + + + + diff --git a/Server/Services/AdminModulesService.cs b/Server/Services/AdminModulesService.cs index b64e269..9e4f7d5 100644 --- a/Server/Services/AdminModulesService.cs +++ b/Server/Services/AdminModulesService.cs @@ -168,7 +168,7 @@ namespace SZUAbsolventenverein.Module.AdminModules.Services User user = _userRepository.GetUser(userid); IdentityUser identityuser = await _identityUserManager.FindByNameAsync(user.Username); string body = template.Content; - + // Fields befüllen. string token = await _identityUserManager.GeneratePasswordResetTokenAsync(identityuser); string url = _alias.Protocol + _alias.Name + "/reset?name=" + user.Username + "&token=" + WebUtility.UrlEncode(token); diff --git a/Server/Services/AdminSettingsService.cs b/Server/Services/AdminSettingsService.cs new file mode 100644 index 0000000..c873c29 --- /dev/null +++ b/Server/Services/AdminSettingsService.cs @@ -0,0 +1,75 @@ +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Identity; +using Oqtane.Enums; +using Oqtane.Extensions; +using Oqtane.Infrastructure; +using Oqtane.Models; +using Oqtane.Repository; +using Oqtane.Security; +using Oqtane.Shared; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Reflection; +using System.Threading.Tasks; +using SZUAbsolventenverein.Module.AdminModules.Models; +using SZUAbsolventenverein.Module.AdminModules.Repository; +using SZUAbsolventenverein.Module.AdminSettings.Services; + +namespace SZUAbsolventenverein.Module.AdminModules.Services +{ + public class ServerAdminSettingsService : IAdminSettingsService + { + private readonly IAdminSettingsRepository _AdminSettingsRepository; + private readonly UserManager _identityUserManager; + private readonly IUserPermissions _userPermissions; + private readonly IRoleRepository _roleRepository; + private readonly IUserRepository _userRepository; + private readonly IUserRoleRepository _userRoleRepository; + private readonly INotificationRepository _notifications; + private readonly ILogManager _logger; + private readonly IHttpContextAccessor _accessor; + private readonly Alias _alias; + + public ServerAdminSettingsService(IAdminSettingsRepository AdminSettingsRepository, UserManager identityUserManager, INotificationRepository notifications, IUserPermissions userPermissions, IRoleRepository roleRepository, IUserRepository userRepository, IUserRoleRepository userRoleRepository, ITenantManager tenantManager, ILogManager logger, IHttpContextAccessor accessor) + { + _AdminSettingsRepository = AdminSettingsRepository; + _identityUserManager = identityUserManager; + _userPermissions = userPermissions; + _roleRepository = roleRepository; + _userRepository = userRepository; + _userRoleRepository = userRoleRepository; + _notifications = notifications; + _logger = logger; + _accessor = accessor; + _alias = tenantManager.GetAlias(); + } + + public Task GetAdminSettingsAsync(int ModuleId) + { + if (_userPermissions.IsAuthorized(_accessor.HttpContext.User, _alias.SiteId, EntityNames.Module, ModuleId, PermissionNames.View)) + { + return Task.FromResult(_AdminSettingsRepository.GetAdminSetting(ModuleId)); + } + else + { + _logger.Log(LogLevel.Error, this, LogFunction.Security, "Unauthorized AdminModules Get Attempt {ModuleId}", ModuleId); + return null; + } + } + + public Task SetAdminSettingsAsync(AdminSetting AdminSettings) + { + if (_userPermissions.IsAuthorized(_accessor.HttpContext.User, _alias.SiteId, EntityNames.Module, 1, PermissionNames.View)) + { + return Task.FromResult(_AdminSettingsRepository.SetAdminSettings(AdminSettings)); + } + else + { + _logger.Log(LogLevel.Error, this, LogFunction.Security, "Unauthorized AdminModules Get Attempt {ModuleId}", 1); + return null; + } + } + } +} diff --git a/Server/Startup/ServerStartup.cs b/Server/Startup/ServerStartup.cs index d4e2e61..42fa326 100644 --- a/Server/Startup/ServerStartup.cs +++ b/Server/Startup/ServerStartup.cs @@ -1,9 +1,12 @@ using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Identity; using Microsoft.Extensions.DependencyInjection; using Oqtane.Infrastructure; +using System; using SZUAbsolventenverein.Module.AdminModules.Repository; using SZUAbsolventenverein.Module.AdminModules.Services; +using SZUAbsolventenverein.Module.AdminSettings.Services; namespace SZUAbsolventenverein.Module.AdminModules.Startup { @@ -21,7 +24,13 @@ 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); } } diff --git a/Shared/Models/AdminSettings.cs b/Shared/Models/AdminSettings.cs new file mode 100644 index 0000000..6c7f9c1 --- /dev/null +++ b/Shared/Models/AdminSettings.cs @@ -0,0 +1,16 @@ +using System; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using Oqtane.Models; + +namespace SZUAbsolventenverein.Module.AdminModules.Models +{ + [Table("SZUAbsolventenvereinAdminSettings")] + public class AdminSetting + { + [Key] + public int AdminSettingsId { get; set; } + public int ModuleId { get; set; } + public int TokenLifeTimeInDays { get; set; } + } +}