Localizer
+
+
+
+
+
+
+
+ Anmeldung zum Event
+
+ Willst du am Event teilnehmen?
+
+
+
+
+
+
+ @if (!string.IsNullOrEmpty(Status))
+ {
+ Status: @Status
+ }
+
+ @code {
+ private string Status;
+
+ private void Zusage()
+ {
+ Status = "Du hast zugesagt. Wir freuen uns auf dich!";
+ }
+
+ private void Absage()
+ {
+ Status = "Du hast abgesagt. Schade, vielleicht nächstes Mal!";
+ }
+ }
+
+
+ Anmeldung
+
\ No newline at end of file
diff --git a/Client/Modules/AdamGais.Module.AnmeldeTool/ModuleInfo.cs b/Client/Modules/AdamGais.Module.AnmeldeTool/ModuleInfo.cs
new file mode 100644
index 0000000..7b5b222
--- /dev/null
+++ b/Client/Modules/AdamGais.Module.AnmeldeTool/ModuleInfo.cs
@@ -0,0 +1,19 @@
+using Oqtane.Models;
+using Oqtane.Modules;
+
+namespace AdamGais.Module.AnmeldeTool
+{
+ public class ModuleInfo : IModule
+ {
+ public ModuleDefinition ModuleDefinition => new ModuleDefinition
+ {
+ Name = "AnmeldeTool",
+ Description = "AnmeldeTool",
+ Version = "1.0.0",
+ ServerManagerType = "AdamGais.Module.AnmeldeTool.Manager.AnmeldeToolManager, AdamGais.Module.AnmeldeTool.Server.Oqtane",
+ ReleaseVersions = "1.0.0",
+ Dependencies = "AdamGais.Module.AnmeldeTool.Shared.Oqtane",
+ PackageName = "AdamGais.Module.AnmeldeTool"
+ };
+ }
+}
diff --git a/Client/Modules/AdamGais.Module.AnmeldeTool/Settings.razor b/Client/Modules/AdamGais.Module.AnmeldeTool/Settings.razor
new file mode 100644
index 0000000..e9f8aa7
--- /dev/null
+++ b/Client/Modules/AdamGais.Module.AnmeldeTool/Settings.razor
@@ -0,0 +1,47 @@
+@namespace AdamGais.Module.AnmeldeTool
+@inherits ModuleBase
+@inject ISettingService SettingService
+@inject IStringLocalizer Localizer
+
+
+
+@code {
+ private string resourceType = "AdamGais.Module.AnmeldeTool.Settings, AdamGais.Module.AnmeldeTool.Client.Oqtane"; // for localization
+ public override string Title => "AnmeldeTool 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/Properties/Resources.Designer.cs b/Client/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..c164961
--- /dev/null
+++ b/Client/Properties/Resources.Designer.cs
@@ -0,0 +1,63 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace AdamGais.Module.AnmeldeTool.Client.Properties {
+ using System;
+
+
+ ///
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ ///
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ ///
+ /// Returns the cached ResourceManager instance used by this class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("AdamGais.Module.AnmeldeTool.Client.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+ }
+}
diff --git a/Client/Properties/Resources.resx b/Client/Properties/Resources.resx
new file mode 100644
index 0000000..4fdb1b6
--- /dev/null
+++ b/Client/Properties/Resources.resx
@@ -0,0 +1,101 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 1.3
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/Client/Resources/AdamGais.Module.AnmeldeTool/Edit - Copy.resx b/Client/Resources/AdamGais.Module.AnmeldeTool/Edit - Copy.resx
new file mode 100644
index 0000000..6de8e1d
--- /dev/null
+++ b/Client/Resources/AdamGais.Module.AnmeldeTool/Edit - Copy.resx
@@ -0,0 +1,141 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Name:
+
+
+ Enter the name
+
+
+ Save
+
+
+ Cancel
+
+
+ Error Loading AnmeldeTool
+
+
+ Please Provide All Required Information
+
+
+ Error Saving AnmeldeTool
+
+
\ No newline at end of file
diff --git a/Client/Resources/AdamGais.Module.AnmeldeTool/Edit.resx b/Client/Resources/AdamGais.Module.AnmeldeTool/Edit.resx
new file mode 100644
index 0000000..6de8e1d
--- /dev/null
+++ b/Client/Resources/AdamGais.Module.AnmeldeTool/Edit.resx
@@ -0,0 +1,141 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Name:
+
+
+ Enter the name
+
+
+ Save
+
+
+ Cancel
+
+
+ Error Loading AnmeldeTool
+
+
+ Please Provide All Required Information
+
+
+ Error Saving AnmeldeTool
+
+
\ No newline at end of file
diff --git a/Client/Resources/AdamGais.Module.AnmeldeTool/Index.resx b/Client/Resources/AdamGais.Module.AnmeldeTool/Index.resx
new file mode 100644
index 0000000..b70adaa
--- /dev/null
+++ b/Client/Resources/AdamGais.Module.AnmeldeTool/Index.resx
@@ -0,0 +1,147 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Name
+
+
+ Add AnmeldeTool
+
+
+ Edit
+
+
+ Delete
+
+
+ Delete AnmeldeTool
+
+
+ Are You Sure You Wish To Delete This AnmeldeTool?
+
+
+ No AnmeldeTools To Display
+
+
+ Error Loading AnmeldeTool
+
+
+ Error Deleting AnmeldeTool
+
+
\ No newline at end of file
diff --git a/Client/Resources/AdamGais.Module.AnmeldeTool/Settings.resx b/Client/Resources/AdamGais.Module.AnmeldeTool/Settings.resx
new file mode 100644
index 0000000..83dc88f
--- /dev/null
+++ b/Client/Resources/AdamGais.Module.AnmeldeTool/Settings.resx
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Name:
+
+
+ Enter a value
+
+
\ No newline at end of file
diff --git a/Client/Services/AnmeldeToolService.cs b/Client/Services/AnmeldeToolService.cs
new file mode 100644
index 0000000..a9aaadf
--- /dev/null
+++ b/Client/Services/AnmeldeToolService.cs
@@ -0,0 +1,42 @@
+using System.Collections.Generic;
+using System.Linq;
+using System.Net.Http;
+using System.Threading.Tasks;
+using Oqtane.Services;
+using Oqtane.Shared;
+
+namespace AdamGais.Module.AnmeldeTool.Services
+{
+ public class AnmeldeToolService : ServiceBase, IAnmeldeToolService
+ {
+ public AnmeldeToolService(HttpClient http, SiteState siteState) : base(http, siteState) { }
+
+ private string Apiurl => CreateApiUrl("AnmeldeTool");
+
+ public async Task> GetAnmeldeToolsAsync(int ModuleId)
+ {
+ List AnmeldeTools = await GetJsonAsync>(CreateAuthorizationPolicyUrl($"{Apiurl}?moduleid={ModuleId}", EntityNames.Module, ModuleId), Enumerable.Empty().ToList());
+ return AnmeldeTools.OrderBy(item => item.Name).ToList();
+ }
+
+ public async Task GetAnmeldeToolAsync(int AnmeldeToolId, int ModuleId)
+ {
+ return await GetJsonAsync(CreateAuthorizationPolicyUrl($"{Apiurl}/{AnmeldeToolId}/{ModuleId}", EntityNames.Module, ModuleId));
+ }
+
+ public async Task AddAnmeldeToolAsync(Models.AnmeldeTool AnmeldeTool)
+ {
+ return await PostJsonAsync(CreateAuthorizationPolicyUrl($"{Apiurl}", EntityNames.Module, AnmeldeTool.ModuleId), AnmeldeTool);
+ }
+
+ public async Task UpdateAnmeldeToolAsync(Models.AnmeldeTool AnmeldeTool)
+ {
+ return await PutJsonAsync(CreateAuthorizationPolicyUrl($"{Apiurl}/{AnmeldeTool.AnmeldeToolId}", EntityNames.Module, AnmeldeTool.ModuleId), AnmeldeTool);
+ }
+
+ public async Task DeleteAnmeldeToolAsync(int AnmeldeToolId, int ModuleId)
+ {
+ await DeleteAsync(CreateAuthorizationPolicyUrl($"{Apiurl}/{AnmeldeToolId}/{ModuleId}", EntityNames.Module, ModuleId));
+ }
+ }
+}
diff --git a/Client/Startup/ClientStartup.cs b/Client/Startup/ClientStartup.cs
new file mode 100644
index 0000000..b92b0e5
--- /dev/null
+++ b/Client/Startup/ClientStartup.cs
@@ -0,0 +1,14 @@
+using Microsoft.Extensions.DependencyInjection;
+using Oqtane.Services;
+using AdamGais.Module.AnmeldeTool.Services;
+
+namespace AdamGais.Module.AnmeldeTool.Startup
+{
+ public class ClientStartup : IClientStartup
+ {
+ public void ConfigureServices(IServiceCollection services)
+ {
+ services.AddScoped();
+ }
+ }
+}
diff --git a/Client/_Imports.razor b/Client/_Imports.razor
new file mode 100644
index 0000000..2f6fb1b
--- /dev/null
+++ b/Client/_Imports.razor
@@ -0,0 +1,24 @@
+@using System
+@using System.Linq
+@using System.Collections.Generic
+@using System.Net.Http
+@using System.Net.Http.Json
+
+@using Microsoft.AspNetCore.Components.Authorization
+@using Microsoft.AspNetCore.Components.Routing
+@using Microsoft.AspNetCore.Components.Web
+@using Microsoft.Extensions.Localization
+@using Microsoft.JSInterop
+
+@using Oqtane.Models
+@using Oqtane.Modules
+@using Oqtane.Modules.Controls
+@using Oqtane.Providers
+@using Oqtane.Security
+@using Oqtane.Services
+@using Oqtane.Shared
+@using Oqtane.Themes
+@using Oqtane.Themes.Controls
+@using Oqtane.UI
+@using Oqtane.Enums
+@using Oqtane.Interfaces
\ No newline at end of file
diff --git a/Package/AdamGais.Module.AnmeldeTool.Package.csproj b/Package/AdamGais.Module.AnmeldeTool.Package.csproj
new file mode 100644
index 0000000..4b5a2bb
--- /dev/null
+++ b/Package/AdamGais.Module.AnmeldeTool.Package.csproj
@@ -0,0 +1,29 @@
+
+
+
+ net9.0
+ false
+ false
+
+
+
+
+ True
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Package/AdamGais.Module.AnmeldeTool.nuspec b/Package/AdamGais.Module.AnmeldeTool.nuspec
new file mode 100644
index 0000000..2f4d588
--- /dev/null
+++ b/Package/AdamGais.Module.AnmeldeTool.nuspec
@@ -0,0 +1,32 @@
+
+
+
+ $projectname$
+ 1.0.0
+ AdamGais
+ AdamGais
+ AnmeldeTool
+ AnmeldeTool
+ AdamGais
+ false
+ MIT
+ https://github.com/oqtane/oqtane.framework
+ icon.png
+ oqtane module
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Package/debug.cmd b/Package/debug.cmd
new file mode 100644
index 0000000..4a87708
--- /dev/null
+++ b/Package/debug.cmd
@@ -0,0 +1,11 @@
+@echo off
+set TargetFramework=%1
+set ProjectName=%2
+
+XCOPY "..\Client\bin\Debug\%TargetFramework%\%ProjectName%.Client.Oqtane.dll" "..\..\oqtane.framework-dev\Oqtane.Server\bin\Debug\%TargetFramework%\" /Y
+XCOPY "..\Client\bin\Debug\%TargetFramework%\%ProjectName%.Client.Oqtane.pdb" "..\..\oqtane.framework-dev\Oqtane.Server\bin\Debug\%TargetFramework%\" /Y
+XCOPY "..\Server\bin\Debug\%TargetFramework%\%ProjectName%.Server.Oqtane.dll" "..\..\oqtane.framework-dev\Oqtane.Server\bin\Debug\%TargetFramework%\" /Y
+XCOPY "..\Server\bin\Debug\%TargetFramework%\%ProjectName%.Server.Oqtane.pdb" "..\..\oqtane.framework-dev\Oqtane.Server\bin\Debug\%TargetFramework%\" /Y
+XCOPY "..\Shared\bin\Debug\%TargetFramework%\%ProjectName%.Shared.Oqtane.dll" "..\..\oqtane.framework-dev\Oqtane.Server\bin\Debug\%TargetFramework%\" /Y
+XCOPY "..\Shared\bin\Debug\%TargetFramework%\%ProjectName%.Shared.Oqtane.pdb" "..\..\oqtane.framework-dev\Oqtane.Server\bin\Debug\%TargetFramework%\" /Y
+XCOPY "..\Server\wwwroot\*" "..\..\oqtane.framework-dev\Oqtane.Server\wwwroot\" /Y /S /I
\ No newline at end of file
diff --git a/Package/debug.sh b/Package/debug.sh
new file mode 100644
index 0000000..9bb748f
--- /dev/null
+++ b/Package/debug.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+
+TargetFramework=$1
+ProjectName=$2
+
+cp -f "../Client/bin/Debug/$TargetFramework/$ProjectName$.Client.Oqtane.dll" "../../oqtane.framework-dev/Oqtane.Server/bin/Debug/$TargetFramework/"
+cp -f "../Client/bin/Debug/$TargetFramework/$ProjectName$.Client.Oqtane.pdb" "../../oqtane.framework-dev/Oqtane.Server/bin/Debug/$TargetFramework/"
+cp -f "../Server/bin/Debug/$TargetFramework/$ProjectName$.Server.Oqtane.dll" "../../oqtane.framework-dev/Oqtane.Server/bin/Debug/$TargetFramework/"
+cp -f "../Server/bin/Debug/$TargetFramework/$ProjectName$.Server.Oqtane.pdb" "../../oqtane.framework-dev/Oqtane.Server/bin/Debug/$TargetFramework/"
+cp -f "../Shared/bin/Debug/$TargetFramework/$ProjectName$.Shared.Oqtane.dll" "../../oqtane.framework-dev/Oqtane.Server/bin/Debug/$TargetFramework/"
+cp -f "../Shared/bin/Debug/$TargetFramework/$ProjectName$.Shared.Oqtane.pdb" "../../oqtane.framework-dev/Oqtane.Server/bin/Debug/$TargetFramework/"
+cp -rf "../Server/wwwroot/"* "../../oqtane.framework-dev/Oqtane.Server/wwwroot/"
\ No newline at end of file
diff --git a/Package/icon.png b/Package/icon.png
new file mode 100644
index 0000000..7422cf2
Binary files /dev/null and b/Package/icon.png differ
diff --git a/Package/release.cmd b/Package/release.cmd
new file mode 100644
index 0000000..a14a149
--- /dev/null
+++ b/Package/release.cmd
@@ -0,0 +1,7 @@
+@echo off
+set TargetFramework=%1
+set ProjectName=%2
+
+del "*.nupkg"
+"..\..\oqtane.framework-dev\oqtane.package\nuget.exe" pack %ProjectName%.nuspec -Properties targetframework=%TargetFramework%;projectname=%ProjectName%
+XCOPY "*.nupkg" "..\..\oqtane.framework-dev\Oqtane.Server\Packages\" /Y
\ No newline at end of file
diff --git a/Package/release.sh b/Package/release.sh
new file mode 100644
index 0000000..f948175
--- /dev/null
+++ b/Package/release.sh
@@ -0,0 +1,5 @@
+TargetFramework=$1
+ProjectName=$2
+
+"..\..\oqtane.framework-dev\oqtane.package\nuget.exe" pack %ProjectName%.nuspec -Properties targetframework=%TargetFramework%;projectname=%ProjectName%
+cp -f "*.nupkg" "..\..\oqtane.framework-dev\Oqtane.Server\Packages\"
\ No newline at end of file
diff --git a/Server/AdamGais.Module.AnmeldeTool.Server.csproj b/Server/AdamGais.Module.AnmeldeTool.Server.csproj
new file mode 100644
index 0000000..8334a3c
--- /dev/null
+++ b/Server/AdamGais.Module.AnmeldeTool.Server.csproj
@@ -0,0 +1,36 @@
+
+
+
+ net9.0
+ true
+ 1.0.0
+ AdamGais.Module.AnmeldeTool
+ AdamGais
+ AdamGais
+ AnmeldeTool
+ AdamGais
+ AdamGais.Module.AnmeldeTool.Server.Oqtane
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ..\..\oqtane.framework-dev\Oqtane.Server\bin\Debug\net9.0\Oqtane.Server.dll
+ ..\..\oqtane.framework-dev\Oqtane.Server\bin\Debug\net9.0\Oqtane.Shared.dll
+
+
diff --git a/Server/Controllers/AnmeldeToolController.cs b/Server/Controllers/AnmeldeToolController.cs
new file mode 100644
index 0000000..e6eab62
--- /dev/null
+++ b/Server/Controllers/AnmeldeToolController.cs
@@ -0,0 +1,114 @@
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Authorization;
+using System.Collections.Generic;
+using Microsoft.AspNetCore.Http;
+using Oqtane.Shared;
+using Oqtane.Enums;
+using Oqtane.Infrastructure;
+using AdamGais.Module.AnmeldeTool.Services;
+using Oqtane.Controllers;
+using System.Net;
+using System.Threading.Tasks;
+
+namespace AdamGais.Module.AnmeldeTool.Controllers
+{
+ [Route(ControllerRoutes.ApiRoute)]
+ public class AnmeldeToolController : ModuleControllerBase
+ {
+ private readonly IAnmeldeToolService _AnmeldeToolService;
+
+ public AnmeldeToolController(IAnmeldeToolService AnmeldeToolService, ILogManager logger, IHttpContextAccessor accessor) : base(logger, accessor)
+ {
+ _AnmeldeToolService = AnmeldeToolService;
+ }
+
+ // GET: api/?moduleid=x
+ [HttpGet]
+ [Authorize(Policy = PolicyNames.ViewModule)]
+ public async Task> Get(string moduleid)
+ {
+ int ModuleId;
+ if (int.TryParse(moduleid, out ModuleId) && IsAuthorizedEntityId(EntityNames.Module, ModuleId))
+ {
+ return await _AnmeldeToolService.GetAnmeldeToolsAsync(ModuleId);
+ }
+ else
+ {
+ _logger.Log(LogLevel.Error, this, LogFunction.Security, "Unauthorized AnmeldeTool Get Attempt {ModuleId}", moduleid);
+ HttpContext.Response.StatusCode = (int)HttpStatusCode.Forbidden;
+ return null;
+ }
+ }
+
+ // GET api//5
+ [HttpGet("{id}/{moduleid}")]
+ [Authorize(Policy = PolicyNames.ViewModule)]
+ public async Task Get(int id, int moduleid)
+ {
+ Models.AnmeldeTool AnmeldeTool = await _AnmeldeToolService.GetAnmeldeToolAsync(id, moduleid);
+ if (AnmeldeTool != null && IsAuthorizedEntityId(EntityNames.Module, AnmeldeTool.ModuleId))
+ {
+ return AnmeldeTool;
+ }
+ else
+ {
+ _logger.Log(LogLevel.Error, this, LogFunction.Security, "Unauthorized AnmeldeTool Get Attempt {AnmeldeToolId} {ModuleId}", id, moduleid);
+ HttpContext.Response.StatusCode = (int)HttpStatusCode.Forbidden;
+ return null;
+ }
+ }
+
+ // POST api/
+ [HttpPost]
+ [Authorize(Policy = PolicyNames.EditModule)]
+ public async Task Post([FromBody] Models.AnmeldeTool AnmeldeTool)
+ {
+ if (ModelState.IsValid && IsAuthorizedEntityId(EntityNames.Module, AnmeldeTool.ModuleId))
+ {
+ AnmeldeTool = await _AnmeldeToolService.AddAnmeldeToolAsync(AnmeldeTool);
+ }
+ else
+ {
+ _logger.Log(LogLevel.Error, this, LogFunction.Security, "Unauthorized AnmeldeTool Post Attempt {AnmeldeTool}", AnmeldeTool);
+ HttpContext.Response.StatusCode = (int)HttpStatusCode.Forbidden;
+ AnmeldeTool = null;
+ }
+ return AnmeldeTool;
+ }
+
+ // PUT api//5
+ [HttpPut("{id}")]
+ [Authorize(Policy = PolicyNames.EditModule)]
+ public async Task Put(int id, [FromBody] Models.AnmeldeTool AnmeldeTool)
+ {
+ if (ModelState.IsValid && AnmeldeTool.AnmeldeToolId == id && IsAuthorizedEntityId(EntityNames.Module, AnmeldeTool.ModuleId))
+ {
+ AnmeldeTool = await _AnmeldeToolService.UpdateAnmeldeToolAsync(AnmeldeTool);
+ }
+ else
+ {
+ _logger.Log(LogLevel.Error, this, LogFunction.Security, "Unauthorized AnmeldeTool Put Attempt {AnmeldeTool}", AnmeldeTool);
+ HttpContext.Response.StatusCode = (int)HttpStatusCode.Forbidden;
+ AnmeldeTool = null;
+ }
+ return AnmeldeTool;
+ }
+
+ // DELETE api//5
+ [HttpDelete("{id}/{moduleid}")]
+ [Authorize(Policy = PolicyNames.EditModule)]
+ public async Task Delete(int id, int moduleid)
+ {
+ Models.AnmeldeTool AnmeldeTool = await _AnmeldeToolService.GetAnmeldeToolAsync(id, moduleid);
+ if (AnmeldeTool != null && IsAuthorizedEntityId(EntityNames.Module, AnmeldeTool.ModuleId))
+ {
+ await _AnmeldeToolService.DeleteAnmeldeToolAsync(id, AnmeldeTool.ModuleId);
+ }
+ else
+ {
+ _logger.Log(LogLevel.Error, this, LogFunction.Security, "Unauthorized AnmeldeTool Delete Attempt {AnmeldeToolId} {ModuleId}", id, moduleid);
+ HttpContext.Response.StatusCode = (int)HttpStatusCode.Forbidden;
+ }
+ }
+ }
+}
diff --git a/Server/Manager/AnmeldeToolManager.cs b/Server/Manager/AnmeldeToolManager.cs
new file mode 100644
index 0000000..eeaaf27
--- /dev/null
+++ b/Server/Manager/AnmeldeToolManager.cs
@@ -0,0 +1,87 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text.Json;
+using Oqtane.Modules;
+using Oqtane.Models;
+using Oqtane.Infrastructure;
+using Oqtane.Interfaces;
+using Oqtane.Enums;
+using Oqtane.Repository;
+using AdamGais.Module.AnmeldeTool.Repository;
+using System.Threading.Tasks;
+
+namespace AdamGais.Module.AnmeldeTool.Manager
+{
+ public class AnmeldeToolManager : MigratableModuleBase, IInstallable, IPortable, ISearchable
+ {
+ private readonly IAnmeldeToolRepository _AnmeldeToolRepository;
+ private readonly IDBContextDependencies _DBContextDependencies;
+
+ public AnmeldeToolManager(IAnmeldeToolRepository AnmeldeToolRepository, IDBContextDependencies DBContextDependencies)
+ {
+ _AnmeldeToolRepository = AnmeldeToolRepository;
+ _DBContextDependencies = DBContextDependencies;
+ }
+
+ public bool Install(Tenant tenant, string version)
+ {
+ return Migrate(new AnmeldeToolContext(_DBContextDependencies), tenant, MigrationType.Up);
+ }
+
+ public bool Uninstall(Tenant tenant)
+ {
+ return Migrate(new AnmeldeToolContext(_DBContextDependencies), tenant, MigrationType.Down);
+ }
+
+ public string ExportModule(Oqtane.Models.Module module)
+ {
+ string content = "";
+ List AnmeldeTools = _AnmeldeToolRepository.GetAnmeldeTools(module.ModuleId).ToList();
+ if (AnmeldeTools != null)
+ {
+ content = JsonSerializer.Serialize(AnmeldeTools);
+ }
+ return content;
+ }
+
+ public void ImportModule(Oqtane.Models.Module module, string content, string version)
+ {
+ List AnmeldeTools = null;
+ if (!string.IsNullOrEmpty(content))
+ {
+ AnmeldeTools = JsonSerializer.Deserialize>(content);
+ }
+ if (AnmeldeTools != null)
+ {
+ foreach(var AnmeldeTool in AnmeldeTools)
+ {
+ _AnmeldeToolRepository.AddAnmeldeTool(new Models.AnmeldeTool { ModuleId = module.ModuleId, Name = AnmeldeTool.Name });
+ }
+ }
+ }
+
+ public Task> GetSearchContentsAsync(PageModule pageModule, DateTime lastIndexedOn)
+ {
+ var searchContentList = new List();
+
+ foreach (var AnmeldeTool in _AnmeldeToolRepository.GetAnmeldeTools(pageModule.ModuleId))
+ {
+ if (AnmeldeTool.ModifiedOn >= lastIndexedOn)
+ {
+ searchContentList.Add(new SearchContent
+ {
+ EntityName = "AdamGaisAnmeldeTool",
+ EntityId = AnmeldeTool.AnmeldeToolId.ToString(),
+ Title = AnmeldeTool.Name,
+ Body = AnmeldeTool.Name,
+ ContentModifiedBy = AnmeldeTool.ModifiedBy,
+ ContentModifiedOn = AnmeldeTool.ModifiedOn
+ });
+ }
+ }
+
+ return Task.FromResult(searchContentList);
+ }
+ }
+}
diff --git a/Server/Migrations/01000000_InitializeModule.cs b/Server/Migrations/01000000_InitializeModule.cs
new file mode 100644
index 0000000..586dedd
--- /dev/null
+++ b/Server/Migrations/01000000_InitializeModule.cs
@@ -0,0 +1,30 @@
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Oqtane.Databases.Interfaces;
+using Oqtane.Migrations;
+using AdamGais.Module.AnmeldeTool.Migrations.EntityBuilders;
+using AdamGais.Module.AnmeldeTool.Repository;
+
+namespace AdamGais.Module.AnmeldeTool.Migrations
+{
+ [DbContext(typeof(AnmeldeToolContext))]
+ [Migration("AdamGais.Module.AnmeldeTool.01.00.00.00")]
+ public class InitializeModule : MultiDatabaseMigration
+ {
+ public InitializeModule(IDatabase database) : base(database)
+ {
+ }
+
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ var entityBuilder = new AnmeldeToolEntityBuilder(migrationBuilder, ActiveDatabase);
+ entityBuilder.Create();
+ }
+
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ var entityBuilder = new AnmeldeToolEntityBuilder(migrationBuilder, ActiveDatabase);
+ entityBuilder.Drop();
+ }
+ }
+}
diff --git a/Server/Migrations/EntityBuilders/AnmeldeToolEntityBuilder.cs b/Server/Migrations/EntityBuilders/AnmeldeToolEntityBuilder.cs
new file mode 100644
index 0000000..13954df
--- /dev/null
+++ b/Server/Migrations/EntityBuilders/AnmeldeToolEntityBuilder.cs
@@ -0,0 +1,36 @@
+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;
+
+namespace AdamGais.Module.AnmeldeTool.Migrations.EntityBuilders
+{
+ public class AnmeldeToolEntityBuilder : AuditableBaseEntityBuilder
+ {
+ private const string _entityTableName = "AdamGaisAnmeldeTool";
+ private readonly PrimaryKey _primaryKey = new("PK_AdamGaisAnmeldeTool", x => x.AnmeldeToolId);
+ private readonly ForeignKey _moduleForeignKey = new("FK_AdamGaisAnmeldeTool_Module", x => x.ModuleId, "Module", "ModuleId", ReferentialAction.Cascade);
+
+ public AnmeldeToolEntityBuilder(MigrationBuilder migrationBuilder, IDatabase database) : base(migrationBuilder, database)
+ {
+ EntityTableName = _entityTableName;
+ PrimaryKey = _primaryKey;
+ ForeignKeys.Add(_moduleForeignKey);
+ }
+
+ protected override AnmeldeToolEntityBuilder BuildTable(ColumnsBuilder table)
+ {
+ AnmeldeToolId = AddAutoIncrementColumn(table,"AnmeldeToolId");
+ ModuleId = AddIntegerColumn(table,"ModuleId");
+ Name = AddMaxStringColumn(table,"Name");
+ AddAuditableColumns(table);
+ return this;
+ }
+
+ public OperationBuilder AnmeldeToolId { get; set; }
+ public OperationBuilder ModuleId { get; set; }
+ public OperationBuilder Name { get; set; }
+ }
+}
diff --git a/Server/Repository/AnmeldeToolContext.cs b/Server/Repository/AnmeldeToolContext.cs
new file mode 100644
index 0000000..602cfc7
--- /dev/null
+++ b/Server/Repository/AnmeldeToolContext.cs
@@ -0,0 +1,26 @@
+using Microsoft.EntityFrameworkCore;
+using Microsoft.AspNetCore.Http;
+using Oqtane.Modules;
+using Oqtane.Repository;
+using Oqtane.Infrastructure;
+using Oqtane.Repository.Databases.Interfaces;
+
+namespace AdamGais.Module.AnmeldeTool.Repository
+{
+ public class AnmeldeToolContext : DBContextBase, ITransientService, IMultiDatabase
+ {
+ public virtual DbSet AnmeldeTool { get; set; }
+
+ public AnmeldeToolContext(IDBContextDependencies DBContextDependencies) : base(DBContextDependencies)
+ {
+ // ContextBase handles multi-tenant database connections
+ }
+
+ protected override void OnModelCreating(ModelBuilder builder)
+ {
+ base.OnModelCreating(builder);
+
+ builder.Entity().ToTable(ActiveDatabase.RewriteName("AdamGaisAnmeldeTool"));
+ }
+ }
+}
diff --git a/Server/Repository/AnmeldeToolRepository.cs b/Server/Repository/AnmeldeToolRepository.cs
new file mode 100644
index 0000000..e196286
--- /dev/null
+++ b/Server/Repository/AnmeldeToolRepository.cs
@@ -0,0 +1,65 @@
+using Microsoft.EntityFrameworkCore;
+using System.Linq;
+using System.Collections.Generic;
+using Oqtane.Modules;
+
+namespace AdamGais.Module.AnmeldeTool.Repository
+{
+ public class AnmeldeToolRepository : IAnmeldeToolRepository, ITransientService
+ {
+ private readonly IDbContextFactory _factory;
+
+ public AnmeldeToolRepository(IDbContextFactory factory)
+ {
+ _factory = factory;
+ }
+
+ public IEnumerable GetAnmeldeTools(int ModuleId)
+ {
+ using var db = _factory.CreateDbContext();
+ return db.AnmeldeTool.Where(item => item.ModuleId == ModuleId).ToList();
+ }
+
+ public Models.AnmeldeTool GetAnmeldeTool(int AnmeldeToolId)
+ {
+ return GetAnmeldeTool(AnmeldeToolId, true);
+ }
+
+ public Models.AnmeldeTool GetAnmeldeTool(int AnmeldeToolId, bool tracking)
+ {
+ using var db = _factory.CreateDbContext();
+ if (tracking)
+ {
+ return db.AnmeldeTool.Find(AnmeldeToolId);
+ }
+ else
+ {
+ return db.AnmeldeTool.AsNoTracking().FirstOrDefault(item => item.AnmeldeToolId == AnmeldeToolId);
+ }
+ }
+
+ public Models.AnmeldeTool AddAnmeldeTool(Models.AnmeldeTool AnmeldeTool)
+ {
+ using var db = _factory.CreateDbContext();
+ db.AnmeldeTool.Add(AnmeldeTool);
+ db.SaveChanges();
+ return AnmeldeTool;
+ }
+
+ public Models.AnmeldeTool UpdateAnmeldeTool(Models.AnmeldeTool AnmeldeTool)
+ {
+ using var db = _factory.CreateDbContext();
+ db.Entry(AnmeldeTool).State = EntityState.Modified;
+ db.SaveChanges();
+ return AnmeldeTool;
+ }
+
+ public void DeleteAnmeldeTool(int AnmeldeToolId)
+ {
+ using var db = _factory.CreateDbContext();
+ Models.AnmeldeTool AnmeldeTool = db.AnmeldeTool.Find(AnmeldeToolId);
+ db.AnmeldeTool.Remove(AnmeldeTool);
+ db.SaveChanges();
+ }
+ }
+}
diff --git a/Server/Repository/IAnmeldeToolRepository.cs b/Server/Repository/IAnmeldeToolRepository.cs
new file mode 100644
index 0000000..1e16f20
--- /dev/null
+++ b/Server/Repository/IAnmeldeToolRepository.cs
@@ -0,0 +1,15 @@
+using System.Collections.Generic;
+using System.Threading.Tasks;
+
+namespace AdamGais.Module.AnmeldeTool.Repository
+{
+ public interface IAnmeldeToolRepository
+ {
+ IEnumerable GetAnmeldeTools(int ModuleId);
+ Models.AnmeldeTool GetAnmeldeTool(int AnmeldeToolId);
+ Models.AnmeldeTool GetAnmeldeTool(int AnmeldeToolId, bool tracking);
+ Models.AnmeldeTool AddAnmeldeTool(Models.AnmeldeTool AnmeldeTool);
+ Models.AnmeldeTool UpdateAnmeldeTool(Models.AnmeldeTool AnmeldeTool);
+ void DeleteAnmeldeTool(int AnmeldeToolId);
+ }
+}
diff --git a/Server/Services/AnmeldeToolService.cs b/Server/Services/AnmeldeToolService.cs
new file mode 100644
index 0000000..6d0983e
--- /dev/null
+++ b/Server/Services/AnmeldeToolService.cs
@@ -0,0 +1,101 @@
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Http;
+using Oqtane.Enums;
+using Oqtane.Infrastructure;
+using Oqtane.Models;
+using Oqtane.Security;
+using Oqtane.Shared;
+using AdamGais.Module.AnmeldeTool.Repository;
+
+namespace AdamGais.Module.AnmeldeTool.Services
+{
+ public class ServerAnmeldeToolService : IAnmeldeToolService
+ {
+ private readonly IAnmeldeToolRepository _AnmeldeToolRepository;
+ private readonly IUserPermissions _userPermissions;
+ private readonly ILogManager _logger;
+ private readonly IHttpContextAccessor _accessor;
+ private readonly Alias _alias;
+
+ public ServerAnmeldeToolService(IAnmeldeToolRepository AnmeldeToolRepository, IUserPermissions userPermissions, ITenantManager tenantManager, ILogManager logger, IHttpContextAccessor accessor)
+ {
+ _AnmeldeToolRepository = AnmeldeToolRepository;
+ _userPermissions = userPermissions;
+ _logger = logger;
+ _accessor = accessor;
+ _alias = tenantManager.GetAlias();
+ }
+
+ public Task> GetAnmeldeToolsAsync(int ModuleId)
+ {
+ if (_userPermissions.IsAuthorized(_accessor.HttpContext.User, _alias.SiteId, EntityNames.Module, ModuleId, PermissionNames.View))
+ {
+ return Task.FromResult(_AnmeldeToolRepository.GetAnmeldeTools(ModuleId).ToList());
+ }
+ else
+ {
+ _logger.Log(LogLevel.Error, this, LogFunction.Security, "Unauthorized AnmeldeTool Get Attempt {ModuleId}", ModuleId);
+ return null;
+ }
+ }
+
+ public Task GetAnmeldeToolAsync(int AnmeldeToolId, int ModuleId)
+ {
+ if (_userPermissions.IsAuthorized(_accessor.HttpContext.User, _alias.SiteId, EntityNames.Module, ModuleId, PermissionNames.View))
+ {
+ return Task.FromResult(_AnmeldeToolRepository.GetAnmeldeTool(AnmeldeToolId));
+ }
+ else
+ {
+ _logger.Log(LogLevel.Error, this, LogFunction.Security, "Unauthorized AnmeldeTool Get Attempt {AnmeldeToolId} {ModuleId}", AnmeldeToolId, ModuleId);
+ return null;
+ }
+ }
+
+ public Task AddAnmeldeToolAsync(Models.AnmeldeTool AnmeldeTool)
+ {
+ if (_userPermissions.IsAuthorized(_accessor.HttpContext.User, _alias.SiteId, EntityNames.Module, AnmeldeTool.ModuleId, PermissionNames.Edit))
+ {
+ AnmeldeTool = _AnmeldeToolRepository.AddAnmeldeTool(AnmeldeTool);
+ _logger.Log(LogLevel.Information, this, LogFunction.Create, "AnmeldeTool Added {AnmeldeTool}", AnmeldeTool);
+ }
+ else
+ {
+ _logger.Log(LogLevel.Error, this, LogFunction.Security, "Unauthorized AnmeldeTool Add Attempt {AnmeldeTool}", AnmeldeTool);
+ AnmeldeTool = null;
+ }
+ return Task.FromResult(AnmeldeTool);
+ }
+
+ public Task UpdateAnmeldeToolAsync(Models.AnmeldeTool AnmeldeTool)
+ {
+ if (_userPermissions.IsAuthorized(_accessor.HttpContext.User, _alias.SiteId, EntityNames.Module, AnmeldeTool.ModuleId, PermissionNames.Edit))
+ {
+ AnmeldeTool = _AnmeldeToolRepository.UpdateAnmeldeTool(AnmeldeTool);
+ _logger.Log(LogLevel.Information, this, LogFunction.Update, "AnmeldeTool Updated {AnmeldeTool}", AnmeldeTool);
+ }
+ else
+ {
+ _logger.Log(LogLevel.Error, this, LogFunction.Security, "Unauthorized AnmeldeTool Update Attempt {AnmeldeTool}", AnmeldeTool);
+ AnmeldeTool = null;
+ }
+ return Task.FromResult(AnmeldeTool);
+ }
+
+ public Task DeleteAnmeldeToolAsync(int AnmeldeToolId, int ModuleId)
+ {
+ if (_userPermissions.IsAuthorized(_accessor.HttpContext.User, _alias.SiteId, EntityNames.Module, ModuleId, PermissionNames.Edit))
+ {
+ _AnmeldeToolRepository.DeleteAnmeldeTool(AnmeldeToolId);
+ _logger.Log(LogLevel.Information, this, LogFunction.Delete, "AnmeldeTool Deleted {AnmeldeToolId}", AnmeldeToolId);
+ }
+ else
+ {
+ _logger.Log(LogLevel.Error, this, LogFunction.Security, "Unauthorized AnmeldeTool Delete Attempt {AnmeldeToolId} {ModuleId}", AnmeldeToolId, ModuleId);
+ }
+ return Task.CompletedTask;
+ }
+ }
+}
diff --git a/Server/Startup/ServerStartup.cs b/Server/Startup/ServerStartup.cs
new file mode 100644
index 0000000..3bc9e17
--- /dev/null
+++ b/Server/Startup/ServerStartup.cs
@@ -0,0 +1,28 @@
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.Extensions.DependencyInjection;
+using Oqtane.Infrastructure;
+using AdamGais.Module.AnmeldeTool.Repository;
+using AdamGais.Module.AnmeldeTool.Services;
+
+namespace AdamGais.Module.AnmeldeTool.Startup
+{
+ public class ServerStartup : IServerStartup
+ {
+ public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
+ {
+ // not implemented
+ }
+
+ public void ConfigureMvc(IMvcBuilder mvcBuilder)
+ {
+ // not implemented
+ }
+
+ public void ConfigureServices(IServiceCollection services)
+ {
+ services.AddTransient();
+ services.AddDbContextFactory(opt => { }, ServiceLifetime.Transient);
+ }
+ }
+}
diff --git a/Server/wwwroot/Modules/AdamGais.Module.AnmeldeTool/Module.css b/Server/wwwroot/Modules/AdamGais.Module.AnmeldeTool/Module.css
new file mode 100644
index 0000000..0856a26
--- /dev/null
+++ b/Server/wwwroot/Modules/AdamGais.Module.AnmeldeTool/Module.css
@@ -0,0 +1 @@
+/* Module Custom Styles */
\ No newline at end of file
diff --git a/Server/wwwroot/Modules/AdamGais.Module.AnmeldeTool/Module.js b/Server/wwwroot/Modules/AdamGais.Module.AnmeldeTool/Module.js
new file mode 100644
index 0000000..346094b
--- /dev/null
+++ b/Server/wwwroot/Modules/AdamGais.Module.AnmeldeTool/Module.js
@@ -0,0 +1,5 @@
+/* Module Script */
+var AdamGais = AdamGais || {};
+
+AdamGais.AnmeldeTool = {
+};
\ No newline at end of file
diff --git a/Server/wwwroot/_content/Placeholder.txt b/Server/wwwroot/_content/Placeholder.txt
new file mode 100644
index 0000000..5a324d7
--- /dev/null
+++ b/Server/wwwroot/_content/Placeholder.txt
@@ -0,0 +1,11 @@
+The _content folder should only contain static resources from shared razor component libraries (RCLs). Static resources can be extracted from shared RCL Nuget packages by executing a Publish task on the module's Server project to a local folder and copying the files from the _content folder which is created. Each shared RCL would have its own appropriately named subfolder within the module's _content folder.
+
+ie.
+
+/_content
+ /Radzen.Blazor
+ /css
+ /fonts
+ /syncfusion.blazor
+ /scripts
+ /styles
diff --git a/Shared/AdamGais.Module.AnmeldeTool.Shared.csproj b/Shared/AdamGais.Module.AnmeldeTool.Shared.csproj
new file mode 100644
index 0000000..f6b646c
--- /dev/null
+++ b/Shared/AdamGais.Module.AnmeldeTool.Shared.csproj
@@ -0,0 +1,22 @@
+
+
+
+ net9.0
+ 1.0.0
+ AdamGais.Module.AnmeldeTool
+ AdamGais
+ AdamGais
+ AnmeldeTool
+ AdamGais
+ AdamGais.Module.AnmeldeTool.Shared.Oqtane
+
+
+
+
+
+
+
+ ..\..\oqtane.framework-dev\Oqtane.Server\bin\Debug\net9.0\Oqtane.Shared.dll
+
+
+
diff --git a/Shared/Interfaces/IAnmeldeToolService.cs b/Shared/Interfaces/IAnmeldeToolService.cs
new file mode 100644
index 0000000..d8d13eb
--- /dev/null
+++ b/Shared/Interfaces/IAnmeldeToolService.cs
@@ -0,0 +1,18 @@
+using System.Collections.Generic;
+using System.Threading.Tasks;
+
+namespace AdamGais.Module.AnmeldeTool.Services
+{
+ public interface IAnmeldeToolService
+ {
+ Task> GetAnmeldeToolsAsync(int ModuleId);
+
+ Task GetAnmeldeToolAsync(int AnmeldeToolId, int ModuleId);
+
+ Task AddAnmeldeToolAsync(Models.AnmeldeTool AnmeldeTool);
+
+ Task UpdateAnmeldeToolAsync(Models.AnmeldeTool AnmeldeTool);
+
+ Task DeleteAnmeldeToolAsync(int AnmeldeToolId, int ModuleId);
+ }
+}
diff --git a/Shared/Models/AnmeldeTool.cs b/Shared/Models/AnmeldeTool.cs
new file mode 100644
index 0000000..dcd078d
--- /dev/null
+++ b/Shared/Models/AnmeldeTool.cs
@@ -0,0 +1,21 @@
+using System;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+using Oqtane.Models;
+
+namespace AdamGais.Module.AnmeldeTool.Models
+{
+ [Table("AdamGaisAnmeldeTool")]
+ public class AnmeldeTool : IAuditable
+ {
+ [Key]
+ public int AnmeldeToolId { get; set; }
+ public int ModuleId { get; set; }
+ public string Name { get; set; }
+
+ public string CreatedBy { get; set; }
+ public DateTime CreatedOn { get; set; }
+ public string ModifiedBy { get; set; }
+ public DateTime ModifiedOn { get; set; }
+ }
+}
diff --git a/template.json b/template.json
new file mode 100644
index 0000000..f216af6
--- /dev/null
+++ b/template.json
@@ -0,0 +1,6 @@
+{
+ "Title": "Default Module Template",
+ "Type": "External",
+ "Version": "5.2.0",
+ "Namespace": "AdamGais.Module.AnmeldeTool"
+}