Compare commits

...

18 Commits
main ... dev

Author SHA1 Message Date
Konstantin Hintermayer
f92c163e2c COSMETIC: Comment out unused vars, remove not released versions and update dependencies 2025-06-21 14:44:25 -07:00
106851fe94 Migrations Down Skript repariert, Eventregistrationservice import hinzugefügt 2025-06-21 00:31:32 +02:00
5f4794e42f Down Methode geschreiben für DropClumn von 3 Spalten 2025-06-16 10:59:54 +02:00
91f1121736 Merge branch 'dev' of https://git.kocoder.xyz/Diplomarbeit-Absolventenverein/Module.EventRegistration into dev 2025-06-16 09:10:08 +02:00
396e531b56 Migrations Down Skript repariert, Eventregistrationservice import hinzugefügt 2025-06-16 09:09:22 +02:00
29c93baa6d Event-Details: Erstellt von und bearbeitet von Felder gelöscht.
Closes: #12
Changed-Files: Details.razor
2025-06-02 12:45:46 +00:00
4f7e846661 New: Event und Response Export Methode
Changed: EventRegistrationManager.cs
Co-Author: Konstantin Hintermayer
2025-06-02 11:52:37 +02:00
Konstantin Hintermayer
f63681bce5 Update: Save DateTime's as UTC and parse to LocalTime at the client. 2025-05-30 23:54:11 +02:00
Konstantin Hintermayer
f280e49d96 Event: Add description, date and location.
Changed Files: Model >Event.cs & Client > Module > Edit.razor & Detail.razor
2025-05-30 23:39:32 +02:00
Konstantin Hintermayer
527f9aadc6 EventRegistrationService: Add Notifications on subscribe/unsubscribe.
Changed: EventRegistrationService.cs
Co-Author: Florian Edlmayer <florian.edlmayer@edu.szu.at>
2025-05-30 09:38:09 +02:00
Konstantin Hintermayer
287b932444 Event: Add Description, Date and Location Column.
Changed: 01000005_AddDescriptionDateTimeLocation.cs
Co-Author: Florian Edlmayer <florian.edlmayer@edu.szu.at>
2025-05-30 08:35:06 +02:00
Konstantin Hintermayer
38c5bef225 Bulk-Commit: Darft: Anmeldetool.
Interface Definition: done
Server-Side-Implementation: partly done (CR missing, potential Refactor, ...)
Client-Side-Implementation: started: (UI: done, Service: started, but works with SSR)
Missing: Permissions / Roles to restrict access to an event.
Missing: Fields on Event.
Missing: Good Styling
Time-Took: about 12 Hours.
Learning: Commit in smaller packets, rest will be discussed at CR
2025-05-14 20:40:10 +02:00
Konstantin Hintermayer
e45fce2e65 NEW: IResponseRepository and finish renaming 2025-05-12 11:53:39 +02:00
Konstantin Hintermayer
95724393ea Merge branch 'dev' of https://git.kocoder.xyz/Diplomarbeit-Absolventenverein/Module.EventRegistration into dev 2025-05-12 11:47:41 +02:00
Konstantin Hintermayer
7977f92a06 COSMETIC: rename EventRepository 2025-05-12 11:47:25 +02:00
fe75ba6fed Implemented EventRegistrationService Event Methods 2025-05-12 11:38:15 +02:00
Konstantin Hintermayer
467d11c97b NEW: EventRegistrationService: generated methods to implement 2025-05-12 10:54:57 +02:00
Konstantin Hintermayer
6e8f14d11d NEW: IEventRegistrationService Initial Interface Definition 2025-05-12 09:34:55 +02:00
23 changed files with 726 additions and 162 deletions

View File

@ -8,22 +8,42 @@
@inject NavigationManager NavigationManager
@inject IStringLocalizer<Edit> Localizer
<div class="container">
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="name" HelpText="Enter a name" ResourceKey="Name">Name: </Label>
<div class="col-sm-9">
<input id="name" class="form-control" @bind="@_name" required />
</div>
<h3>Anmeldung zum Event</h3>
<p>Willst du am Event (@_name) teilnehmen?</p>
<span>@_eventDate - @_location</span>
<div>
<p>@_description</p>
</div>
@if (PageState.User != null) {
@if (Status != null)
{
<p class="mt-3"><strong>Status:</strong>
@if (Status == true)
{
@Localizer["Zusage"]
<button class="btn btn-danger" @onclick="Absage">@Localizer["Absagen"]</button>
} else
{
@Localizer["Absage"]
<button class="btn btn-success" @onclick="Zusage">@Localizer["Zusagen"]</button>
}
</p>
} else {
<div class="buttons">
<button class="btn btn-success" @onclick="Zusage">@Localizer["Zusagen"]</button>
<button class="btn btn-danger" @onclick="Absage">@Localizer["Absagen"]</button>
</div>
</div>
<button type="button" class="btn btn-success" @onclick="Save">@Localizer["Save"]</button>
<NavLink class="btn btn-secondary" href="@NavigateUrl()">@Localizer["Cancel"]</NavLink>
<br /><br />
<AuditInfo CreatedBy="@_createdby" CreatedOn="@_createdon" ModifiedBy="@_modifiedby" ModifiedOn="@_modifiedon"></AuditInfo>
}
} else
{
<p class="mt-3">Um dich für dieses Event zu registrieren, muss man sich zuerst anmelden.</p> <Login /><Register />
}
@code {
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Edit;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.View;
public override string Actions => "Details";
@ -34,29 +54,76 @@
new Resource { ResourceType = ResourceType.Stylesheet, Url = ModulePath() + "Module.css" }
};
private ElementReference form;
private bool validated = false;
// private ElementReference form;
// private bool validated = false;
private int _id;
private string _name;
private string _description;
private DateTime _eventDate;
private string _location;
private string _createdby;
private DateTime _createdon;
private string _modifiedby;
private DateTime _modifiedon;
private Response _response;
private bool? Status;
private async Task SendResponse(bool response)
{
if(_response == null)
{
_response = new Response();
_response.EventRegistrationId = _id;
_response.OwnerId = PageState.User.UserId;
_response.ModuleId = ModuleState.ModuleId;
_response.ResponseType = response;
_response = await EventRegistrationService.AddResponseAsync(_response);
} else
{
_response.ResponseType = response;
_response = await EventRegistrationService.UpdateResponseAsync(_response);
}
if(_response != null) Status = _response.ResponseType;
}
private async void Zusage()
{
await SendResponse(true);
}
private async void Absage()
{
await SendResponse(false);
}
protected override async Task OnInitializedAsync()
{
try
{
_id = Int32.Parse(PageState.QueryString["id"]);
Event EventRegistration = await EventRegistrationService.GetEventRegistrationAsync(_id, ModuleState.ModuleId);
if (EventRegistration != null)
Event currentEvent;
Response rsvp;
(currentEvent, rsvp) = await EventRegistrationService.GetEventDetails(_id, ModuleState.ModuleId);
if (currentEvent != null)
{
_name = EventRegistration.Name;
_createdby = EventRegistration.CreatedBy;
_createdon = EventRegistration.CreatedOn;
_modifiedby = EventRegistration.ModifiedBy;
_modifiedon = EventRegistration.ModifiedOn;
_name = currentEvent.Name;
_description = currentEvent.Description;
_eventDate = currentEvent.EventDate.ToLocalTime();
_location = currentEvent.Location;
_createdby = currentEvent.CreatedBy;
_createdon = currentEvent.CreatedOn.ToLocalTime();
_modifiedby = currentEvent.ModifiedBy;
_modifiedon = currentEvent.ModifiedOn.ToLocalTime();
}
if(rsvp != null)
{
_response = rsvp;
Status = rsvp.ResponseType;
}
}
catch (Exception ex)
@ -65,41 +132,4 @@
AddModuleMessage(Localizer["Message.LoadError"], MessageType.Error);
}
}
private async Task Save()
{
try
{
validated = true;
var interop = new Oqtane.UI.Interop(JSRuntime);
if (await interop.FormValid(form))
{
if (PageState.Action == "Add")
{
Event EventRegistration = new Event();
EventRegistration.ModuleId = ModuleState.ModuleId;
EventRegistration.Name = _name;
EventRegistration = await EventRegistrationService.AddEventRegistrationAsync(EventRegistration);
await logger.LogInformation("EventRegistration Added {EventRegistration}", EventRegistration);
}
else
{
Event EventRegistration = await EventRegistrationService.GetEventRegistrationAsync(_id, ModuleState.ModuleId);
EventRegistration.Name = _name;
await EventRegistrationService.UpdateEventRegistrationAsync(EventRegistration);
await logger.LogInformation("EventRegistration Updated {EventRegistration}", EventRegistration);
}
NavigationManager.NavigateTo(NavigateUrl());
}
else
{
AddModuleMessage(Localizer["Message.SaveValidation"], MessageType.Warning);
}
}
catch (Exception ex)
{
await logger.LogError(ex, "Error Saving EventRegistration {Error}", ex.Message);
AddModuleMessage(Localizer["Message.SaveError"], MessageType.Error);
}
}
}

View File

@ -16,13 +16,31 @@
<input id="name" class="form-control" @bind="@_name" required />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="description" HelpText="Enter a description" ResourceKey="Description">Description: </Label>
<div class="col-sm-9">
<input id="description" class="form-control" @bind="@_description" required />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="eventdate" HelpText="Enter a Date" ResourceKey="EventDate">EventDate: </Label>
<div class="col-sm-9">
<input id="eventdate" class="form-control" @bind="@_eventDate" required />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="location" HelpText="Enter a Location" ResourceKey="Location">Location: </Label>
<div class="col-sm-9">
<input id="location" class="form-control" @bind="@_location" required />
</div>
</div>
</div>
<button type="button" class="btn btn-success" @onclick="Save">@Localizer["Save"]</button>
<NavLink class="btn btn-secondary" href="@NavigateUrl()">@Localizer["Cancel"]</NavLink>
<br /><br />
@if (PageState.Action == "Edit")
{
<AuditInfo CreatedBy="@_createdby" CreatedOn="@_createdon" ModifiedBy="@_modifiedby" ModifiedOn="@_modifiedon"></AuditInfo>
<AuditInfo CreatedBy="@_createdby" CreatedOn="@_createdon" ModifiedBy="@_modifiedby" ModifiedOn="@_modifiedon"></AuditInfo>
}
</form>
@ -43,6 +61,10 @@
private int _id;
private string _name;
private string _description;
private DateTime _eventDate;
private string _location;
private string _createdby;
private DateTime _createdon;
private string _modifiedby;
@ -55,10 +77,14 @@
if (PageState.Action == "Edit")
{
_id = Int32.Parse(PageState.QueryString["id"]);
Event EventRegistration = await EventRegistrationService.GetEventRegistrationAsync(_id, ModuleState.ModuleId);
Event EventRegistration = await EventRegistrationService.GetEventAsync(_id, ModuleState.ModuleId);
if (EventRegistration != null)
{
_name = EventRegistration.Name;
_description = EventRegistration.Description;
_eventDate = EventRegistration.EventDate.ToLocalTime();
_location = EventRegistration.Location;
_createdby = EventRegistration.CreatedBy;
_createdon = EventRegistration.CreatedOn;
_modifiedby = EventRegistration.ModifiedBy;
@ -86,14 +112,20 @@
Event EventRegistration = new Event();
EventRegistration.ModuleId = ModuleState.ModuleId;
EventRegistration.Name = _name;
EventRegistration = await EventRegistrationService.AddEventRegistrationAsync(EventRegistration);
EventRegistration.Description = _description;
EventRegistration.EventDate = _eventDate.ToUniversalTime();
EventRegistration.Location = _location;
EventRegistration = await EventRegistrationService.AddEventAsync(EventRegistration);
await logger.LogInformation("EventRegistration Added {EventRegistration}", EventRegistration);
}
else
{
Event EventRegistration = await EventRegistrationService.GetEventRegistrationAsync(_id, ModuleState.ModuleId);
Event EventRegistration = await EventRegistrationService.GetEventAsync(_id, ModuleState.ModuleId);
EventRegistration.Name = _name;
await EventRegistrationService.UpdateEventRegistrationAsync(EventRegistration);
EventRegistration.Description = _description;
EventRegistration.EventDate = _eventDate.ToUniversalTime();
EventRegistration.Location = _location;
await EventRegistrationService.UpdateEventAsync(EventRegistration);
await logger.LogInformation("EventRegistration Updated {EventRegistration}", EventRegistration);
}
NavigationManager.NavigateTo(NavigateUrl());

View File

@ -27,13 +27,11 @@ else
<th style="width: 1px;">&nbsp;</th>
</Header>
<Row>
<td><ActionLink Action="Edit" Parameters="@($"id=" + context.EventRegistrationId.ToString())" ResourceKey="Edit" /></td>
<td><ActionDialog Header="Delete EventRegistration" Message="Are You Sure You Wish To Delete This EventRegistration?" Action="Delete" Security="SecurityAccessLevel.Edit" Class="btn btn-danger" OnClick="@(async () => await Delete(context))" ResourceKey="Delete" Id="@context.EventRegistrationId.ToString()" /></td>
<td><ActionLink Action="Edit" Parameters="@($"id=" + context.EventId.ToString())" ResourceKey="Edit" /></td>
<td><ActionDialog Header="Delete EventRegistration" Message="Are You Sure You Wish To Delete This EventRegistration?" Action="Delete" Security="SecurityAccessLevel.Edit" Class="btn btn-danger" OnClick="@(async () => await Delete(context))" ResourceKey="Delete" Id="@context.EventId.ToString()" /></td>
<td>@context.Name</td>
@* @if(UserSecurity.IsAuthorized(PageState.User, PermissionNames.Utilize)) { *@
<td><ActionLink Action="Details" Parameters="@($"id=" + context.EventRegistrationId.ToString())" ResourceKey="Details"/></td>
@* } *@
<td><ActionLink Action="Details" Parameters="@($"id=" + context.EventId.ToString())" ResourceKey="Details"/></td>
</Row>
</Pager>
}
@ -58,7 +56,7 @@ else
{
try
{
_EventRegistrations = await EventRegistrationService.GetEventRegistrationsAsync(ModuleState.ModuleId);
_EventRegistrations = await EventRegistrationService.GetEventsAsync(ModuleState.ModuleId);
}
catch (Exception ex)
{
@ -71,9 +69,9 @@ else
{
try
{
await EventRegistrationService.DeleteEventRegistrationAsync(EventRegistration.EventRegistrationId, ModuleState.ModuleId);
await EventRegistrationService.DeleteEventAsync(EventRegistration.EventId, ModuleState.ModuleId);
await logger.LogInformation("EventRegistration Deleted {EventRegistration}", EventRegistration);
_EventRegistrations = await EventRegistrationService.GetEventRegistrationsAsync(ModuleState.ModuleId);
_EventRegistrations = await EventRegistrationService.GetEventsAsync(ModuleState.ModuleId);
StateHasChanged();
}
catch (Exception ex)

View File

@ -9,9 +9,9 @@ namespace SZUAbsolventenverein.Module.EventRegistration
{
Name = "EventRegistration",
Description = "A module to manage registration for events",
Version = "1.0.0",
Version = "1.0.5",
ServerManagerType = "SZUAbsolventenverein.Module.EventRegistration.Manager.EventRegistrationManager, SZUAbsolventenverein.Module.EventRegistration.Server.Oqtane",
ReleaseVersions = "1.0.0",
ReleaseVersions = "1.0.0,1.0.5",
Dependencies = "SZUAbsolventenverein.Module.EventRegistration.Shared.Oqtane",
PackageName = "SZUAbsolventenverein.Module.EventRegistration"
};

View File

@ -0,0 +1,132 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Absage" xml:space="preserve">
<value>Du hast abgesagt. Schade, vielleicht nächstes Mal!</value>
</data>
<data name="Absagen" xml:space="preserve">
<value>Absagen</value>
</data>
<data name="Zusage" xml:space="preserve">
<value>Du hast zugesagt. Wir freuen uns auf dich!</value>
</data>
<data name="Zusagen" xml:space="preserve">
<value>Zusagen</value>
</data>
</root>

View File

@ -13,8 +13,8 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="9.0.3" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Authentication" Version="9.0.3" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="9.0.5" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Authentication" Version="9.0.5" />
<PackageReference Include="Microsoft.Extensions.Localization" Version="9.0.3" />
<PackageReference Include="Microsoft.Extensions.Http" Version="9.0.3" />
<PackageReference Include="System.Net.Http.Json" Version="9.0.3" />

View File

@ -2,8 +2,10 @@ using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Oqtane.Services;
using Oqtane.Shared;
using SZUAbsolventenverein.Module.EventRegistration.Models;
namespace SZUAbsolventenverein.Module.EventRegistration.Services
{
@ -13,7 +15,7 @@ namespace SZUAbsolventenverein.Module.EventRegistration.Services
private string Apiurl => CreateApiUrl("EventRegistration");
public async Task<List<Models.Event>> GetEventRegistrationsAsync(int ModuleId)
/*public async Task<List<Models.Event>> GetEventRegistrationsAsync(int ModuleId)
{
List<Models.Event> EventRegistrations = await GetJsonAsync<List<Models.Event>>(CreateAuthorizationPolicyUrl($"{Apiurl}?moduleid={ModuleId}", EntityNames.Module, ModuleId), Enumerable.Empty<Models.Event>().ToList());
return EventRegistrations.OrderBy(item => item.Name).ToList();
@ -32,11 +34,51 @@ namespace SZUAbsolventenverein.Module.EventRegistration.Services
public async Task<Models.Event> UpdateEventRegistrationAsync(Models.Event EventRegistration)
{
return await PutJsonAsync<Models.Event>(CreateAuthorizationPolicyUrl($"{Apiurl}/{EventRegistration.EventRegistrationId}", EntityNames.Module, EventRegistration.ModuleId), EventRegistration);
}*/
public async Task<List<Event>> GetEventsAsync(int ModuleId)
{
List<Event> EventRegistrations = await GetJsonAsync(CreateAuthorizationPolicyUrl($"{Apiurl}?moduleid={ModuleId}", EntityNames.Module, ModuleId), Enumerable.Empty<Event>().ToList());
return EventRegistrations.OrderBy(item => item.Name).ToList();
}
public async Task<Event> GetEventAsync(int EventId, int ModuleId)
{
return await GetJsonAsync<Event>(CreateAuthorizationPolicyUrl($"{Apiurl}/{EventId}/{ModuleId}", EntityNames.Module, ModuleId));
}
public async Task DeleteEventRegistrationAsync(int EventRegistrationId, int ModuleId)
public async Task<Event> AddEventAsync(Event NewEvent)
{
await DeleteAsync(CreateAuthorizationPolicyUrl($"{Apiurl}/{EventRegistrationId}/{ModuleId}", EntityNames.Module, ModuleId));
return await PostJsonAsync(CreateAuthorizationPolicyUrl($"{Apiurl}", EntityNames.Module, NewEvent.ModuleId), NewEvent);
}
public async Task<Event> UpdateEventAsync(Event NewEvent)
{
return await PutJsonAsync<Event>(CreateAuthorizationPolicyUrl($"{Apiurl}/{NewEvent.EventId}", EntityNames.Module, NewEvent.ModuleId), NewEvent);
}
public async Task DeleteEventAsync(int EventId, int ModuleId)
{
await DeleteAsync(CreateAuthorizationPolicyUrl($"{Apiurl}/{EventId}/{ModuleId}", EntityNames.Module, ModuleId));
}
public async Task<Response> AddResponseAsync(Response response)
{
return await PostJsonAsync<Response>(CreateAuthorizationPolicyUrl($"{Apiurl}/response/{response.EventRegistrationId}/{response.ModuleId}", EntityNames.Module, response.ModuleId), response);
}
public async Task<Response> UpdateResponseAsync(Response response)
{
return await PutJsonAsync<Response>(CreateAuthorizationPolicyUrl($"{Apiurl}/response/{response.EventRegistrationId}/{response.ModuleId}", EntityNames.Module, response.ModuleId), response);
}
public async Task<(Event, Response)> GetEventDetails(int EventId, int ModuleId)
{
return await GetJsonAsync<(Event, Response)>(CreateAuthorizationPolicyUrl($"{Apiurl}/details/{EventId}/{ModuleId}", EntityNames.Module, ModuleId));
}
public Task<List<Response>> GetEventResponses(int EventId, int ModuleId)
{
throw new System.NotImplementedException();
}
}
}

View File

@ -30,7 +30,7 @@ namespace SZUAbsolventenverein.Module.EventRegistration.Controllers
int ModuleId;
if (int.TryParse(moduleid, out ModuleId) && IsAuthorizedEntityId(EntityNames.Module, ModuleId))
{
return await _EventRegistrationService.GetEventRegistrationsAsync(ModuleId);
return await _EventRegistrationService.GetEventsAsync(ModuleId);
}
else
{
@ -45,7 +45,7 @@ namespace SZUAbsolventenverein.Module.EventRegistration.Controllers
[Authorize(Policy = PolicyNames.ViewModule)]
public async Task<Models.Event> Get(int id, int moduleid)
{
Models.Event EventRegistration = await _EventRegistrationService.GetEventRegistrationAsync(id, moduleid);
Models.Event EventRegistration = await _EventRegistrationService.GetEventAsync(id, moduleid);
if (EventRegistration != null && IsAuthorizedEntityId(EntityNames.Module, EventRegistration.ModuleId))
{
return EventRegistration;
@ -65,7 +65,7 @@ namespace SZUAbsolventenverein.Module.EventRegistration.Controllers
{
if (ModelState.IsValid && IsAuthorizedEntityId(EntityNames.Module, EventRegistration.ModuleId))
{
EventRegistration = await _EventRegistrationService.AddEventRegistrationAsync(EventRegistration);
EventRegistration = await _EventRegistrationService.AddEventAsync(EventRegistration);
}
else
{
@ -81,9 +81,9 @@ namespace SZUAbsolventenverein.Module.EventRegistration.Controllers
[Authorize(Policy = PolicyNames.EditModule)]
public async Task<Models.Event> Put(int id, [FromBody] Models.Event EventRegistration)
{
if (ModelState.IsValid && EventRegistration.EventRegistrationId == id && IsAuthorizedEntityId(EntityNames.Module, EventRegistration.ModuleId))
if (ModelState.IsValid && EventRegistration.EventId == id && IsAuthorizedEntityId(EntityNames.Module, EventRegistration.ModuleId))
{
EventRegistration = await _EventRegistrationService.UpdateEventRegistrationAsync(EventRegistration);
EventRegistration = await _EventRegistrationService.UpdateEventAsync(EventRegistration);
}
else
{
@ -99,10 +99,10 @@ namespace SZUAbsolventenverein.Module.EventRegistration.Controllers
[Authorize(Policy = PolicyNames.EditModule)]
public async Task Delete(int id, int moduleid)
{
Models.Event EventRegistration = await _EventRegistrationService.GetEventRegistrationAsync(id, moduleid);
Models.Event EventRegistration = await _EventRegistrationService.GetEventAsync(id, moduleid);
if (EventRegistration != null && IsAuthorizedEntityId(EntityNames.Module, EventRegistration.ModuleId))
{
await _EventRegistrationService.DeleteEventRegistrationAsync(id, EventRegistration.ModuleId);
await _EventRegistrationService.DeleteEventAsync(id, EventRegistration.ModuleId);
}
else
{
@ -110,5 +110,27 @@ namespace SZUAbsolventenverein.Module.EventRegistration.Controllers
HttpContext.Response.StatusCode = (int)HttpStatusCode.Forbidden;
}
}
// GET api/<controller>/5
[HttpGet("details/{id}/{moduleid}")]
[Authorize(Policy = PolicyNames.ViewModule)]
public async Task<(Models.Event, Models.Response)> GetDetails(int id, int moduleid)
{
Models.Event EventRegistration;
Models.Response EventResponse;
(EventRegistration, EventResponse) = await _EventRegistrationService.GetEventDetails(id, moduleid);
if (EventRegistration != null && EventResponse != null && IsAuthorizedEntityId(EntityNames.Module, EventRegistration.ModuleId))
{
return (EventRegistration, EventResponse);
}
else
{
_logger.Log(LogLevel.Error, this, LogFunction.Security, "Unauthorized EventRegistration Get Attempt {EventRegistrationId} {ModuleId}", id, moduleid);
HttpContext.Response.StatusCode = (int)HttpStatusCode.Forbidden;
return (null, null);
}
}
// TODO: Add Event Response Endpoints.
}
}

View File

@ -15,12 +15,14 @@ namespace SZUAbsolventenverein.Module.EventRegistration.Manager
{
public class EventRegistrationManager : MigratableModuleBase, IInstallable, IPortable, ISearchable
{
private readonly IEventRegistrationRepository _EventRegistrationRepository;
private readonly IEventRepository _EventRepository;
private readonly IResponseRepository _ResponseRepository;
private readonly IDBContextDependencies _DBContextDependencies;
public EventRegistrationManager(IEventRegistrationRepository EventRegistrationRepository, IDBContextDependencies DBContextDependencies)
public EventRegistrationManager(IEventRepository EventRegistrationRepository, IResponseRepository ResponseRepository, IDBContextDependencies DBContextDependencies)
{
_EventRegistrationRepository = EventRegistrationRepository;
_EventRepository = EventRegistrationRepository;
_ResponseRepository = ResponseRepository;
_DBContextDependencies = DBContextDependencies;
}
@ -36,17 +38,28 @@ namespace SZUAbsolventenverein.Module.EventRegistration.Manager
public string ExportModule(Oqtane.Models.Module module)
{
// TODO: Export event Responses as well.
string content = "";
List<Models.Event> EventRegistrations = _EventRegistrationRepository.GetEventRegistrations(module.ModuleId).ToList();
if (EventRegistrations != null)
List<object> exportData = new List<object>();
foreach (var events in _EventRepository.GetEvents(module.ModuleId))
{
content = JsonSerializer.Serialize(EventRegistrations);
var responses = _ResponseRepository.GetResponses(events.EventId, module.ModuleId);
exportData.Add(new
{
Event = events,
Responses = responses.ToList()
});
};
if (exportData != null)
{
content = JsonSerializer.Serialize(exportData);
}
return content;
}
public void ImportModule(Oqtane.Models.Module module, string content, string version)
{
// TODO: Import event Responses as well.
List<Models.Event> EventRegistrations = null;
if (!string.IsNullOrEmpty(content))
{
@ -56,7 +69,7 @@ namespace SZUAbsolventenverein.Module.EventRegistration.Manager
{
foreach(var EventRegistration in EventRegistrations)
{
_EventRegistrationRepository.AddEventRegistration(new Models.Event { ModuleId = module.ModuleId, Name = EventRegistration.Name });
_EventRepository.AddEvent(new Models.Event { ModuleId = module.ModuleId, Name = EventRegistration.Name });
}
}
}
@ -65,14 +78,14 @@ namespace SZUAbsolventenverein.Module.EventRegistration.Manager
{
var searchContentList = new List<SearchContent>();
foreach (var EventRegistration in _EventRegistrationRepository.GetEventRegistrations(pageModule.ModuleId))
foreach (var EventRegistration in _EventRepository.GetEvents(pageModule.ModuleId))
{
if (EventRegistration.ModifiedOn >= lastIndexedOn)
{
searchContentList.Add(new SearchContent
{
EntityName = "SZUAbsolventenvereinEventRegistration",
EntityId = EventRegistration.EventRegistrationId.ToString(),
EntityId = EventRegistration.EventId.ToString(),
Title = EventRegistration.Name,
Body = EventRegistration.Name,
ContentModifiedBy = EventRegistration.ModifiedBy,

View File

@ -17,7 +17,7 @@ namespace SZUAbsolventenverein.Module.EventRegistration.Migrations
protected override void Up(MigrationBuilder migrationBuilder)
{
var entityBuilder = new EventRegistrationEntityBuilder(migrationBuilder, ActiveDatabase);
var entityBuilder = new EventEntityBuilder(migrationBuilder, ActiveDatabase);
entityBuilder.Create();
var entityBuilder2 = new EventResponseEntityBuilder(migrationBuilder, ActiveDatabase);
@ -26,10 +26,10 @@ namespace SZUAbsolventenverein.Module.EventRegistration.Migrations
protected override void Down(MigrationBuilder migrationBuilder)
{
var entityBuilder = new EventRegistrationEntityBuilder(migrationBuilder, ActiveDatabase);
entityBuilder.Drop();
var entityBuilder2 = new EventResponseEntityBuilder(migrationBuilder, ActiveDatabase);
entityBuilder2.Drop();
var responseEB = new EventResponseEntityBuilder(migrationBuilder, ActiveDatabase);
responseEB.Drop();
var eventEB = new EventEntityBuilder(migrationBuilder, ActiveDatabase);
eventEB.Drop();
}
}
}

View File

@ -0,0 +1,35 @@
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Oqtane.Databases.Interfaces;
using Oqtane.Migrations;
using System;
using SZUAbsolventenverein.Module.EventRegistration.Migrations.EntityBuilders;
using SZUAbsolventenverein.Module.EventRegistration.Repository;
namespace SZUAbsolventenverein.Module.EventRegistration.Migrations
{
[DbContext(typeof(EventRegistrationContext))]
[Migration("SZUAbsolventenverein.Module.EventRegistration.01.00.00.05")]
public class AddDescriptionDateTimeLocation : MultiDatabaseMigration
{
public AddDescriptionDateTimeLocation(IDatabase database) : base(database)
{
}
protected override void Up(MigrationBuilder migrationBuilder)
{
var entityBuilder = new EventEntityBuilder(migrationBuilder, ActiveDatabase);
entityBuilder.AddMaxStringColumn("Description", false, true, ""); // Contents for RichTextEditor
entityBuilder.AddDateTimeColumn("EventDate", false, new DateTime()); // DateTime for the event
entityBuilder.AddStringColumn("Location", 100, false, true, ""); // Location of the event
}
protected override void Down(MigrationBuilder migrationBuilder)
{
var entityBuilder = new EventEntityBuilder(migrationBuilder, ActiveDatabase);
entityBuilder.DropColumn("Description"); // RichTextEditor
entityBuilder.DropColumn("EventDate"); // DateTime
entityBuilder.DropColumn("Location"); // Location 0
}
}
}

View File

@ -7,29 +7,29 @@ using Oqtane.Migrations.EntityBuilders;
namespace SZUAbsolventenverein.Module.EventRegistration.Migrations.EntityBuilders
{
public class EventRegistrationEntityBuilder : AuditableBaseEntityBuilder<EventRegistrationEntityBuilder>
public class EventEntityBuilder : AuditableBaseEntityBuilder<EventEntityBuilder>
{
private const string _entityTableName = "SZUAbsolventenvereinEvent";
private readonly PrimaryKey<EventRegistrationEntityBuilder> _primaryKey = new("PK_SZUAbsolventenvereinEvent", x => x.EventRegistrationId);
private readonly ForeignKey<EventRegistrationEntityBuilder> _moduleForeignKey = new("FK_SZUAbsolventenvereinEvent_Module", x => x.ModuleId, "Module", "ModuleId", ReferentialAction.Cascade);
private readonly PrimaryKey<EventEntityBuilder> _primaryKey = new("PK_SZUAbsolventenvereinEvent", x => x.EventId);
private readonly ForeignKey<EventEntityBuilder> _moduleForeignKey = new("FK_SZUAbsolventenvereinEvent_Module", x => x.ModuleId, "Module", "ModuleId", ReferentialAction.Cascade);
public EventRegistrationEntityBuilder(MigrationBuilder migrationBuilder, IDatabase database) : base(migrationBuilder, database)
public EventEntityBuilder(MigrationBuilder migrationBuilder, IDatabase database) : base(migrationBuilder, database)
{
EntityTableName = _entityTableName;
PrimaryKey = _primaryKey;
ForeignKeys.Add(_moduleForeignKey);
}
protected override EventRegistrationEntityBuilder BuildTable(ColumnsBuilder table)
protected override EventEntityBuilder BuildTable(ColumnsBuilder table)
{
EventRegistrationId = AddAutoIncrementColumn(table,"EventRegistrationId");
EventId = AddAutoIncrementColumn(table,"EventId");
ModuleId = AddIntegerColumn(table,"ModuleId");
Name = AddMaxStringColumn(table,"Name");
AddAuditableColumns(table);
return this;
}
public OperationBuilder<AddColumnOperation> EventRegistrationId { get; set; }
public OperationBuilder<AddColumnOperation> EventId { get; set; }
public OperationBuilder<AddColumnOperation> ModuleId { get; set; }
public OperationBuilder<AddColumnOperation> Name { get; set; }
}

View File

@ -13,7 +13,7 @@ namespace SZUAbsolventenverein.Module.EventRegistration.Migrations.EntityBuilder
private const string _entityTableName = "SZUAbsolventenvereinEventResponse";
private readonly PrimaryKey<EventResponseEntityBuilder> _primaryKey = new("PK_SZUAbsolventenvereinEventResponse", x => x.EventResponseId);
private readonly ForeignKey<EventResponseEntityBuilder> _moduleForeignKey = new("FK_SZUAbsolventenvereinEventResponse_Module", x => x.ModuleId, "Module", "ModuleId", ReferentialAction.Cascade);
private readonly ForeignKey<EventResponseEntityBuilder> _eventForeignKey = new("FK_SZUAbsolventenvereinEventResponse_Event", x => x.EventRegistrationId, "SZUAbsolventenvereinEvent", "EventRegistrationId", ReferentialAction.Cascade);
private readonly ForeignKey<EventResponseEntityBuilder> _eventForeignKey = new("FK_SZUAbsolventenvereinEventResponse_Event", x => x.EventRegistrationId, "SZUAbsolventenvereinEvent", "EventId", ReferentialAction.Cascade);
private readonly ForeignKey<EventResponseEntityBuilder> _ownerForeignKey = new("FK_SZUAbsolventenvereinEventResponse_User_Owner", x => x.OwnerId, "User", "UserId", ReferentialAction.Cascade);
public EventResponseEntityBuilder(MigrationBuilder migrationBuilder, IDatabase database) : base(migrationBuilder, database)

View File

@ -5,27 +5,27 @@ using Oqtane.Modules;
namespace SZUAbsolventenverein.Module.EventRegistration.Repository
{
public class EventRegistrationRepository : IEventRegistrationRepository, ITransientService
public class EventRepository : IEventRepository, ITransientService
{
private readonly IDbContextFactory<EventRegistrationContext> _factory;
public EventRegistrationRepository(IDbContextFactory<EventRegistrationContext> factory)
public EventRepository(IDbContextFactory<EventRegistrationContext> factory)
{
_factory = factory;
}
public IEnumerable<Models.Event> GetEventRegistrations(int ModuleId)
public IEnumerable<Models.Event> GetEvents(int ModuleId)
{
using var db = _factory.CreateDbContext();
return db.Event.Where(item => item.ModuleId == ModuleId).ToList();
}
public Models.Event GetEventRegistration(int EventRegistrationId)
public Models.Event GetEvent(int EventRegistrationId)
{
return GetEventRegistration(EventRegistrationId, true);
return GetEvent(EventRegistrationId, true);
}
public Models.Event GetEventRegistration(int EventRegistrationId, bool tracking)
public Models.Event GetEvent(int EventRegistrationId, bool tracking)
{
using var db = _factory.CreateDbContext();
if (tracking)
@ -34,11 +34,11 @@ namespace SZUAbsolventenverein.Module.EventRegistration.Repository
}
else
{
return db.Event.AsNoTracking().FirstOrDefault(item => item.EventRegistrationId == EventRegistrationId);
return db.Event.AsNoTracking().FirstOrDefault(item => item.EventId == EventRegistrationId);
}
}
public Models.Event AddEventRegistration(Models.Event EventRegistration)
public Models.Event AddEvent(Models.Event EventRegistration)
{
using var db = _factory.CreateDbContext();
db.Event.Add(EventRegistration);
@ -46,7 +46,7 @@ namespace SZUAbsolventenverein.Module.EventRegistration.Repository
return EventRegistration;
}
public Models.Event UpdateEventRegistration(Models.Event EventRegistration)
public Models.Event UpdateEvent(Models.Event EventRegistration)
{
using var db = _factory.CreateDbContext();
db.Entry(EventRegistration).State = EntityState.Modified;
@ -54,7 +54,7 @@ namespace SZUAbsolventenverein.Module.EventRegistration.Repository
return EventRegistration;
}
public void DeleteEventRegistration(int EventRegistrationId)
public void DeleteEvent(int EventRegistrationId)
{
using var db = _factory.CreateDbContext();
Models.Event EventRegistration = db.Event.Find(EventRegistrationId);

View File

@ -1,15 +0,0 @@
using System.Collections.Generic;
using System.Threading.Tasks;
namespace SZUAbsolventenverein.Module.EventRegistration.Repository
{
public interface IEventRegistrationRepository
{
IEnumerable<Models.Event> GetEventRegistrations(int ModuleId);
Models.Event GetEventRegistration(int EventRegistrationId);
Models.Event GetEventRegistration(int EventRegistrationId, bool tracking);
Models.Event AddEventRegistration(Models.Event EventRegistration);
Models.Event UpdateEventRegistration(Models.Event EventRegistration);
void DeleteEventRegistration(int EventRegistrationId);
}
}

View File

@ -0,0 +1,15 @@
using System.Collections.Generic;
using System.Threading.Tasks;
namespace SZUAbsolventenverein.Module.EventRegistration.Repository
{
public interface IEventRepository
{
IEnumerable<Models.Event> GetEvents(int ModuleId);
Models.Event GetEvent(int EventRegistrationId);
Models.Event GetEvent(int EventRegistrationId, bool tracking);
Models.Event AddEvent(Models.Event EventRegistration);
Models.Event UpdateEvent(Models.Event EventRegistration);
void DeleteEvent(int EventRegistrationId);
}
}

View File

@ -0,0 +1,19 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using SZUAbsolventenverein.Module.EventRegistration.Models;
namespace SZUAbsolventenverein.Module.EventRegistration.Repository
{
public interface IResponseRepository
{
IEnumerable<Response> GetResponses(int ModuleId);
IEnumerable<Response> GetResponses(int EventId, int ModuleId);
Response GetResponse(int EventRegistrationId);
Response GetResponse(int EventRegistrationId, bool tracking);
Response GetResponse(int EventId, int OwnerId);
Response GetResponse(int EventId, int OwnerId, bool tracking);
Response AddResponse(Response EventResponse);
Response UpdateResponse(Response EventResponse);
void DeleteResponse(int EventResponseId);
}
}

View File

@ -0,0 +1,89 @@
using Microsoft.EntityFrameworkCore;
using System.Linq;
using System.Collections.Generic;
using Oqtane.Modules;
using SZUAbsolventenverein.Module.EventRegistration.Models;
namespace SZUAbsolventenverein.Module.EventRegistration.Repository
{
public class ResponseRepository : IResponseRepository, ITransientService
{
private readonly IDbContextFactory<EventRegistrationContext> _factory;
public ResponseRepository(IDbContextFactory<EventRegistrationContext> factory)
{
_factory = factory;
}
public IEnumerable<Response> GetResponses(int ModuleId)
{
using var db = _factory.CreateDbContext();
return db.Response.Where(item => item.ModuleId == ModuleId).ToList();
}
public IEnumerable<Response> GetResponses(int EventId, int ModuleId)
{
using var db = _factory.CreateDbContext();
return db.Response.Where(item => item.ModuleId == ModuleId && item.EventRegistrationId == EventId).ToList();
}
public Response GetResponse(int EventRegistrationId)
{
return GetResponse(EventRegistrationId, true);
}
public Response GetResponse(int EventRegistrationId, bool tracking)
{
using var db = _factory.CreateDbContext();
if (tracking)
{
return db.Response.Find(EventRegistrationId);
}
else
{
return db.Response.AsNoTracking().FirstOrDefault(item => item.EventRegistrationId == EventRegistrationId);
}
}
public Response GetResponse(int EventId, int OwnerId)
{
return GetResponse(EventId, OwnerId, true);
}
public Response GetResponse(int EventId, int OwnerId, bool tracking)
{
using var db = _factory.CreateDbContext();
if (tracking)
{
return db.Response.FirstOrDefault(item => item.EventRegistrationId == EventId && item.OwnerId == OwnerId);
}
else
{
return db.Response.AsNoTracking().FirstOrDefault(item => item.EventRegistrationId == EventId && item.OwnerId == OwnerId);
}
}
public Response AddResponse(Response EventResponse)
{
using var db = _factory.CreateDbContext();
db.Response.Add(EventResponse);
db.SaveChanges();
return EventResponse;
}
public Response UpdateResponse(Response EventResponse)
{
using var db = _factory.CreateDbContext();
db.Entry(EventResponse).State = EntityState.Modified;
db.SaveChanges();
return EventResponse;
}
public void DeleteResponse(int EventRegistrationId)
{
using var db = _factory.CreateDbContext();
Response EventResponse = db.Response.Find(EventRegistrationId);
db.Response.Remove(EventResponse);
db.SaveChanges();
}
}
}

View File

@ -19,10 +19,10 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="9.0.3" />
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="9.0.3" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.3" />
<PackageReference Include="Microsoft.Extensions.Localization" Version="9.0.3" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="9.0.5" />
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="9.0.5" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.5" />
<PackageReference Include="Microsoft.Extensions.Localization" Version="9.0.5" />
</ItemGroup>
<ItemGroup>

View File

@ -3,44 +3,186 @@ using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Oqtane.Enums;
using Oqtane.Extensions;
using Oqtane.Infrastructure;
using Oqtane.Models;
using Oqtane.Repository;
using Oqtane.Security;
using Oqtane.Shared;
using SZUAbsolventenverein.Module.EventRegistration.Models;
using SZUAbsolventenverein.Module.EventRegistration.Repository;
namespace SZUAbsolventenverein.Module.EventRegistration.Services
{
public class ServerEventRegistrationService : IEventRegistrationService
{
private readonly IEventRegistrationRepository _EventRegistrationRepository;
private readonly IEventRepository _EventRepository;
private readonly IResponseRepository _ResponseRepository;
private readonly INotificationRepository _NotificationRepository;
private readonly IUserRepository _UserRepository;
private readonly IUserPermissions _userPermissions;
private readonly ILogManager _logger;
private readonly IHttpContextAccessor _accessor;
private readonly Alias _alias;
public ServerEventRegistrationService(IEventRegistrationRepository EventRegistrationRepository, IUserPermissions userPermissions, ITenantManager tenantManager, ILogManager logger, IHttpContextAccessor accessor)
public ServerEventRegistrationService(IEventRepository EventRepository, IResponseRepository ResponseRepository, INotificationRepository NotificationRepository, IUserRepository UserRepository, IUserPermissions userPermissions, ITenantManager tenantManager, ILogManager logger, IHttpContextAccessor accessor)
{
_EventRegistrationRepository = EventRegistrationRepository;
_EventRepository = EventRepository;
_ResponseRepository = ResponseRepository;
_NotificationRepository = NotificationRepository;
_UserRepository = UserRepository;
_userPermissions = userPermissions;
_logger = logger;
_accessor = accessor;
_alias = tenantManager.GetAlias();
}
public Task<List<Models.Event>> GetEventRegistrationsAsync(int ModuleId)
public Task<Event> AddEventAsync(Event NewEvent)
{
if (_userPermissions.IsAuthorized(_accessor.HttpContext.User, _alias.SiteId, EntityNames.Module, ModuleId, PermissionNames.View))
if (_userPermissions.IsAuthorized(_accessor.HttpContext.User, _alias.SiteId, EntityNames.Module, NewEvent.ModuleId, PermissionNames.Edit))
{
return Task.FromResult(_EventRegistrationRepository.GetEventRegistrations(ModuleId).ToList());
NewEvent = _EventRepository.AddEvent(NewEvent);
_logger.Log(LogLevel.Information, this, LogFunction.Create, "EventRegistration Added {NewEvent}", NewEvent);
}
else
{
_logger.Log(LogLevel.Error, this, LogFunction.Security, "Unauthorized EventRegistration Get Attempt {ModuleId}", ModuleId);
_logger.Log(LogLevel.Error, this, LogFunction.Security, "Unauthorized EventRegistration Add Attempt {NewEvent}", NewEvent);
NewEvent = null;
}
return Task.FromResult(NewEvent);
}
public Task<Response> AddResponseAsync(Response Response)
{
if (_userPermissions.IsAuthorized(_accessor.HttpContext.User, _alias.SiteId, EntityNames.Module, Response.ModuleId, PermissionNames.View))
{
Response = _ResponseRepository.AddResponse(Response);
Event currentEvent = _EventRepository.GetEvent(Response.EventRegistrationId);
string subject = Response.ResponseType ? $"Du bist erfolgreich für '{currentEvent.Name}' Registriert worden." : $"Du hast erfolgreich für '{currentEvent.Name}' abgesagt.";
string body = "Hier kann man die Infos des Events hineinpacken (HTML ist erlaubt)";
SendEventResponseNotification(subject, body);
_logger.Log(LogLevel.Information, this, LogFunction.Create, "EventRegistration Added {NewEvent}", Response);
}
else
{
_logger.Log(LogLevel.Error, this, LogFunction.Security, "Unauthorized EventRegistration Add Attempt {NewEvent}", Response);
Response = null;
}
return Task.FromResult(Response);
}
public Task<Response> UpdateResponseAsync(Response Response)
{
if (_userPermissions.IsAuthorized(_accessor.HttpContext.User, _alias.SiteId, EntityNames.Module, Response.ModuleId, PermissionNames.View))
{
Response = _ResponseRepository.UpdateResponse(Response);
Event currentEvent = _EventRepository.GetEvent(Response.EventRegistrationId);
string subject = Response.ResponseType ? $"Du bist erfolgreich für '{currentEvent.Name}' Registriert worden." : $"Du hast erfolgreich für '{currentEvent.Name}' abgesagt.";
string body = "Hier kann man die Infos des Events hineinpacken (HTML ist erlaubt)";
SendEventResponseNotification(subject, body);
_logger.Log(LogLevel.Information, this, LogFunction.Create, "EventRegistration Added {NewEvent}", Response);
}
else
{
_logger.Log(LogLevel.Error, this, LogFunction.Security, "Unauthorized EventRegistration Add Attempt {NewEvent}", Response);
Response = null;
}
return Task.FromResult(Response);
}
public Task DeleteEventAsync(int EventId, int ModuleId)
{
if (_userPermissions.IsAuthorized(_accessor.HttpContext.User, _alias.SiteId, EntityNames.Module, ModuleId, PermissionNames.Edit))
{
_EventRepository.DeleteEvent(EventId);
_logger.Log(LogLevel.Information, this, LogFunction.Delete, "Event Deleted {EventId}", EventId);
}
else
{
_logger.Log(LogLevel.Error, this, LogFunction.Security, "Unauthorized Event Delete Attempt {EventId} {ModuleId}", EventId, ModuleId);
}
return Task.CompletedTask;
}
public Task<Event> GetEventAsync(int EventId, int ModuleId)
{
if (_userPermissions.IsAuthorized(_accessor.HttpContext.User, _alias.SiteId, EntityNames.Module, ModuleId, PermissionNames.View))
{
return Task.FromResult(_EventRepository.GetEvent(EventId, true));
}
else
{
_logger.Log(LogLevel.Error, this, LogFunction.Security, "Unauthorized Event Get Attempt {ModuleId}", ModuleId);
return null;
}
}
public Task<(Event, Response)> GetEventDetails(int EventId, int ModuleId)
{
if (_userPermissions.IsAuthorized(_accessor.HttpContext.User, _alias.SiteId, EntityNames.Module, ModuleId, PermissionNames.View))
{
Event currentEvent = _EventRepository.GetEvent(EventId);
Response rsvp = _ResponseRepository.GetResponse(EventId, _accessor.HttpContext.User.UserId());
return Task.FromResult((currentEvent, rsvp));
}
else
{
_logger.Log(LogLevel.Error, this, LogFunction.Security, "Unauthorized Event Get Attempt {ModuleId}", ModuleId);
return null;
}
}
public Task<List<Response>> GetEventResponses(int EventId, int ModuleId)
{
if (_userPermissions.IsAuthorized(_accessor.HttpContext.User, _alias.SiteId, EntityNames.Module, ModuleId, PermissionNames.Edit))
{
return Task.FromResult(_ResponseRepository.GetResponses(EventId, ModuleId).ToList());
}
else
{
_logger.Log(LogLevel.Error, this, LogFunction.Security, "Unauthorized Event Response Get Attempt {ModuleId}", ModuleId);
return null;
}
throw new System.NotImplementedException();
}
public Task<List<Event>> GetEventsAsync(int ModuleId)
{
if (_userPermissions.IsAuthorized(_accessor.HttpContext.User, _alias.SiteId, EntityNames.Module, ModuleId, PermissionNames.View))
{
return Task.FromResult(_EventRepository.GetEvents(ModuleId).ToList());
}
else
{
_logger.Log(LogLevel.Error, this, LogFunction.Security, "Unauthorized Events Get Attempt {ModuleId}", ModuleId);
return null;
}
}
public Task<Event> UpdateEventAsync(Event NewEvent)
{
if (_userPermissions.IsAuthorized(_accessor.HttpContext.User, _alias.SiteId, EntityNames.Module, NewEvent.ModuleId, PermissionNames.Edit))
{
NewEvent = _EventRepository.UpdateEvent(NewEvent);
_logger.Log(LogLevel.Information, this, LogFunction.Update, "Event Updated {NewEvent}", NewEvent);
}
else
{
_logger.Log(LogLevel.Error, this, LogFunction.Security, "Unauthorized Event Update Attempt {NewEvent}", NewEvent);
NewEvent = null;
}
return Task.FromResult(NewEvent);
}
// TODO: Implement the methods for EventResponses
/*
public Task<Models.Event> GetEventRegistrationAsync(int EventRegistrationId, int ModuleId)
{
if (_userPermissions.IsAuthorized(_accessor.HttpContext.User, _alias.SiteId, EntityNames.Module, ModuleId, PermissionNames.View))
@ -84,18 +226,13 @@ namespace SZUAbsolventenverein.Module.EventRegistration.Services
return Task.FromResult(EventRegistration);
}
public Task DeleteEventRegistrationAsync(int EventRegistrationId, int ModuleId)
}*/
private void SendEventResponseNotification(string subject, string body)
{
if (_userPermissions.IsAuthorized(_accessor.HttpContext.User, _alias.SiteId, EntityNames.Module, ModuleId, PermissionNames.Edit))
{
_EventRegistrationRepository.DeleteEventRegistration(EventRegistrationId);
_logger.Log(LogLevel.Information, this, LogFunction.Delete, "EventRegistration Deleted {EventRegistrationId}", EventRegistrationId);
}
else
{
_logger.Log(LogLevel.Error, this, LogFunction.Security, "Unauthorized EventRegistration Delete Attempt {EventRegistrationId} {ModuleId}", EventRegistrationId, ModuleId);
}
return Task.CompletedTask;
User user = _UserRepository.GetUser(_accessor.HttpContext.User.UserId());
Notification notification = new Notification(_alias.SiteId, user, subject, body);
_NotificationRepository.AddNotification(notification);
}
}
}

View File

@ -1,18 +1,30 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using SZUAbsolventenverein.Module.EventRegistration.Models;
namespace SZUAbsolventenverein.Module.EventRegistration.Services
{
public interface IEventRegistrationService
{
Task<List<Models.Event>> GetEventRegistrationsAsync(int ModuleId);
/* Reine Events */
Task<List<Event>> GetEventsAsync(int ModuleId);
Task<Event> GetEventAsync(int EventId, int ModuleId);
Task<Models.Event> GetEventRegistrationAsync(int EventRegistrationId, int ModuleId);
Task<Event> AddEventAsync(Event NewEvent);
Task<Models.Event> AddEventRegistrationAsync(Models.Event EventRegistration);
Task<Event> UpdateEventAsync(Event NewEvent);
Task<Models.Event> UpdateEventRegistrationAsync(Models.Event EventRegistration);
Task DeleteEventAsync(int EventId, int ModuleId);
Task DeleteEventRegistrationAsync(int EventRegistrationId, int ModuleId);
/* Events & Responses */
Task<Response> AddResponseAsync(Response Response);
Task<Response> UpdateResponseAsync(Response Response);
Task<(Event, Response)> GetEventDetails(int EventId, int ModuleId);
Task<List<Response>> GetEventResponses(int EventId, int ModuleId);
}
}

View File

@ -9,10 +9,14 @@ namespace SZUAbsolventenverein.Module.EventRegistration.Models
public class Event : IAuditable
{
[Key]
public int EventRegistrationId { get; set; }
public int EventId { get; set; }
public int ModuleId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public DateTime EventDate { get; set; }
public string Location { get; set; }
public string CreatedBy { get; set; }
public DateTime CreatedOn { get; set; }
public string ModifiedBy { get; set; }

View File

@ -14,7 +14,6 @@ namespace SZUAbsolventenverein.Module.EventRegistration.Models
public int OwnerId { get; set; }
public int EventRegistrationId { get; set; }
public int ModuleId { get; set; }
public string Name { get; set; }
public string CreatedBy { get; set; }
public DateTime CreatedOn { get; set; }