From 9725e2a729b979a15ad3b0cf88c4c2af484ecf38 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Tue, 1 Apr 2025 19:05:33 +0200 Subject: [PATCH 01/76] =?UTF-8?q?fix(Programm):=20Update=20des=20=E2=80=9E?= =?UTF-8?q?Envelope=20Generator=E2=80=9C-Repositorys=20und=20der=20Dienstk?= =?UTF-8?q?onfiguration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- EnvelopeGenerator.GeneratorAPI/Program.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/EnvelopeGenerator.GeneratorAPI/Program.cs b/EnvelopeGenerator.GeneratorAPI/Program.cs index 5d734ea5..0baaa1d2 100644 --- a/EnvelopeGenerator.GeneratorAPI/Program.cs +++ b/EnvelopeGenerator.GeneratorAPI/Program.cs @@ -60,7 +60,9 @@ builder.Services.AddDirectorySearchService(); builder.Services.AddCookieBasedLocalizer() ; // Envelope generator serives -builder.Services.AddEnvelopeGenerator(config); +builder.Services + .AddEnvelopeGeneratorRepositories() + .AddEnvelopeGeneratorServices(config); var app = builder.Build(); From 4a48bbb3e208a84460dc759961f2cac711a06d7c Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Tue, 1 Apr 2025 20:43:35 +0200 Subject: [PATCH 02/76] Update target frameworks in project file The project file `EnvelopeGenerator.GeneratorAPI.csproj` has been modified to target multiple frameworks, replacing the single target `net7.0` with `net8.0` and `net9.0`. This change enables the project to be built for the latest versions of .NET. --- .../EnvelopeGenerator.GeneratorAPI.csproj | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/EnvelopeGenerator.GeneratorAPI/EnvelopeGenerator.GeneratorAPI.csproj b/EnvelopeGenerator.GeneratorAPI/EnvelopeGenerator.GeneratorAPI.csproj index 51efca53..4518eb7e 100644 --- a/EnvelopeGenerator.GeneratorAPI/EnvelopeGenerator.GeneratorAPI.csproj +++ b/EnvelopeGenerator.GeneratorAPI/EnvelopeGenerator.GeneratorAPI.csproj @@ -1,7 +1,7 @@  - net7.0 + net8.0;net9.0 enable enable @@ -10,6 +10,7 @@ + From d08e93cbefcb02089ac04d1787a3b1fae1015517 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Wed, 2 Apr 2025 11:21:31 +0200 Subject: [PATCH 03/76] =?UTF-8?q?Aktualisieren=20Sie=20das=20Projekt=20auf?= =?UTF-8?q?=20.NET=209.0=20und=20verbessern=20Sie=20die=20API-Unterst?= =?UTF-8?q?=C3=BCtzung?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Zielen Sie nur auf .NET 9.0 in `EnvelopeGenerator.GeneratorAPI.csproj`. - Fügen Sie das Paket `AspNetCore.Scalar` hinzu und aktualisieren Sie `Microsoft.AspNetCore.OpenApi` auf Version 9.0.3. - Scalar.AspNetCore„ in die Datei “Program.cs" einbinden. - Integrieren Sie OpenAPI-Unterstützung mit `AddOpenApi()` und bilden Sie Endpunkte mit `app.MapOpenApi()` und `app.MapScalarApiReference()` ab. --- .../EnvelopeGenerator.GeneratorAPI.csproj | 5 +++-- EnvelopeGenerator.GeneratorAPI/Program.cs | 6 +++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/EnvelopeGenerator.GeneratorAPI/EnvelopeGenerator.GeneratorAPI.csproj b/EnvelopeGenerator.GeneratorAPI/EnvelopeGenerator.GeneratorAPI.csproj index 4518eb7e..7dca91d6 100644 --- a/EnvelopeGenerator.GeneratorAPI/EnvelopeGenerator.GeneratorAPI.csproj +++ b/EnvelopeGenerator.GeneratorAPI/EnvelopeGenerator.GeneratorAPI.csproj @@ -1,15 +1,16 @@  - net8.0;net9.0 + net9.0 enable enable + - + diff --git a/EnvelopeGenerator.GeneratorAPI/Program.cs b/EnvelopeGenerator.GeneratorAPI/Program.cs index 0baaa1d2..35abd3f4 100644 --- a/EnvelopeGenerator.GeneratorAPI/Program.cs +++ b/EnvelopeGenerator.GeneratorAPI/Program.cs @@ -7,6 +7,7 @@ using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.AspNetCore.Localization; using Microsoft.EntityFrameworkCore; using System.Globalization; +using Scalar.AspNetCore; var builder = WebApplication.CreateBuilder(args); @@ -32,7 +33,7 @@ builder.Services.AddCors(options => // Swagger builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); - +builder.Services.AddOpenApi(); // DbContext var connStr = config.GetConnectionString("Default") ?? throw new InvalidOperationException("There is no default connection string in appsettings.json."); builder.Services.AddDbContext(options => options.UseSqlServer(connStr)); @@ -66,11 +67,14 @@ builder.Services var app = builder.Build(); +app.MapOpenApi(); + // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); + app.MapScalarApiReference(); } // Set CORS policy From f40ee49977043c3e01ec1eba5385a439a642a797 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Wed, 2 Apr 2025 14:40:02 +0200 Subject: [PATCH 04/76] Verbesserung der Login-Methode und Vereinfachung der IsAuthenticated-Route MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Die Login-Methode wurde geändert, um einen zusätzlichen `bool cookie`-Parameter für mehr Flexibilität zu akzeptieren. - Hinzufügen einer neuen Login-Methode, die LogInDto aus Formulardaten verarbeitet und die ursprüngliche Methode mit `cookie` auf true setzt. - Aufnahme eines Platzhalters für JWT- und Cookie-Handling in die ursprüngliche Login-Methode. --- .../Controllers/AuthController.cs | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/AuthController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/AuthController.cs index 8d790429..b1d3314d 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/AuthController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/AuthController.cs @@ -27,11 +27,15 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers //TODO: When a user group is created for signFlow, add a process to check if the user is in this group (like "PM_USER") [AllowAnonymous] - [HttpPost("login")] - public async Task Login([FromBody] LogInDto login) + [HttpPost] + public async Task Login([FromBody] LogInDto login, bool cookie = false) { try { + return Ok(); + + throw new NotImplementedException("JWT and cookie option is not implemented"); + bool isValid = _dirSearchService.ValidateCredentials(login.Username, login.Password); if (!isValid) @@ -82,6 +86,14 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers } } + [AllowAnonymous] + [HttpPost] + [Route("/login")] + public async Task Login([FromForm] LogInDto login) + { + return await Login(login, true); + } + [Authorize] [HttpPost("logout")] public async Task Logout() @@ -99,7 +111,7 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers } [AllowAnonymous] - [HttpGet("check")] + [HttpGet] public IActionResult IsAuthenticated() => Ok(User.Identity?.IsAuthenticated ?? false); } } \ No newline at end of file From b9f25a0ac4b90aabdedbf64e3a484fcaf1abfed8 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Wed, 2 Apr 2025 15:02:36 +0200 Subject: [PATCH 05/76] Update Swashbuckle.AspNetCore to version 8.1.0 --- .../EnvelopeGenerator.GeneratorAPI.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EnvelopeGenerator.GeneratorAPI/EnvelopeGenerator.GeneratorAPI.csproj b/EnvelopeGenerator.GeneratorAPI/EnvelopeGenerator.GeneratorAPI.csproj index 7dca91d6..d556a56b 100644 --- a/EnvelopeGenerator.GeneratorAPI/EnvelopeGenerator.GeneratorAPI.csproj +++ b/EnvelopeGenerator.GeneratorAPI/EnvelopeGenerator.GeneratorAPI.csproj @@ -12,7 +12,7 @@ - + From a0e8cc6989300245959347149061e798e055ba55 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Wed, 2 Apr 2025 15:12:59 +0200 Subject: [PATCH 06/76] =?UTF-8?q?Das=20Swagger-Setup=20wurde=20aktualisier?= =?UTF-8?q?t=20und=20enth=C3=A4lt=20nun=20eine=20detaillierte=20Dokumentat?= =?UTF-8?q?ion=20mit=20Versionsangaben,=20Titel,=20Beschreibung=20und=20Ko?= =?UTF-8?q?ntaktinformationen.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- EnvelopeGenerator.GeneratorAPI/Program.cs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/EnvelopeGenerator.GeneratorAPI/Program.cs b/EnvelopeGenerator.GeneratorAPI/Program.cs index 35abd3f4..175e5292 100644 --- a/EnvelopeGenerator.GeneratorAPI/Program.cs +++ b/EnvelopeGenerator.GeneratorAPI/Program.cs @@ -8,6 +8,7 @@ using Microsoft.AspNetCore.Localization; using Microsoft.EntityFrameworkCore; using System.Globalization; using Scalar.AspNetCore; +using Microsoft.OpenApi.Models; var builder = WebApplication.CreateBuilder(args); @@ -32,7 +33,21 @@ builder.Services.AddCors(options => // Swagger builder.Services.AddEndpointsApiExplorer(); -builder.Services.AddSwaggerGen(); +builder.Services.AddSwaggerGen(options => +{ + options.SwaggerDoc("v1", new OpenApiInfo + { + Version = "v1", + Title = "signFLOW Absender-API", + Description = "\"Eine API zur Verwaltung der Erstellung, des Versands und der Nachverfolgung von Umschlägen in der signFLOW-Anwendung.", + Contact = new OpenApiContact + { + Name = "Digital Data GmbH", + Url = new Uri("https://digitaldata.works/digitale-signatur#kontakt"), + Email = "info-flow@digitaldata.works" + }, + }); +}); builder.Services.AddOpenApi(); // DbContext var connStr = config.GetConnectionString("Default") ?? throw new InvalidOperationException("There is no default connection string in appsettings.json."); From 754e3ddc7afc26b72c52b257816c62ecd2bfc764 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Wed, 2 Apr 2025 17:07:07 +0200 Subject: [PATCH 07/76] Verbesserung des AuthControllers und der Projektdokumentation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - AuthController.cs mit XML-Dokumentation aktualisiert und Parameter der Login-Methode umstrukturiert. - Geänderte Klassendefinition zu partiell für Erweiterbarkeit. - XML-Dokumentationsgenerierung zur Projektdatei hinzugefügt. - Verbesserte Swagger-Dokumentation in Program.cs und korrigierte API-Beschreibung. - Einführung einer neuen Datei Login.cs für ein strukturiertes Login-Datenmodell. --- .../Controllers/AuthController.cs | 47 ++++++++++++++----- .../EnvelopeGenerator.GeneratorAPI.csproj | 1 + .../Models/Login.cs | 15 ++++++ EnvelopeGenerator.GeneratorAPI/Program.cs | 6 ++- 4 files changed, 56 insertions(+), 13 deletions(-) create mode 100644 EnvelopeGenerator.GeneratorAPI/Models/Login.cs diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/AuthController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/AuthController.cs index b1d3314d..136216d0 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/AuthController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/AuthController.cs @@ -10,14 +10,23 @@ using Microsoft.AspNetCore.Authorization; namespace EnvelopeGenerator.GeneratorAPI.Controllers { + /// + /// Controller verantwortlich für die Benutzer-Authentifizierung, einschließlich Anmelden, Abmelden und Überprüfung des Authentifizierungsstatus. + /// [Route("api/[controller]")] [ApiController] - public class AuthController : ControllerBase + public partial class AuthController : ControllerBase { private readonly ILogger _logger; private readonly IUserService _userService; private readonly IDirectorySearchService _dirSearchService; + /// + /// Initializes a new instance of the class. + /// + /// The logger instance. + /// The user service instance. + /// The directory search service instance. public AuthController(ILogger logger, IUserService userService, IDirectorySearchService dirSearchService) { _logger = logger; @@ -25,10 +34,24 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers _dirSearchService = dirSearchService; } - //TODO: When a user group is created for signFlow, add a process to check if the user is in this group (like "PM_USER") + /// + /// Authentifiziert einen Benutzer und generiert ein JWT-Token. Wenn 'cookie' wahr ist, wird das Token als HTTP-Only-Cookie zurückgegeben. + /// + /// Benutzeranmeldedaten (Benutzername und Passwort). + /// Wenn wahr, wird das JWT-Token auch als HTTP-Only-Cookie gesendet. + /// + /// Gibt eine HTTP 200 OK-Antwort mit dem JWT-Token im Antwortkörper oder als HTTP-Only-Cookie zurück, wenn 'cookie' wahr ist. + /// + /// Erfolgreiche Anmeldung. Gibt das JWT-Token im Antwortkörper oder als Cookie zurück, wenn 'cookie' wahr ist. + /// Unbefugt. Ungültiger Benutzername oder Passwort. + /// Interner Serverfehler. + [HttpPost] + [ProducesResponseType(typeof(string), StatusCodes.Status200OK, "text/javascript")] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status500InternalServerError)] [AllowAnonymous] [HttpPost] - public async Task Login([FromBody] LogInDto login, bool cookie = false) + public async Task Login([FromBody] LogInDto login, [FromQuery] bool cookie = false) { try { @@ -52,13 +75,13 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers // Create claims var claims = new List - { - new (ClaimTypes.NameIdentifier, user.Id.ToString()), - new (ClaimTypes.Name, user.Username), - new (ClaimTypes.Surname, user.Name!), - new (ClaimTypes.GivenName, user.Prename!), - new (ClaimTypes.Email, user.Email!), - }; + { + new (ClaimTypes.NameIdentifier, user.Id.ToString()), + new (ClaimTypes.Name, user.Username), + new (ClaimTypes.Surname, user.Name!), + new (ClaimTypes.GivenName, user.Prename!), + new (ClaimTypes.Email, user.Email!), + }; // Create claimsIdentity var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme); @@ -79,7 +102,7 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers return Ok(); } - catch(Exception ex) + catch (Exception ex) { _logger.LogError(ex, "Unexpected error occurred.\n{ErrorMessage}", ex.Message); return StatusCode(StatusCodes.Status500InternalServerError); @@ -88,7 +111,7 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers [AllowAnonymous] [HttpPost] - [Route("/login")] + [Route("/form")] public async Task Login([FromForm] LogInDto login) { return await Login(login, true); diff --git a/EnvelopeGenerator.GeneratorAPI/EnvelopeGenerator.GeneratorAPI.csproj b/EnvelopeGenerator.GeneratorAPI/EnvelopeGenerator.GeneratorAPI.csproj index d556a56b..50a84c9c 100644 --- a/EnvelopeGenerator.GeneratorAPI/EnvelopeGenerator.GeneratorAPI.csproj +++ b/EnvelopeGenerator.GeneratorAPI/EnvelopeGenerator.GeneratorAPI.csproj @@ -4,6 +4,7 @@ net9.0 enable enable + true diff --git a/EnvelopeGenerator.GeneratorAPI/Models/Login.cs b/EnvelopeGenerator.GeneratorAPI/Models/Login.cs new file mode 100644 index 00000000..424931d1 --- /dev/null +++ b/EnvelopeGenerator.GeneratorAPI/Models/Login.cs @@ -0,0 +1,15 @@ +using System.ComponentModel.DataAnnotations; + +namespace EnvelopeGenerator.GeneratorAPI.Models; + +/// +/// Anmeldedatenmodell +/// +/// +/// Login data model +/// +/// Active Directory user name +/// Active Directory password +public record Login([Required]string Username, [Required] string Password) +{ +} diff --git a/EnvelopeGenerator.GeneratorAPI/Program.cs b/EnvelopeGenerator.GeneratorAPI/Program.cs index 175e5292..3638047f 100644 --- a/EnvelopeGenerator.GeneratorAPI/Program.cs +++ b/EnvelopeGenerator.GeneratorAPI/Program.cs @@ -9,6 +9,7 @@ using Microsoft.EntityFrameworkCore; using System.Globalization; using Scalar.AspNetCore; using Microsoft.OpenApi.Models; +using System.Reflection; var builder = WebApplication.CreateBuilder(args); @@ -39,7 +40,7 @@ builder.Services.AddSwaggerGen(options => { Version = "v1", Title = "signFLOW Absender-API", - Description = "\"Eine API zur Verwaltung der Erstellung, des Versands und der Nachverfolgung von Umschlägen in der signFLOW-Anwendung.", + Description = "Eine API zur Verwaltung der Erstellung, des Versands und der Nachverfolgung von Umschlägen in der signFLOW-Anwendung.", Contact = new OpenApiContact { Name = "Digital Data GmbH", @@ -47,6 +48,9 @@ builder.Services.AddSwaggerGen(options => Email = "info-flow@digitaldata.works" }, }); + + var xmlFilename = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; + options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, xmlFilename)); }); builder.Services.AddOpenApi(); // DbContext From 701b26289ba59c20682d419f78df390a29448eef Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Thu, 3 Apr 2025 08:02:42 +0200 Subject: [PATCH 08/76] Refactor AuthController and update Login method - Added using directive for EnvelopeGenerator.GeneratorAPI.Models. - Changed Login method parameter type from LogInDto to Login. - Modified HTTP route for Login method from "/form" to "form". - Enhanced XML documentation for better clarity on method usage. - Specified response type for successful login as text/javascript. - Removed ProducesResponseType for 500 Internal Server Error. --- .../Controllers/AuthController.cs | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/AuthController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/AuthController.cs index 136216d0..050c0587 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/AuthController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/AuthController.cs @@ -7,6 +7,7 @@ using Microsoft.AspNetCore.Mvc; using System.Security.Claims; using DigitalData.UserManager.Application.DTOs.Auth; using Microsoft.AspNetCore.Authorization; +using EnvelopeGenerator.GeneratorAPI.Models; namespace EnvelopeGenerator.GeneratorAPI.Controllers { @@ -44,14 +45,11 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers /// /// Erfolgreiche Anmeldung. Gibt das JWT-Token im Antwortkörper oder als Cookie zurück, wenn 'cookie' wahr ist. /// Unbefugt. Ungültiger Benutzername oder Passwort. - /// Interner Serverfehler. - [HttpPost] [ProducesResponseType(typeof(string), StatusCodes.Status200OK, "text/javascript")] [ProducesResponseType(StatusCodes.Status401Unauthorized)] - [ProducesResponseType(StatusCodes.Status500InternalServerError)] [AllowAnonymous] [HttpPost] - public async Task Login([FromBody] LogInDto login, [FromQuery] bool cookie = false) + public async Task Login([FromBody] Login login, [FromQuery] bool cookie = false) { try { @@ -109,10 +107,21 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers } } + /// + /// Authentifiziert einen Benutzer und generiert ein JWT-Token. Das Token wird als HTTP-only-Cookie zurückgegeben. + /// + /// Benutzeranmeldedaten (Benutzername und Passwort). + /// + /// Gibt eine HTTP 200 OK-Antwort als HTTP-Only-Cookie zurück. + /// + /// Erfolgreiche Anmeldung. Gibt das JWT-Token im Antwortkörper oder als Cookie zurück, wenn 'cookie' wahr ist. + /// Unbefugt. Ungültiger Benutzername oder Passwort. + [ProducesResponseType(typeof(string), StatusCodes.Status200OK, "text/javascript")] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] [AllowAnonymous] [HttpPost] - [Route("/form")] - public async Task Login([FromForm] LogInDto login) + [Route("form")] + public async Task Login([FromForm] Login login) { return await Login(login, true); } From 251420134a5848873cdb2dbea073adf02d7d4b51 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Thu, 3 Apr 2025 11:12:33 +0200 Subject: [PATCH 09/76] Verbesserung der Authentifizierungsmethoden und der Dokumentation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Die XML-Dokumentation für die Methode „Login“ wurde aktualisiert, um die Antwortcodes zu verdeutlichen, und es wurden Beispielanfragen hinzugefügt. Einführung einer neuen „Logout“-Methode mit entsprechender Dokumentation und Autorisierung. Hinzufügen einer Methode `IsAuthenticated` zur Überprüfung auf gültige Token, mit aktualisierter Antwortbehandlung und Dokumentation. Das `AllowAnonymous`-Attribut von `IsAuthenticated` wurde entfernt, um die Autorisierung zu erzwingen. --- .../Controllers/AuthController.cs | 62 +++++++++++++++++-- 1 file changed, 56 insertions(+), 6 deletions(-) diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/AuthController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/AuthController.cs index 050c0587..129ea20d 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/AuthController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/AuthController.cs @@ -41,12 +41,22 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers /// Benutzeranmeldedaten (Benutzername und Passwort). /// Wenn wahr, wird das JWT-Token auch als HTTP-Only-Cookie gesendet. /// - /// Gibt eine HTTP 200 OK-Antwort mit dem JWT-Token im Antwortkörper oder als HTTP-Only-Cookie zurück, wenn 'cookie' wahr ist. + /// Gibt eine HTTP 200 oder 401. /// + /// + /// Sample request: + /// + /// POST /api/auth?cookie=true + /// { + /// "username": "MaxMustermann", + /// "password": "Geheim123!" + /// } + /// + /// /// Erfolgreiche Anmeldung. Gibt das JWT-Token im Antwortkörper oder als Cookie zurück, wenn 'cookie' wahr ist. /// Unbefugt. Ungültiger Benutzername oder Passwort. [ProducesResponseType(typeof(string), StatusCodes.Status200OK, "text/javascript")] - [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(typeof(void), StatusCodes.Status401Unauthorized)] [AllowAnonymous] [HttpPost] public async Task Login([FromBody] Login login, [FromQuery] bool cookie = false) @@ -112,12 +122,22 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers /// /// Benutzeranmeldedaten (Benutzername und Passwort). /// - /// Gibt eine HTTP 200 OK-Antwort als HTTP-Only-Cookie zurück. + /// Gibt eine HTTP 200 oder 401. /// + /// + /// Sample request: + /// + /// POST /api/auth/form + /// { + /// "username": "MaxMustermann", + /// "password": "Geheim123!" + /// } + /// + /// /// Erfolgreiche Anmeldung. Gibt das JWT-Token im Antwortkörper oder als Cookie zurück, wenn 'cookie' wahr ist. /// Unbefugt. Ungültiger Benutzername oder Passwort. [ProducesResponseType(typeof(string), StatusCodes.Status200OK, "text/javascript")] - [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(typeof(void), StatusCodes.Status401Unauthorized)] [AllowAnonymous] [HttpPost] [Route("form")] @@ -126,6 +146,22 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers return await Login(login, true); } + /// + /// Entfernt das Authentifizierungs-Cookie des Benutzers (AuthCookie) + /// + /// + /// Gibt eine HTTP 200 oder 401. + /// + /// + /// Sample request: + /// + /// POST /api/auth/logout + /// + /// + /// Erfolgreich gelöscht, wenn der Benutzer ein berechtigtes Cookie hat. + /// Wenn es kein zugelassenes Cookie gibt, wird „nicht zugelassen“ zurückgegeben. + [ProducesResponseType(typeof(string), StatusCodes.Status200OK, "text/javascript")] + [ProducesResponseType(typeof(void), StatusCodes.Status401Unauthorized)] [Authorize] [HttpPost("logout")] public async Task Logout() @@ -142,8 +178,22 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers } } - [AllowAnonymous] + /// + /// Prüft, ob der Benutzer ein autorisiertes Token hat. + /// + /// Wenn ein autorisiertes Token vorhanden ist HTTP 200 asynchron 401 + /// + /// Sample request: + /// + /// GET /api/auth + /// + /// + /// Wenn es einen autorisierten Cookie gibt. + /// Wenn kein Cookie vorhanden ist oder nicht autorisierte. + [ProducesResponseType(typeof(string), StatusCodes.Status200OK, "text/javascript")] + [ProducesResponseType(typeof(void), StatusCodes.Status401Unauthorized)] + [Authorize] [HttpGet] - public IActionResult IsAuthenticated() => Ok(User.Identity?.IsAuthenticated ?? false); + public IActionResult IsAuthenticated() => Ok(); } } \ No newline at end of file From 7e07afa384b15c1e0124f3dbd7754c92ddfbf9a0 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Thu, 3 Apr 2025 13:21:08 +0200 Subject: [PATCH 10/76] Add MediatR package reference to project This commit adds a new package reference for "MediatR" with version "11.1.0" to the project file `EnvelopeGenerator.Application.csproj`. --- .../EnvelopeGenerator.Application.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/EnvelopeGenerator.Application/EnvelopeGenerator.Application.csproj b/EnvelopeGenerator.Application/EnvelopeGenerator.Application.csproj index c8b0b4a5..072cca40 100644 --- a/EnvelopeGenerator.Application/EnvelopeGenerator.Application.csproj +++ b/EnvelopeGenerator.Application/EnvelopeGenerator.Application.csproj @@ -17,6 +17,7 @@ + From 7871bf72f6e10fdc952677f5ceebff4ecc0bd3cb Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Thu, 3 Apr 2025 17:48:49 +0200 Subject: [PATCH 11/76] Add CreateEnvelope command and DTO for envelope creation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Führt den `CreateEnvelopeCommand` Datensatz und seinen Handler ein, der die `IRequest` Schnittstelle von MediatR implementiert. Der Handler wirft derzeit eine `NotImplementedException`. Fügt die Klasse „EnvelopeCreateDto“ mit Eigenschaften für Titel, Nachricht, Sprache, Verfallsdaten, Vertragstyp und TFA-Flag hinzu. Erforderliche Felder werden mit Datenanmerkungen validiert, und für bestimmte Eigenschaften werden Standardwerte festgelegt. --- .../Envelope/Commands/CreateEnvelope.cs | 13 +++++++++++ .../Envelope/Commands/EnvelopeCreateDto.cs | 23 +++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 EnvelopeGenerator.Application/Envelope/Commands/CreateEnvelope.cs create mode 100644 EnvelopeGenerator.Application/Envelope/Commands/EnvelopeCreateDto.cs diff --git a/EnvelopeGenerator.Application/Envelope/Commands/CreateEnvelope.cs b/EnvelopeGenerator.Application/Envelope/Commands/CreateEnvelope.cs new file mode 100644 index 00000000..8dafdc01 --- /dev/null +++ b/EnvelopeGenerator.Application/Envelope/Commands/CreateEnvelope.cs @@ -0,0 +1,13 @@ +using MediatR; + +namespace EnvelopeGenerator.Application.Envelope.Commands; + +public record CreateEnvelopeCommand(EnvelopeCreateDto Envelope) : IRequest; + +public class CreateEnvelopeCommandHandler : IRequestHandler +{ + public Task Handle(CreateEnvelopeCommand request, CancellationToken cancellationToken) + { + throw new NotImplementedException(); + } +} diff --git a/EnvelopeGenerator.Application/Envelope/Commands/EnvelopeCreateDto.cs b/EnvelopeGenerator.Application/Envelope/Commands/EnvelopeCreateDto.cs new file mode 100644 index 00000000..80176ad6 --- /dev/null +++ b/EnvelopeGenerator.Application/Envelope/Commands/EnvelopeCreateDto.cs @@ -0,0 +1,23 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace EnvelopeGenerator.Application.Envelope.Commands; + +public class EnvelopeCreateDto +{ + [Required] + public required string Title { get; init; } + + [Required] + public required string Message { get; init; } + + public string Language { get; init; } = "de-DE"; + + public DateTime? ExpiresWhen { get; init; } + + public DateTime? ExpiresWarningWhen { get; init; } + + public int? ContractType { get; init; } = (int)Common.Constants.ContractType.Contract; + + public bool TFAEnabled { get; init; } = false; +} From 401d03aac2a90f64cf725358b0ed698101ad73ef Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Fri, 4 Apr 2025 14:02:30 +0200 Subject: [PATCH 12/76] Verbesserung der Umschlagserstellung mit neuen DTOs und Befehlen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Einführung neuer Datenübertragungsobjekte für Signaturen und Empfänger. Aktualisiert `CreateEnvelopeCommand` um benötigte Felder wie `Title`, `Message`, `Document` und `Receivers`, zusammen mit optionalen Parametern. Entfernt `EnvelopeCreateDto` für einen besser strukturierten Ansatz zur Verwaltung von Umschlagserstellungsdaten. --- .../Envelope/Commands/CreateEnvelope.cs | 54 ++++++++++++++++++- .../Envelope/Commands/EnvelopeCreateDto.cs | 23 -------- 2 files changed, 52 insertions(+), 25 deletions(-) delete mode 100644 EnvelopeGenerator.Application/Envelope/Commands/EnvelopeCreateDto.cs diff --git a/EnvelopeGenerator.Application/Envelope/Commands/CreateEnvelope.cs b/EnvelopeGenerator.Application/Envelope/Commands/CreateEnvelope.cs index 8dafdc01..60138a30 100644 --- a/EnvelopeGenerator.Application/Envelope/Commands/CreateEnvelope.cs +++ b/EnvelopeGenerator.Application/Envelope/Commands/CreateEnvelope.cs @@ -1,12 +1,62 @@ using MediatR; +using System.ComponentModel.DataAnnotations; namespace EnvelopeGenerator.Application.Envelope.Commands; -public record CreateEnvelopeCommand(EnvelopeCreateDto Envelope) : IRequest; +#region DTOs +/// +/// Signaturposition auf einem Dokument. +/// +/// X-Position +/// Y-Position +/// Seite, auf der sie sich befindet +public record Signature([Required] int X, [Required] int Y, [Required] int Page); +/// +/// DTO für Empfänger, die erstellt oder abgerufen werden sollen. +/// Wenn nicht, wird sie erstellt und mit einer Signatur versehen. +/// +/// Unterschriften auf Dokumenten. +/// Der Name, mit dem der Käufer angesprochen werden soll. Bei Null oder keinem Wert wird der zuletzt verwendete Name verwendet. +/// Sollte mit Vorwahl geschrieben werden +public record ReceiverGetOrCreateDto([Required] IEnumerable Signatures, string? Name = null, string? PhoneNumber = null) +{ + private string _emailAddress; + + /// + /// E-Mail-Adresse des Empfängers. + /// + [Required] + public required string EmailAddress { get => _emailAddress.ToLower(); init => _emailAddress.ToLower(); } +}; + +/// +/// DTO für die Erstellung eines Dokuments. +/// +public record DocumentCreateDto(byte[]? DataAsByte = null, string? DataAsBase64 = null); +#endregion + +/// +/// Befehl zur Erstellung eines Umschlags. +/// +public record CreateEnvelopeCommand( + [Required] string Title, + [Required] string Message, + [Required] DocumentCreateDto Document, + [Required] IEnumerable Receivers + string Language = "de-DE", + DateTime? ExpiresWhen = null, + DateTime? ExpiresWarningWhen = null, + int ContractType = (int)Common.Constants.ContractType.Contract, + bool TFAEnabled = false, + ) : IRequest; + +/// +/// Handler für den CreateEnvelopeCommand. +/// public class CreateEnvelopeCommandHandler : IRequestHandler { - public Task Handle(CreateEnvelopeCommand request, CancellationToken cancellationToken) + public Task Handle(CreateEnvelopeCommand request, CancellationToken cancellationToken) { throw new NotImplementedException(); } diff --git a/EnvelopeGenerator.Application/Envelope/Commands/EnvelopeCreateDto.cs b/EnvelopeGenerator.Application/Envelope/Commands/EnvelopeCreateDto.cs deleted file mode 100644 index 80176ad6..00000000 --- a/EnvelopeGenerator.Application/Envelope/Commands/EnvelopeCreateDto.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; - -namespace EnvelopeGenerator.Application.Envelope.Commands; - -public class EnvelopeCreateDto -{ - [Required] - public required string Title { get; init; } - - [Required] - public required string Message { get; init; } - - public string Language { get; init; } = "de-DE"; - - public DateTime? ExpiresWhen { get; init; } - - public DateTime? ExpiresWarningWhen { get; init; } - - public int? ContractType { get; init; } = (int)Common.Constants.ContractType.Contract; - - public bool TFAEnabled { get; init; } = false; -} From 261d1b3db9021d4eaf733807f928fdfc4fa55395 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Fri, 4 Apr 2025 15:36:03 +0200 Subject: [PATCH 13/76] =?UTF-8?q?Verbesserte=20Funktionen=20zur=20Erstellu?= =?UTF-8?q?ng=20von=20Umschl=C3=A4gen=20und=20Aktualisierung=20von=20Proje?= =?UTF-8?q?kten?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Neue DTOs und Befehle zur Erstellung von Umschlägen in CreateEnvelope.cs hinzugefügt. Aktualisierte Projektdateien, um net7.0, net8.0 und net9.0 zu unterstützen. Refactored EnvelopeController für bessere Struktur und Fehlerbehandlung. Einführung einer Methode zur Erstellung von Umschlägen in EnvelopeReceiverController unter Verwendung von IMediator. Allgemeine Verbesserungen der Funktionalität und Kompatibilität. --- .../EnvelopeGenerator.Application.csproj | 2 +- .../Commands/CreateEnvelope.cs | 8 +- .../EnvelopeGenerator.Domain.csproj | 2 +- .../Controllers/EnvelopeController.cs | 73 +++++++++---------- .../Controllers/EnvelopeReceiverController.cs | 58 ++++++++++++++- .../EnvelopeGenerator.Infrastructure.csproj | 2 +- 6 files changed, 100 insertions(+), 45 deletions(-) rename EnvelopeGenerator.Application/{Envelope => EnvelopeReceivers}/Commands/CreateEnvelope.cs (88%) diff --git a/EnvelopeGenerator.Application/EnvelopeGenerator.Application.csproj b/EnvelopeGenerator.Application/EnvelopeGenerator.Application.csproj index 072cca40..b53c961c 100644 --- a/EnvelopeGenerator.Application/EnvelopeGenerator.Application.csproj +++ b/EnvelopeGenerator.Application/EnvelopeGenerator.Application.csproj @@ -1,7 +1,7 @@  - net7.0 + net7.0;net8.0;net9.0 enable enable diff --git a/EnvelopeGenerator.Application/Envelope/Commands/CreateEnvelope.cs b/EnvelopeGenerator.Application/EnvelopeReceivers/Commands/CreateEnvelope.cs similarity index 88% rename from EnvelopeGenerator.Application/Envelope/Commands/CreateEnvelope.cs rename to EnvelopeGenerator.Application/EnvelopeReceivers/Commands/CreateEnvelope.cs index 60138a30..ff15f3b6 100644 --- a/EnvelopeGenerator.Application/Envelope/Commands/CreateEnvelope.cs +++ b/EnvelopeGenerator.Application/EnvelopeReceivers/Commands/CreateEnvelope.cs @@ -1,7 +1,7 @@ using MediatR; using System.ComponentModel.DataAnnotations; -namespace EnvelopeGenerator.Application.Envelope.Commands; +namespace EnvelopeGenerator.Application.EnvelopeReceivers.Commands; #region DTOs /// @@ -43,12 +43,12 @@ public record CreateEnvelopeCommand( [Required] string Title, [Required] string Message, [Required] DocumentCreateDto Document, - [Required] IEnumerable Receivers + [Required] IEnumerable Receivers, string Language = "de-DE", DateTime? ExpiresWhen = null, DateTime? ExpiresWarningWhen = null, int ContractType = (int)Common.Constants.ContractType.Contract, - bool TFAEnabled = false, + bool TFAEnabled = false ) : IRequest; /// @@ -56,7 +56,7 @@ public record CreateEnvelopeCommand( /// public class CreateEnvelopeCommandHandler : IRequestHandler { - public Task Handle(CreateEnvelopeCommand request, CancellationToken cancellationToken) + public Task Handle(CreateEnvelopeCommand request, CancellationToken cancellationToken = default) { throw new NotImplementedException(); } diff --git a/EnvelopeGenerator.Domain/EnvelopeGenerator.Domain.csproj b/EnvelopeGenerator.Domain/EnvelopeGenerator.Domain.csproj index 50561806..7827d6d6 100644 --- a/EnvelopeGenerator.Domain/EnvelopeGenerator.Domain.csproj +++ b/EnvelopeGenerator.Domain/EnvelopeGenerator.Domain.csproj @@ -1,7 +1,7 @@ - net7.0 + net7.0;net8.0;net9.0 enable enable diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs index a7835d66..f6e4d17c 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs @@ -3,50 +3,49 @@ using EnvelopeGenerator.Application.Contracts.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace EnvelopeGenerator.GeneratorAPI.Controllers +namespace EnvelopeGenerator.GeneratorAPI.Controllers; + +[Route("api/[controller]")] +[ApiController] +[Authorize] +public class EnvelopeController : ControllerBase { - [Route("api/[controller]")] - [ApiController] - [Authorize] - public class EnvelopeController : ControllerBase + private readonly ILogger _logger; + private readonly IEnvelopeService _envelopeService; + + public EnvelopeController(ILogger logger, IEnvelopeService envelopeService) { - private readonly ILogger _logger; - private readonly IEnvelopeService _envelopeService; - - public EnvelopeController(ILogger logger, IEnvelopeService envelopeService) - { - _logger = logger; - _envelopeService = envelopeService; - } + _logger = logger; + _envelopeService = envelopeService; + } - [Authorize] - [HttpGet] - public async Task GetCurrentAsync( - [FromQuery] int? min_status = null, - [FromQuery] int? max_status = null, - [FromQuery] params int[] ignore_statuses) + [Authorize] + [HttpGet] + public async Task GetAsync( + [FromQuery] int? min_status = null, + [FromQuery] int? max_status = null, + [FromQuery] params int[] ignore_statuses) + { + try { - try - { - if (User.GetId() is int intId) - return await _envelopeService.ReadByUserAsync(intId, min_status: min_status, max_status: max_status, ignore_statuses: ignore_statuses).ThenAsync( - Success: Ok, - Fail: IActionResult (msg, ntc) => - { - _logger.LogNotice(ntc); - return StatusCode(StatusCodes.Status500InternalServerError); - }); - else - { - _logger.LogError("Despite successful authorization, the 'api/envelope' route encountered an issue: the user ID is not recognized as an integer. This may be due to the removal of the ID during the creation of the claims list."); - return StatusCode(StatusCodes.Status500InternalServerError); - } - } - catch (Exception ex) + if (User.GetId() is int intId) + return await _envelopeService.ReadByUserAsync(intId, min_status: min_status, max_status: max_status, ignore_statuses: ignore_statuses).ThenAsync( + Success: Ok, + Fail: IActionResult (msg, ntc) => + { + _logger.LogNotice(ntc); + return StatusCode(StatusCodes.Status500InternalServerError); + }); + else { - _logger.LogError(ex, "{Message}", ex.Message); + _logger.LogError("Despite successful authorization, the 'api/envelope' route encountered an issue: the user ID is not recognized as an integer. This may be due to the removal of the ID during the creation of the claims list."); return StatusCode(StatusCodes.Status500InternalServerError); } } + catch (Exception ex) + { + _logger.LogError(ex, "{Message}", ex.Message); + return StatusCode(StatusCodes.Status500InternalServerError); + } } } \ No newline at end of file diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs index 38184e9a..220c34fb 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs @@ -1,6 +1,8 @@ using DigitalData.Core.DTO; using EnvelopeGenerator.Application.Contracts.Services; +using EnvelopeGenerator.Application.EnvelopeReceivers.Commands; using EnvelopeGenerator.Common.My.Resources; +using MediatR; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; @@ -12,12 +14,16 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers public class EnvelopeReceiverController : ControllerBase { private readonly ILogger _logger; + private readonly IEnvelopeReceiverService _erService; - public EnvelopeReceiverController(ILogger logger, IEnvelopeReceiverService envelopeReceiverService) + private readonly IMediator _mediator; + + public EnvelopeReceiverController(ILogger logger, IEnvelopeReceiverService envelopeReceiverService, IMediator mediator) { _logger = logger; _erService = envelopeReceiverService; + _mediator = mediator; } [HttpGet] @@ -94,5 +100,55 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers return StatusCode(StatusCodes.Status500InternalServerError); } } + + /// + /// Datenübertragungsobjekt mit Informationen zu Umschlägen, Empfängern und Unterschriften. + /// + /// + /// Token to cancel the operation + /// HTTP-Antwort + /// + /// Sample request: + /// + /// POST /api/envelope + /// { + /// "title": "Vertragsdokument", + /// "message": "Bitte unterschreiben Sie dieses Dokument.", + /// "document": { + /// "dataAsBase64": "dGVzdC1iYXNlNjQtZGF0YQ==" + /// }, + /// "receivers": [ + /// { + /// "emailAddress": "example@example.com", + /// "signatures": [ + /// { + /// "x": 100, + /// "y": 200, + /// "page": 1 + /// } + /// ], + /// "name": "Max Mustermann", + /// "phoneNumber": "+49123456789" + /// } + /// ], + /// "language": "de-DE", + /// "expiresWhen": "2025-12-31T23:59:59Z", + /// "expiresWarningWhen": "2025-12-24T23:59:59Z", + /// "contractType": 1, + /// "tfaEnabled": false + /// } + /// + /// + /// Envelope-Erstellung und Sendeprozessbefehl erfolgreich + /// Wenn ein Fehler im HTTP-Body auftritt + /// Wenn kein autorisierter Token vorhanden ist + /// Es handelt sich um einen unerwarteten Fehler. Die Protokolle sollten überprüft werden. + [Authorize] + [HttpPost] + public async Task CreateAsync([FromBody] CreateEnvelopeCommand envelope, CancellationToken cancellationToken) + { + await _mediator.Send(envelope, cancellationToken); + return Accepted(); + } } } \ No newline at end of file diff --git a/EnvelopeGenerator.Infrastructure/EnvelopeGenerator.Infrastructure.csproj b/EnvelopeGenerator.Infrastructure/EnvelopeGenerator.Infrastructure.csproj index 892bbe5a..9f46ea48 100644 --- a/EnvelopeGenerator.Infrastructure/EnvelopeGenerator.Infrastructure.csproj +++ b/EnvelopeGenerator.Infrastructure/EnvelopeGenerator.Infrastructure.csproj @@ -1,7 +1,7 @@  - net7.0 + net7.0;net8.0;net9.0 enable enable From b3a2e1559aa598639b7386f992ae42d2969be4d5 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Mon, 7 Apr 2025 12:03:34 +0200 Subject: [PATCH 14/76] Refactor envelope handling and introduce new queries MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Restructured the `CreateEnvelope` functionality by moving the `CreateEnvelopeCommand` and related DTOs to a new namespace. Der `EnvelopeReceiverController` wurde aktualisiert, um diese Änderungen widerzuspiegeln, und die Parameter wurden zur besseren Übersichtlichkeit umbenannt. Es wurden neue Abfragesätze für das Lesen von Umschlag-Empfängern und definierte Antwortstrukturen eingeführt, wodurch die Gesamtorganisation und die Wartbarkeit der Codebasis verbessert wurden. Übersetzt mit DeepL.com (kostenlose Version) --- .../CreateEnvelopeCommand.cs} | 17 ++----- .../EnvelopeReceiverQuery.cs | 16 +++++++ .../Queries/Read/ReadEnvelopeReceiverQuery.cs | 15 +++++++ .../Read/ReadEnvelopeReceiverResponse.cs | 45 +++++++++++++++++++ .../Envelopes/EnvelopeQuery.cs | 16 +++++++ .../Queries/Read/ReadEnvelopeQuery.cs | 5 +++ .../Queries/Read/ReadReceiverQuery.cs | 5 +++ .../Queries/Read/ReadReceiverResponse.cs | 5 +++ .../Receivers/ReceiverQuery.cs | 3 ++ .../Controllers/EnvelopeReceiverController.cs | 9 ++-- 10 files changed, 117 insertions(+), 19 deletions(-) rename EnvelopeGenerator.Application/EnvelopeReceivers/Commands/{CreateEnvelope.cs => Create/CreateEnvelopeCommand.cs} (83%) create mode 100644 EnvelopeGenerator.Application/EnvelopeReceivers/EnvelopeReceiverQuery.cs create mode 100644 EnvelopeGenerator.Application/EnvelopeReceivers/Queries/Read/ReadEnvelopeReceiverQuery.cs create mode 100644 EnvelopeGenerator.Application/EnvelopeReceivers/Queries/Read/ReadEnvelopeReceiverResponse.cs create mode 100644 EnvelopeGenerator.Application/Envelopes/EnvelopeQuery.cs create mode 100644 EnvelopeGenerator.Application/Envelopes/Queries/Read/ReadEnvelopeQuery.cs create mode 100644 EnvelopeGenerator.Application/Receivers/Queries/Read/ReadReceiverQuery.cs create mode 100644 EnvelopeGenerator.Application/Receivers/Queries/Read/ReadReceiverResponse.cs create mode 100644 EnvelopeGenerator.Application/Receivers/ReceiverQuery.cs diff --git a/EnvelopeGenerator.Application/EnvelopeReceivers/Commands/CreateEnvelope.cs b/EnvelopeGenerator.Application/EnvelopeReceivers/Commands/Create/CreateEnvelopeCommand.cs similarity index 83% rename from EnvelopeGenerator.Application/EnvelopeReceivers/Commands/CreateEnvelope.cs rename to EnvelopeGenerator.Application/EnvelopeReceivers/Commands/Create/CreateEnvelopeCommand.cs index ff15f3b6..195c9db5 100644 --- a/EnvelopeGenerator.Application/EnvelopeReceivers/Commands/CreateEnvelope.cs +++ b/EnvelopeGenerator.Application/EnvelopeReceivers/Commands/Create/CreateEnvelopeCommand.cs @@ -1,7 +1,7 @@ using MediatR; using System.ComponentModel.DataAnnotations; -namespace EnvelopeGenerator.Application.EnvelopeReceivers.Commands; +namespace EnvelopeGenerator.Application.EnvelopeReceivers.Commands.Create; #region DTOs /// @@ -21,7 +21,7 @@ public record Signature([Required] int X, [Required] int Y, [Required] int Page) /// Sollte mit Vorwahl geschrieben werden public record ReceiverGetOrCreateDto([Required] IEnumerable Signatures, string? Name = null, string? PhoneNumber = null) { - private string _emailAddress; + private string _emailAddress = string.Empty; /// /// E-Mail-Adresse des Empfängers. @@ -49,15 +49,4 @@ public record CreateEnvelopeCommand( DateTime? ExpiresWarningWhen = null, int ContractType = (int)Common.Constants.ContractType.Contract, bool TFAEnabled = false - ) : IRequest; - -/// -/// Handler für den CreateEnvelopeCommand. -/// -public class CreateEnvelopeCommandHandler : IRequestHandler -{ - public Task Handle(CreateEnvelopeCommand request, CancellationToken cancellationToken = default) - { - throw new NotImplementedException(); - } -} + ) : IRequest; \ No newline at end of file diff --git a/EnvelopeGenerator.Application/EnvelopeReceivers/EnvelopeReceiverQuery.cs b/EnvelopeGenerator.Application/EnvelopeReceivers/EnvelopeReceiverQuery.cs new file mode 100644 index 00000000..ce8fffd2 --- /dev/null +++ b/EnvelopeGenerator.Application/EnvelopeReceivers/EnvelopeReceiverQuery.cs @@ -0,0 +1,16 @@ +using EnvelopeGenerator.Application.Envelopes.Queries.Read; +using EnvelopeGenerator.Application.Receivers.Queries.Read; + +namespace EnvelopeGenerator.Application.EnvelopeReceivers; + +/// +/// Stellt eine Abfrage zum Lesen eines Envelope-Empfängers dar. +/// +/// +/// +/// +/// +public record EnvelopeReceiverQuery( + int? MinStatus = null, + int? MaxStatus = null, + int[]? IgnoreStatus = null); \ No newline at end of file diff --git a/EnvelopeGenerator.Application/EnvelopeReceivers/Queries/Read/ReadEnvelopeReceiverQuery.cs b/EnvelopeGenerator.Application/EnvelopeReceivers/Queries/Read/ReadEnvelopeReceiverQuery.cs new file mode 100644 index 00000000..d81b8579 --- /dev/null +++ b/EnvelopeGenerator.Application/EnvelopeReceivers/Queries/Read/ReadEnvelopeReceiverQuery.cs @@ -0,0 +1,15 @@ +using EnvelopeGenerator.Application.Envelopes.Queries.Read; +using EnvelopeGenerator.Application.Receivers.Queries.Read; +using MediatR; + +namespace EnvelopeGenerator.Application.EnvelopeReceivers.Queries.Read; + +/// +/// Stellt eine Abfrage zum Lesen eines Envelope-Empfängers dar. +/// +public record ReadEnvelopeReceiverQuery : EnvelopeReceiverQuery, IRequest +{ + public ReadEnvelopeQuery? Envelope { get; init; } + + public ReadReceiverQuery? Receiver { get; init; } +}; \ No newline at end of file diff --git a/EnvelopeGenerator.Application/EnvelopeReceivers/Queries/Read/ReadEnvelopeReceiverResponse.cs b/EnvelopeGenerator.Application/EnvelopeReceivers/Queries/Read/ReadEnvelopeReceiverResponse.cs new file mode 100644 index 00000000..69559533 --- /dev/null +++ b/EnvelopeGenerator.Application/EnvelopeReceivers/Queries/Read/ReadEnvelopeReceiverResponse.cs @@ -0,0 +1,45 @@ +using DigitalData.EmailProfilerDispatcher.Abstraction.Attributes; +using EnvelopeGenerator.Application.Receivers.Queries.Read; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace EnvelopeGenerator.Application.EnvelopeReceivers.Queries.Read; + +/// +/// Stellt eine Antwort auf die Abfrage zum Lesen eines Envelope-Empfängers dar. +/// +/// Der angeforderte Empfänger. +public record ReadEnvelopeReceiverResponse(int UserId, int Status) +{ + [NotMapped] + public (int Envelope, int Receiver) Id => (Envelope: EnvelopeId, Receiver: ReceiverId); + + [Required] + public int EnvelopeId { get; init; } + + [Required] + public int ReceiverId { get; init; } + + public int Sequence { get; init; } + + [TemplatePlaceholder("[NAME_RECEIVER]")] + public string? Name { get; init; } + + public string? JobTitle { get; init; } + + public string? CompanyName { get; init; } + + public string? PrivateMessage { get; init; } + + public DateTime AddedWhen { get; init; } + + public DateTime? ChangedWhen { get; init; } + + public bool HasPhoneNumber { get; init; } + + [Required] + public required ReadReceiverResponse Envelope { get; init; } + + [Required] + public required ReadReceiverResponse Receiver { get; init; } +} \ No newline at end of file diff --git a/EnvelopeGenerator.Application/Envelopes/EnvelopeQuery.cs b/EnvelopeGenerator.Application/Envelopes/EnvelopeQuery.cs new file mode 100644 index 00000000..5c91a622 --- /dev/null +++ b/EnvelopeGenerator.Application/Envelopes/EnvelopeQuery.cs @@ -0,0 +1,16 @@ +using MediatR; + +namespace EnvelopeGenerator.Application.Envelopes; + +/// +/// Repräsentiert eine Abfrage für Umschläge. +/// +/// Die eindeutige Kennung des Umschlags. +/// Die Kennung des Benutzers, der den Umschlag erstellt hat. +/// Der Status des Umschlags. +/// Die universell eindeutige Kennung des Umschlags. +public record EnvelopeQuery( + int? Id = null, + int? UserId = null, + int? Status = null, + string? Uuid = null) : IRequest; \ No newline at end of file diff --git a/EnvelopeGenerator.Application/Envelopes/Queries/Read/ReadEnvelopeQuery.cs b/EnvelopeGenerator.Application/Envelopes/Queries/Read/ReadEnvelopeQuery.cs new file mode 100644 index 00000000..be21efc3 --- /dev/null +++ b/EnvelopeGenerator.Application/Envelopes/Queries/Read/ReadEnvelopeQuery.cs @@ -0,0 +1,5 @@ +namespace EnvelopeGenerator.Application.Envelopes.Queries.Read; + +public record ReadEnvelopeQuery : EnvelopeQuery +{ +} diff --git a/EnvelopeGenerator.Application/Receivers/Queries/Read/ReadReceiverQuery.cs b/EnvelopeGenerator.Application/Receivers/Queries/Read/ReadReceiverQuery.cs new file mode 100644 index 00000000..a93bf137 --- /dev/null +++ b/EnvelopeGenerator.Application/Receivers/Queries/Read/ReadReceiverQuery.cs @@ -0,0 +1,5 @@ +namespace EnvelopeGenerator.Application.Receivers.Queries.Read; + +public record ReadReceiverQuery : ReceiverQuery +{ +} diff --git a/EnvelopeGenerator.Application/Receivers/Queries/Read/ReadReceiverResponse.cs b/EnvelopeGenerator.Application/Receivers/Queries/Read/ReadReceiverResponse.cs new file mode 100644 index 00000000..11794a88 --- /dev/null +++ b/EnvelopeGenerator.Application/Receivers/Queries/Read/ReadReceiverResponse.cs @@ -0,0 +1,5 @@ +namespace EnvelopeGenerator.Application.Receivers.Queries.Read; + +public record ReadReceiverResponse +{ +} diff --git a/EnvelopeGenerator.Application/Receivers/ReceiverQuery.cs b/EnvelopeGenerator.Application/Receivers/ReceiverQuery.cs new file mode 100644 index 00000000..7b8b5f69 --- /dev/null +++ b/EnvelopeGenerator.Application/Receivers/ReceiverQuery.cs @@ -0,0 +1,3 @@ +namespace EnvelopeGenerator.Application.Receivers; + +public record ReceiverQuery(int? Id = null, string? EmailAddress = null, string? Signature = null); \ No newline at end of file diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs index 220c34fb..c73d791c 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs @@ -1,7 +1,6 @@ using DigitalData.Core.DTO; using EnvelopeGenerator.Application.Contracts.Services; -using EnvelopeGenerator.Application.EnvelopeReceivers.Commands; -using EnvelopeGenerator.Common.My.Resources; +using EnvelopeGenerator.Application.EnvelopeReceivers.Commands.Create; using MediatR; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; @@ -104,7 +103,7 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers /// /// Datenübertragungsobjekt mit Informationen zu Umschlägen, Empfängern und Unterschriften. /// - /// + /// /// Token to cancel the operation /// HTTP-Antwort /// @@ -145,9 +144,9 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers /// Es handelt sich um einen unerwarteten Fehler. Die Protokolle sollten überprüft werden. [Authorize] [HttpPost] - public async Task CreateAsync([FromBody] CreateEnvelopeCommand envelope, CancellationToken cancellationToken) + public async Task CreateAsync([FromBody] CreateEnvelopeCommand createEnvelopeQuery, CancellationToken cancellationToken) { - await _mediator.Send(envelope, cancellationToken); + await _mediator.Send(createEnvelopeQuery, cancellationToken); return Accepted(); } } From 9a4931781afc85d769fa86799a2cbf66b86f7dc0 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Mon, 7 Apr 2025 14:53:31 +0200 Subject: [PATCH 15/76] Refactor envelope and receiver response models - Updated `ReadEnvelopeReceiverResponse` to use `ReadEnvelopeResponse` instead of `ReadReceiverResponse`. - Modified `ReadReceiverResponse` to include additional parameters in its constructor for better detail. - Introduced a new `ReadEnvelopeResponse` record with comprehensive properties and a computed `StatusName`. --- .../Queries/Read/ReadEnvelopeReceiverResponse.cs | 3 ++- .../Envelopes/Queries/Read/ReadEnvelopeResponse.cs | 8 ++++++++ .../Receivers/Queries/Read/ReadReceiverResponse.cs | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 EnvelopeGenerator.Application/Envelopes/Queries/Read/ReadEnvelopeResponse.cs diff --git a/EnvelopeGenerator.Application/EnvelopeReceivers/Queries/Read/ReadEnvelopeReceiverResponse.cs b/EnvelopeGenerator.Application/EnvelopeReceivers/Queries/Read/ReadEnvelopeReceiverResponse.cs index 69559533..4ca56486 100644 --- a/EnvelopeGenerator.Application/EnvelopeReceivers/Queries/Read/ReadEnvelopeReceiverResponse.cs +++ b/EnvelopeGenerator.Application/EnvelopeReceivers/Queries/Read/ReadEnvelopeReceiverResponse.cs @@ -1,4 +1,5 @@ using DigitalData.EmailProfilerDispatcher.Abstraction.Attributes; +using EnvelopeGenerator.Application.Envelopes.Queries.Read; using EnvelopeGenerator.Application.Receivers.Queries.Read; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -38,7 +39,7 @@ public record ReadEnvelopeReceiverResponse(int UserId, int Status) public bool HasPhoneNumber { get; init; } [Required] - public required ReadReceiverResponse Envelope { get; init; } + public required ReadEnvelopeResponse Envelope { get; init; } [Required] public required ReadReceiverResponse Receiver { get; init; } diff --git a/EnvelopeGenerator.Application/Envelopes/Queries/Read/ReadEnvelopeResponse.cs b/EnvelopeGenerator.Application/Envelopes/Queries/Read/ReadEnvelopeResponse.cs new file mode 100644 index 00000000..04938c55 --- /dev/null +++ b/EnvelopeGenerator.Application/Envelopes/Queries/Read/ReadEnvelopeResponse.cs @@ -0,0 +1,8 @@ +using EnvelopeGenerator.Common; + +namespace EnvelopeGenerator.Application.Envelopes.Queries.Read; + +public record ReadEnvelopeResponse(int Id, int UserId, int Status, string Uuid, string? Message, DateTime AddedWhen, DateTime? ChangedWhen, string? Title, string Language, bool TFAEnabled, DigitalData.UserManager.Domain.Entities.User User) +{ + public string StatusName => ((Constants.EnvelopeStatus)Status).ToString(); +} diff --git a/EnvelopeGenerator.Application/Receivers/Queries/Read/ReadReceiverResponse.cs b/EnvelopeGenerator.Application/Receivers/Queries/Read/ReadReceiverResponse.cs index 11794a88..2517fef3 100644 --- a/EnvelopeGenerator.Application/Receivers/Queries/Read/ReadReceiverResponse.cs +++ b/EnvelopeGenerator.Application/Receivers/Queries/Read/ReadReceiverResponse.cs @@ -1,5 +1,5 @@ namespace EnvelopeGenerator.Application.Receivers.Queries.Read; -public record ReadReceiverResponse +public record ReadReceiverResponse(int Id, string EmailAddress, DateTime AddedWhen, string Signature) { } From 9b72a7b4726681235ba77752b723b5b85cfaa9ce Mon Sep 17 00:00:00 2001 From: Developer01 Date: Mon, 7 Apr 2025 14:55:48 +0200 Subject: [PATCH 16/76] MS Update DocumentViewer --- .../EnvelopeGenerator.Form.vbproj | 19 +++++++++-------- EnvelopeGenerator.Form/Images/circle.svg | 3 --- EnvelopeGenerator.Form/frmEnvelopeEditor.vb | 21 ++++++++++++------- EnvelopeGenerator.Form/packages.config | 3 +-- EnvelopeGenerator.sln | 21 ++----------------- 5 files changed, 27 insertions(+), 40 deletions(-) delete mode 100644 EnvelopeGenerator.Form/Images/circle.svg diff --git a/EnvelopeGenerator.Form/EnvelopeGenerator.Form.vbproj b/EnvelopeGenerator.Form/EnvelopeGenerator.Form.vbproj index 2f6c16a4..789eba38 100644 --- a/EnvelopeGenerator.Form/EnvelopeGenerator.Form.vbproj +++ b/EnvelopeGenerator.Form/EnvelopeGenerator.Form.vbproj @@ -77,8 +77,8 @@ - - ..\packages\DigitalData.Controls.DocumentViewer.1.9.7\lib\net462\DigitalData.Controls.DocumentViewer.dll + + ..\packages\DigitalData.Controls.DocumentViewer.1.9.8\lib\net462\DigitalData.Controls.DocumentViewer.dll ..\..\2_DLL Projekte\DDMonorepo\GUIs.Common\bin\Debug\DigitalData.GUIs.Common.dll @@ -116,9 +116,6 @@ ..\packages\EntityFramework.6.4.4\lib\net45\EntityFramework.SqlServer.dll - - ..\packages\EnvelopeGenerator.Common.2.4.2\lib\net462\EnvelopeGenerator.Common.dll - ..\packages\FirebirdSql.Data.FirebirdClient.7.5.0\lib\net452\FirebirdSql.Data.FirebirdClient.dll @@ -186,6 +183,9 @@ ..\packages\GdPicture.14.3.3\lib\net462\GdPicture.NET.14.wia.gateway.dll True + + P:\Projekte DIGITAL DATA\DIGITAL DATA - Entwicklung\DLL_Bibliotheken\Limilabs\Mail.dll + ..\packages\Microsoft.Bcl.AsyncInterfaces.9.0.0\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll @@ -464,10 +464,7 @@ - - - PreserveNewest - + @@ -475,6 +472,10 @@ {6EA0C51F-C2B1-4462-8198-3DE0B32B74F8} EnvelopeGenerator.Common + + {6ea0c51f-c2b1-4462-8198-3de0b32b74f8} + EnvelopeGenerator.Common + diff --git a/EnvelopeGenerator.Form/Images/circle.svg b/EnvelopeGenerator.Form/Images/circle.svg deleted file mode 100644 index e0d1b515..00000000 --- a/EnvelopeGenerator.Form/Images/circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/EnvelopeGenerator.Form/frmEnvelopeEditor.vb b/EnvelopeGenerator.Form/frmEnvelopeEditor.vb index 0e07e699..9023d016 100644 --- a/EnvelopeGenerator.Form/frmEnvelopeEditor.vb +++ b/EnvelopeGenerator.Form/frmEnvelopeEditor.vb @@ -568,10 +568,6 @@ Partial Public Class frmEnvelopeEditor RibbonPageGroupAddSignature_Enabled() End Sub Dim CellValueChanged As Boolean = False - Private Sub ViewReceivers_ColumnPositionChanged(sender As Object, e As EventArgs) Handles ViewReceivers.ColumnPositionChanged - - - End Sub Private Sub ViewReceivers_CellValueChanged(sender As Object, e As Views.Base.CellValueChangedEventArgs) Handles ViewReceivers.CellValueChanged If e.Column.FieldName = COL_EMAIL And CellValueChanged = False Then @@ -587,17 +583,22 @@ Partial Public Class frmEnvelopeEditor Dim oEmailAdress As String = DirectCast(e.Value.ToString.ToLower, String) oEmailAdress = Trim(oEmailAdress) If IsValidEmailAddress(oEmailAdress) = True Then + Dim oAccessCode As String = "" Dim oLastName As String = Controller.GetLastNameByEmailAdress(oEmailAdress) - Dim oAccessCode As String = Helpers.GetAccessCode() + 'oAccessCode = Helpers.GetAccessCode() Dim oPhoneNumber As String = Controller.GetLastPhoneByEmailAdress(oEmailAdress) ViewReceivers.SetRowCellValue(e.RowHandle, ViewReceivers.Columns.Item(COL_EMAIL), oEmailAdress) ViewReceivers.SetRowCellValue(e.RowHandle, ViewReceivers.Columns.Item(COL_NAME), oLastName) - ViewReceivers.SetRowCellValue(e.RowHandle, ViewReceivers.Columns.Item(COL_CODE), oAccessCode) + CheckAccesscode(e.RowHandle, oAccessCode) + ' ViewReceivers.SetRowCellValue(e.RowHandle, ViewReceivers.Columns.Item(COL_CODE), oAccessCode) If Envelope.TFA_Enabled AndAlso DEF_TF_ENABLED_WITH_PHONE Then ViewReceivers.SetRowCellValue(e.RowHandle, ViewReceivers.Columns.Item(COL_PHONE), oPhoneNumber) End If + If ViewReceivers.GetRowCellValue(e.RowHandle, ViewReceivers.Columns.Item(COL_CODE)) = String.Empty Then + CheckAccesscode(e.RowHandle, oAccessCode) + End If Else - Dim oMsg = Resources.Envelope.Error_email_Validation + Dim oMsg = Resources.Envelope.Error_email_Validation oMsg = oMsg.Replace("@Mail", oEmailAdress) MsgBox(oMsg, MsgBoxStyle.Exclamation, Text) ViewReceivers.DeleteRow(ViewReceivers.FocusedRowHandle) @@ -620,6 +621,12 @@ Partial Public Class frmEnvelopeEditor CellValueChanged = False End If End Sub + Private Function CheckAccesscode(pRowHandle As Integer, pAccessCode As String) As Boolean + If pAccessCode = "" Then + pAccessCode = Helpers.GetAccessCode() + ViewReceivers.SetRowCellValue(pRowHandle, ViewReceivers.Columns.Item(COL_CODE), pAccessCode) + End If + End Function Private Function IsValidEmailAddress(pEmailAddress As String) As Boolean Try If pEmailAddress.Contains("@") Then diff --git a/EnvelopeGenerator.Form/packages.config b/EnvelopeGenerator.Form/packages.config index ee5069d7..2b9ea36e 100644 --- a/EnvelopeGenerator.Form/packages.config +++ b/EnvelopeGenerator.Form/packages.config @@ -1,7 +1,7 @@  - + @@ -12,7 +12,6 @@ - diff --git a/EnvelopeGenerator.sln b/EnvelopeGenerator.sln index 3e6fecaf..35649a69 100644 --- a/EnvelopeGenerator.sln +++ b/EnvelopeGenerator.sln @@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.5.33516.290 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "EnvelopeGenerator.BBTests", "EnvelopeGenerator.BBTests\EnvelopeGenerator.BBTests.vbproj", "{089D5634-FB6B-42D0-B912-7AA7457044E7}" +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "EnvelopeGenerator.Test", "EnvelopeGenerator.Test\EnvelopeGenerator.Test.vbproj", "{089D5634-FB6B-42D0-B912-7AA7457044E7}" EndProject Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "EnvelopeGenerator.Form", "EnvelopeGenerator.Form\EnvelopeGenerator.Form.vbproj", "{6D56C01F-D6CB-4D8A-BD3D-4FD34326998C}" EndProject @@ -13,12 +13,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EnvelopeGenerator.Web", "En EndProject Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "EnvelopeGenerator.Service", "EnvelopeGenerator.Service\EnvelopeGenerator.Service.vbproj", "{83ED2617-B398-4859-8F59-B38F8807E83E}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EnvelopeGenerator.Domain", "EnvelopeGenerator.Domain\EnvelopeGenerator.Domain.csproj", "{4F32A98D-E6F0-4A09-BD97-1CF26107E837}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EnvelopeGenerator.Infrastructure", "EnvelopeGenerator.Infrastructure\EnvelopeGenerator.Infrastructure.csproj", "{63E32615-0ECA-42DC-96E3-91037324B7C7}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EnvelopeGenerator.Application", "EnvelopeGenerator.Application\EnvelopeGenerator.Application.csproj", "{5A9984F8-51A2-4558-A415-EC5FEED7CF7D}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EnvelopeGenerator.GeneratorAPI", "EnvelopeGenerator.GeneratorAPI\EnvelopeGenerator.GeneratorAPI.csproj", "{E5E12BA4-60C1-48BA-9053-0F8B62B38124}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EnvelopeGenerator.Extensions", "EnvelopeGenerator.Extensions\EnvelopeGenerator.Extensions.csproj", "{47F98812-4280-4D53-B04A-2AAEEA5EBC31}" @@ -55,18 +51,10 @@ Global {83ED2617-B398-4859-8F59-B38F8807E83E}.Debug|Any CPU.Build.0 = Debug|Any CPU {83ED2617-B398-4859-8F59-B38F8807E83E}.Release|Any CPU.ActiveCfg = Debug|Any CPU {83ED2617-B398-4859-8F59-B38F8807E83E}.Release|Any CPU.Build.0 = Debug|Any CPU - {4F32A98D-E6F0-4A09-BD97-1CF26107E837}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4F32A98D-E6F0-4A09-BD97-1CF26107E837}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4F32A98D-E6F0-4A09-BD97-1CF26107E837}.Release|Any CPU.ActiveCfg = Debug|Any CPU - {4F32A98D-E6F0-4A09-BD97-1CF26107E837}.Release|Any CPU.Build.0 = Debug|Any CPU {63E32615-0ECA-42DC-96E3-91037324B7C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {63E32615-0ECA-42DC-96E3-91037324B7C7}.Debug|Any CPU.Build.0 = Debug|Any CPU {63E32615-0ECA-42DC-96E3-91037324B7C7}.Release|Any CPU.ActiveCfg = Debug|Any CPU {63E32615-0ECA-42DC-96E3-91037324B7C7}.Release|Any CPU.Build.0 = Debug|Any CPU - {5A9984F8-51A2-4558-A415-EC5FEED7CF7D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5A9984F8-51A2-4558-A415-EC5FEED7CF7D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5A9984F8-51A2-4558-A415-EC5FEED7CF7D}.Release|Any CPU.ActiveCfg = Debug|Any CPU - {5A9984F8-51A2-4558-A415-EC5FEED7CF7D}.Release|Any CPU.Build.0 = Debug|Any CPU {E5E12BA4-60C1-48BA-9053-0F8B62B38124}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E5E12BA4-60C1-48BA-9053-0F8B62B38124}.Debug|Any CPU.Build.0 = Debug|Any CPU {E5E12BA4-60C1-48BA-9053-0F8B62B38124}.Release|Any CPU.ActiveCfg = Debug|Any CPU @@ -83,13 +71,8 @@ Global {089D5634-FB6B-42D0-B912-7AA7457044E7} = {0CBC2432-A561-4440-89BC-671B66A24146} {6D56C01F-D6CB-4D8A-BD3D-4FD34326998C} = {134D4164-B291-4E19-99B9-E4FA3AFAB62C} {6EA0C51F-C2B1-4462-8198-3DE0B32B74F8} = {134D4164-B291-4E19-99B9-E4FA3AFAB62C} - {5E0E17C0-FF5A-4246-BF87-1ADD85376A27} = {134D4164-B291-4E19-99B9-E4FA3AFAB62C} {83ED2617-B398-4859-8F59-B38F8807E83E} = {134D4164-B291-4E19-99B9-E4FA3AFAB62C} - {4F32A98D-E6F0-4A09-BD97-1CF26107E837} = {9943209E-1744-4944-B1BA-4F87FC1A0EEB} - {63E32615-0ECA-42DC-96E3-91037324B7C7} = {134D4164-B291-4E19-99B9-E4FA3AFAB62C} - {5A9984F8-51A2-4558-A415-EC5FEED7CF7D} = {9943209E-1744-4944-B1BA-4F87FC1A0EEB} - {E5E12BA4-60C1-48BA-9053-0F8B62B38124} = {134D4164-B291-4E19-99B9-E4FA3AFAB62C} - {47F98812-4280-4D53-B04A-2AAEEA5EBC31} = {134D4164-B291-4E19-99B9-E4FA3AFAB62C} + {47F98812-4280-4D53-B04A-2AAEEA5EBC31} = {9943209E-1744-4944-B1BA-4F87FC1A0EEB} {9943209E-1744-4944-B1BA-4F87FC1A0EEB} = {134D4164-B291-4E19-99B9-E4FA3AFAB62C} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution From 7481691b4ed54abdabf01d6d7b4be9233accf703 Mon Sep 17 00:00:00 2001 From: Developer01 Date: Mon, 7 Apr 2025 15:00:48 +0200 Subject: [PATCH 17/76] MS --- .../frmFieldEditor.Designer.vb | 1 + EnvelopeGenerator.Form/frmFieldEditor.resx | 28 +++++++++---------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/EnvelopeGenerator.Form/frmFieldEditor.Designer.vb b/EnvelopeGenerator.Form/frmFieldEditor.Designer.vb index 9481a496..d5377e93 100644 --- a/EnvelopeGenerator.Form/frmFieldEditor.Designer.vb +++ b/EnvelopeGenerator.Form/frmFieldEditor.Designer.vb @@ -282,6 +282,7 @@ ' 'frmFieldEditor ' + Me.Appearance.Options.UseFont = True resources.ApplyResources(Me, "$this") Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font Me.Controls.Add(Me.SplitContainerControl1) diff --git a/EnvelopeGenerator.Form/frmFieldEditor.resx b/EnvelopeGenerator.Form/frmFieldEditor.resx index 5eba2d41..5fcb652a 100644 --- a/EnvelopeGenerator.Form/frmFieldEditor.resx +++ b/EnvelopeGenerator.Form/frmFieldEditor.resx @@ -123,7 +123,7 @@ - 0, 132 + 0, 59 Fill @@ -132,7 +132,7 @@ 0, 0 - 199, 526 + 199, 600 @@ -142,7 +142,7 @@ ThumbnailEx2 - GdPicture14.ThumbnailEx, GdPicture.NET.14, Version=14.1.0.152, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb + GdPicture14.ThumbnailEx, GdPicture.NET.14, Version=14.3.3.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb SplitContainerControl1.Panel1 @@ -172,7 +172,7 @@ 0, 0 - 916, 526 + 917, 600 3 @@ -181,7 +181,7 @@ DocumentViewer1 - DigitalData.Controls.DocumentViewer.DocumentViewer, DigitalData.Controls.DocumentViewer, Version=1.9.2.0, Culture=neutral, PublicKeyToken=null + DigitalData.Controls.DocumentViewer.DocumentViewer, DigitalData.Controls.DocumentViewer, Version=1.9.8.0, Culture=neutral, PublicKeyToken=null SplitContainerControl1.Panel2 @@ -205,7 +205,7 @@ 1 - 1125, 526 + 1126, 600 15 @@ -397,7 +397,7 @@ Combo - 1125, 132 + 1126, 88 ribbonControl1 @@ -427,7 +427,7 @@ 0, 0 - 1125, 0 + 1126, 0 barDockControlTop @@ -445,10 +445,10 @@ Bottom - 0, 658 + 0, 659 - 1125, 0 + 1126, 0 barDockControlBottom @@ -469,7 +469,7 @@ 0, 0 - 0, 658 + 0, 659 barDockControlLeft @@ -487,10 +487,10 @@ Right - 1125, 0 + 1126, 0 - 0, 658 + 0, 659 barDockControlRight @@ -511,7 +511,7 @@ 6, 13 - 1125, 658 + 1689, 988 Segoe UI, 8.25pt From 3f33be452c8a69bab6767b59faab91a4754dc933 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Wed, 9 Apr 2025 09:53:13 +0200 Subject: [PATCH 18/76] =?UTF-8?q?feat:=20Option=20zur=20Verwendung=20von?= =?UTF-8?q?=20Swagger=20und=20Scalar=20in=20der=20Produktion=20hinzuf?= =?UTF-8?q?=C3=BCgen.=20=20-=20Login-Endpunkt=20beheben?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../.config/dotnet-tools.json | 13 +++++++++++++ .../Controllers/AuthController.cs | 4 ---- EnvelopeGenerator.GeneratorAPI/Program.cs | 2 +- EnvelopeGenerator.GeneratorAPI/appsettings.json | 2 ++ 4 files changed, 16 insertions(+), 5 deletions(-) create mode 100644 EnvelopeGenerator.GeneratorAPI/.config/dotnet-tools.json diff --git a/EnvelopeGenerator.GeneratorAPI/.config/dotnet-tools.json b/EnvelopeGenerator.GeneratorAPI/.config/dotnet-tools.json new file mode 100644 index 00000000..0280531d --- /dev/null +++ b/EnvelopeGenerator.GeneratorAPI/.config/dotnet-tools.json @@ -0,0 +1,13 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "dotnet-ef": { + "version": "9.0.3", + "commands": [ + "dotnet-ef" + ], + "rollForward": false + } + } +} \ No newline at end of file diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/AuthController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/AuthController.cs index 129ea20d..9c84ddbe 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/AuthController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/AuthController.cs @@ -63,10 +63,6 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers { try { - return Ok(); - - throw new NotImplementedException("JWT and cookie option is not implemented"); - bool isValid = _dirSearchService.ValidateCredentials(login.Username, login.Password); if (!isValid) diff --git a/EnvelopeGenerator.GeneratorAPI/Program.cs b/EnvelopeGenerator.GeneratorAPI/Program.cs index 3638047f..a5d1b05a 100644 --- a/EnvelopeGenerator.GeneratorAPI/Program.cs +++ b/EnvelopeGenerator.GeneratorAPI/Program.cs @@ -89,7 +89,7 @@ var app = builder.Build(); app.MapOpenApi(); // Configure the HTTP request pipeline. -if (app.Environment.IsDevelopment()) +if (app.Environment.IsDevelopment() || (app.IsDevOrDiP() && config.GetValue("UseSwagger"))) { app.UseSwagger(); app.UseSwaggerUI(); diff --git a/EnvelopeGenerator.GeneratorAPI/appsettings.json b/EnvelopeGenerator.GeneratorAPI/appsettings.json index 0f469f84..734a3dcb 100644 --- a/EnvelopeGenerator.GeneratorAPI/appsettings.json +++ b/EnvelopeGenerator.GeneratorAPI/appsettings.json @@ -1,4 +1,6 @@ { + "UseSwagger": true, + "DiPMode": true, "Logging": { "LogLevel": { "Default": "Information", From abd1807b18b4ea3a45ffb943a163c1dfc8448d12 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Wed, 9 Apr 2025 09:59:29 +0200 Subject: [PATCH 19/76] =?UTF-8?q?chore:=20Aktualisierung=20der=20Projekt-M?= =?UTF-8?q?etadaten=20in=20der=20.csproj-Datei=20=20-=20Hinzuf=C3=BCgen=20?= =?UTF-8?q?von=20Paket-ID,=20Titel,=20Autoren,=20Firma,=20Produktname,=20V?= =?UTF-8?q?ersionsinformationen=20und=20Paketausgabepfad=20zu=20`EnvelopeG?= =?UTF-8?q?enerator.GeneratorAPI.csproj`=20f=C3=BCr=20verbesserte=20Identi?= =?UTF-8?q?fizierung=20und=20Verwaltung=20in=20Paket-Repositories.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EnvelopeGenerator.GeneratorAPI.csproj | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/EnvelopeGenerator.GeneratorAPI/EnvelopeGenerator.GeneratorAPI.csproj b/EnvelopeGenerator.GeneratorAPI/EnvelopeGenerator.GeneratorAPI.csproj index 50a84c9c..2648a49a 100644 --- a/EnvelopeGenerator.GeneratorAPI/EnvelopeGenerator.GeneratorAPI.csproj +++ b/EnvelopeGenerator.GeneratorAPI/EnvelopeGenerator.GeneratorAPI.csproj @@ -5,6 +5,15 @@ enable enable true + EnvelopeGenerator.GeneratorAPI + + Digital Data GmbH + Digital Data GmbH + EnvelopeGenerator.GeneratorAPI + 1.1.0 + 1.1.0 + 1.1.0 + Copyright © 2025 Digital Data GmbH. All rights reserved. From 5375d89d5ba9da00cb7118ed7ad0c67a99c04a15 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Wed, 9 Apr 2025 10:23:19 +0200 Subject: [PATCH 20/76] Refactor envelope response and query records MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `ReadEnvelopeReceiverResponse` wurde aktualisiert, um mehrere Empfänger zuzulassen und `HasPhoneNumber` hinzugefügt. EnvelopeQuery„ wurde durch die Einführung der optionalen Parameter ‚Username‘ und “E-Mail" für einen besseren Benutzerkontext verbessert. --- .../Queries/Read/ReadEnvelopeReceiverResponse.cs | 4 ++-- EnvelopeGenerator.Application/Envelopes/EnvelopeQuery.cs | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/EnvelopeGenerator.Application/EnvelopeReceivers/Queries/Read/ReadEnvelopeReceiverResponse.cs b/EnvelopeGenerator.Application/EnvelopeReceivers/Queries/Read/ReadEnvelopeReceiverResponse.cs index 4ca56486..c046fd5d 100644 --- a/EnvelopeGenerator.Application/EnvelopeReceivers/Queries/Read/ReadEnvelopeReceiverResponse.cs +++ b/EnvelopeGenerator.Application/EnvelopeReceivers/Queries/Read/ReadEnvelopeReceiverResponse.cs @@ -40,7 +40,7 @@ public record ReadEnvelopeReceiverResponse(int UserId, int Status) [Required] public required ReadEnvelopeResponse Envelope { get; init; } - + [Required] - public required ReadReceiverResponse Receiver { get; init; } + public IEnumerable Receiver { get; init; } = new List(); } \ No newline at end of file diff --git a/EnvelopeGenerator.Application/Envelopes/EnvelopeQuery.cs b/EnvelopeGenerator.Application/Envelopes/EnvelopeQuery.cs index 5c91a622..60b770e6 100644 --- a/EnvelopeGenerator.Application/Envelopes/EnvelopeQuery.cs +++ b/EnvelopeGenerator.Application/Envelopes/EnvelopeQuery.cs @@ -7,10 +7,14 @@ namespace EnvelopeGenerator.Application.Envelopes; /// /// Die eindeutige Kennung des Umschlags. /// Die Kennung des Benutzers, der den Umschlag erstellt hat. +/// Der Benutzername des Benutzers, der den Umschlag erstellt hat. +/// Die E-Mail-Adresse des Benutzers, der den Umschlag erstellt hat. /// Der Status des Umschlags. /// Die universell eindeutige Kennung des Umschlags. public record EnvelopeQuery( int? Id = null, int? UserId = null, + string? Username = null, + string? Email = null, int? Status = null, string? Uuid = null) : IRequest; \ No newline at end of file From 06175b0c95e357076b66d59fe0a8e3dc2d02f1af Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Wed, 9 Apr 2025 10:28:28 +0200 Subject: [PATCH 21/76] =?UTF-8?q?feat(ReceiverQuery):=20Hinzuf=C3=BCgen=20?= =?UTF-8?q?von=20XML-Dokumentation=20zum=20ReceiverQuery-Datensatz=20=20-?= =?UTF-8?q?=20Verbesserte=20Klarheit=20und=20Benutzerfreundlichkeit=20des?= =?UTF-8?q?=20Codes=20durch=20Hinzuf=C3=BCgen=20von=20XML-Dokumentationsko?= =?UTF-8?q?mmentaren=20zum=20ReceiverQuery-Datensatz,=20einschlie=C3=9Flic?= =?UTF-8?q?h=20einer=20Zusammenfassung=20und=20detaillierter=20Parameterbe?= =?UTF-8?q?schreibungen.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- EnvelopeGenerator.Application/Receivers/ReceiverQuery.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/EnvelopeGenerator.Application/Receivers/ReceiverQuery.cs b/EnvelopeGenerator.Application/Receivers/ReceiverQuery.cs index 7b8b5f69..a9d90965 100644 --- a/EnvelopeGenerator.Application/Receivers/ReceiverQuery.cs +++ b/EnvelopeGenerator.Application/Receivers/ReceiverQuery.cs @@ -1,3 +1,9 @@ namespace EnvelopeGenerator.Application.Receivers; +/// +/// Empfänger des Umschlags +/// +/// ID des Empfängers +/// E-Mail Adresse des Empfängers +/// Eindeutige Signatur des Empfängers public record ReceiverQuery(int? Id = null, string? EmailAddress = null, string? Signature = null); \ No newline at end of file From 396c6014fb84db2ff282ce5883e18c06129c5cfc Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Wed, 9 Apr 2025 10:30:36 +0200 Subject: [PATCH 22/76] =?UTF-8?q?Hinzuf=C3=BCgen=20von=20XML-Dokumentation?= =?UTF-8?q?=20f=C3=BCr=20ReadEnvelopeQuery?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Der Datensatz `ReadEnvelopeQuery` wurde um XML-Kommentare erweitert, um seinen Zweck als Abfrage zum Lesen von Umschlägen zu verdeutlichen. --- .../Envelopes/Queries/Read/ReadEnvelopeQuery.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/EnvelopeGenerator.Application/Envelopes/Queries/Read/ReadEnvelopeQuery.cs b/EnvelopeGenerator.Application/Envelopes/Queries/Read/ReadEnvelopeQuery.cs index be21efc3..30092482 100644 --- a/EnvelopeGenerator.Application/Envelopes/Queries/Read/ReadEnvelopeQuery.cs +++ b/EnvelopeGenerator.Application/Envelopes/Queries/Read/ReadEnvelopeQuery.cs @@ -1,5 +1,8 @@ namespace EnvelopeGenerator.Application.Envelopes.Queries.Read; +/// +/// Stellt eine Abfrage zum Lesen von Briefumschlägen dar. +/// public record ReadEnvelopeQuery : EnvelopeQuery { } From 8bdc305b82d236692a58a77d25e666d0092c8ea5 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Wed, 9 Apr 2025 13:25:48 +0200 Subject: [PATCH 23/76] chore: Aktualisierung der Zielframeworks in der Projektdatei MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Die Projektdatei `EnvelopeGenerator.Web.csproj` wurde geändert, um mehrere Zielframeworks zu unterstützen. Das bisherige einzelne Zielframework `net7.0` wurde durch `net7.0`, `net8.0` und `net9.0` ersetzt, was eine verbesserte Kompatibilität und Zukunftssicherheit der Anwendung ermöglicht. --- EnvelopeGenerator.Web/EnvelopeGenerator.Web.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EnvelopeGenerator.Web/EnvelopeGenerator.Web.csproj b/EnvelopeGenerator.Web/EnvelopeGenerator.Web.csproj index 4afba015..7f65cc86 100644 --- a/EnvelopeGenerator.Web/EnvelopeGenerator.Web.csproj +++ b/EnvelopeGenerator.Web/EnvelopeGenerator.Web.csproj @@ -1,7 +1,7 @@  - net7.0 + net7.0;net8.0;net9.0 enable enable EnvelopeGenerator.Web From bdc0286253a4fe5a3c79db7f22ae1589bc813da8 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Wed, 9 Apr 2025 13:26:40 +0200 Subject: [PATCH 24/76] chore: Aktualisierung der Ziel-Frameworks in der Projektdatei MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Modifizierte `EnvelopeGenerator.GeneratorAPI.csproj`, um mehrere Ziel-Frameworks zu unterstützen: `net7.0`, `net8.0`, und `net9.0`. Diese Änderung verbessert die Kompatibilität und macht die Anwendung zukunftssicher. --- .../EnvelopeGenerator.GeneratorAPI.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EnvelopeGenerator.GeneratorAPI/EnvelopeGenerator.GeneratorAPI.csproj b/EnvelopeGenerator.GeneratorAPI/EnvelopeGenerator.GeneratorAPI.csproj index 51efca53..7570e6de 100644 --- a/EnvelopeGenerator.GeneratorAPI/EnvelopeGenerator.GeneratorAPI.csproj +++ b/EnvelopeGenerator.GeneratorAPI/EnvelopeGenerator.GeneratorAPI.csproj @@ -1,7 +1,7 @@  - net7.0 + net7.0;net8.0;net9.0 enable enable From 4a898e40acf97d78d573f0a85a94592960a8d855 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Wed, 9 Apr 2025 14:25:17 +0200 Subject: [PATCH 25/76] =?UTF-8?q?chore:=20Hinzuf=C3=BCgen=20von=20IIS-Ver?= =?UTF-8?q?=C3=B6ffentlichungsprofilen=20f=C3=BCr=20.NET=207=20und=20.NET?= =?UTF-8?q?=209?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mit diesem Commit werden zwei neue XML-Projektdateien eingeführt: `IISProfileNet7.pubxml` für .NET 7.0 und `IISProfileNet9Win64.pubxml` für .NET 9.0 mit Windows 64-bit. Diese Dateien definieren wesentliche Eigenschaften für die Veröffentlichung von .NET-Anwendungen, einschließlich der Web-Publishing-Methode, der Build-Konfiguration, des Speicherorts des Pakets und des Bereitstellungspfads, wodurch die ordnungsgemäße Paketierung und Bereitstellung für IIS erleichtert wird. --- .../PublishProfiles/IISProfileNet7.pubxml | 20 +++++++++++++++++ .../IISProfileNet9Win64.pubxml | 22 +++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 EnvelopeGenerator.Web/Properties/PublishProfiles/IISProfileNet7.pubxml create mode 100644 EnvelopeGenerator.Web/Properties/PublishProfiles/IISProfileNet9Win64.pubxml diff --git a/EnvelopeGenerator.Web/Properties/PublishProfiles/IISProfileNet7.pubxml b/EnvelopeGenerator.Web/Properties/PublishProfiles/IISProfileNet7.pubxml new file mode 100644 index 00000000..9ef04907 --- /dev/null +++ b/EnvelopeGenerator.Web/Properties/PublishProfiles/IISProfileNet7.pubxml @@ -0,0 +1,20 @@ + + + + + Package + Release + Any CPU + + true + false + 5e0e17c0-ff5a-4246-bf87-1add85376a27 + P:\Install .Net\0 DD - Smart UP\signFLOW\Web\net7\$(Version)\EnvelopeGenerator.Web.zip + true + EnvelopeGenerator + <_TargetId>IISWebDeployPackage + net7.0 + + \ No newline at end of file diff --git a/EnvelopeGenerator.Web/Properties/PublishProfiles/IISProfileNet9Win64.pubxml b/EnvelopeGenerator.Web/Properties/PublishProfiles/IISProfileNet9Win64.pubxml new file mode 100644 index 00000000..b1213f08 --- /dev/null +++ b/EnvelopeGenerator.Web/Properties/PublishProfiles/IISProfileNet9Win64.pubxml @@ -0,0 +1,22 @@ + + + + + Package + Release + Any CPU + + true + false + 5e0e17c0-ff5a-4246-bf87-1add85376a27 + P:\Install .Net\0 DD - Smart UP\signFLOW\Web\net9\win64\$(Version)\EnvelopeGenerator.Web.zip + true + EnvelopeGenerator + <_TargetId>IISWebDeployPackage + net9.0 + win-x64 + true + + \ No newline at end of file From 17902c482425305e1ad6bfca0f00d06192704bbf Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Thu, 10 Apr 2025 12:45:51 +0200 Subject: [PATCH 26/76] =?UTF-8?q?Refactor=20DTOs=20und=20Queries=20f=C3=BC?= =?UTF-8?q?r=20Klarheit=20und=20Konsistenz?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Aktualisiert `ReceiverGetOrCreateDto`, um E-Mail in Kleinbuchstaben korrekt zuzuordnen und verbesserte Dokumentation. - Der Parameter `Receiver` wurde aus der `EnvelopeReceiverQuery` entfernt. - Verbesserte Kommentare in `ReadEnvelopeReceiverQuery`, um den Zweck zu verdeutlichen. - Detaillierte Zusammenfassungskommentare zu `ReadEnvelopeReceiverResponse` und `ReadEnvelopeResponse` zum besseren Verständnis der Eigenschaften hinzugefügt. - Es wurden neue zusammenfassende Kommentare in `ReadReceiverQuery` und `ReadReceiverResponse` eingeführt, um ihre Rollen und Beziehungen zu beschreiben. --- .../Commands/Create/CreateEnvelopeCommand.cs | 31 ++++++++++++- .../EnvelopeReceiverQuery.cs | 1 - .../Queries/Read/ReadEnvelopeReceiverQuery.cs | 17 ++++++- .../Read/ReadEnvelopeReceiverResponse.cs | 45 +++++++++++++++++++ .../Queries/Read/ReadEnvelopeResponse.cs | 30 ++++++++++++- .../Queries/Read/ReadReceiverQuery.cs | 5 +++ .../Queries/Read/ReadReceiverResponse.cs | 7 +++ 7 files changed, 130 insertions(+), 6 deletions(-) diff --git a/EnvelopeGenerator.Application/EnvelopeReceivers/Commands/Create/CreateEnvelopeCommand.cs b/EnvelopeGenerator.Application/EnvelopeReceivers/Commands/Create/CreateEnvelopeCommand.cs index 195c9db5..5f726bca 100644 --- a/EnvelopeGenerator.Application/EnvelopeReceivers/Commands/Create/CreateEnvelopeCommand.cs +++ b/EnvelopeGenerator.Application/EnvelopeReceivers/Commands/Create/CreateEnvelopeCommand.cs @@ -27,18 +27,45 @@ public record ReceiverGetOrCreateDto([Required] IEnumerable Signature /// E-Mail-Adresse des Empfängers. /// [Required] - public required string EmailAddress { get => _emailAddress.ToLower(); init => _emailAddress.ToLower(); } + public required string EmailAddress { get => _emailAddress.ToLower(); init => _emailAddress = _emailAddress.ToLower(); } }; /// -/// DTO für die Erstellung eines Dokuments. +/// DTO for creating a document. /// +/// +/// The document data in byte array format. This is used when the document is provided as raw binary data. +/// +/// +/// The document data in Base64 string format. This is used when the document is provided as a Base64-encoded string. +/// public record DocumentCreateDto(byte[]? DataAsByte = null, string? DataAsBase64 = null); #endregion /// +/// +/// Command to create an envelope. +/// +/// The title of the envelope. This is a required field. +/// The message to be included in the envelope. This is a required field. +/// The document associated with the envelope. This is a required field. +/// A collection of receivers who will receive the envelope. This is a required field. +/// The language of the envelope. Defaults to "de-DE" if not specified. +/// The expiration date of the envelope. Optional. +/// The date when a warning should be issued before expiration. Optional. +/// The type of contract associated with the envelope. Defaults to the "Contract" type. +/// Indicates whether two-factor authentication is enabled for the envelope. Defaults to false. /// Befehl zur Erstellung eines Umschlags. /// +/// +/// +/// +/// +/// +/// +/// +/// +/// public record CreateEnvelopeCommand( [Required] string Title, [Required] string Message, diff --git a/EnvelopeGenerator.Application/EnvelopeReceivers/EnvelopeReceiverQuery.cs b/EnvelopeGenerator.Application/EnvelopeReceivers/EnvelopeReceiverQuery.cs index ce8fffd2..b4bc1de4 100644 --- a/EnvelopeGenerator.Application/EnvelopeReceivers/EnvelopeReceiverQuery.cs +++ b/EnvelopeGenerator.Application/EnvelopeReceivers/EnvelopeReceiverQuery.cs @@ -9,7 +9,6 @@ namespace EnvelopeGenerator.Application.EnvelopeReceivers; /// /// /// -/// public record EnvelopeReceiverQuery( int? MinStatus = null, int? MaxStatus = null, diff --git a/EnvelopeGenerator.Application/EnvelopeReceivers/Queries/Read/ReadEnvelopeReceiverQuery.cs b/EnvelopeGenerator.Application/EnvelopeReceivers/Queries/Read/ReadEnvelopeReceiverQuery.cs index d81b8579..3bb56aaa 100644 --- a/EnvelopeGenerator.Application/EnvelopeReceivers/Queries/Read/ReadEnvelopeReceiverQuery.cs +++ b/EnvelopeGenerator.Application/EnvelopeReceivers/Queries/Read/ReadEnvelopeReceiverQuery.cs @@ -5,11 +5,24 @@ using MediatR; namespace EnvelopeGenerator.Application.EnvelopeReceivers.Queries.Read; /// -/// Stellt eine Abfrage zum Lesen eines Envelope-Empfängers dar. +/// Repräsentiert eine Abfrage zum Lesen eines Envelope-Empfängers. /// +/// +/// Diese Abfrage kombiniert Informationen über einen Umschlag () +/// und einen Empfänger (), um eine vollständige Antwort +/// () zu generieren. +/// Die Antwort enthält Details wie den Status, die Zuordnung zwischen Umschlag und Empfänger +/// sowie zusätzliche Metadaten. +/// public record ReadEnvelopeReceiverQuery : EnvelopeReceiverQuery, IRequest { + /// + /// Der Umschlag, der mit dem Empfänger verknüpft ist. + /// public ReadEnvelopeQuery? Envelope { get; init; } + /// + /// Der Empfänger, der mit dem Umschlag verknüpft ist. + /// public ReadReceiverQuery? Receiver { get; init; } -}; \ No newline at end of file +}; diff --git a/EnvelopeGenerator.Application/EnvelopeReceivers/Queries/Read/ReadEnvelopeReceiverResponse.cs b/EnvelopeGenerator.Application/EnvelopeReceivers/Queries/Read/ReadEnvelopeReceiverResponse.cs index c046fd5d..ca0526be 100644 --- a/EnvelopeGenerator.Application/EnvelopeReceivers/Queries/Read/ReadEnvelopeReceiverResponse.cs +++ b/EnvelopeGenerator.Application/EnvelopeReceivers/Queries/Read/ReadEnvelopeReceiverResponse.cs @@ -12,35 +12,80 @@ namespace EnvelopeGenerator.Application.EnvelopeReceivers.Queries.Read; /// Der angeforderte Empfänger. public record ReadEnvelopeReceiverResponse(int UserId, int Status) { + /// + /// Repräsentiert die Antwort für das Lesen eines Envelope-Empfängers. + /// + /// + /// Diese Klasse enthält Informationen über einen spezifischen Empfänger eines Umschlags (Envelope). + /// Sie verknüpft die Empfängerinformationen mit den zugehörigen Umschlagsdaten und bietet zusätzliche Metadaten. + /// + /// Die eindeutige Kennung des Benutzers, der den Empfänger erstellt hat. + /// Der Status des Empfängers als numerischer Wert. [NotMapped] public (int Envelope, int Receiver) Id => (Envelope: EnvelopeId, Receiver: ReceiverId); + /// + /// Die eindeutige Kennung des zugehörigen Umschlags. + /// [Required] public int EnvelopeId { get; init; } + /// + /// Die eindeutige Kennung des Empfängers. + /// [Required] public int ReceiverId { get; init; } + /// + /// Die Reihenfolge des Empfängers innerhalb des Umschlags. + /// public int Sequence { get; init; } + /// + /// Der Name des Empfängers. Kann als Platzhalter verwendet werden. + /// [TemplatePlaceholder("[NAME_RECEIVER]")] public string? Name { get; init; } + /// + /// Die Berufsbezeichnung des Empfängers. + /// public string? JobTitle { get; init; } + /// + /// Der Firmenname des Empfängers. + /// public string? CompanyName { get; init; } + /// + /// Eine private Nachricht, die mit dem Empfänger verknüpft ist. + /// public string? PrivateMessage { get; init; } + /// + /// Das Datum und die Uhrzeit, wann der Empfänger hinzugefügt wurde. + /// public DateTime AddedWhen { get; init; } + /// + /// Das Datum und die Uhrzeit, wann der Empfänger zuletzt geändert wurde (falls vorhanden). + /// public DateTime? ChangedWhen { get; init; } + /// + /// Gibt an, ob der Empfänger eine Telefonnummer hat. + /// public bool HasPhoneNumber { get; init; } + /// + /// Die zugehörigen Umschlagsdaten. + /// [Required] public required ReadEnvelopeResponse Envelope { get; init; } + /// + /// Die Liste der Empfängerinformationen. + /// [Required] public IEnumerable Receiver { get; init; } = new List(); } \ No newline at end of file diff --git a/EnvelopeGenerator.Application/Envelopes/Queries/Read/ReadEnvelopeResponse.cs b/EnvelopeGenerator.Application/Envelopes/Queries/Read/ReadEnvelopeResponse.cs index 04938c55..5644d251 100644 --- a/EnvelopeGenerator.Application/Envelopes/Queries/Read/ReadEnvelopeResponse.cs +++ b/EnvelopeGenerator.Application/Envelopes/Queries/Read/ReadEnvelopeResponse.cs @@ -2,7 +2,35 @@ namespace EnvelopeGenerator.Application.Envelopes.Queries.Read; -public record ReadEnvelopeResponse(int Id, int UserId, int Status, string Uuid, string? Message, DateTime AddedWhen, DateTime? ChangedWhen, string? Title, string Language, bool TFAEnabled, DigitalData.UserManager.Domain.Entities.User User) +/// +/// Repräsentiert die Antwort für das Lesen eines Umschlags. +/// +/// Die eindeutige Kennung des Umschlags. +/// Die Kennung des Benutzers, der den Umschlag erstellt hat. +/// Der Status des Umschlags als numerischer Wert. +/// Die universelle eindeutige Kennung (UUID) des Umschlags. +/// Eine optionale Nachricht, die mit dem Umschlag verknüpft ist. +/// Das Datum und die Uhrzeit, wann der Umschlag hinzugefügt wurde. +/// Das Datum und die Uhrzeit, wann der Umschlag zuletzt geändert wurde (falls vorhanden). +/// Ein optionaler Titel des Umschlags. +/// Die Sprache, die mit dem Umschlag verknüpft ist. +/// Gibt an, ob die Zwei-Faktor-Authentifizierung (TFA) aktiviert ist. +/// Das Benutzerobjekt, das mit dem Umschlag verknüpft ist. +public record ReadEnvelopeResponse( + int Id, + int UserId, + int Status, + string Uuid, + string? Message, + DateTime AddedWhen, + DateTime? ChangedWhen, + string? Title, + string Language, + bool TFAEnabled, + DigitalData.UserManager.Domain.Entities.User User) { + /// + /// Gibt den Namen des Status zurück, der dem numerischen Statuswert entspricht. + /// public string StatusName => ((Constants.EnvelopeStatus)Status).ToString(); } diff --git a/EnvelopeGenerator.Application/Receivers/Queries/Read/ReadReceiverQuery.cs b/EnvelopeGenerator.Application/Receivers/Queries/Read/ReadReceiverQuery.cs index a93bf137..4e62b083 100644 --- a/EnvelopeGenerator.Application/Receivers/Queries/Read/ReadReceiverQuery.cs +++ b/EnvelopeGenerator.Application/Receivers/Queries/Read/ReadReceiverQuery.cs @@ -1,5 +1,10 @@ namespace EnvelopeGenerator.Application.Receivers.Queries.Read; +/// +/// Stellt eine Abfrage dar, um die Details eines Empfängers zu lesen. +/// Diese Abfrage erbt von und wird verwendet, +/// um spezifische Informationen über einen Empfänger abzurufen. +/// public record ReadReceiverQuery : ReceiverQuery { } diff --git a/EnvelopeGenerator.Application/Receivers/Queries/Read/ReadReceiverResponse.cs b/EnvelopeGenerator.Application/Receivers/Queries/Read/ReadReceiverResponse.cs index 2517fef3..10eb1b87 100644 --- a/EnvelopeGenerator.Application/Receivers/Queries/Read/ReadReceiverResponse.cs +++ b/EnvelopeGenerator.Application/Receivers/Queries/Read/ReadReceiverResponse.cs @@ -1,5 +1,12 @@ namespace EnvelopeGenerator.Application.Receivers.Queries.Read; +/// +/// Repräsentiert die Antwort auf eine Abfrage, um einen Empfänger zu lesen. +/// +/// Die eindeutige Identifikationsnummer des Empfängers. +/// Die E-Mail-Adresse des Empfängers. +/// Das Datum und die Uhrzeit, wann der Empfänger hinzugefügt wurde. +/// Die Signatur des Empfängers. public record ReadReceiverResponse(int Id, string EmailAddress, DateTime AddedWhen, string Signature) { } From 26be8d4565559d19bf1c178108d585d9a14ca8e7 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Thu, 10 Apr 2025 13:19:21 +0200 Subject: [PATCH 27/76] =?UTF-8?q?feat(EnvelopeHistoryQuery):=20Hinzuf?= =?UTF-8?q?=C3=BCgen=20des=20EnvelopeHistoryQuery-Datensatzes=20f=C3=BCr?= =?UTF-8?q?=20den=20Umschlagverlauf.=20=20-=20F=C3=BChrt=20einen=20neuen?= =?UTF-8?q?=20Datensatztyp=20`EnvelopeHistoryQuery`=20im=20`EnvelopeGenera?= =?UTF-8?q?tor.Application.EnvelopeHistories`=20Namespace=20ein.=20Dieser?= =?UTF-8?q?=20Datensatz=20kapselt=20die=20Parameter=20`EnvelopeId`,=20`Env?= =?UTF-8?q?elope`=20und=20`Receiver`,=20wobei=20die=20letzten=20beiden=20g?= =?UTF-8?q?enerische=20Typen=20sind,=20die=20auf=20`EnvelopeQuery`=20und?= =?UTF-8?q?=20`ReceiverQuery`=20beschr=C3=A4nkt=20sind.=20Die=20XML-Dokume?= =?UTF-8?q?ntation=20enth=C3=A4lt=20Kommentare=20zur=20Beschreibung=20des?= =?UTF-8?q?=20Datensatzes=20und=20seiner=20Parameter.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EnvelopeHistories/EnvelopeHistoryQuery.cs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 EnvelopeGenerator.Application/EnvelopeHistories/EnvelopeHistoryQuery.cs diff --git a/EnvelopeGenerator.Application/EnvelopeHistories/EnvelopeHistoryQuery.cs b/EnvelopeGenerator.Application/EnvelopeHistories/EnvelopeHistoryQuery.cs new file mode 100644 index 00000000..f179679b --- /dev/null +++ b/EnvelopeGenerator.Application/EnvelopeHistories/EnvelopeHistoryQuery.cs @@ -0,0 +1,16 @@ +using EnvelopeGenerator.Application.Envelopes; +using EnvelopeGenerator.Application.Receivers; + +namespace EnvelopeGenerator.Application.EnvelopeHistories; + +/// +/// Repräsentiert eine Abfrage für die Verlaufshistorie eines Umschlags. +/// +/// Die eindeutige Kennung des Umschlags. +/// Die Abfrage, die den Umschlag beschreibt. +/// Die Abfrage, die den Empfänger beschreibt. +public record EnvelopeHistoryQuery(int EnvelopeId, TEnvelopeQuery Envelope, TReceiverQuery Receiver) + where TEnvelopeQuery : EnvelopeQuery + where TReceiverQuery : ReceiverQuery +{ +} From e7bc43b3397e70476708a129989e4957db1356d1 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Thu, 10 Apr 2025 16:01:21 +0200 Subject: [PATCH 28/76] Refactor envelope query structures and controller methods MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Aktualisiert `EnvelopeHistoryQuery` um optionale `Envelope`, `Receiver` und neue `Status` Parameter für mehr Flexibilität zu enthalten. - Vereinfachte `EnvelopeReceiverQuery`, so dass sie nur noch einen `Status`-Parameter enthält und unnötige Parameter entfernt wurden. - ReadEnvelopeReceiverQuery„ wurde an das neue Design von ‚EnvelopeReceiverQuery‘ angepasst, indem ein “Status"-Parameter akzeptiert wird. - Verbesserte XML-Dokumentation in `EnvelopeController` für mehr Klarheit über Methoden und Parameter. - Die `GetAsync`-Methode wurde gestrafft, um einen `StatusQuery`-Parameter zu akzeptieren, der separate Status-Parameter ersetzt. - Einführung eines neuen `StatusQuery`-Datensatzes, um Statuswerte mit detaillierter Dokumentation zu kapseln. - Aktualisierte „using“-Direktiven in relevanten Dateien, um den neuen „EnvelopeHistories“-Namensraum einzubeziehen. --- .../EnvelopeHistories/EnvelopeHistoryQuery.cs | 2 +- .../EnvelopeHistories/StatusQuery.cs | 41 +++++++++++++++++++ .../EnvelopeReceiverQuery.cs | 8 +--- .../Queries/Read/ReadEnvelopeReceiverQuery.cs | 6 ++- .../Controllers/EnvelopeController.cs | 29 +++++++++---- 5 files changed, 70 insertions(+), 16 deletions(-) create mode 100644 EnvelopeGenerator.Application/EnvelopeHistories/StatusQuery.cs diff --git a/EnvelopeGenerator.Application/EnvelopeHistories/EnvelopeHistoryQuery.cs b/EnvelopeGenerator.Application/EnvelopeHistories/EnvelopeHistoryQuery.cs index f179679b..4784ec11 100644 --- a/EnvelopeGenerator.Application/EnvelopeHistories/EnvelopeHistoryQuery.cs +++ b/EnvelopeGenerator.Application/EnvelopeHistories/EnvelopeHistoryQuery.cs @@ -9,7 +9,7 @@ namespace EnvelopeGenerator.Application.EnvelopeHistories; /// Die eindeutige Kennung des Umschlags. /// Die Abfrage, die den Umschlag beschreibt. /// Die Abfrage, die den Empfänger beschreibt. -public record EnvelopeHistoryQuery(int EnvelopeId, TEnvelopeQuery Envelope, TReceiverQuery Receiver) +public record EnvelopeHistoryQuery(int EnvelopeId, TEnvelopeQuery? Envelope, TReceiverQuery? Receiver = null, StatusQuery? Status = null) where TEnvelopeQuery : EnvelopeQuery where TReceiverQuery : ReceiverQuery { diff --git a/EnvelopeGenerator.Application/EnvelopeHistories/StatusQuery.cs b/EnvelopeGenerator.Application/EnvelopeHistories/StatusQuery.cs new file mode 100644 index 00000000..1f7961fd --- /dev/null +++ b/EnvelopeGenerator.Application/EnvelopeHistories/StatusQuery.cs @@ -0,0 +1,41 @@ +namespace EnvelopeGenerator.Application.EnvelopeHistories; + +/// +/// Repräsentiert den Status eines Umschlags und dessen Beziehung zum Empfänger. (vgl. auch +/// +/// Invalid (0): Ungültiger Status. +/// EnvelopeCreated (1001): Der Umschlag wurde erstellt. +/// EnvelopeSaved (1002): Der Umschlag wurde gespeichert. +/// EnvelopeQueued (1003): Der Umschlag wurde zur Verarbeitung eingeplant. +/// EnvelopeSent (1004): Der Umschlag wurde versendet. (Nicht verwendet) +/// EnvelopePartlySigned (1005): Der Umschlag wurde teilweise unterschrieben. +/// EnvelopeCompletelySigned (1006): Der Umschlag wurde vollständig unterschrieben. +/// EnvelopeReportCreated (1007): Ein Abschlussbericht wurde für den Umschlag erstellt. +/// EnvelopeArchived (1008): Der Umschlag wurde archiviert. +/// EnvelopeDeleted (1009): Der Umschlag wurde gelöscht. +/// AccessCodeRequested (2001): Der Zugriffscode wurde angefordert. +/// AccessCodeCorrect (2002): Der Zugriffscode war korrekt. +/// AccessCodeIncorrect (2003): Der Zugriffscode war falsch. +/// DocumentOpened (2004): Das Dokument wurde geöffnet. +/// DocumentSigned (2005): Ein Dokument wurde unterschrieben. +/// SignatureConfirmed (2006): Die Signatur wurde bestätigt. +/// DocumentRejected (2007): Ein Dokument wurde abgelehnt. +/// EnvelopeShared (2008): Der Umschlag wurde geteilt. +/// EnvelopeViewed (2009): Der Umschlag wurde angesehen. +/// DocumentForwarded (4001): Das Dokument wurde weitergeleitet. +/// MessageInvitationSent (3001): Einladung wurde gesendet (vom Trigger verwendet). +/// MessageAccessCodeSent (3002): Zugriffscode wurde gesendet. +/// MessageConfirmationSent (3003): Bestätigungsnachricht wurde gesendet. +/// MessageDeletionSent (3004): Löschbenachrichtigung wurde gesendet. +/// MessageCompletionSent (3005): Abschlussbenachrichtigung wurde gesendet. +/// +/// +/// Der minimale Statuswert, der berücksichtigt werden soll. +/// Der maximale Statuswert, der berücksichtigt werden soll. +/// Eine Liste von Statuswerten, die ignoriert werden sollen. +public record StatusQuery( + int? Min = null, + int? Max = null, + int[]? Ignore = null) +{ +} diff --git a/EnvelopeGenerator.Application/EnvelopeReceivers/EnvelopeReceiverQuery.cs b/EnvelopeGenerator.Application/EnvelopeReceivers/EnvelopeReceiverQuery.cs index b4bc1de4..3eccc2c8 100644 --- a/EnvelopeGenerator.Application/EnvelopeReceivers/EnvelopeReceiverQuery.cs +++ b/EnvelopeGenerator.Application/EnvelopeReceivers/EnvelopeReceiverQuery.cs @@ -1,5 +1,4 @@ -using EnvelopeGenerator.Application.Envelopes.Queries.Read; -using EnvelopeGenerator.Application.Receivers.Queries.Read; +using EnvelopeGenerator.Application.EnvelopeHistories; namespace EnvelopeGenerator.Application.EnvelopeReceivers; @@ -9,7 +8,4 @@ namespace EnvelopeGenerator.Application.EnvelopeReceivers; /// /// /// -public record EnvelopeReceiverQuery( - int? MinStatus = null, - int? MaxStatus = null, - int[]? IgnoreStatus = null); \ No newline at end of file +public record EnvelopeReceiverQuery(StatusQuery Status); \ No newline at end of file diff --git a/EnvelopeGenerator.Application/EnvelopeReceivers/Queries/Read/ReadEnvelopeReceiverQuery.cs b/EnvelopeGenerator.Application/EnvelopeReceivers/Queries/Read/ReadEnvelopeReceiverQuery.cs index 3bb56aaa..20894771 100644 --- a/EnvelopeGenerator.Application/EnvelopeReceivers/Queries/Read/ReadEnvelopeReceiverQuery.cs +++ b/EnvelopeGenerator.Application/EnvelopeReceivers/Queries/Read/ReadEnvelopeReceiverQuery.cs @@ -1,4 +1,5 @@ -using EnvelopeGenerator.Application.Envelopes.Queries.Read; +using EnvelopeGenerator.Application.EnvelopeHistories; +using EnvelopeGenerator.Application.Envelopes.Queries.Read; using EnvelopeGenerator.Application.Receivers.Queries.Read; using MediatR; @@ -14,7 +15,8 @@ namespace EnvelopeGenerator.Application.EnvelopeReceivers.Queries.Read; /// Die Antwort enthält Details wie den Status, die Zuordnung zwischen Umschlag und Empfänger /// sowie zusätzliche Metadaten. /// -public record ReadEnvelopeReceiverQuery : EnvelopeReceiverQuery, IRequest +/// Umschlag oder Empfängerstatus. +public record ReadEnvelopeReceiverQuery(StatusQuery Status) : EnvelopeReceiverQuery(Status), IRequest { /// /// Der Umschlag, der mit dem Empfänger verknüpft ist. diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs index f6e4d17c..5cf96857 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs @@ -1,10 +1,17 @@ using DigitalData.Core.DTO; using EnvelopeGenerator.Application.Contracts.Services; +using EnvelopeGenerator.Application.EnvelopeHistories; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace EnvelopeGenerator.GeneratorAPI.Controllers; +/// +/// Dieser Controller stellt Endpunkte für die Verwaltung von Umschlägen bereit. +/// +/// +/// Die API ermöglicht das Abrufen und Verwalten von Umschlägen basierend auf Benutzerinformationen und Statusfiltern. +/// [Route("api/[controller]")] [ApiController] [Authorize] @@ -12,24 +19,32 @@ public class EnvelopeController : ControllerBase { private readonly ILogger _logger; private readonly IEnvelopeService _envelopeService; - + + /// + /// Erstellt eine neue Instanz des EnvelopeControllers. + /// + /// Der Logger, der für das Protokollieren von Informationen verwendet wird. + /// Der Dienst, der für die Verarbeitung von Umschlägen zuständig ist. public EnvelopeController(ILogger logger, IEnvelopeService envelopeService) { _logger = logger; _envelopeService = envelopeService; } + /// + /// Ruft eine Liste von Umschlägen basierend auf dem Benutzer und den angegebenen Statusfiltern ab. + /// + /// Die Statusfilter, die für die Abfrage verwendet werden sollen. + /// Eine IActionResult-Instanz, die die abgerufenen Umschläge oder einen Fehlerstatus enthält. [Authorize] [HttpGet] public async Task GetAsync( - [FromQuery] int? min_status = null, - [FromQuery] int? max_status = null, - [FromQuery] params int[] ignore_statuses) + [FromQuery] StatusQuery status) { try { if (User.GetId() is int intId) - return await _envelopeService.ReadByUserAsync(intId, min_status: min_status, max_status: max_status, ignore_statuses: ignore_statuses).ThenAsync( + return await _envelopeService.ReadByUserAsync(intId, min_status: status.Min, max_status: status.Max, ignore_statuses: status.Ignore).ThenAsync( Success: Ok, Fail: IActionResult (msg, ntc) => { @@ -38,7 +53,7 @@ public class EnvelopeController : ControllerBase }); else { - _logger.LogError("Despite successful authorization, the 'api/envelope' route encountered an issue: the user ID is not recognized as an integer. This may be due to the removal of the ID during the creation of the claims list."); + _logger.LogError("Trotz erfolgreicher Autorisierung wurde die Benutzer-ID nicht als Ganzzahl erkannt. Dies könnte auf eine fehlerhafte Erstellung der Anspruchsliste zurückzuführen sein."); return StatusCode(StatusCodes.Status500InternalServerError); } } @@ -48,4 +63,4 @@ public class EnvelopeController : ControllerBase return StatusCode(StatusCodes.Status500InternalServerError); } } -} \ No newline at end of file +} From ec76014ce764bbc395c19929d779de61550e4da4 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Thu, 10 Apr 2025 16:07:08 +0200 Subject: [PATCH 29/76] Verbesserung von EnvelopeReceiverController mit neuen Funktionen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Die Klasse EnvelopeReceiverController wurde aktualisiert, um die Funktionalität und Dokumentation zu verbessern. Es wurde eine neue using-Direktive hinzugefügt und die Namespace-Deklaration verschoben. Einführung der XML-Dokumentation in deutscher Sprache für mehr Klarheit. Die GetEnvelopeReceiver-Methode wurde so geändert, dass sie einen ReadEnvelopeReceiverQuery-Parameter akzeptiert, wodurch ihre Signatur verbessert wurde. Verbesserte Fehlerbehandlung und Protokollierung bei allen Methoden. GetSecretAsync hinzugefügt, um geheime Informationen nach UUID abzurufen. CreateAsync wurde aktualisiert, um die createEnvelopeQuery über den Mediator zu senden und einen akzeptierten Status zurückzugeben. --- .../Controllers/EnvelopeReceiverController.cs | 285 ++++++++++-------- 1 file changed, 161 insertions(+), 124 deletions(-) diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs index c73d791c..244ddf71 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs @@ -1,153 +1,190 @@ using DigitalData.Core.DTO; using EnvelopeGenerator.Application.Contracts.Services; using EnvelopeGenerator.Application.EnvelopeReceivers.Commands.Create; +using EnvelopeGenerator.Application.EnvelopeReceivers.Queries.Read; using MediatR; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace EnvelopeGenerator.GeneratorAPI.Controllers -{ - [Route("api/[controller]")] - [Authorize] - [ApiController] - public class EnvelopeReceiverController : ControllerBase - { - private readonly ILogger _logger; - - private readonly IEnvelopeReceiverService _erService; +namespace EnvelopeGenerator.GeneratorAPI.Controllers; - private readonly IMediator _mediator; - - public EnvelopeReceiverController(ILogger logger, IEnvelopeReceiverService envelopeReceiverService, IMediator mediator) - { - _logger = logger; - _erService = envelopeReceiverService; - _mediator = mediator; - } - - [HttpGet] - public async Task GetEnvelopeReceiver([FromQuery] int? min_status = null, [FromQuery] int? max_status = null, [FromQuery] int[]? ignore_status = null) - { - try - { - var username = User.GetUsername(); +/// +/// Controller für die Verwaltung von Umschlagempfängern. +/// +/// +/// Dieser Controller bietet Endpunkte für das Abrufen und Verwalten von Umschlagempfängerdaten. +/// +[Route("api/[controller]")] +[Authorize] +[ApiController] +public class EnvelopeReceiverController : ControllerBase +{ + private readonly ILogger _logger; - if (username is null) - { - _logger.LogError(@"Envelope Receiver dto cannot be sent because username claim is null. Potential authentication and authorization error. The value of other claims are [id: {id}], [username: {username}], [name: {name}], [prename: {prename}], [email: {email}].", - User.GetId(), User.GetUsername(), User.GetName(), User.GetPrename(), User.GetEmail()); - return StatusCode(StatusCodes.Status500InternalServerError); - } + private readonly IEnvelopeReceiverService _erService; - ignore_status ??= Array.Empty(); + private readonly IMediator _mediator; - return await _erService.ReadByUsernameAsync(username: username, min_status: min_status, max_status: max_status, ignore_statuses: ignore_status).ThenAsync( - Success: Ok, - Fail: IActionResult (msg, ntc) => - { - _logger.LogNotice(ntc); - return StatusCode(StatusCodes.Status500InternalServerError, msg); - }); - } - catch(Exception ex) - { - _logger.LogError(ex, "An unexpected error occurred. {message}", ex.Message); - return new StatusCodeResult(StatusCodes.Status500InternalServerError); - } - } + /// + /// Konstruktor für den EnvelopeReceiverController. + /// + /// Logger-Instanz zur Protokollierung von Informationen und Fehlern. + /// Service zur Verwaltung von Umschlagempfängern. + /// Mediator-Instanz zur Verarbeitung von Befehlen und Abfragen. + public EnvelopeReceiverController(ILogger logger, IEnvelopeReceiverService envelopeReceiverService, IMediator mediator) + { + _logger = logger; + _erService = envelopeReceiverService; + _mediator = mediator; + } - [HttpGet("receiver-name/{mail}")] - public async Task GetReceiverName([FromRoute] string mail) + /// + /// Ruft eine Liste von Umschlagempfängern basierend auf den angegebenen Abfrageparametern ab. + /// + /// Die Abfrageparameter, die den Status und andere Filterkriterien enthalten. + /// Eine HTTP-Antwort mit der Liste der gefundenen Umschlagempfänger oder einem Fehlerstatus. + /// + /// Dieser Endpunkt ermöglicht es, Umschlagempfänger basierend auf dem Benutzernamen und optionalen Statusfiltern abzurufen. + /// Wenn der Benutzername nicht ermittelt werden kann, wird ein Serverfehler zurückgegeben. + /// + [HttpGet] + public async Task GetEnvelopeReceiver([FromQuery] ReadEnvelopeReceiverQuery envelopeReceiver) + { + try { - try - { - return await _erService.ReadLastUsedReceiverNameByMail(mail).ThenAsync( - Success: res => res is null ? Ok(string.Empty) : Ok(res), - Fail: IActionResult (msg, ntc) => - { - if (ntc.HasFlag(Flag.NotFound)) - return NotFound(); + var username = User.GetUsername(); - _logger.LogNotice(ntc); - return StatusCode(StatusCodes.Status500InternalServerError); - }); - } - catch(Exception ex) + if (username is null) { - _logger.LogError(ex, "{message}", ex.Message); + _logger.LogError(@"Envelope Receiver dto cannot be sent because username claim is null. Potential authentication and authorization error. The value of other claims are [id: {id}], [username: {username}], [name: {name}], [prename: {prename}], [email: {email}].", + User.GetId(), User.GetUsername(), User.GetName(), User.GetPrename(), User.GetEmail()); return StatusCode(StatusCodes.Status500InternalServerError); } - } - [HttpGet("secret")] - [Authorize] - public async Task GetSecretAsync([FromQuery] string uuid) - { - try - { - return await _erService.ReadWithSecretByUuidAsync(uuid: uuid).ThenAsync( + return await _erService.ReadByUsernameAsync(username: username, min_status: envelopeReceiver.Status.Min, max_status: envelopeReceiver.Status.Min, ignore_statuses: envelopeReceiver.Status.Ignore ?? Array.Empty()).ThenAsync( Success: Ok, Fail: IActionResult (msg, ntc) => { _logger.LogNotice(ntc); - return StatusCode(StatusCodes.Status500InternalServerError); + return StatusCode(StatusCodes.Status500InternalServerError, msg); }); - } - catch (Exception ex) - { - _logger.LogError(ex, "{message}", ex.Message); - return StatusCode(StatusCodes.Status500InternalServerError); - } } + catch(Exception ex) + { + _logger.LogError(ex, "An unexpected error occurred. {message}", ex.Message); + return new StatusCodeResult(StatusCodes.Status500InternalServerError); + } + } + + /// + /// Ruft den Namen des letzten verwendeten Empfängers basierend auf der angegebenen E-Mail-Adresse ab. + /// + /// Die E-Mail-Adresse des Empfängers. + /// Eine HTTP-Antwort mit dem Namen des Empfängers oder einem Fehlerstatus. + /// + /// Dieser Endpunkt ermöglicht es, den Namen des letzten Empfängers abzurufen, der mit der angegebenen E-Mail-Adresse verknüpft ist. + /// Wenn kein Empfänger gefunden wird, wird ein leerer String zurückgegeben. + /// + [HttpGet("receiver-name/{mail}")] + public async Task GetReceiverName([FromRoute] string mail) + { + try + { + return await _erService.ReadLastUsedReceiverNameByMail(mail).ThenAsync( + Success: res => res is null ? Ok(string.Empty) : Ok(res), + Fail: IActionResult (msg, ntc) => + { + if (ntc.HasFlag(Flag.NotFound)) + return NotFound(); + + _logger.LogNotice(ntc); + return StatusCode(StatusCodes.Status500InternalServerError); + }); + } + catch(Exception ex) + { + _logger.LogError(ex, "{message}", ex.Message); + return StatusCode(StatusCodes.Status500InternalServerError); + } + } - /// - /// Datenübertragungsobjekt mit Informationen zu Umschlägen, Empfängern und Unterschriften. - /// - /// - /// Token to cancel the operation - /// HTTP-Antwort - /// - /// Sample request: - /// - /// POST /api/envelope - /// { - /// "title": "Vertragsdokument", - /// "message": "Bitte unterschreiben Sie dieses Dokument.", - /// "document": { - /// "dataAsBase64": "dGVzdC1iYXNlNjQtZGF0YQ==" - /// }, - /// "receivers": [ - /// { - /// "emailAddress": "example@example.com", - /// "signatures": [ - /// { - /// "x": 100, - /// "y": 200, - /// "page": 1 - /// } - /// ], - /// "name": "Max Mustermann", - /// "phoneNumber": "+49123456789" - /// } - /// ], - /// "language": "de-DE", - /// "expiresWhen": "2025-12-31T23:59:59Z", - /// "expiresWarningWhen": "2025-12-24T23:59:59Z", - /// "contractType": 1, - /// "tfaEnabled": false - /// } - /// - /// - /// Envelope-Erstellung und Sendeprozessbefehl erfolgreich - /// Wenn ein Fehler im HTTP-Body auftritt - /// Wenn kein autorisierter Token vorhanden ist - /// Es handelt sich um einen unerwarteten Fehler. Die Protokolle sollten überprüft werden. - [Authorize] - [HttpPost] - public async Task CreateAsync([FromBody] CreateEnvelopeCommand createEnvelopeQuery, CancellationToken cancellationToken) + /// + /// Ruft geheime Informationen basierend auf der angegebenen UUID ab. + /// + /// Die eindeutige Kennung (UUID), die verwendet wird, um die geheimen Informationen abzurufen. + /// Eine HTTP-Antwort mit den geheimen Informationen oder einem Fehlerstatus. + /// + /// Dieser Endpunkt ermöglicht es, geheime Informationen zu einem Umschlagempfänger basierend auf der UUID abzurufen. + /// Wenn keine Informationen gefunden werden, wird ein entsprechender Fehlerstatus zurückgegeben. + /// + [HttpGet("secret")] + [Authorize] + public async Task GetSecretAsync([FromQuery] string uuid) + { + try + { + return await _erService.ReadWithSecretByUuidAsync(uuid: uuid).ThenAsync( + Success: Ok, + Fail: IActionResult (msg, ntc) => + { + _logger.LogNotice(ntc); + return StatusCode(StatusCodes.Status500InternalServerError); + }); + } + catch (Exception ex) { - await _mediator.Send(createEnvelopeQuery, cancellationToken); - return Accepted(); + _logger.LogError(ex, "{message}", ex.Message); + return StatusCode(StatusCodes.Status500InternalServerError); } } + + /// + /// Datenübertragungsobjekt mit Informationen zu Umschlägen, Empfängern und Unterschriften. + /// + /// + /// Token to cancel the operation + /// HTTP-Antwort + /// + /// Sample request: + /// + /// POST /api/envelope + /// { + /// "title": "Vertragsdokument", + /// "message": "Bitte unterschreiben Sie dieses Dokument.", + /// "document": { + /// "dataAsBase64": "dGVzdC1iYXNlNjQtZGF0YQ==" + /// }, + /// "receivers": [ + /// { + /// "emailAddress": "example@example.com", + /// "signatures": [ + /// { + /// "x": 100, + /// "y": 200, + /// "page": 1 + /// } + /// ], + /// "name": "Max Mustermann", + /// "phoneNumber": "+49123456789" + /// } + /// ], + /// "language": "de-DE", + /// "expiresWhen": "2025-12-31T23:59:59Z", + /// "expiresWarningWhen": "2025-12-24T23:59:59Z", + /// "contractType": 1, + /// "tfaEnabled": false + /// } + /// + /// + /// Envelope-Erstellung und Sendeprozessbefehl erfolgreich + /// Wenn ein Fehler im HTTP-Body auftritt + /// Wenn kein autorisierter Token vorhanden ist + /// Es handelt sich um einen unerwarteten Fehler. Die Protokolle sollten überprüft werden. + [Authorize] + [HttpPost] + public async Task CreateAsync([FromBody] CreateEnvelopeCommand createEnvelopeQuery, CancellationToken cancellationToken) + { + await _mediator.Send(createEnvelopeQuery, cancellationToken); + return Accepted(); + } } \ No newline at end of file From 9f186afdff32ddc5bf7a168d77bed6a8aa430d08 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Thu, 10 Apr 2025 16:09:45 +0200 Subject: [PATCH 30/76] refactor(EnvelopeTypeController): aktualisiert zu ignoriert von open-api --- .../Controllers/EnvelopeTypeController.cs | 57 +++++++++---------- 1 file changed, 27 insertions(+), 30 deletions(-) diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeTypeController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeTypeController.cs index 3708cf08..bf2ea067 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeTypeController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeTypeController.cs @@ -1,43 +1,40 @@ using DigitalData.Core.DTO; using EnvelopeGenerator.Application.Contracts.Services; -using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; -using System.Net.Mail; -using System.Security.Cryptography.Xml; -namespace EnvelopeGenerator.GeneratorAPI.Controllers +namespace EnvelopeGenerator.GeneratorAPI.Controllers; + +[ApiExplorerSettings(IgnoreApi = true)] +[Route("api/[controller]")] +[ApiController] +public class EnvelopeTypeController : ControllerBase { - [Route("api/[controller]")] - [ApiController] - public class EnvelopeTypeController : ControllerBase + private readonly ILogger _logger; + private readonly IEnvelopeTypeService _service; + + public EnvelopeTypeController(ILogger logger, IEnvelopeTypeService service) { - private readonly ILogger _logger; - private readonly IEnvelopeTypeService _service; + _logger = logger; + _service = service; + } - public EnvelopeTypeController(ILogger logger, IEnvelopeTypeService service) + [HttpGet] + public async Task GetAllAsync() + { + try { - _logger = logger; - _service = service; + return await _service.ReadAllAsync().ThenAsync( + Success: Ok, + Fail: IActionResult (msg, ntc) => + { + _logger.LogNotice(ntc); + return ntc.HasFlag(Flag.NotFound) ? NotFound() : StatusCode(StatusCodes.Status500InternalServerError); + }); } - - [HttpGet] - public async Task GetAllAsync() + catch (Exception ex) { - try - { - return await _service.ReadAllAsync().ThenAsync( - Success: Ok, - Fail: IActionResult (msg, ntc) => - { - _logger.LogNotice(ntc); - return ntc.HasFlag(Flag.NotFound) ? NotFound() : StatusCode(StatusCodes.Status500InternalServerError); - }); - } - catch (Exception ex) - { - _logger.LogError(ex, "{Message}", ex.Message); - return StatusCode(StatusCodes.Status500InternalServerError); - } + _logger.LogError(ex, "{Message}", ex.Message); + return StatusCode(StatusCodes.Status500InternalServerError); } } } \ No newline at end of file From 2cb5d0c0d51532d707565afcd0bdaf811b99450a Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Thu, 10 Apr 2025 16:35:40 +0200 Subject: [PATCH 31/76] Refactor envelope and user query structures - Introduced a new `UserQuery` record to encapsulate user-related information, replacing individual fields in `EnvelopeQuery`. - Added a `ReferenceType` property in `EnvelopeHistoryQuery` to enhance reference handling logic. - Modified `EnvelopeQuery` to use the new `UserQuery` structure, simplifying the data model. - Updated `HistoryController` with a new constructor and restructured the `GetReferenceTypes` method. - Introduced `ReadEnvelopeHistoryQuery` to allow for more specific envelope history queries. - Overall improvements enhance code structure, clarity, and querying capabilities. --- .../EnvelopeHistories/EnvelopeHistoryQuery.cs | 7 + .../Queries/Read/ReadEnvelopeHistoryQuery.cs | 17 +++ .../Envelopes/EnvelopeQuery.cs | 17 ++- .../Envelopes/UserQuery.cs | 5 + .../Controllers/HistoryController.cs | 121 ++++++++++-------- 5 files changed, 104 insertions(+), 63 deletions(-) create mode 100644 EnvelopeGenerator.Application/EnvelopeHistories/Queries/Read/ReadEnvelopeHistoryQuery.cs create mode 100644 EnvelopeGenerator.Application/Envelopes/UserQuery.cs diff --git a/EnvelopeGenerator.Application/EnvelopeHistories/EnvelopeHistoryQuery.cs b/EnvelopeGenerator.Application/EnvelopeHistories/EnvelopeHistoryQuery.cs index 4784ec11..04df49fd 100644 --- a/EnvelopeGenerator.Application/EnvelopeHistories/EnvelopeHistoryQuery.cs +++ b/EnvelopeGenerator.Application/EnvelopeHistories/EnvelopeHistoryQuery.cs @@ -1,5 +1,6 @@ using EnvelopeGenerator.Application.Envelopes; using EnvelopeGenerator.Application.Receivers; +using static EnvelopeGenerator.Common.Constants; namespace EnvelopeGenerator.Application.EnvelopeHistories; @@ -13,4 +14,10 @@ public record EnvelopeHistoryQuery(int EnvelopeI where TEnvelopeQuery : EnvelopeQuery where TReceiverQuery : ReceiverQuery { + public ReferenceType ReferenceType => + Envelope?.User is not null + ? ReferenceType.Receiver + : Receiver is not null + ? ReferenceType.Receiver + : ReferenceType.System; } diff --git a/EnvelopeGenerator.Application/EnvelopeHistories/Queries/Read/ReadEnvelopeHistoryQuery.cs b/EnvelopeGenerator.Application/EnvelopeHistories/Queries/Read/ReadEnvelopeHistoryQuery.cs new file mode 100644 index 00000000..c9fd4593 --- /dev/null +++ b/EnvelopeGenerator.Application/EnvelopeHistories/Queries/Read/ReadEnvelopeHistoryQuery.cs @@ -0,0 +1,17 @@ +using EnvelopeGenerator.Application.Envelopes.Queries.Read; +using EnvelopeGenerator.Application.Receivers.Queries.Read; + +namespace EnvelopeGenerator.Application.EnvelopeHistories.Queries.Read; + +/// +/// Repräsentiert eine Abfrage für die Verlaufshistorie eines Umschlags. +/// +/// Die eindeutige Kennung des Umschlags. +/// Die Abfrage, die den Umschlag beschreibt. +/// Die Abfrage, die den Empfänger beschreibt. +public record ReadEnvelopeHistoryQuery( + int EnvelopeId, + ReadEnvelopeQuery? Envelope, + ReadReceiverQuery? Receiver, + StatusQuery? Status) + : EnvelopeHistoryQuery(EnvelopeId, Envelope, Receiver, Status); diff --git a/EnvelopeGenerator.Application/Envelopes/EnvelopeQuery.cs b/EnvelopeGenerator.Application/Envelopes/EnvelopeQuery.cs index 60b770e6..8507b102 100644 --- a/EnvelopeGenerator.Application/Envelopes/EnvelopeQuery.cs +++ b/EnvelopeGenerator.Application/Envelopes/EnvelopeQuery.cs @@ -6,15 +6,18 @@ namespace EnvelopeGenerator.Application.Envelopes; /// Repräsentiert eine Abfrage für Umschläge. /// /// Die eindeutige Kennung des Umschlags. -/// Die Kennung des Benutzers, der den Umschlag erstellt hat. -/// Der Benutzername des Benutzers, der den Umschlag erstellt hat. -/// Die E-Mail-Adresse des Benutzers, der den Umschlag erstellt hat. +/// Absender des Schreibens /// Der Status des Umschlags. /// Die universell eindeutige Kennung des Umschlags. public record EnvelopeQuery( int? Id = null, - int? UserId = null, - string? Username = null, - string? Email = null, + UserQuery? User = null, int? Status = null, - string? Uuid = null) : IRequest; \ No newline at end of file + string? Uuid = null) : IRequest +{ + public int? UserId => User?.Id; + + public string? Username => User?.Username; + + public string? UserEmail => User?.Username; +}; \ No newline at end of file diff --git a/EnvelopeGenerator.Application/Envelopes/UserQuery.cs b/EnvelopeGenerator.Application/Envelopes/UserQuery.cs new file mode 100644 index 00000000..0c57327b --- /dev/null +++ b/EnvelopeGenerator.Application/Envelopes/UserQuery.cs @@ -0,0 +1,5 @@ +namespace EnvelopeGenerator.Application.Envelopes; + +public record UserQuery(int? Id = null, string? Username = null, string? Email = null) +{ +} diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs index ce0abab4..89dcf8ce 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs @@ -1,73 +1,82 @@ using EnvelopeGenerator.Application.Contracts.Services; +using EnvelopeGenerator.Application.EnvelopeHistories.Queries.Read; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -using System; using static EnvelopeGenerator.Common.Constants; -namespace EnvelopeGenerator.GeneratorAPI.Controllers + +namespace EnvelopeGenerator.GeneratorAPI.Controllers; + +/// +/// Dieser Controller bietet Endpunkte für den Zugriff auf die Verlaufshistorie von Umschlägen. +/// +[Route("api/[controller]")] +[ApiController] +[Authorize] +public class HistoryController : ControllerBase { - [Route("api/[controller]")] - [ApiController] + private readonly ILogger _logger; + + private readonly IEnvelopeHistoryService _service; + + /// + /// Konstruktor für den HistoryController. + /// + /// Der Logger, der für das Protokollieren von Informationen verwendet wird. + /// Der Dienst, der für die Verarbeitung der Verlaufshistorie verantwortlich ist. + public HistoryController(ILogger logger, IEnvelopeHistoryService service) + { + _logger = logger; + _service = service; + } + + [HttpGet("reference-type")] [Authorize] - public class HistoryController : ControllerBase + public IActionResult GetReferenceTypes() { - private readonly ILogger _logger; + // Enum to Key-Value pair + var referenceTypes = Enum.GetValues(typeof(ReferenceType)) + .Cast() + .ToDictionary(rt => + { + var key = rt.ToString(); + var keyAsCamelCase = char.ToLower(key[0]) + key[1..]; + return keyAsCamelCase; + }, rt => (int)rt); - private readonly IEnvelopeHistoryService _service; + return Ok(referenceTypes); + } - public HistoryController(ILogger logger, IEnvelopeHistoryService service) - { - _logger = logger; - _service = service; - } + /// + /// Ruft die gesamte Verlaufshistorie von Umschlägen basierend auf den angegebenen Abfrageparametern ab. + /// + /// Die Abfrageparameter, die die Filterkriterien für die Verlaufshistorie definieren. + /// Eine Liste von Verlaufseinträgen, die den angegebenen Kriterien entsprechen. + [HttpGet] + [Authorize] + public async Task GetAllAsync([FromQuery] ReadEnvelopeHistoryQuery history) + { + ReferenceType? refTypEnum = history.ReferenceType; + bool withReceiver = false; + bool withSender = false; - [HttpGet("reference-type")] - [Authorize] - public IActionResult GetReferenceTypes() + switch (refTypEnum) { - // Enum to Key-Value pair - var referenceTypes = Enum.GetValues(typeof(ReferenceType)) - .Cast() - .ToDictionary(rt => - { - var key = rt.ToString(); - var keyAsCamelCase = char.ToLower(key[0]) + key[1..]; - return keyAsCamelCase; - }, rt => (int)rt); - - return Ok(referenceTypes); + case ReferenceType.Receiver: + withReceiver = true; + break; + case ReferenceType.Sender: + withSender = true; + break; } - [HttpGet] - [Authorize] - public async Task GetAllAsync([FromQuery] int? envelopeId = null, [FromQuery] string? userReference = null, [FromQuery] int? referenceType = null, [FromQuery] bool withSender = false, [FromQuery] bool withReceiver = false) - { - ReferenceType? refTypEnum = null; + var histories = await _service.ReadAsync( + envelopeId: history.EnvelopeId, + //userReference: history.r, + referenceType: refTypEnum, + withSender: withSender, + withReceiver: withReceiver); - if (referenceType is int refTypInt) - if (Enum.IsDefined(typeof(ReferenceType), refTypInt)) - refTypEnum = (ReferenceType)refTypInt; - else - throw new ArgumentException($"The provided referenceType '{referenceType}' is not valid. It must correspond to a valid value in the {nameof(ReferenceType)} enum."); - - switch(referenceType) - { - case (int)ReferenceType.Receiver: - withReceiver = true; - break; - case (int)ReferenceType.Sender: - withSender = true; - break; - } - - var histories = await _service.ReadAsync( - envelopeId: envelopeId, - userReference: userReference, - referenceType: refTypEnum, - withSender: withSender, - withReceiver: withReceiver); - - return Ok(histories); - } + return Ok(histories); } } \ No newline at end of file From 02c7040b392de2c10725f9d81fa481877fd9c94a Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Thu, 10 Apr 2025 16:37:33 +0200 Subject: [PATCH 32/76] Verbesserung von LocalizationController mit XML-Dokumentation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Die Klasse LocalizationController wurde aktualisiert, um XML-Dokumentationskommentare für eine bessere Klarheit und ein besseres Verständnis der Methoden und Eigenschaften einzuschließen. Zusammenfassungen von Konstruktoren und Methoden sowie Parameterbeschreibungen wurden in deutscher Sprache hinzugefügt. Die allgemeine Struktur und Formatierung der Klasse wurde verbessert, um die richtige Definition und Lesbarkeit zu gewährleisten. --- .../Controllers/LocalizationController.cs | 157 +++++++++++------- 1 file changed, 93 insertions(+), 64 deletions(-) diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/LocalizationController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/LocalizationController.cs index 2636d67c..244bbc47 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/LocalizationController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/LocalizationController.cs @@ -6,85 +6,114 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Localization; -namespace EnvelopeGenerator.GeneratorAPI.Controllers +namespace EnvelopeGenerator.GeneratorAPI.Controllers; + +/// +/// Controller für die Verwaltung der Lokalisierung und Spracheinstellungen. +/// +[Route("api/[controller]")] +[ApiController] +public class LocalizationController : ControllerBase { - [Route("api/[controller]")] - [ApiController] - public class LocalizationController : ControllerBase - { - private static readonly Guid L_KEY = Guid.NewGuid(); + private static readonly Guid L_KEY = Guid.NewGuid(); - private readonly ILogger _logger; - private readonly IStringLocalizer _mLocalizer; - private readonly IStringLocalizer _localizer; - private readonly IMemoryCache _cache; + private readonly ILogger _logger; + private readonly IStringLocalizer _mLocalizer; + private readonly IStringLocalizer _localizer; + private readonly IMemoryCache _cache; - public LocalizationController( - ILogger logger, - IStringLocalizer localizer, - IMemoryCache memoryCache, - IStringLocalizer _modelLocalizer) - { - _logger = logger; - _localizer = localizer; - _cache = memoryCache; - _mLocalizer = _modelLocalizer; - } + /// + /// Konstruktor für den . + /// + /// Logger für die Protokollierung. + /// Lokalisierungsdienst für Ressourcen. + /// Speicher-Cache für die Zwischenspeicherung von Daten. + /// Lokalisierungsdienst für Modelle. + public LocalizationController( + ILogger logger, + IStringLocalizer localizer, + IMemoryCache memoryCache, + IStringLocalizer _modelLocalizer) + { + _logger = logger; + _localizer = localizer; + _cache = memoryCache; + _mLocalizer = _modelLocalizer; + } - [HttpGet] - public IActionResult GetAll() => Ok(_cache.GetOrCreate(Language ?? string.Empty + L_KEY, _ => _mLocalizer.ToDictionary())); + /// + /// Ruft alle lokalisierten Daten ab. + /// + /// Eine Liste aller lokalisierten Daten. + [HttpGet] + public IActionResult GetAll() => Ok(_cache.GetOrCreate(Language ?? string.Empty + L_KEY, _ => _mLocalizer.ToDictionary())); - [HttpGet("lang")] - public IActionResult GetLanguage() => Language is null ? NotFound() : Ok(Language); + /// + /// Ruft die aktuelle Sprache ab. + /// + /// Die aktuelle Sprache oder ein NotFound-Ergebnis, wenn keine Sprache gesetzt ist. + [HttpGet("lang")] + public IActionResult GetLanguage() => Language is null ? NotFound() : Ok(Language); - [HttpPost("lang")] - public IActionResult SetLanguage([FromQuery] string language) - { - if (string.IsNullOrEmpty(language)) - return BadRequest(); + /// + /// Setzt die Sprache. + /// + /// Die zu setzende Sprache. + /// Ein Ok-Ergebnis, wenn die Sprache erfolgreich gesetzt wurde, oder ein BadRequest-Ergebnis, wenn die Eingabe ungültig ist. + [HttpPost("lang")] + public IActionResult SetLanguage([FromQuery] string language) + { + if (string.IsNullOrEmpty(language)) + return BadRequest(); - Language = language; - return Ok(); - } + Language = language; + return Ok(); + } - [HttpDelete("lang")] - public IActionResult DeleteLanguage() - { - Language = null; - return Ok(); - } + /// + /// Löscht die aktuelle Sprache. + /// + /// Ein Ok-Ergebnis, wenn die Sprache erfolgreich gelöscht wurde. + [HttpDelete("lang")] + public IActionResult DeleteLanguage() + { + Language = null; + return Ok(); + } - private string? Language + /// + /// Eigenschaft für die Verwaltung der aktuellen Sprache über Cookies. + /// + private string? Language + { + get { - get - { - var cookieValue = Request.Cookies[CookieRequestCultureProvider.DefaultCookieName]; + var cookieValue = Request.Cookies[CookieRequestCultureProvider.DefaultCookieName]; - if (string.IsNullOrEmpty(cookieValue)) - return null; + if (string.IsNullOrEmpty(cookieValue)) + return null; - var culture = CookieRequestCultureProvider.ParseCookieValue(cookieValue)?.Cultures[0]; - return culture?.Value ?? null; - } - set + var culture = CookieRequestCultureProvider.ParseCookieValue(cookieValue)?.Cultures[0]; + return culture?.Value ?? null; + } + set + { + if (value is null) + Response.Cookies.Delete(CookieRequestCultureProvider.DefaultCookieName); + else { - if (value is null) - Response.Cookies.Delete(CookieRequestCultureProvider.DefaultCookieName); - else + var cookieOptions = new CookieOptions() { - var cookieOptions = new CookieOptions() - { - Expires = DateTimeOffset.UtcNow.AddYears(1), - Secure = false, - SameSite = SameSiteMode.Strict, - HttpOnly = true - }; + Expires = DateTimeOffset.UtcNow.AddYears(1), + Secure = false, + SameSite = SameSiteMode.Strict, + HttpOnly = true + }; - Response.Cookies.Append( - CookieRequestCultureProvider.DefaultCookieName, - CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(value)), - cookieOptions); - } + Response.Cookies.Append( + CookieRequestCultureProvider.DefaultCookieName, + CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(value)), + cookieOptions); } } } From ecf0771f9e31a42d529ffcf2640b6cff814497e1 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Thu, 10 Apr 2025 16:40:07 +0200 Subject: [PATCH 33/76] Refactor ReceiverController to use ReadReceiverQuery MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Aktualisierte Get- und Delete-Methoden, um ReadReceiverQuery für die Parameterbehandlung zu verwenden, was die Organisation und Kapselung verbessert. Service-Aufrufe wurden angepasst, um Eigenschaften des neuen Query-Objekts anstelle von individuellen Parametern zu verwenden. --- .../Controllers/ReceiverController.cs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/ReceiverController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/ReceiverController.cs index f8c11be2..653e6c4c 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/ReceiverController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/ReceiverController.cs @@ -2,6 +2,7 @@ using DigitalData.Core.DTO; using EnvelopeGenerator.Application.Contracts.Services; using EnvelopeGenerator.Application.DTOs.Receiver; +using EnvelopeGenerator.Application.Receivers.Queries.Read; using EnvelopeGenerator.Domain.Entities; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; @@ -18,14 +19,14 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers } [HttpGet] - public async Task Get([FromQuery] string? emailAddress = null, [FromQuery] string? signature = null) + public async Task Get([FromQuery] ReadReceiverQuery receiver) { - if (emailAddress is null && signature is null) + if (receiver.EmailAddress is null && receiver.Signature is null) return await base.GetAll(); try { - return await _service.ReadByAsync(emailAddress: emailAddress, signature: signature).ThenAsync( + return await _service.ReadByAsync(emailAddress: receiver.EmailAddress, signature: receiver.Signature).ThenAsync( Success: Ok, Fail: IActionResult (msg, ntc) => { @@ -50,15 +51,15 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers } [HttpDelete] - public async Task Delete([FromQuery] int? id = null, [FromQuery]string? emailAddress = null, [FromQuery] string? signature = null) + public async Task Delete([FromQuery] ReadReceiverQuery receiver) { - if(id is int id_int) + if(receiver.Id is int id_int) return await base.Delete(id_int); try { - if (emailAddress is not null || signature is not null) - return await _service.DeleteByAsync(emailAddress: emailAddress, signature: signature).ThenAsync( + if (receiver.EmailAddress is not null || receiver.Signature is not null) + return await _service.DeleteByAsync(emailAddress: receiver.EmailAddress, signature: receiver.Signature).ThenAsync( Success: Ok, Fail: IActionResult (msg, ntc) => { From c8a5a8627db849db69a81dac4b62ae348529dc3d Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Thu, 10 Apr 2025 16:42:20 +0200 Subject: [PATCH 34/76] Verbesserung der Dokumentation im ReceiverController MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Der ReceiverController wurde mit XML-Dokumentationskommentaren versehen, um seinen Zweck und seine Funktionalität zu verdeutlichen. Beibehaltung des Konstruktors mit Parametererklärungen. Verbesserung der Get-Methode für eine bessere Fehlerbehandlung und Protokollierung. Die Create-, Delete- und Update-Methoden wurden als deaktiviert markiert, während ihre Basisfunktionalität beibehalten wurde. Die #region REMOVED ENDPOINTS wurde aktualisiert, um unbenutzte Methoden zu berücksichtigen. Insgesamt verbessern diese Änderungen die Code-Dokumentation und erhalten die Kernfunktionalität. --- .../Controllers/ReceiverController.cs | 130 ++++++++---------- 1 file changed, 60 insertions(+), 70 deletions(-) diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/ReceiverController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/ReceiverController.cs index 653e6c4c..8da7ee87 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/ReceiverController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/ReceiverController.cs @@ -7,84 +7,74 @@ using EnvelopeGenerator.Domain.Entities; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace EnvelopeGenerator.GeneratorAPI.Controllers +namespace EnvelopeGenerator.GeneratorAPI.Controllers; + +/// +/// Controller für die Verwaltung von Empfängern. +/// +/// +/// Dieser Controller bietet Endpunkte für CRUD-Operationen (Erstellen, Lesen, Aktualisieren, Löschen) +/// sowie zusätzliche Funktionen wie das Abrufen von Empfängern basierend auf E-Mail-Adresse oder Signatur. +/// +[Route("api/[controller]")] +[ApiController] +[Authorize] +public class ReceiverController : CRUDControllerBaseWithErrorHandling { - [Route("api/[controller]")] - [ApiController] - [Authorize] - public class ReceiverController : CRUDControllerBaseWithErrorHandling + /// + /// Initialisiert eine neue Instanz des -Controllers. + /// + /// Der Logger für die Protokollierung. + /// Der Dienst für Empfängeroperationen. + public ReceiverController(ILogger logger, IReceiverService service) : base(logger, service) { - public ReceiverController(ILogger logger, IReceiverService service) : base(logger, service) - { - } - - [HttpGet] - public async Task Get([FromQuery] ReadReceiverQuery receiver) - { - if (receiver.EmailAddress is null && receiver.Signature is null) - return await base.GetAll(); + } - try - { - return await _service.ReadByAsync(emailAddress: receiver.EmailAddress, signature: receiver.Signature).ThenAsync( - Success: Ok, - Fail: IActionResult (msg, ntc) => - { - _logger.LogNotice(ntc); - return StatusCode(StatusCodes.Status500InternalServerError); - }); - } - catch(Exception ex) - { - _logger.LogError(ex, "{Message}", ex.Message); - return StatusCode(StatusCodes.Status500InternalServerError); - } - } + /// + /// Ruft eine Liste von Empfängern ab, basierend auf den angegebenen Abfrageparametern. + /// + /// Die Abfrageparameter, einschließlich E-Mail-Adresse und Signatur. + /// Eine Liste von Empfängern oder ein Fehlerstatus. + [HttpGet] + public async Task Get([FromQuery] ReadReceiverQuery receiver) + { + if (receiver.EmailAddress is null && receiver.Signature is null) + return await base.GetAll(); - [HttpPost] - public async override Task Create(ReceiverCreateDto createDto) + try { - if (!ModelState.IsValid) - return BadRequest(ModelState); - - return await base.Create(createDto); + return await _service.ReadByAsync(emailAddress: receiver.EmailAddress, signature: receiver.Signature).ThenAsync( + Success: Ok, + Fail: IActionResult (msg, ntc) => + { + _logger.LogNotice(ntc); + return StatusCode(StatusCodes.Status500InternalServerError); + }); } - - [HttpDelete] - public async Task Delete([FromQuery] ReadReceiverQuery receiver) + catch (Exception ex) { - if(receiver.Id is int id_int) - return await base.Delete(id_int); - - try - { - if (receiver.EmailAddress is not null || receiver.Signature is not null) - return await _service.DeleteByAsync(emailAddress: receiver.EmailAddress, signature: receiver.Signature).ThenAsync( - Success: Ok, - Fail: IActionResult (msg, ntc) => - { - _logger.LogNotice(ntc); - return StatusCode(StatusCodes.Status500InternalServerError); - }); - } - catch(Exception ex) - { - _logger.LogError(ex, "{Message}", ex.Message); - return StatusCode(500); - } - - return BadRequest(); + _logger.LogError(ex, "{Message}", ex.Message); + return StatusCode(StatusCodes.Status500InternalServerError); } + } - #region REMOVED ENDPOINTS - [NonAction] - public override Task GetAll() => base.GetAll(); + #region REMOVED ENDPOINTS + /// + /// Diese Methode ist deaktiviert und wird nicht verwendet. + /// + [NonAction] + public override Task GetAll() => base.GetAll(); - [NonAction] - public override Task Delete([FromRoute] int id) => base.Delete(id); + /// + /// Diese Methode ist deaktiviert und wird nicht verwendet. + /// + [NonAction] + public override Task Delete([FromRoute] int id) => base.Delete(id); - [NonAction] - public override Task Update(ReceiverUpdateDto updateDto) => base.Update(updateDto); - #endregion - } -} \ No newline at end of file + /// + /// Diese Methode ist deaktiviert und wird nicht verwendet. + /// + [NonAction] + public override Task Update(ReceiverUpdateDto updateDto) => base.Update(updateDto); + #endregion +} From b02ab585cba328d3dc177ee9e342bf4a4684e450 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Thu, 10 Apr 2025 16:45:17 +0200 Subject: [PATCH 35/76] =?UTF-8?q?Hinzuf=C3=BCgen=20der=20Methoden=20?= =?UTF-8?q?=E2=80=9ECreate=E2=80=9C=20und=20=E2=80=9EGetById=E2=80=9C=20zu?= =?UTF-8?q?=20ReceiverController?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Die Klasse `ReceiverController` wurde um zwei neue Methoden erweitert: `Create` und `GetById`. Beide Methoden sind mit dem Attribut `[NonAction]` gekennzeichnet und derzeit deaktiviert. Die Methode `Create` akzeptiert einen `ReceiverCreateDto`-Parameter, während die Methode `GetById` einen `int`-Parameter annimmt. Die bestehende Methode `Update` bleibt unverändert. Übersetzt mit DeepL.com (kostenlose Version) --- .../Controllers/ReceiverController.cs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/ReceiverController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/ReceiverController.cs index 8da7ee87..9920b5de 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/ReceiverController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/ReceiverController.cs @@ -76,5 +76,23 @@ public class ReceiverController : CRUDControllerBaseWithErrorHandling [NonAction] public override Task Update(ReceiverUpdateDto updateDto) => base.Update(updateDto); + + /// + /// Diese Methode ist deaktiviert und wird nicht verwendet. + /// + [NonAction] + public override Task Create(ReceiverCreateDto createDto) + { + return base.Create(createDto); + } + + /// + /// Diese Methode ist deaktiviert und wird nicht verwendet. + /// + [NonAction] + public override Task GetById([FromRoute] int id) + { + return base.GetById(id); + } #endregion } From 8a9d5f92f31a725109e8b17277e1f76ee648c787 Mon Sep 17 00:00:00 2001 From: Developer01 Date: Thu, 10 Apr 2025 17:46:33 +0200 Subject: [PATCH 36/76] MS Bodytext, Bugfixing deleting --- .../Entities/EmailData.vb | 18 +- .../Models/ReceiverModel.vb | 5 +- EnvelopeGenerator.Common/Models/UserModel.vb | 4 +- .../My Project/AssemblyInfo.vb | 4 +- .../EnvelopeGenerator.Form.vbproj | 18 ++ EnvelopeGenerator.Form/ModuleSettings.vb | 5 + EnvelopeGenerator.Form/frmEnvelopeEditor.vb | 26 +- .../frmGhostMode.Designer.vb | 125 ++++++++ .../frmGhostMode.en-US.resx | 165 +++++++++++ EnvelopeGenerator.Form/frmGhostMode.en.resx | 132 +++++++++ EnvelopeGenerator.Form/frmGhostMode.fr.resx | 132 +++++++++ EnvelopeGenerator.Form/frmGhostMode.resx | 266 ++++++++++++++++++ EnvelopeGenerator.Form/frmGhostMode.vb | 59 ++++ EnvelopeGenerator.Form/frmMain.Designer.vb | 20 +- EnvelopeGenerator.Form/frmMain.resx | 32 ++- EnvelopeGenerator.Form/frmMain.vb | 15 + .../frmSplashScreen.Designer.vb | 15 + EnvelopeGenerator.Form/frmSplashScreen.resx | 2 +- EnvelopeGenerator.Form/frmSplashScreen.vb | 50 ++-- 19 files changed, 1029 insertions(+), 64 deletions(-) create mode 100644 EnvelopeGenerator.Form/frmGhostMode.Designer.vb create mode 100644 EnvelopeGenerator.Form/frmGhostMode.en-US.resx create mode 100644 EnvelopeGenerator.Form/frmGhostMode.en.resx create mode 100644 EnvelopeGenerator.Form/frmGhostMode.fr.resx create mode 100644 EnvelopeGenerator.Form/frmGhostMode.resx create mode 100644 EnvelopeGenerator.Form/frmGhostMode.vb diff --git a/EnvelopeGenerator.Common/Entities/EmailData.vb b/EnvelopeGenerator.Common/Entities/EmailData.vb index 54f115a9..79afc476 100644 --- a/EnvelopeGenerator.Common/Entities/EmailData.vb +++ b/EnvelopeGenerator.Common/Entities/EmailData.vb @@ -31,7 +31,7 @@ Public Class EmailData EmailSubject = String.Empty EmailType = pStatus - Message = pEnvelope.Message + Message = TextToHtml(pEnvelope.Message) ReferenceID = pEnvelope.Id ReferenceString = pEnvelope.Uuid ReceiverName = pReceiver.Name @@ -40,6 +40,22 @@ Public Class EmailData SenderName = pEnvelope.User.FullName EnvelopeTitle = pEnvelope.Title End Sub + Public Function TextToHtml(input As String) As String + If String.IsNullOrEmpty(input) Then Return "" + + ' HTML-Encodierung der Sonderzeichen + Dim encoded As String = System.Net.WebUtility.HtmlEncode(input) + + ' Tabs in   umwandeln (z.B. 4 non-breaking spaces) + encoded = encoded.Replace(vbTab, "    ") + + ' Zeilenumbrüche in
umwandeln + encoded = encoded.Replace(vbCrLf, "
") ' Windows + encoded = encoded.Replace(vbCr, "
") ' Mac alt + encoded = encoded.Replace(vbLf, "
") ' Unix/Linux + + Return encoded + End Function ''' ''' Constructor for sending email to creator diff --git a/EnvelopeGenerator.Common/Models/ReceiverModel.vb b/EnvelopeGenerator.Common/Models/ReceiverModel.vb index d969c415..6630b3ef 100644 --- a/EnvelopeGenerator.Common/Models/ReceiverModel.vb +++ b/EnvelopeGenerator.Common/Models/ReceiverModel.vb @@ -57,7 +57,8 @@ Public Class ReceiverModel Public Function Insert(pReceiver As EnvelopeReceiver, pTransaction As SqlTransaction) As Boolean Try - Dim oCheck = $"SELECT COUNT(GUID) FROM [dbo].[TBSIG_RECEIVER] WHERE SIGNATURE = '{pReceiver.GetSignature()}'" + Dim oSignature As String = pReceiver.GetSignature() + Dim oCheck = $"SELECT COUNT(GUID) FROM [dbo].[TBSIG_RECEIVER] WHERE SIGNATURE = '{oSignature}'" Dim oExists = Database.GetScalarValue(oCheck) If oExists = 0 Then @@ -77,7 +78,7 @@ Public Class ReceiverModel Return False End If Else - Logger.Warn($"Receiver [{pReceiver.Email}] already existing! Check collecting not existing Receivers!") + Logger.Warn($"Receiver [{pReceiver.Email}] already existing! SignatureID: {oSignature} Check SQL {oCheck}") Return True End If Catch ex As Exception diff --git a/EnvelopeGenerator.Common/Models/UserModel.vb b/EnvelopeGenerator.Common/Models/UserModel.vb index 04f64995..99469b1e 100644 --- a/EnvelopeGenerator.Common/Models/UserModel.vb +++ b/EnvelopeGenerator.Common/Models/UserModel.vb @@ -70,9 +70,9 @@ Public Class UserModel End Try End Function - Public Function SelectUserId() As Integer + Public Function SelectUserId(oUserName As String) As Integer Try - Dim oUserId As Integer = Database.GetScalarValue($"SELECT GUID FROM TBDD_USER WHERE USERNAME = '{Environment.UserName}'") + Dim oUserId As Integer = Database.GetScalarValue($"SELECT GUID FROM TBDD_USER WHERE USERNAME = '{oUserName}'") Return oUserId Catch ex As Exception diff --git a/EnvelopeGenerator.Common/My Project/AssemblyInfo.vb b/EnvelopeGenerator.Common/My Project/AssemblyInfo.vb index cadf8f09..be0af8bd 100644 --- a/EnvelopeGenerator.Common/My Project/AssemblyInfo.vb +++ b/EnvelopeGenerator.Common/My Project/AssemblyInfo.vb @@ -31,5 +31,5 @@ Imports System.Runtime.InteropServices ' indem Sie "*" wie unten gezeigt eingeben: ' - - + + diff --git a/EnvelopeGenerator.Form/EnvelopeGenerator.Form.vbproj b/EnvelopeGenerator.Form/EnvelopeGenerator.Form.vbproj index 789eba38..d499ac6c 100644 --- a/EnvelopeGenerator.Form/EnvelopeGenerator.Form.vbproj +++ b/EnvelopeGenerator.Form/EnvelopeGenerator.Form.vbproj @@ -337,6 +337,12 @@ Form + + frmGhostMode.vb + + + Form + frmMain.vb @@ -397,6 +403,18 @@ frmFieldEditor.vb Designer + + frmGhostMode.vb + + + frmGhostMode.vb + + + frmGhostMode.vb + + + frmGhostMode.vb + frmMain.vb diff --git a/EnvelopeGenerator.Form/ModuleSettings.vb b/EnvelopeGenerator.Form/ModuleSettings.vb index 12a3caa6..fa1a810b 100644 --- a/EnvelopeGenerator.Form/ModuleSettings.vb +++ b/EnvelopeGenerator.Form/ModuleSettings.vb @@ -17,4 +17,9 @@ Module ModuleSettings Public SQL_REP_ENV_USER_Y As String = "" Public SQL_REP_ENV_USER_ALL As String = "" Public DT_CHARTS As DataTable + Public MyLogger As Logger + Public USER_GHOST_MODE_USRNAME As String = "" + Public USER_GHOST_MODE_ACTIVE As Boolean = False + Public MyUserModel As UserModel + Public MyState As State End Module diff --git a/EnvelopeGenerator.Form/frmEnvelopeEditor.vb b/EnvelopeGenerator.Form/frmEnvelopeEditor.vb index 9023d016..c0e90966 100644 --- a/EnvelopeGenerator.Form/frmEnvelopeEditor.vb +++ b/EnvelopeGenerator.Form/frmEnvelopeEditor.vb @@ -122,7 +122,7 @@ Partial Public Class frmEnvelopeEditor Catch ex As Exception MsgBox("File might already be open?", MsgBoxStyle.Exclamation) Me.Cursor = Cursors.Default - Exit Sub + Exit For End Try @@ -421,29 +421,7 @@ Partial Public Class frmEnvelopeEditor MsgBox(Resources.Envelope.Envelope_could_not_be_sent, MsgBoxStyle.Critical, Text) Else If MsgBox(Resources.Envelope.Envelope_Invitations_Sent, MsgBoxStyle.Information Or MsgBoxStyle.OkOnly, Text) = MsgBoxResult.Ok Then - 'If DOCUMENT_PATH_MOVE_AFTSEND <> String.Empty Then - ' If My.Settings.NetUse_PW <> String.Empty And My.Settings.NetUse_Usr <> String.Empty Then - ' Dim oDecrypted = Decryption.Decrypt(My.Settings.NetUse_PW) - ' For Each odoc In Controller.Envelope.Documents 'envelope ist leer! - ' Directory2Delete = "" - ' If CopyFileWithNetUse(odoc.Filepath, DOCUMENT_PATH_MOVE_AFTSEND, My.Settings.NetUse_Usr, My.Settings.NetUse_PW) = False Then - ' BarStaticItem1.Caption = "ERROR while copying files to DMZ! Check Your log!" - ' End If - ' If Directory2Delete <> String.Empty Then - ' Logger.Debug("Now Deleting SourcePath: {0} ...", Directory2Delete) - ' Try - ' System.IO.Directory.Delete(Directory2Delete, True) - ' Logger.Debug("Successfully deleted Sourcepath!") - ' Catch ex As Exception - ' Logger.Warn("Unexpected Error while deleting SourcePath {0}", Directory2Delete) - ' Logger.Warn("ErrorMessage: {0}", ex.Message) - ' End Try - - ' End If - ' Next - ' End If - - 'End If + Me.Close() End If End If diff --git a/EnvelopeGenerator.Form/frmGhostMode.Designer.vb b/EnvelopeGenerator.Form/frmGhostMode.Designer.vb new file mode 100644 index 00000000..50ad2c1b --- /dev/null +++ b/EnvelopeGenerator.Form/frmGhostMode.Designer.vb @@ -0,0 +1,125 @@ + +Partial Class frmGhostMode + Inherits System.Windows.Forms.Form + + 'Das Formular überschreibt den Löschvorgang, um die Komponentenliste zu bereinigen. + + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + Try + If disposing AndAlso components IsNot Nothing Then + components.Dispose() + End If + Finally + MyBase.Dispose(disposing) + End Try + End Sub + + 'Wird vom Windows Form-Designer benötigt. + Private components As System.ComponentModel.IContainer + + 'Hinweis: Die folgende Prozedur ist für den Windows Form-Designer erforderlich. + 'Das Bearbeiten ist mit dem Windows Form-Designer möglich. + 'Das Bearbeiten mit dem Code-Editor ist nicht möglich. + + Private Sub InitializeComponent() + Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(frmGhostMode)) + Me.RibbonControl1 = New DevExpress.XtraBars.Ribbon.RibbonControl() + Me.BarButtonItem1 = New DevExpress.XtraBars.BarButtonItem() + Me.RibbonPage1 = New DevExpress.XtraBars.Ribbon.RibbonPage() + Me.RibbonPageGroup1 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup() + Me.RibbonStatusBar1 = New DevExpress.XtraBars.Ribbon.RibbonStatusBar() + Me.GridControl1 = New DevExpress.XtraGrid.GridControl() + Me.GridView1 = New DevExpress.XtraGrid.Views.Grid.GridView() + CType(Me.RibbonControl1, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.GridControl1, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.GridView1, System.ComponentModel.ISupportInitialize).BeginInit() + Me.SuspendLayout() + ' + 'RibbonControl1 + ' + Me.RibbonControl1.ExpandCollapseItem.Id = 0 + Me.RibbonControl1.Items.AddRange(New DevExpress.XtraBars.BarItem() {Me.RibbonControl1.ExpandCollapseItem, Me.RibbonControl1.SearchEditItem, Me.BarButtonItem1}) + resources.ApplyResources(Me.RibbonControl1, "RibbonControl1") + Me.RibbonControl1.MaxItemId = 2 + Me.RibbonControl1.Name = "RibbonControl1" + Me.RibbonControl1.Pages.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPage() {Me.RibbonPage1}) + Me.RibbonControl1.ShowApplicationButton = DevExpress.Utils.DefaultBoolean.[False] + Me.RibbonControl1.StatusBar = Me.RibbonStatusBar1 + ' + 'BarButtonItem1 + ' + resources.ApplyResources(Me.BarButtonItem1, "BarButtonItem1") + Me.BarButtonItem1.Id = 1 + Me.BarButtonItem1.ImageOptions.SvgImage = CType(resources.GetObject("BarButtonItem1.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage) + Me.BarButtonItem1.Name = "BarButtonItem1" + ' + 'RibbonPage1 + ' + Me.RibbonPage1.Groups.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPageGroup() {Me.RibbonPageGroup1}) + Me.RibbonPage1.Name = "RibbonPage1" + resources.ApplyResources(Me.RibbonPage1, "RibbonPage1") + ' + 'RibbonPageGroup1 + ' + Me.RibbonPageGroup1.ItemLinks.Add(Me.BarButtonItem1) + Me.RibbonPageGroup1.Name = "RibbonPageGroup1" + resources.ApplyResources(Me.RibbonPageGroup1, "RibbonPageGroup1") + ' + 'RibbonStatusBar1 + ' + resources.ApplyResources(Me.RibbonStatusBar1, "RibbonStatusBar1") + Me.RibbonStatusBar1.Name = "RibbonStatusBar1" + Me.RibbonStatusBar1.Ribbon = Me.RibbonControl1 + ' + 'GridControl1 + ' + resources.ApplyResources(Me.GridControl1, "GridControl1") + Me.GridControl1.MainView = Me.GridView1 + Me.GridControl1.Name = "GridControl1" + Me.GridControl1.ViewCollection.AddRange(New DevExpress.XtraGrid.Views.Base.BaseView() {Me.GridView1}) + ' + 'GridView1 + ' + Me.GridView1.Appearance.EvenRow.BackColor = System.Drawing.Color.LightBlue + Me.GridView1.Appearance.EvenRow.Options.UseBackColor = True + Me.GridView1.GridControl = Me.GridControl1 + Me.GridView1.Name = "GridView1" + Me.GridView1.OptionsBehavior.AllowAddRows = DevExpress.Utils.DefaultBoolean.[False] + Me.GridView1.OptionsBehavior.AllowDeleteRows = DevExpress.Utils.DefaultBoolean.[False] + Me.GridView1.OptionsBehavior.AllowFixedGroups = DevExpress.Utils.DefaultBoolean.[True] + Me.GridView1.OptionsBehavior.AllowGroupExpandAnimation = DevExpress.Utils.DefaultBoolean.[True] + Me.GridView1.OptionsBehavior.Editable = False + Me.GridView1.OptionsClipboard.CopyColumnHeaders = DevExpress.Utils.DefaultBoolean.[False] + Me.GridView1.OptionsView.ColumnAutoWidth = False + Me.GridView1.OptionsView.EnableAppearanceEvenRow = True + Me.GridView1.OptionsView.ShowAutoFilterRow = True + Me.GridView1.OptionsView.ShowErrorPanel = DevExpress.Utils.DefaultBoolean.[True] + Me.GridView1.OptionsView.ShowViewCaption = True + resources.ApplyResources(Me.GridView1, "GridView1") + ' + 'frmGhostMode + ' + resources.ApplyResources(Me, "$this") + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.Controls.Add(Me.GridControl1) + Me.Controls.Add(Me.RibbonStatusBar1) + Me.Controls.Add(Me.RibbonControl1) + Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow + Me.Name = "frmGhostMode" + Me.TopMost = True + CType(Me.RibbonControl1, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.GridControl1, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.GridView1, System.ComponentModel.ISupportInitialize).EndInit() + Me.ResumeLayout(False) + Me.PerformLayout() + + End Sub + + Friend WithEvents RibbonControl1 As DevExpress.XtraBars.Ribbon.RibbonControl + Friend WithEvents RibbonPage1 As DevExpress.XtraBars.Ribbon.RibbonPage + Friend WithEvents RibbonPageGroup1 As DevExpress.XtraBars.Ribbon.RibbonPageGroup + Friend WithEvents RibbonStatusBar1 As DevExpress.XtraBars.Ribbon.RibbonStatusBar + Friend WithEvents BarButtonItem1 As DevExpress.XtraBars.BarButtonItem + Friend WithEvents GridControl1 As DevExpress.XtraGrid.GridControl + Friend WithEvents GridView1 As DevExpress.XtraGrid.Views.Grid.GridView +End Class diff --git a/EnvelopeGenerator.Form/frmGhostMode.en-US.resx b/EnvelopeGenerator.Form/frmGhostMode.en-US.resx new file mode 100644 index 00000000..08655b78 --- /dev/null +++ b/EnvelopeGenerator.Form/frmGhostMode.en-US.resx @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Activate ghost mode + + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIxLjIsIFZlcnNpb249MjEuMi40 + LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl + dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAAIEAAAC77u/ + PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi + IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv + MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh + Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg + MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsdWV7ZmlsbDojMTE3N0Q3O30KCS5Z + ZWxsb3d7ZmlsbDojRkZCMTE1O30KCS5SZWR7ZmlsbDojRDExQzFDO30KCS5HcmVlbntmaWxsOiMwMzlD + MjM7fQoJLkJsYWNre2ZpbGw6IzcyNzI3Mjt9CgkuV2hpdGV7ZmlsbDojRkZGRkZGO30KCS5zdDB7b3Bh + Y2l0eTowLjU7fQoJLnN0MXtvcGFjaXR5OjAuNzU7fQoJLnN0MntkaXNwbGF5Om5vbmU7fQoJLnN0M3tk + aXNwbGF5OmlubGluZTtmaWxsOiNGRkIxMTU7fQoJLnN0NHtkaXNwbGF5OmlubGluZTt9Cgkuc3Q1e2Rp + c3BsYXk6aW5saW5lO29wYWNpdHk6MC43NTt9Cgkuc3Q2e2Rpc3BsYXk6aW5saW5lO29wYWNpdHk6MC41 + O30KCS5zdDd7ZGlzcGxheTppbmxpbmU7ZmlsbDojMDM5QzIzO30KCS5zdDh7ZGlzcGxheTppbmxpbmU7 + ZmlsbDojRDExQzFDO30KCS5zdDl7ZGlzcGxheTppbmxpbmU7ZmlsbDojMTE3N0Q3O30KCS5zdDEwe2Rp + c3BsYXk6aW5saW5lO2ZpbGw6I0ZGRkZGRjt9Cjwvc3R5bGU+DQogIDxnIGlkPSJSb2xlIj4NCiAgICA8 + cGF0aCBkPSJNNCwydjE2YzAsNi42LDUuNCwxMiwxMiwxMnMxMi01LjQsMTItMTJWMkg0eiBNMTEsOWMx + LjcsMCwzLDEuMywzLDNIOEM4LDEwLjMsOS4zLDksMTEsOXogTTE2LDI0ICAgYy0zLjMsMC02LTIuNy02 + LTZjMCwxLjEsMi43LDIsNiwyczYtMC45LDYtMkMyMiwyMS4zLDE5LjMsMjQsMTYsMjR6IE0xOCwxMmMw + LTEuNywxLjMtMywzLTNzMywxLjMsMywzSDE4eiIgY2xhc3M9IlllbGxvdyIgLz4NCiAgPC9nPg0KPC9z + dmc+Cw== + + + + Actions + + + + 965, 146 + + + 0, 146 + + + Please choose a ghost user + + + 965, 341 + + \ No newline at end of file diff --git a/EnvelopeGenerator.Form/frmGhostMode.en.resx b/EnvelopeGenerator.Form/frmGhostMode.en.resx new file mode 100644 index 00000000..dfaf29a7 --- /dev/null +++ b/EnvelopeGenerator.Form/frmGhostMode.en.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Actions + + + Please select a ghost user + + + Activate ghost mode + + + Start + + \ No newline at end of file diff --git a/EnvelopeGenerator.Form/frmGhostMode.fr.resx b/EnvelopeGenerator.Form/frmGhostMode.fr.resx new file mode 100644 index 00000000..bcbe5cd4 --- /dev/null +++ b/EnvelopeGenerator.Form/frmGhostMode.fr.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Actions + + + Veuillez sélectionner un utilisateur fantôme + + + Activer le Mode Fantôme + + + Démarrer + + \ No newline at end of file diff --git a/EnvelopeGenerator.Form/frmGhostMode.resx b/EnvelopeGenerator.Form/frmGhostMode.resx new file mode 100644 index 00000000..86b5d401 --- /dev/null +++ b/EnvelopeGenerator.Form/frmGhostMode.resx @@ -0,0 +1,266 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Ghost Modus aktivieren + + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIxLjIsIFZlcnNpb249MjEuMi40 + LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl + dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAAIEAAAC77u/ + PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi + IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv + MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh + Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg + MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsdWV7ZmlsbDojMTE3N0Q3O30KCS5Z + ZWxsb3d7ZmlsbDojRkZCMTE1O30KCS5SZWR7ZmlsbDojRDExQzFDO30KCS5HcmVlbntmaWxsOiMwMzlD + MjM7fQoJLkJsYWNre2ZpbGw6IzcyNzI3Mjt9CgkuV2hpdGV7ZmlsbDojRkZGRkZGO30KCS5zdDB7b3Bh + Y2l0eTowLjU7fQoJLnN0MXtvcGFjaXR5OjAuNzU7fQoJLnN0MntkaXNwbGF5Om5vbmU7fQoJLnN0M3tk + aXNwbGF5OmlubGluZTtmaWxsOiNGRkIxMTU7fQoJLnN0NHtkaXNwbGF5OmlubGluZTt9Cgkuc3Q1e2Rp + c3BsYXk6aW5saW5lO29wYWNpdHk6MC43NTt9Cgkuc3Q2e2Rpc3BsYXk6aW5saW5lO29wYWNpdHk6MC41 + O30KCS5zdDd7ZGlzcGxheTppbmxpbmU7ZmlsbDojMDM5QzIzO30KCS5zdDh7ZGlzcGxheTppbmxpbmU7 + ZmlsbDojRDExQzFDO30KCS5zdDl7ZGlzcGxheTppbmxpbmU7ZmlsbDojMTE3N0Q3O30KCS5zdDEwe2Rp + c3BsYXk6aW5saW5lO2ZpbGw6I0ZGRkZGRjt9Cjwvc3R5bGU+DQogIDxnIGlkPSJSb2xlIj4NCiAgICA8 + cGF0aCBkPSJNNCwydjE2YzAsNi42LDUuNCwxMiwxMiwxMnMxMi01LjQsMTItMTJWMkg0eiBNMTEsOWMx + LjcsMCwzLDEuMywzLDNIOEM4LDEwLjMsOS4zLDksMTEsOXogTTE2LDI0ICAgYy0zLjMsMC02LTIuNy02 + LTZjMCwxLjEsMi43LDIsNiwyczYtMC45LDYtMkMyMiwyMS4zLDE5LjMsMjQsMTYsMjR6IE0xOCwxMmMw + LTEuNywxLjMtMywzLTNzMywxLjMsMywzSDE4eiIgY2xhc3M9IlllbGxvdyIgLz4NCiAgPC9nPg0KPC9z + dmc+Cw== + + + + + 0, 0 + + + Aktionen + + + Start + + + 965, 146 + + + 0, 487 + + + 965, 22 + + + RibbonStatusBar1 + + + DevExpress.XtraBars.Ribbon.RibbonStatusBar, DevExpress.XtraBars.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a + + + $this + + + 1 + + + RibbonControl1 + + + DevExpress.XtraBars.Ribbon.RibbonControl, DevExpress.XtraBars.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a + + + $this + + + 2 + + + + Fill + + + 0, 146 + + + Bitte wählen Sie einen Ghost User + + + 965, 341 + + + + 9 + + + GridControl1 + + + DevExpress.XtraGrid.GridControl, DevExpress.XtraGrid.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a + + + $this + + + 0 + + + True + + + 6, 13 + + + 965, 509 + + + Calibri, 8.25pt + + + CenterParent + + + BarButtonItem1 + + + DevExpress.XtraBars.BarButtonItem, DevExpress.XtraBars.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a + + + RibbonPage1 + + + DevExpress.XtraBars.Ribbon.RibbonPage, DevExpress.XtraBars.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a + + + RibbonPageGroup1 + + + DevExpress.XtraBars.Ribbon.RibbonPageGroup, DevExpress.XtraBars.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a + + + GridView1 + + + DevExpress.XtraGrid.Views.Grid.GridView, DevExpress.XtraGrid.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a + + + frmGhostMode + + + System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/EnvelopeGenerator.Form/frmGhostMode.vb b/EnvelopeGenerator.Form/frmGhostMode.vb new file mode 100644 index 00000000..04bcb107 --- /dev/null +++ b/EnvelopeGenerator.Form/frmGhostMode.vb @@ -0,0 +1,59 @@ +Public Class frmGhostMode + Private Sub frmGhostMode_Load(sender As Object, e As EventArgs) Handles Me.Load + Dim oSQL = "SELECT T.USERNAME,T.NAME, T.[PRENAME],T.EMAIL FROM TBDD_USER T ORDER BY USERNAME" + Dim DT_USER = DB_DD_ECM.GetDatatable(oSQL) + + Try + If Not IsNothing(DT_USER) Then + GridControl1.DataSource = DT_USER + MyLogger.Info($"Received [{DT_USER.Rows.Count}] Ghost-Users to select!") + End If + + + Catch ex As Exception + MsgBox("Error Load_Users:" & vbNewLine & ex.Message) + End Try + End Sub + + Private Sub BarButtonItem1_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItem1.ItemClick + + Set_GhostUser() + End Sub + + Private Sub GridView1_DoubleClick(sender As Object, e As EventArgs) Handles GridView1.DoubleClick + Set_GhostUser() + End Sub + + Sub Set_GhostUser() + Dim oFocusedUserName + Try + oFocusedUserName = GridView1.GetFocusedRowCellValue(GridView1.Columns("UserName")) + If IsNothing(oFocusedUserName) Then + oFocusedUserName = GridView1.GetFocusedRowCellValue(GridView1.Columns("USERNAME")) + End If + If IsNothing(oFocusedUserName) Then + oFocusedUserName = GridView1.GetFocusedRowCellValue(GridView1.Columns("USER_NAME")) + End If + If IsNothing(oFocusedUserName) Then + oFocusedUserName = GridView1.GetFocusedRowCellValue(GridView1.Columns("USER")) + End If + Catch ex As Exception + oFocusedUserName = GridView1.GetFocusedRowCellValue(GridView1.Columns("UserName")) + If IsNothing(oFocusedUserName) Then + MsgBox(ex.Message, MsgBoxStyle.Critical) + Exit Sub + End If + End Try + If oFocusedUserName <> String.Empty Then + Dim result As MsgBoxResult = MsgBox("Do You really want to activate the Ghost-Mode?", MsgBoxStyle.YesNo, "") + 'wenn Speichern ja + If result = MsgBoxResult.Yes Then + USER_GHOST_MODE_USRNAME = oFocusedUserName + USER_GHOST_MODE_ACTIVE = True + Me.Close() + End If + Else + MsgBox("Please choose an user for ghostmode!", MsgBoxStyle.Information) + End If + End Sub +End Class \ No newline at end of file diff --git a/EnvelopeGenerator.Form/frmMain.Designer.vb b/EnvelopeGenerator.Form/frmMain.Designer.vb index 7d92b57f..e5262c8c 100644 --- a/EnvelopeGenerator.Form/frmMain.Designer.vb +++ b/EnvelopeGenerator.Form/frmMain.Designer.vb @@ -102,6 +102,7 @@ Partial Class frmMain Me.RefreshTimer = New System.Windows.Forms.Timer(Me.components) Me.SaveFileDialog1 = New System.Windows.Forms.SaveFileDialog() Me.XtraSaveFileDialog1 = New DevExpress.XtraEditors.XtraSaveFileDialog(Me.components) + Me.BarStaticItemGhost = New DevExpress.XtraBars.BarStaticItem() CType(Me.SplitContainerControl1, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.SplitContainerControl1.Panel1, System.ComponentModel.ISupportInitialize).BeginInit() Me.SplitContainerControl1.Panel1.SuspendLayout() @@ -321,9 +322,9 @@ Partial Class frmMain Me.RibbonControl.ExpandCollapseItem.Id = 0 Me.RibbonControl.ExpandCollapseItem.ImageOptions.ImageIndex = CType(resources.GetObject("RibbonControl.ExpandCollapseItem.ImageOptions.ImageIndex"), Integer) Me.RibbonControl.ExpandCollapseItem.ImageOptions.LargeImageIndex = CType(resources.GetObject("RibbonControl.ExpandCollapseItem.ImageOptions.LargeImageIndex"), Integer) - Me.RibbonControl.Items.AddRange(New DevExpress.XtraBars.BarItem() {Me.RibbonControl.ExpandCollapseItem, Me.RibbonControl.SearchEditItem, Me.btnCreateEnvelope, Me.btnEditEnvelope, Me.btnDeleteEnvelope, Me.BarButtonItem1, Me.txtRefreshLabel, Me.btnShowDocument, Me.btnContactReceiver, Me.txtEnvelopeIdLabel, Me.btnOpenLogDirectory, Me.BarCheckItem1, Me.bsitmInfo, Me.bbtnitmEB, Me.bbtnitmInfoMail, Me.BarButtonItem2, Me.BarButtonItem3, Me.BarButtonItem4}) + Me.RibbonControl.Items.AddRange(New DevExpress.XtraBars.BarItem() {Me.RibbonControl.ExpandCollapseItem, Me.RibbonControl.SearchEditItem, Me.btnCreateEnvelope, Me.btnEditEnvelope, Me.btnDeleteEnvelope, Me.BarButtonItem1, Me.txtRefreshLabel, Me.btnShowDocument, Me.btnContactReceiver, Me.txtEnvelopeIdLabel, Me.btnOpenLogDirectory, Me.BarCheckItem1, Me.bsitmInfo, Me.bbtnitmEB, Me.bbtnitmInfoMail, Me.BarButtonItem2, Me.BarButtonItem3, Me.BarButtonItem4, Me.BarStaticItemGhost}) resources.ApplyResources(Me.RibbonControl, "RibbonControl") - Me.RibbonControl.MaxItemId = 19 + Me.RibbonControl.MaxItemId = 20 Me.RibbonControl.Name = "RibbonControl" Me.RibbonControl.Pages.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPage() {Me.RibbonPage1, Me.RibbonPage2}) Me.RibbonControl.ShowApplicationButton = DevExpress.Utils.DefaultBoolean.[False] @@ -515,6 +516,7 @@ Partial Class frmMain ' 'RibbonStatusBar ' + Me.RibbonStatusBar.ItemLinks.Add(Me.BarStaticItemGhost) Me.RibbonStatusBar.ItemLinks.Add(Me.txtRefreshLabel) Me.RibbonStatusBar.ItemLinks.Add(Me.txtEnvelopeIdLabel) Me.RibbonStatusBar.ItemLinks.Add(Me.bsitmInfo) @@ -753,6 +755,19 @@ Partial Class frmMain ' Me.XtraSaveFileDialog1.FileName = "XtraSaveFileDialog1" ' + 'BarStaticItemGhost + ' + resources.ApplyResources(Me.BarStaticItemGhost, "BarStaticItemGhost") + Me.BarStaticItemGhost.Id = 19 + Me.BarStaticItemGhost.ItemAppearance.Normal.BackColor = System.Drawing.Color.Yellow + Me.BarStaticItemGhost.ItemAppearance.Normal.Font = CType(resources.GetObject("BarStaticItemGhost.ItemAppearance.Normal.Font"), System.Drawing.Font) + Me.BarStaticItemGhost.ItemAppearance.Normal.ForeColor = System.Drawing.Color.Black + Me.BarStaticItemGhost.ItemAppearance.Normal.Options.UseBackColor = True + Me.BarStaticItemGhost.ItemAppearance.Normal.Options.UseFont = True + Me.BarStaticItemGhost.ItemAppearance.Normal.Options.UseForeColor = True + Me.BarStaticItemGhost.Name = "BarStaticItemGhost" + Me.BarStaticItemGhost.Visibility = DevExpress.XtraBars.BarItemVisibility.Never + ' 'frmMain ' resources.ApplyResources(Me, "$this") @@ -878,4 +893,5 @@ Partial Class frmMain Friend WithEvents XtraSaveFileDialog1 As DevExpress.XtraEditors.XtraSaveFileDialog Friend WithEvents RibbonPageGroupFunctions As DevExpress.XtraBars.Ribbon.RibbonPageGroup Friend WithEvents BarButtonItem4 As DevExpress.XtraBars.BarButtonItem + Friend WithEvents BarStaticItemGhost As DevExpress.XtraBars.BarStaticItem End Class diff --git a/EnvelopeGenerator.Form/frmMain.resx b/EnvelopeGenerator.Form/frmMain.resx index c83fef0d..8d2b9ef6 100644 --- a/EnvelopeGenerator.Form/frmMain.resx +++ b/EnvelopeGenerator.Form/frmMain.resx @@ -123,7 +123,7 @@ - 0, 160 + 0, 158 Fill @@ -850,6 +850,12 @@ R3JlZW4iIC8+DQogIDwvZz4NCjwvc3ZnPgs= + + GhostMode active + + + Tahoma, 8.25pt, style=Bold + 0, 0 @@ -872,7 +878,7 @@ Einstellungen - 1090, 160 + 1090, 158 0, 660 @@ -905,7 +911,7 @@ 2 - 1088, 467 + 1088, 469 2 @@ -923,7 +929,7 @@ 0 - 1088, 467 + 1088, 469 Offene Umschläge @@ -941,7 +947,7 @@ 0 - 1090, 490 + 1090, 492 3 @@ -1202,7 +1208,7 @@ 17, 37 - 131, 13 + 120, 13 0 @@ -1451,7 +1457,7 @@ 1 - 1090, 500 + 1090, 502 5 @@ -1469,16 +1475,16 @@ 0 - 17, 54 + 193, 17 - 17, 91 + 316, 17 PDF Files|*.pdf - 17, 128 + 452, 17 True @@ -1927,6 +1933,12 @@ DevExpress.XtraEditors.XtraSaveFileDialog, DevExpress.XtraDialogs.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a + + BarStaticItemGhost + + + DevExpress.XtraBars.BarStaticItem, DevExpress.XtraBars.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a + frmMain diff --git a/EnvelopeGenerator.Form/frmMain.vb b/EnvelopeGenerator.Form/frmMain.vb index 31b22f28..5e3cf9cf 100644 --- a/EnvelopeGenerator.Form/frmMain.vb +++ b/EnvelopeGenerator.Form/frmMain.vb @@ -512,6 +512,21 @@ Public Class frmMain End If bbtnitmEB.Enabled = False RefreshTimer.Start() + If USER_GHOST_MODE_ACTIVE Then + frmGhostMode.ShowDialog() + If USER_GHOST_MODE_USRNAME <> "" Then + MyUserModel = New UserModel(MyState) + MyState.UserId = MyUserModel.SelectUserId(USER_GHOST_MODE_USRNAME) + Dim oUser = MyUserModel.SelectUser() + If oUser IsNot Nothing Then + MyUserModel.CheckUserLogin(oUser) + BarStaticItemGhost.Caption = $"GhostMode active: {USER_GHOST_MODE_USRNAME} - End signFLOW to quit mode" + BarStaticItemGhost.Visibility = DevExpress.XtraBars.BarItemVisibility.Always + LoadEnvelopeData() + End If + MYUSER = oUser + End If + End If End Sub Private Sub bbtnitmInfoMail_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles bbtnitmInfoMail.ItemClick diff --git a/EnvelopeGenerator.Form/frmSplashScreen.Designer.vb b/EnvelopeGenerator.Form/frmSplashScreen.Designer.vb index 21d62435..bee7ff51 100644 --- a/EnvelopeGenerator.Form/frmSplashScreen.Designer.vb +++ b/EnvelopeGenerator.Form/frmSplashScreen.Designer.vb @@ -28,6 +28,7 @@ Partial Class frmSplashScreen Me.lblVersion = New System.Windows.Forms.Label() Me.pbStatus = New System.Windows.Forms.ProgressBar() Me.lblStatus = New System.Windows.Forms.Label() + Me.lblGhostMode = New DevExpress.XtraEditors.LabelControl() CType(Me.PictureEdit1.Properties, System.ComponentModel.ISupportInitialize).BeginInit() Me.SuspendLayout() ' @@ -88,17 +89,30 @@ Partial Class frmSplashScreen Me.lblStatus.Text = "{Status}" Me.lblStatus.TextAlign = System.Drawing.ContentAlignment.MiddleCenter ' + 'lblGhostMode + ' + Me.lblGhostMode.Appearance.BackColor = System.Drawing.Color.Yellow + Me.lblGhostMode.Appearance.Options.UseBackColor = True + Me.lblGhostMode.Location = New System.Drawing.Point(654, 243) + Me.lblGhostMode.Name = "lblGhostMode" + Me.lblGhostMode.Size = New System.Drawing.Size(92, 13) + Me.lblGhostMode.TabIndex = 10 + Me.lblGhostMode.Text = "GhostModus active" + Me.lblGhostMode.Visible = False + ' 'frmSplashScreen ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font Me.ClientSize = New System.Drawing.Size(800, 303) + Me.Controls.Add(Me.lblGhostMode) Me.Controls.Add(Me.lblCopyright) Me.Controls.Add(Me.lblVersion) Me.Controls.Add(Me.lblStatus) Me.Controls.Add(Me.pbStatus) Me.Controls.Add(Me.PictureEdit1) Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None + Me.KeyPreview = True Me.Name = "frmSplashScreen" Me.ShowIcon = False Me.ShowInTaskbar = False @@ -115,4 +129,5 @@ Partial Class frmSplashScreen Friend WithEvents lblVersion As Label Friend WithEvents pbStatus As ProgressBar Friend WithEvents lblStatus As Label + Friend WithEvents lblGhostMode As DevExpress.XtraEditors.LabelControl End Class diff --git a/EnvelopeGenerator.Form/frmSplashScreen.resx b/EnvelopeGenerator.Form/frmSplashScreen.resx index 8487129c..3b8d22e1 100644 --- a/EnvelopeGenerator.Form/frmSplashScreen.resx +++ b/EnvelopeGenerator.Form/frmSplashScreen.resx @@ -121,7 +121,7 @@ iVBORw0KGgoAAAANSUhEUgAAAyAAAADICAYAAAAQj4UaAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL - DwAACw8BkvkDpQAASudJREFUeF7tvWusZNd5nukfcpSOmmre3Wp2s3lrdpNUk01RPxIk6iBBIjFxMBPZ + DQAACw0B7QfALAAASudJREFUeF7tvWusZNd5nukfcpSOmmre3Wp2s3lrdpNUk01RPxIk6iBBIjFxMBPZ DGxLEyB2M8ggkegAsSRElikHEsnBJFZrRjZtxZIpZaIZRy2AloGxrAHIRKIQRIqVGJ6AsJEAAwgDOzNJ HCBSLsqfynmq+HV9tepd+1KnLnufen88OKf2rfa67HPed3/rW+t7PnffoxNjjDHGGLNb/n4L/9t9l6b8 vXsX+ewBn1ngkSkvCH79hy9NXr5yafKbz1yavHr10uRfv/jo5Pe//Ohk8uoMfmcb+ziGYznnc4/q663C diff --git a/EnvelopeGenerator.Form/frmSplashScreen.vb b/EnvelopeGenerator.Form/frmSplashScreen.vb index fd957a63..e8545a40 100644 --- a/EnvelopeGenerator.Form/frmSplashScreen.vb +++ b/EnvelopeGenerator.Form/frmSplashScreen.vb @@ -25,7 +25,7 @@ Public Class frmSplashScreen Dim oLogPath = IO.Path.Combine(Application.LocalUserAppDataPath, "Log") CurrLogConfig = New LogConfig(LogConfig.PathType.CustomPath, oLogPath, CompanyName:="Digital Data", ProductName:="Envelope Generator") Logger = CurrLogConfig.GetLogger() - + MyLogger = Logger Try ConfigManager = New ConfigManager(Of Config)(CurrLogConfig, Application.UserAppDataPath, Application.CommonAppDataPath, Application.StartupPath) @@ -60,25 +60,25 @@ Public Class frmSplashScreen End Sub Private Sub Worker_DoWork(sender As Object, e As DoWorkEventArgs) Handles Worker.DoWork - Dim oState As State = DirectCast(e.Argument, State) + MyState = DirectCast(e.Argument, State) Worker.ReportProgress(20, "Initializing Database") Thread.Sleep(300) - Dim oConnectionString = MSSQLServer.DecryptConnectionString(oState.Config.ConnectionString) - oState.Database = New MSSQLServer(oState.LogConfig, oConnectionString) + Dim oConnectionString = MSSQLServer.DecryptConnectionString(MyState.Config.ConnectionString) + MyState.Database = New MSSQLServer(MyState.LogConfig, oConnectionString) - If oState.Database?.DBInitialized = False Then + If MyState.Database?.DBInitialized = False Then Throw New ApplicationException("Could not connect to the database. Application will close!") Else - DB_DD_ECM = oState.Database + DB_DD_ECM = MyState.Database End If Worker.ReportProgress(40, "Initializing Configuration") Thread.Sleep(300) Dim oSQl = "SELECT * FROM TBDD_SQL_COMMANDS" - Dim oDT = oState.Database.GetDatatable(oSQl) + Dim oDT = MyState.Database.GetDatatable(oSQl) For Each oROW As DataRow In oDT.Rows If oROW.Item("TITLE") = "REPORT ENV USER THIS_MONTH" Then SQL_REP_ENV_USER_TM = oROW.Item("SQL_COMMAND") @@ -92,39 +92,39 @@ Public Class frmSplashScreen Next oSQl = "SELECT * FROM TBSIG_CHART" - DT_CHARTS = oState.Database.GetDatatable(oSQl) + DT_CHARTS = MyState.Database.GetDatatable(oSQl) - Dim ConfigModel = New ConfigModel(oState) - oState.DbConfig = ConfigModel.LoadConfiguration() - DEF_TF_ENABLED = oState.DbConfig.Default_TFA_Enabled - DEF_TF_ENABLED_WITH_PHONE = oState.DbConfig.Default_TFA_WithPhone + Dim ConfigModel = New ConfigModel(MyState) + MyState.DbConfig = ConfigModel.LoadConfiguration() + DEF_TF_ENABLED = MyState.DbConfig.Default_TFA_Enabled + DEF_TF_ENABLED_WITH_PHONE = MyState.DbConfig.Default_TFA_WithPhone ' DOCUMENT_PATH_MOVE_AFTSEND = oState.DbConfig.DOCUMENT_PATH_MOVE_AFTSEND Worker.ReportProgress(60, "Initializing User") - Dim oKey = oState.Database.GetScalarValue("SELECT LICENSE FROM TBDD_3RD_PARTY_MODULES WHERE NAME = 'GDPICTURE' and ACTIVE = 1") - Thread.Sleep(300) + Dim oKey = MyState.Database.GetScalarValue("SELECT LICENSE FROM TBDD_3RD_PARTY_MODULES WHERE NAME = 'GDPICTURE' and ACTIVE = 1") + Thread.Sleep(300) If oKey.ToString <> String.Empty Then MS_GDPICTUREKEY = oKey End If - Dim oUserModel = New UserModel(oState) - oState.UserId = oUserModel.SelectUserId() + MyUserModel = New UserModel(MyState) + MyState.UserId = MyUserModel.SelectUserId(Environment.UserName) - Dim oUser = oUserModel.SelectUser() + Dim oUser = MyUserModel.SelectUser() Worker.ReportProgress(80, "Initializing Rights") Thread.Sleep(300) ' This checks for module access and admin rights If oUser IsNot Nothing Then - oUserModel.CheckUserLogin(oUser) + MyUserModel.CheckUserLogin(oUser) End If MYUSER = oUser Worker.ReportProgress(100, "Starting Application") Thread.Sleep(300) - oState.User = oUser + MyState.User = oUser - e.Result = oState + e.Result = MyState End Sub Private Sub Worker_ProgressChanged(sender As Object, e As ProgressChangedEventArgs) Handles Worker.ProgressChanged @@ -174,4 +174,14 @@ Public Class frmSplashScreen End Try End Sub + Private Sub frmSplashScreen_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown + If Not IsNothing(MYUSER) Then + If MYUSER.IsAdmin Then + If e.KeyCode = Keys.Escape Then + USER_GHOST_MODE_ACTIVE = True + lblGhostMode.Visible = True + End If + End If + End If + End Sub End Class \ No newline at end of file From 049827a1332602dee99c9f9af1b0581903330eaa Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Thu, 10 Apr 2025 18:03:38 +0200 Subject: [PATCH 37/76] =?UTF-8?q?refactor:=20Deutsche=20Dokumentation=20f?= =?UTF-8?q?=C3=BCr=20Umschlagbefehlsdatens=C3=A4tze=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit XML-Dokumentationskommentare für `CreateEnvelopeCommand`, `ReceiverGetOrCreateDto` und `DocumentCreateDto` auf Deutsch aktualisiert. Die bestehende englische Dokumentation wurde entfernt, um eine einheitliche Sprache in der Codebasis zu gewährleisten. --- .../Commands/Create/CreateEnvelopeCommand.cs | 68 ++++++++----------- 1 file changed, 28 insertions(+), 40 deletions(-) diff --git a/EnvelopeGenerator.Application/EnvelopeReceivers/Commands/Create/CreateEnvelopeCommand.cs b/EnvelopeGenerator.Application/EnvelopeReceivers/Commands/Create/CreateEnvelopeCommand.cs index 5f726bca..12efa25b 100644 --- a/EnvelopeGenerator.Application/EnvelopeReceivers/Commands/Create/CreateEnvelopeCommand.cs +++ b/EnvelopeGenerator.Application/EnvelopeReceivers/Commands/Create/CreateEnvelopeCommand.cs @@ -3,6 +3,30 @@ using System.ComponentModel.DataAnnotations; namespace EnvelopeGenerator.Application.EnvelopeReceivers.Commands.Create; +/// +/// Befehl zur Erstellung eines Umschlags. +/// +/// Der Titel des Umschlags. Dies ist ein Pflichtfeld. +/// Die Nachricht, die im Umschlag enthalten sein soll. Dies ist ein Pflichtfeld. +/// Das mit dem Umschlag verknüpfte Dokument. Dies ist ein Pflichtfeld. +/// Eine Sammlung von Empfängern, die den Umschlag erhalten. Dies ist ein Pflichtfeld. +/// Die Sprache des Umschlags. Standardmäßig "de-DE", wenn nicht angegeben. +/// Das Ablaufdatum des Umschlags. Optional. +/// Das Datum, an dem vor dem Ablauf eine Warnung ausgegeben werden soll. Optional. +/// Der Vertragstyp, der mit dem Umschlag verknüpft ist. Standardmäßig der Typ "Contract". +/// Gibt an, ob die Zwei-Faktor-Authentifizierung für den Umschlag aktiviert ist. Standardmäßig false. +public record CreateEnvelopeCommand( + [Required] string Title, + [Required] string Message, + [Required] DocumentCreateDto Document, + [Required] IEnumerable Receivers, + string Language = "de-DE", + DateTime? ExpiresWhen = null, + DateTime? ExpiresWarningWhen = null, + int ContractType = (int)Common.Constants.ContractType.Contract, + bool TFAEnabled = false + ) : IRequest; + #region DTOs /// /// Signaturposition auf einem Dokument. @@ -31,49 +55,13 @@ public record ReceiverGetOrCreateDto([Required] IEnumerable Signature }; /// -/// DTO for creating a document. +/// DTO zum Erstellen eines Dokuments. /// /// -/// The document data in byte array format. This is used when the document is provided as raw binary data. +/// Die Dokumentdaten im Byte-Array-Format. Wird verwendet, wenn das Dokument als Roh-Binärdaten bereitgestellt wird. /// /// -/// The document data in Base64 string format. This is used when the document is provided as a Base64-encoded string. +/// Die Dokumentdaten im Base64-String-Format. Wird verwendet, wenn das Dokument als Base64-codierter String bereitgestellt wird. /// public record DocumentCreateDto(byte[]? DataAsByte = null, string? DataAsBase64 = null); -#endregion - -/// -/// -/// Command to create an envelope. -/// -/// The title of the envelope. This is a required field. -/// The message to be included in the envelope. This is a required field. -/// The document associated with the envelope. This is a required field. -/// A collection of receivers who will receive the envelope. This is a required field. -/// The language of the envelope. Defaults to "de-DE" if not specified. -/// The expiration date of the envelope. Optional. -/// The date when a warning should be issued before expiration. Optional. -/// The type of contract associated with the envelope. Defaults to the "Contract" type. -/// Indicates whether two-factor authentication is enabled for the envelope. Defaults to false. -/// Befehl zur Erstellung eines Umschlags. -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -public record CreateEnvelopeCommand( - [Required] string Title, - [Required] string Message, - [Required] DocumentCreateDto Document, - [Required] IEnumerable Receivers, - string Language = "de-DE", - DateTime? ExpiresWhen = null, - DateTime? ExpiresWarningWhen = null, - int ContractType = (int)Common.Constants.ContractType.Contract, - bool TFAEnabled = false - ) : IRequest; \ No newline at end of file +#endregion \ No newline at end of file From b2cc0cb65a984cd5c382f68b893554946c50f2f6 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Thu, 10 Apr 2025 18:08:35 +0200 Subject: [PATCH 38/76] Refactor envelope creation commands and DTOs Removed `CreateEnvelopeCommand` and introduced `CreateEnvelopeReceiverCommand` with updated parameters. Updated `ReceiverGetOrCreateDto` to include a new `Salution` parameter. Added XML documentation for the new command and associated DTOs. --- ...eEnvelopeCommand.cs => CreateEnvelopeReceiverCommand.cs} | 6 +++--- .../Controllers/EnvelopeReceiverController.cs | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) rename EnvelopeGenerator.Application/EnvelopeReceivers/Commands/Create/{CreateEnvelopeCommand.cs => CreateEnvelopeReceiverCommand.cs} (91%) diff --git a/EnvelopeGenerator.Application/EnvelopeReceivers/Commands/Create/CreateEnvelopeCommand.cs b/EnvelopeGenerator.Application/EnvelopeReceivers/Commands/Create/CreateEnvelopeReceiverCommand.cs similarity index 91% rename from EnvelopeGenerator.Application/EnvelopeReceivers/Commands/Create/CreateEnvelopeCommand.cs rename to EnvelopeGenerator.Application/EnvelopeReceivers/Commands/Create/CreateEnvelopeReceiverCommand.cs index 12efa25b..09649016 100644 --- a/EnvelopeGenerator.Application/EnvelopeReceivers/Commands/Create/CreateEnvelopeCommand.cs +++ b/EnvelopeGenerator.Application/EnvelopeReceivers/Commands/Create/CreateEnvelopeReceiverCommand.cs @@ -15,7 +15,7 @@ namespace EnvelopeGenerator.Application.EnvelopeReceivers.Commands.Create; /// Das Datum, an dem vor dem Ablauf eine Warnung ausgegeben werden soll. Optional. /// Der Vertragstyp, der mit dem Umschlag verknüpft ist. Standardmäßig der Typ "Contract". /// Gibt an, ob die Zwei-Faktor-Authentifizierung für den Umschlag aktiviert ist. Standardmäßig false. -public record CreateEnvelopeCommand( +public record CreateEnvelopeReceiverCommand( [Required] string Title, [Required] string Message, [Required] DocumentCreateDto Document, @@ -41,9 +41,9 @@ public record Signature([Required] int X, [Required] int Y, [Required] int Page) /// Wenn nicht, wird sie erstellt und mit einer Signatur versehen. /// /// Unterschriften auf Dokumenten. -/// Der Name, mit dem der Käufer angesprochen werden soll. Bei Null oder keinem Wert wird der zuletzt verwendete Name verwendet. +/// Der Name, mit dem der Empfänger angesprochen werden soll. Bei Null oder keinem Wert wird der zuletzt verwendete Name verwendet. /// Sollte mit Vorwahl geschrieben werden -public record ReceiverGetOrCreateDto([Required] IEnumerable Signatures, string? Name = null, string? PhoneNumber = null) +public record ReceiverGetOrCreateDto([Required] IEnumerable Signatures, string? Salution = null, string? PhoneNumber = null) { private string _emailAddress = string.Empty; diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs index 244ddf71..b888c883 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs @@ -182,7 +182,7 @@ public class EnvelopeReceiverController : ControllerBase /// Es handelt sich um einen unerwarteten Fehler. Die Protokolle sollten überprüft werden. [Authorize] [HttpPost] - public async Task CreateAsync([FromBody] CreateEnvelopeCommand createEnvelopeQuery, CancellationToken cancellationToken) + public async Task CreateAsync([FromBody] CreateEnvelopeReceiverCommand createEnvelopeQuery, CancellationToken cancellationToken) { await _mediator.Send(createEnvelopeQuery, cancellationToken); return Accepted(); From d55006fdda45fac67749ed80a9bac8cb67ff5c92 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Thu, 10 Apr 2025 18:30:12 +0200 Subject: [PATCH 39/76] =?UTF-8?q?chore:=20Hinzuf=C3=BCgen=20von=20XML-Doku?= =?UTF-8?q?mentationsgenerierung=20und=20Swagger-Kommentaren?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Aktualisierte Projektdateien zur Aktivierung der XML-Dokumentationsgenerierung durch Hinzufügen der Eigenschaften `` und ``. Geänderte Swagger-Konfiguration in `Program.cs`, um alle XML-Dateien im Basisverzeichnis für eine flexiblere Einbindung der Dokumentation einzuschließen. --- .../EnvelopeGenerator.Application.csproj | 2 ++ .../EnvelopeGenerator.GeneratorAPI.csproj | 1 + EnvelopeGenerator.GeneratorAPI/Program.cs | 7 +++++-- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/EnvelopeGenerator.Application/EnvelopeGenerator.Application.csproj b/EnvelopeGenerator.Application/EnvelopeGenerator.Application.csproj index b53c961c..3fe00e17 100644 --- a/EnvelopeGenerator.Application/EnvelopeGenerator.Application.csproj +++ b/EnvelopeGenerator.Application/EnvelopeGenerator.Application.csproj @@ -4,6 +4,8 @@ net7.0;net8.0;net9.0 enable enable + true + bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml diff --git a/EnvelopeGenerator.GeneratorAPI/EnvelopeGenerator.GeneratorAPI.csproj b/EnvelopeGenerator.GeneratorAPI/EnvelopeGenerator.GeneratorAPI.csproj index 2648a49a..9ac01c63 100644 --- a/EnvelopeGenerator.GeneratorAPI/EnvelopeGenerator.GeneratorAPI.csproj +++ b/EnvelopeGenerator.GeneratorAPI/EnvelopeGenerator.GeneratorAPI.csproj @@ -14,6 +14,7 @@ 1.1.0 1.1.0 Copyright © 2025 Digital Data GmbH. All rights reserved. + bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml diff --git a/EnvelopeGenerator.GeneratorAPI/Program.cs b/EnvelopeGenerator.GeneratorAPI/Program.cs index a5d1b05a..3bffafe9 100644 --- a/EnvelopeGenerator.GeneratorAPI/Program.cs +++ b/EnvelopeGenerator.GeneratorAPI/Program.cs @@ -49,8 +49,11 @@ builder.Services.AddSwaggerGen(options => }, }); - var xmlFilename = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; - options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, xmlFilename)); + var xmlFiles = Directory.GetFiles(AppContext.BaseDirectory, "*.xml"); + foreach (var xmlFile in xmlFiles) + { + options.IncludeXmlComments(xmlFile); + } }); builder.Services.AddOpenApi(); // DbContext From 98290c7b28f7dd8b139e8b9a5bfe26f5dada9e35 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Thu, 10 Apr 2025 18:42:51 +0200 Subject: [PATCH 40/76] Update comments in ReadEnvelopeReceiverResponse.cs Enhanced clarity and detail in class documentation. Rephrased summaries and remarks for better understanding of the class and its properties, including the relationship between envelope and receiver. Clarified parameters `UserId` and `Status` for improved overall documentation. --- .../Read/ReadEnvelopeReceiverResponse.cs | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/EnvelopeGenerator.Application/EnvelopeReceivers/Queries/Read/ReadEnvelopeReceiverResponse.cs b/EnvelopeGenerator.Application/EnvelopeReceivers/Queries/Read/ReadEnvelopeReceiverResponse.cs index ca0526be..dd9c482b 100644 --- a/EnvelopeGenerator.Application/EnvelopeReceivers/Queries/Read/ReadEnvelopeReceiverResponse.cs +++ b/EnvelopeGenerator.Application/EnvelopeReceivers/Queries/Read/ReadEnvelopeReceiverResponse.cs @@ -7,20 +7,23 @@ using System.ComponentModel.DataAnnotations.Schema; namespace EnvelopeGenerator.Application.EnvelopeReceivers.Queries.Read; /// -/// Stellt eine Antwort auf die Abfrage zum Lesen eines Envelope-Empfängers dar. +/// Repräsentiert die Antwort für das Lesen eines Envelope-Empfängers. /// -/// Der angeforderte Empfänger. +/// +/// Diese Klasse enthält Informationen über einen spezifischen Empfänger eines Umschlags (Envelope). +/// Sie verknüpft die Empfängerinformationen mit den zugehörigen Umschlagsdaten und bietet zusätzliche Metadaten. +/// +/// Die eindeutige Kennung des Benutzers, der den Empfänger erstellt hat. +/// Der Status des Empfängers als numerischer Wert. public record ReadEnvelopeReceiverResponse(int UserId, int Status) { /// - /// Repräsentiert die Antwort für das Lesen eines Envelope-Empfängers. + /// Gibt die zusammengesetzte Kennung des Empfängers zurück, bestehend aus der Umschlags-ID und der Empfänger-ID. /// /// - /// Diese Klasse enthält Informationen über einen spezifischen Empfänger eines Umschlags (Envelope). - /// Sie verknüpft die Empfängerinformationen mit den zugehörigen Umschlagsdaten und bietet zusätzliche Metadaten. + /// Diese Eigenschaft kombiniert die eindeutige Kennung des Umschlags (EnvelopeId) und die des Empfängers (ReceiverId) + /// zu einer einzigen, leicht zugänglichen Struktur. /// - /// Die eindeutige Kennung des Benutzers, der den Empfänger erstellt hat. - /// Der Status des Empfängers als numerischer Wert. [NotMapped] public (int Envelope, int Receiver) Id => (Envelope: EnvelopeId, Receiver: ReceiverId); From 7bbed3890e4d4194db8d7dd0924e58d188e46a7c Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Thu, 10 Apr 2025 18:46:37 +0200 Subject: [PATCH 41/76] Add Status parameter to EnvelopeHistoryQuery records Updated EnvelopeHistoryQuery to include a new `Status` parameter for describing the envelope's status. Modified the `ReferenceType` property to return `ReferenceType.System` when neither the envelope's `User` nor the `Receiver` is defined. Updated ReadEnvelopeHistoryQuery to include the `Status` parameter and set default values of `null` for `Envelope` and `Receiver`, ensuring consistency with the base class. --- .../EnvelopeHistories/EnvelopeHistoryQuery.cs | 17 ++++++++++++----- .../Queries/Read/ReadEnvelopeHistoryQuery.cs | 7 ++++--- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/EnvelopeGenerator.Application/EnvelopeHistories/EnvelopeHistoryQuery.cs b/EnvelopeGenerator.Application/EnvelopeHistories/EnvelopeHistoryQuery.cs index 04df49fd..6fc487cc 100644 --- a/EnvelopeGenerator.Application/EnvelopeHistories/EnvelopeHistoryQuery.cs +++ b/EnvelopeGenerator.Application/EnvelopeHistories/EnvelopeHistoryQuery.cs @@ -10,14 +10,21 @@ namespace EnvelopeGenerator.Application.EnvelopeHistories; /// Die eindeutige Kennung des Umschlags. /// Die Abfrage, die den Umschlag beschreibt. /// Die Abfrage, die den Empfänger beschreibt. +/// Die Abfrage, die den Status des Umschlags beschreibt. public record EnvelopeHistoryQuery(int EnvelopeId, TEnvelopeQuery? Envelope, TReceiverQuery? Receiver = null, StatusQuery? Status = null) where TEnvelopeQuery : EnvelopeQuery where TReceiverQuery : ReceiverQuery { - public ReferenceType ReferenceType => - Envelope?.User is not null - ? ReferenceType.Receiver - : Receiver is not null - ? ReferenceType.Receiver + /// + /// Gibt den Referenztyp des Umschlags an. + /// Wenn der Benutzer des Umschlags definiert ist, wird der Referenztyp als Empfänger betrachtet. + /// Andernfalls, wenn ein Empfänger definiert ist, wird der Referenztyp ebenfalls als Empfänger betrachtet. + /// Ist keiner von beiden definiert, wird der Referenztyp als System betrachtet. + /// + public ReferenceType ReferenceType => + Envelope?.User is not null + ? ReferenceType.Receiver + : Receiver is not null + ? ReferenceType.Receiver : ReferenceType.System; } diff --git a/EnvelopeGenerator.Application/EnvelopeHistories/Queries/Read/ReadEnvelopeHistoryQuery.cs b/EnvelopeGenerator.Application/EnvelopeHistories/Queries/Read/ReadEnvelopeHistoryQuery.cs index c9fd4593..be1854de 100644 --- a/EnvelopeGenerator.Application/EnvelopeHistories/Queries/Read/ReadEnvelopeHistoryQuery.cs +++ b/EnvelopeGenerator.Application/EnvelopeHistories/Queries/Read/ReadEnvelopeHistoryQuery.cs @@ -9,9 +9,10 @@ namespace EnvelopeGenerator.Application.EnvelopeHistories.Queries.Read; /// Die eindeutige Kennung des Umschlags. /// Die Abfrage, die den Umschlag beschreibt. /// Die Abfrage, die den Empfänger beschreibt. +/// Die Abfrage, die den Status des Umschlags beschreibt. public record ReadEnvelopeHistoryQuery( int EnvelopeId, - ReadEnvelopeQuery? Envelope, - ReadReceiverQuery? Receiver, - StatusQuery? Status) + ReadEnvelopeQuery? Envelope = null, + ReadReceiverQuery? Receiver = null, + StatusQuery? Status = null) : EnvelopeHistoryQuery(EnvelopeId, Envelope, Receiver, Status); From 6969f5f93efa84264227f6d343703d8e21841687 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Thu, 10 Apr 2025 18:48:08 +0200 Subject: [PATCH 42/76] Add XML documentation for EnvelopeQuery properties This commit introduces XML documentation comments for the `UserId`, `Username`, and `UserEmail` properties in the `EnvelopeQuery` record. The comments clarify the purpose of each property, enhancing code readability and maintainability. --- EnvelopeGenerator.Application/Envelopes/EnvelopeQuery.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/EnvelopeGenerator.Application/Envelopes/EnvelopeQuery.cs b/EnvelopeGenerator.Application/Envelopes/EnvelopeQuery.cs index 8507b102..39bd71a5 100644 --- a/EnvelopeGenerator.Application/Envelopes/EnvelopeQuery.cs +++ b/EnvelopeGenerator.Application/Envelopes/EnvelopeQuery.cs @@ -15,9 +15,18 @@ public record EnvelopeQuery( int? Status = null, string? Uuid = null) : IRequest { + /// + /// Die eindeutige Kennung des Benutzers. + /// public int? UserId => User?.Id; + /// + /// Der Benutzername des Absenders. + /// public string? Username => User?.Username; + /// + /// Die E-Mail-Adresse des Benutzers. + /// public string? UserEmail => User?.Username; }; \ No newline at end of file From 2f8d5f1fc8efb426116858439403f4be73f57528 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Thu, 10 Apr 2025 18:49:01 +0200 Subject: [PATCH 43/76] Refactor Envelope classes to use Sender instead of User Updated the `EnvelopeHistoryQuery` to determine `ReferenceType` based on the presence of a `Sender` instead of a `User`. In the `EnvelopeQuery`, replaced the `User` parameter with `Sender`, and updated related properties to reflect this change. This refactor shifts the focus from a user-centric model to a sender-centric model for envelope queries. --- .../EnvelopeHistories/EnvelopeHistoryQuery.cs | 2 +- .../Envelopes/EnvelopeQuery.cs | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/EnvelopeGenerator.Application/EnvelopeHistories/EnvelopeHistoryQuery.cs b/EnvelopeGenerator.Application/EnvelopeHistories/EnvelopeHistoryQuery.cs index 6fc487cc..3d917027 100644 --- a/EnvelopeGenerator.Application/EnvelopeHistories/EnvelopeHistoryQuery.cs +++ b/EnvelopeGenerator.Application/EnvelopeHistories/EnvelopeHistoryQuery.cs @@ -22,7 +22,7 @@ public record EnvelopeHistoryQuery(int EnvelopeI /// Ist keiner von beiden definiert, wird der Referenztyp als System betrachtet. /// public ReferenceType ReferenceType => - Envelope?.User is not null + Envelope?.Sender is not null ? ReferenceType.Receiver : Receiver is not null ? ReferenceType.Receiver diff --git a/EnvelopeGenerator.Application/Envelopes/EnvelopeQuery.cs b/EnvelopeGenerator.Application/Envelopes/EnvelopeQuery.cs index 39bd71a5..8d3bd7fb 100644 --- a/EnvelopeGenerator.Application/Envelopes/EnvelopeQuery.cs +++ b/EnvelopeGenerator.Application/Envelopes/EnvelopeQuery.cs @@ -6,27 +6,27 @@ namespace EnvelopeGenerator.Application.Envelopes; /// Repräsentiert eine Abfrage für Umschläge. ///
/// Die eindeutige Kennung des Umschlags. -/// Absender des Schreibens +/// Absender des Schreibens /// Der Status des Umschlags. /// Die universell eindeutige Kennung des Umschlags. public record EnvelopeQuery( int? Id = null, - UserQuery? User = null, + UserQuery? Sender = null, int? Status = null, string? Uuid = null) : IRequest { /// /// Die eindeutige Kennung des Benutzers. /// - public int? UserId => User?.Id; + public int? SenderId => Sender?.Id; /// /// Der Benutzername des Absenders. /// - public string? Username => User?.Username; + public string? SenderUsername => Sender?.Username; /// /// Die E-Mail-Adresse des Benutzers. /// - public string? UserEmail => User?.Username; + public string? SenderEmail => Sender?.Username; }; \ No newline at end of file From 99b0dba79f18a1db9f96871980f423fcffdf42d4 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Thu, 10 Apr 2025 18:50:24 +0200 Subject: [PATCH 44/76] Refactor envelope sender handling and update namespaces Changed the namespace for `EnvelopeQuery` and updated the `Sender` parameter type to `SenderQuery?`. Removed `UserQuery.cs` as it is no longer needed. Introduced `SenderQuery.cs` with properties for sender details and added XML documentation for clarity. --- .../Envelopes/EnvelopeQuery.cs | 2 +- .../Envelopes/SenderQuery.cs | 11 +++++++++++ EnvelopeGenerator.Application/Envelopes/UserQuery.cs | 5 ----- 3 files changed, 12 insertions(+), 6 deletions(-) create mode 100644 EnvelopeGenerator.Application/Envelopes/SenderQuery.cs delete mode 100644 EnvelopeGenerator.Application/Envelopes/UserQuery.cs diff --git a/EnvelopeGenerator.Application/Envelopes/EnvelopeQuery.cs b/EnvelopeGenerator.Application/Envelopes/EnvelopeQuery.cs index 8d3bd7fb..fcf6de9d 100644 --- a/EnvelopeGenerator.Application/Envelopes/EnvelopeQuery.cs +++ b/EnvelopeGenerator.Application/Envelopes/EnvelopeQuery.cs @@ -11,7 +11,7 @@ namespace EnvelopeGenerator.Application.Envelopes; /// Die universell eindeutige Kennung des Umschlags. public record EnvelopeQuery( int? Id = null, - UserQuery? Sender = null, + SenderQuery? Sender = null, int? Status = null, string? Uuid = null) : IRequest { diff --git a/EnvelopeGenerator.Application/Envelopes/SenderQuery.cs b/EnvelopeGenerator.Application/Envelopes/SenderQuery.cs new file mode 100644 index 00000000..ca0c70a1 --- /dev/null +++ b/EnvelopeGenerator.Application/Envelopes/SenderQuery.cs @@ -0,0 +1,11 @@ +namespace EnvelopeGenerator.Application.Envelopes; + +/// +/// Repräsentiert eine Abfrage für einen Absender. +/// +/// Die eindeutige Kennung des Absenders. +/// Der Benutzername des Absenders. +/// Die E-Mail-Adresse des Absenders. +public record SenderQuery(int? Id = null, string? Username = null, string? Email = null) +{ +} diff --git a/EnvelopeGenerator.Application/Envelopes/UserQuery.cs b/EnvelopeGenerator.Application/Envelopes/UserQuery.cs deleted file mode 100644 index 0c57327b..00000000 --- a/EnvelopeGenerator.Application/Envelopes/UserQuery.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace EnvelopeGenerator.Application.Envelopes; - -public record UserQuery(int? Id = null, string? Username = null, string? Email = null) -{ -} From 6550be02356c0481616c31656cbfea0bf39d17e5 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Thu, 10 Apr 2025 18:57:48 +0200 Subject: [PATCH 45/76] Add XML documentation for GetReferenceTypes method This commit introduces XML documentation comments to the GetReferenceTypes method in the HistoryController class. The comments clarify the method's purpose, indicating that it retrieves available reference types and returns them as key-value pairs, along with a summary and return type information. --- .../Controllers/EnvelopeController.cs | 2 +- .../Controllers/HistoryController.cs | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs index 5cf96857..ce9147a2 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs @@ -44,7 +44,7 @@ public class EnvelopeController : ControllerBase try { if (User.GetId() is int intId) - return await _envelopeService.ReadByUserAsync(intId, min_status: status.Min, max_status: status.Max, ignore_statuses: status.Ignore).ThenAsync( + return await _envelopeService.ReadByUserAsync(intId, min_status: status.Min, max_status: status.Max, ignore_statuses: status.Ignore ?? Array.Empty()).ThenAsync( Success: Ok, Fail: IActionResult (msg, ntc) => { diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs index 89dcf8ce..ae683738 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs @@ -30,6 +30,10 @@ public class HistoryController : ControllerBase _service = service; } + /// + /// Ruft die verfügbaren Referenztypen ab und gibt sie als Schlüssel-Wert-Paare zurück. + /// + /// Ein Ok-Ergebnis mit einem Wörterbuch, das die Referenztypen als Schlüssel-Wert-Paare enthält. [HttpGet("reference-type")] [Authorize] public IActionResult GetReferenceTypes() From 57153436518bd96c2dbc6acb622d1cb1b53ea70e Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Thu, 10 Apr 2025 19:04:22 +0200 Subject: [PATCH 46/76] Refactor envelope command and controller response Removed unnecessary parameters from CreateEnvelopeReceiverCommand, simplifying envelope creation. Updated EnvelopeReceiverController to reflect these changes by removing related fields from the JSON response, focusing on essential information. --- .../Commands/Create/CreateEnvelopeReceiverCommand.cs | 8 -------- .../Controllers/EnvelopeReceiverController.cs | 4 ---- 2 files changed, 12 deletions(-) diff --git a/EnvelopeGenerator.Application/EnvelopeReceivers/Commands/Create/CreateEnvelopeReceiverCommand.cs b/EnvelopeGenerator.Application/EnvelopeReceivers/Commands/Create/CreateEnvelopeReceiverCommand.cs index 09649016..4b2ae1e1 100644 --- a/EnvelopeGenerator.Application/EnvelopeReceivers/Commands/Create/CreateEnvelopeReceiverCommand.cs +++ b/EnvelopeGenerator.Application/EnvelopeReceivers/Commands/Create/CreateEnvelopeReceiverCommand.cs @@ -10,20 +10,12 @@ namespace EnvelopeGenerator.Application.EnvelopeReceivers.Commands.Create; /// Die Nachricht, die im Umschlag enthalten sein soll. Dies ist ein Pflichtfeld. /// Das mit dem Umschlag verknüpfte Dokument. Dies ist ein Pflichtfeld. /// Eine Sammlung von Empfängern, die den Umschlag erhalten. Dies ist ein Pflichtfeld. -/// Die Sprache des Umschlags. Standardmäßig "de-DE", wenn nicht angegeben. -/// Das Ablaufdatum des Umschlags. Optional. -/// Das Datum, an dem vor dem Ablauf eine Warnung ausgegeben werden soll. Optional. -/// Der Vertragstyp, der mit dem Umschlag verknüpft ist. Standardmäßig der Typ "Contract". /// Gibt an, ob die Zwei-Faktor-Authentifizierung für den Umschlag aktiviert ist. Standardmäßig false. public record CreateEnvelopeReceiverCommand( [Required] string Title, [Required] string Message, [Required] DocumentCreateDto Document, [Required] IEnumerable Receivers, - string Language = "de-DE", - DateTime? ExpiresWhen = null, - DateTime? ExpiresWarningWhen = null, - int ContractType = (int)Common.Constants.ContractType.Contract, bool TFAEnabled = false ) : IRequest; diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs index b888c883..2437691e 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs @@ -168,10 +168,6 @@ public class EnvelopeReceiverController : ControllerBase /// "phoneNumber": "+49123456789" /// } /// ], - /// "language": "de-DE", - /// "expiresWhen": "2025-12-31T23:59:59Z", - /// "expiresWarningWhen": "2025-12-24T23:59:59Z", - /// "contractType": 1, /// "tfaEnabled": false /// } /// From b4ab2c4423906e7d8522ab3564dce6edb47fd626 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Thu, 10 Apr 2025 19:08:35 +0200 Subject: [PATCH 47/76] Enhance API documentation and error handling Updated `EnvelopeReceiverController` with additional XML documentation for HTTP response codes in key methods. Improved formatting of catch blocks and enhanced logging statements for better error context. --- .../Controllers/EnvelopeReceiverController.cs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs index 2437691e..f67b5237 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs @@ -47,6 +47,8 @@ public class EnvelopeReceiverController : ControllerBase /// Dieser Endpunkt ermöglicht es, Umschlagempfänger basierend auf dem Benutzernamen und optionalen Statusfiltern abzurufen. /// Wenn der Benutzername nicht ermittelt werden kann, wird ein Serverfehler zurückgegeben. /// + /// Die Liste der Umschlagempfänger wurde erfolgreich abgerufen. + /// Ein unerwarteter Fehler ist aufgetreten. [HttpGet] public async Task GetEnvelopeReceiver([FromQuery] ReadEnvelopeReceiverQuery envelopeReceiver) { @@ -69,7 +71,7 @@ public class EnvelopeReceiverController : ControllerBase return StatusCode(StatusCodes.Status500InternalServerError, msg); }); } - catch(Exception ex) + catch (Exception ex) { _logger.LogError(ex, "An unexpected error occurred. {message}", ex.Message); return new StatusCodeResult(StatusCodes.Status500InternalServerError); @@ -85,6 +87,9 @@ public class EnvelopeReceiverController : ControllerBase /// Dieser Endpunkt ermöglicht es, den Namen des letzten Empfängers abzurufen, der mit der angegebenen E-Mail-Adresse verknüpft ist. /// Wenn kein Empfänger gefunden wird, wird ein leerer String zurückgegeben. /// + /// Der Name des Empfängers wurde erfolgreich abgerufen. + /// Kein Empfänger mit der angegebenen E-Mail-Adresse gefunden. + /// Ein unerwarteter Fehler ist aufgetreten. [HttpGet("receiver-name/{mail}")] public async Task GetReceiverName([FromRoute] string mail) { @@ -101,7 +106,7 @@ public class EnvelopeReceiverController : ControllerBase return StatusCode(StatusCodes.Status500InternalServerError); }); } - catch(Exception ex) + catch (Exception ex) { _logger.LogError(ex, "{message}", ex.Message); return StatusCode(StatusCodes.Status500InternalServerError); @@ -117,6 +122,8 @@ public class EnvelopeReceiverController : ControllerBase /// Dieser Endpunkt ermöglicht es, geheime Informationen zu einem Umschlagempfänger basierend auf der UUID abzurufen. /// Wenn keine Informationen gefunden werden, wird ein entsprechender Fehlerstatus zurückgegeben. /// + /// Die geheimen Informationen wurden erfolgreich abgerufen. + /// Ein unerwarteter Fehler ist aufgetreten. [HttpGet("secret")] [Authorize] public async Task GetSecretAsync([FromQuery] string uuid) From f0ed6137d18b3da908a021ae230bd3d99a39c9fe Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Thu, 10 Apr 2025 19:08:49 +0200 Subject: [PATCH 48/76] Remove GetSecretAsync method from EnvelopeReceiverController The GetSecretAsync method, which retrieved secret information based on a UUID, has been completely removed along with its XML documentation comments and error handling logic. This change eliminates the functionality to access secret information via the specified endpoint in the controller. --- .../Controllers/EnvelopeReceiverController.cs | 32 ------------------- 1 file changed, 32 deletions(-) diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs index f67b5237..7a4c640c 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs @@ -113,38 +113,6 @@ public class EnvelopeReceiverController : ControllerBase } } - /// - /// Ruft geheime Informationen basierend auf der angegebenen UUID ab. - /// - /// Die eindeutige Kennung (UUID), die verwendet wird, um die geheimen Informationen abzurufen. - /// Eine HTTP-Antwort mit den geheimen Informationen oder einem Fehlerstatus. - /// - /// Dieser Endpunkt ermöglicht es, geheime Informationen zu einem Umschlagempfänger basierend auf der UUID abzurufen. - /// Wenn keine Informationen gefunden werden, wird ein entsprechender Fehlerstatus zurückgegeben. - /// - /// Die geheimen Informationen wurden erfolgreich abgerufen. - /// Ein unerwarteter Fehler ist aufgetreten. - [HttpGet("secret")] - [Authorize] - public async Task GetSecretAsync([FromQuery] string uuid) - { - try - { - return await _erService.ReadWithSecretByUuidAsync(uuid: uuid).ThenAsync( - Success: Ok, - Fail: IActionResult (msg, ntc) => - { - _logger.LogNotice(ntc); - return StatusCode(StatusCodes.Status500InternalServerError); - }); - } - catch (Exception ex) - { - _logger.LogError(ex, "{message}", ex.Message); - return StatusCode(StatusCodes.Status500InternalServerError); - } - } - /// /// Datenübertragungsobjekt mit Informationen zu Umschlägen, Empfängern und Unterschriften. /// From 0147f525fabe95912dc36e274e84ed2258ab735f Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Thu, 10 Apr 2025 19:12:01 +0200 Subject: [PATCH 49/76] Update AuthController and Login model for API changes - Updated API documentation in AuthController.cs to include an optional "id" field in the authentication request body. - Modified the Login record in Login.cs to require a "Password" field and include optional "Id" and "Username" fields, along with updated documentation comments. --- .../Controllers/AuthController.cs | 6 ++++++ EnvelopeGenerator.GeneratorAPI/Models/Login.cs | 12 +++++------- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/AuthController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/AuthController.cs index 9c84ddbe..5ce1ce7a 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/AuthController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/AuthController.cs @@ -51,6 +51,12 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers /// "username": "MaxMustermann", /// "password": "Geheim123!" /// } + /// + /// POST /api/auth?cookie=true + /// { + /// "id": "1", + /// "password": "Geheim123!" + /// } /// /// /// Erfolgreiche Anmeldung. Gibt das JWT-Token im Antwortkörper oder als Cookie zurück, wenn 'cookie' wahr ist. diff --git a/EnvelopeGenerator.GeneratorAPI/Models/Login.cs b/EnvelopeGenerator.GeneratorAPI/Models/Login.cs index 424931d1..7aaeea50 100644 --- a/EnvelopeGenerator.GeneratorAPI/Models/Login.cs +++ b/EnvelopeGenerator.GeneratorAPI/Models/Login.cs @@ -3,13 +3,11 @@ namespace EnvelopeGenerator.GeneratorAPI.Models; /// -/// Anmeldedatenmodell +/// Repräsentiert ein Login-Modell mit erforderlichem Passwort und optionaler ID und Benutzername. /// -/// -/// Login data model -/// -/// Active Directory user name -/// Active Directory password -public record Login([Required]string Username, [Required] string Password) +/// Das erforderliche Passwort für das Login. +/// Die optionale ID des Benutzers. +/// Der optionale Benutzername. +public record Login([Required] string Password, int? Id = null, string? Username = null) { } From 178ec9226d91ae271817babae97a5e67d3c2ecd5 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Thu, 10 Apr 2025 19:14:05 +0200 Subject: [PATCH 50/76] Enhance API documentation in EnvelopeController Added detailed response documentation for HTTP status codes in the EnvelopeController class. This improves clarity on expected responses for various scenarios, including success, client errors, unauthorized access, and server errors. --- .../Controllers/EnvelopeController.cs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs index ce9147a2..fac5d1d3 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs @@ -11,6 +11,14 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers; /// /// /// Die API ermöglicht das Abrufen und Verwalten von Umschlägen basierend auf Benutzerinformationen und Statusfiltern. +/// +/// Mögliche Antworten: +/// - 200 OK: Die Anfrage war erfolgreich, und die angeforderten Daten werden zurückgegeben. +/// - 400 Bad Request: Die Anfrage war fehlerhaft oder unvollständig. +/// - 401 Unauthorized: Der Benutzer ist nicht authentifiziert. +/// - 403 Forbidden: Der Benutzer hat keine Berechtigung, auf die Ressource zuzugreifen. +/// - 404 Not Found: Die angeforderte Ressource wurde nicht gefunden. +/// - 500 Internal Server Error: Ein unerwarteter Fehler ist aufgetreten. /// [Route("api/[controller]")] [ApiController] @@ -36,6 +44,11 @@ public class EnvelopeController : ControllerBase /// /// Die Statusfilter, die für die Abfrage verwendet werden sollen. /// Eine IActionResult-Instanz, die die abgerufenen Umschläge oder einen Fehlerstatus enthält. + /// Die Anfrage war erfolgreich, und die Umschläge werden zurückgegeben. + /// Die Anfrage war fehlerhaft oder unvollständig. + /// Der Benutzer ist nicht authentifiziert. + /// Der Benutzer hat keine Berechtigung, auf die Ressource zuzugreifen. + /// Ein unerwarteter Fehler ist aufgetreten. [Authorize] [HttpGet] public async Task GetAsync( From 26616b4cabe5d22bb3fc8e45a6d954c727facddf Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Fri, 11 Apr 2025 15:08:37 +0200 Subject: [PATCH 51/76] Update HistoryController comments and response codes Replaced "Verlaufshistorie" with "Umschlaghistorie" in the `HistoryController` class to clarify API context. Added detailed response codes for `GetReferenceTypes` and `GetAllAsync` methods to enhance API documentation. --- .../Controllers/HistoryController.cs | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs index ae683738..d6eee03e 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs @@ -8,7 +8,7 @@ using static EnvelopeGenerator.Common.Constants; namespace EnvelopeGenerator.GeneratorAPI.Controllers; /// -/// Dieser Controller bietet Endpunkte für den Zugriff auf die Verlaufshistorie von Umschlägen. +/// Dieser Controller stellt Endpunkte für den Zugriff auf die Umschlaghistorie bereit. /// [Route("api/[controller]")] [ApiController] @@ -23,7 +23,7 @@ public class HistoryController : ControllerBase /// Konstruktor für den HistoryController. /// /// Der Logger, der für das Protokollieren von Informationen verwendet wird. - /// Der Dienst, der für die Verarbeitung der Verlaufshistorie verantwortlich ist. + /// Der Dienst, der für die Verarbeitung der Umschlaghistorie verantwortlich ist. public HistoryController(ILogger logger, IEnvelopeHistoryService service) { _logger = logger; @@ -34,11 +34,16 @@ public class HistoryController : ControllerBase /// Ruft die verfügbaren Referenztypen ab und gibt sie als Schlüssel-Wert-Paare zurück. /// /// Ein Ok-Ergebnis mit einem Wörterbuch, das die Referenztypen als Schlüssel-Wert-Paare enthält. + /// Die Anfrage war erfolgreich, und die Referenztypen werden zurückgegeben. + /// Die Anfrage war ungültig oder unvollständig. + /// Der Benutzer ist nicht authentifiziert. + /// Der Benutzer hat keine Berechtigung, auf die Ressource zuzugreifen. + /// Ein unerwarteter Fehler ist aufgetreten. [HttpGet("reference-type")] [Authorize] public IActionResult GetReferenceTypes() { - // Enum to Key-Value pair + // Enum zu Schlüssel-Wert-Paar var referenceTypes = Enum.GetValues(typeof(ReferenceType)) .Cast() .ToDictionary(rt => @@ -52,10 +57,15 @@ public class HistoryController : ControllerBase } /// - /// Ruft die gesamte Verlaufshistorie von Umschlägen basierend auf den angegebenen Abfrageparametern ab. + /// Ruft die gesamte Umschlaghistorie basierend auf den angegebenen Abfrageparametern ab. /// - /// Die Abfrageparameter, die die Filterkriterien für die Verlaufshistorie definieren. - /// Eine Liste von Verlaufseinträgen, die den angegebenen Kriterien entsprechen. + /// Die Abfrageparameter, die die Filterkriterien für die Umschlaghistorie definieren. + /// Eine Liste von Historieneinträgen, die den angegebenen Kriterien entsprechen. + /// Die Anfrage war erfolgreich, und die Umschlaghistorie wird zurückgegeben. + /// Die Anfrage war ungültig oder unvollständig. + /// Der Benutzer ist nicht authentifiziert. + /// Der Benutzer hat keine Berechtigung, auf die Ressource zuzugreifen. + /// Ein unerwarteter Fehler ist aufgetreten. [HttpGet] [Authorize] public async Task GetAllAsync([FromQuery] ReadEnvelopeHistoryQuery history) @@ -76,11 +86,10 @@ public class HistoryController : ControllerBase var histories = await _service.ReadAsync( envelopeId: history.EnvelopeId, - //userReference: history.r, referenceType: refTypEnum, withSender: withSender, withReceiver: withReceiver); return Ok(histories); } -} \ No newline at end of file +} From 6cec82abd54d4d08ae228a2d90b71225a0925ff9 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Fri, 11 Apr 2025 18:35:02 +0200 Subject: [PATCH 52/76] Update envelope controllers and improve documentation - Added using directives in `EnvelopeController.cs` for `EnvelopeGenerator.Application.Envelopes.Queries.Read` and `EnvelopeGenerator.Common.Constants`. - Modified `GetAsync` method to use `ReadEnvelopeQuery` instead of `StatusQuery`, updating the logic for retrieving envelope data. - Enhanced parameter description in `EnvelopeReceiverController.cs` for clarity on filtering criteria for envelope recipients. --- .../Controllers/EnvelopeController.cs | 9 +++++---- .../Controllers/EnvelopeReceiverController.cs | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs index fac5d1d3..f3d5c7e4 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs @@ -1,8 +1,10 @@ using DigitalData.Core.DTO; using EnvelopeGenerator.Application.Contracts.Services; using EnvelopeGenerator.Application.EnvelopeHistories; +using EnvelopeGenerator.Application.Envelopes.Queries.Read; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using static EnvelopeGenerator.Common.Constants; namespace EnvelopeGenerator.GeneratorAPI.Controllers; @@ -42,7 +44,7 @@ public class EnvelopeController : ControllerBase /// /// Ruft eine Liste von Umschlägen basierend auf dem Benutzer und den angegebenen Statusfiltern ab. /// - /// Die Statusfilter, die für die Abfrage verwendet werden sollen. + /// /// Eine IActionResult-Instanz, die die abgerufenen Umschläge oder einen Fehlerstatus enthält. /// Die Anfrage war erfolgreich, und die Umschläge werden zurückgegeben. /// Die Anfrage war fehlerhaft oder unvollständig. @@ -51,13 +53,12 @@ public class EnvelopeController : ControllerBase /// Ein unerwarteter Fehler ist aufgetreten. [Authorize] [HttpGet] - public async Task GetAsync( - [FromQuery] StatusQuery status) + public async Task GetAsync([FromQuery] ReadEnvelopeQuery envelope) { try { if (User.GetId() is int intId) - return await _envelopeService.ReadByUserAsync(intId, min_status: status.Min, max_status: status.Max, ignore_statuses: status.Ignore ?? Array.Empty()).ThenAsync( + return await _envelopeService.ReadByUserAsync(intId, min_status: envelope.Status, max_status: envelope.Status).ThenAsync( Success: Ok, Fail: IActionResult (msg, ntc) => { diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs index 7a4c640c..98d51b47 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs @@ -41,7 +41,7 @@ public class EnvelopeReceiverController : ControllerBase /// /// Ruft eine Liste von Umschlagempfängern basierend auf den angegebenen Abfrageparametern ab. /// - /// Die Abfrageparameter, die den Status und andere Filterkriterien enthalten. + /// Die Abfrageparameter für die Filterung von Umschlagempfängern. /// Eine HTTP-Antwort mit der Liste der gefundenen Umschlagempfänger oder einem Fehlerstatus. /// /// Dieser Endpunkt ermöglicht es, Umschlagempfänger basierend auf dem Benutzernamen und optionalen Statusfiltern abzurufen. From 9a950ae37df64ff230723fbe46663f22012c04ea Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Fri, 11 Apr 2025 19:27:53 +0200 Subject: [PATCH 53/76] Enhance EnvelopeReceiver queries and controller - Updated `EnvelopeReceiverQuery` to include an optional, nullable `Status` parameter. - Modified `ReadEnvelopeReceiverQuery` to inherit from the updated `EnvelopeReceiverQuery`. - Added new using directives in `EnvelopeReceiverController` and enhanced response documentation to include a 401 Unauthorized response. - Implemented authorization for the `GetEnvelopeReceiver` method. - Improved documentation and method signature for `GetReceiverName` to accept a `ReadReceiverNameQuery` object. - Introduced a new `ReadReceiverNameQuery` record for querying the last used salutation of a receiver. --- .../EnvelopeReceiverQuery.cs | 8 +++---- .../Queries/Read/ReadEnvelopeReceiverQuery.cs | 2 +- .../ReceiverName/ReadReceiverNameQuery.cs | 13 ++++++++++++ .../Controllers/EnvelopeReceiverController.cs | 21 ++++++++++++------- 4 files changed, 30 insertions(+), 14 deletions(-) create mode 100644 EnvelopeGenerator.Application/Envelopes/Queries/ReceiverName/ReadReceiverNameQuery.cs diff --git a/EnvelopeGenerator.Application/EnvelopeReceivers/EnvelopeReceiverQuery.cs b/EnvelopeGenerator.Application/EnvelopeReceivers/EnvelopeReceiverQuery.cs index 3eccc2c8..73f66e06 100644 --- a/EnvelopeGenerator.Application/EnvelopeReceivers/EnvelopeReceiverQuery.cs +++ b/EnvelopeGenerator.Application/EnvelopeReceivers/EnvelopeReceiverQuery.cs @@ -3,9 +3,7 @@ namespace EnvelopeGenerator.Application.EnvelopeReceivers; /// -/// Stellt eine Abfrage zum Lesen eines Envelope-Empfängers dar. +/// Stellt eine Abfrage für einen Envelope-Empfänger dar. /// -/// -/// -/// -public record EnvelopeReceiverQuery(StatusQuery Status); \ No newline at end of file +/// Der Status der Abfrage, optional. +public record EnvelopeReceiverQuery(StatusQuery? Status = null); diff --git a/EnvelopeGenerator.Application/EnvelopeReceivers/Queries/Read/ReadEnvelopeReceiverQuery.cs b/EnvelopeGenerator.Application/EnvelopeReceivers/Queries/Read/ReadEnvelopeReceiverQuery.cs index 20894771..c0465dc2 100644 --- a/EnvelopeGenerator.Application/EnvelopeReceivers/Queries/Read/ReadEnvelopeReceiverQuery.cs +++ b/EnvelopeGenerator.Application/EnvelopeReceivers/Queries/Read/ReadEnvelopeReceiverQuery.cs @@ -16,7 +16,7 @@ namespace EnvelopeGenerator.Application.EnvelopeReceivers.Queries.Read; /// sowie zusätzliche Metadaten. /// /// Umschlag oder Empfängerstatus. -public record ReadEnvelopeReceiverQuery(StatusQuery Status) : EnvelopeReceiverQuery(Status), IRequest +public record ReadEnvelopeReceiverQuery(StatusQuery? Status = null) : EnvelopeReceiverQuery(Status), IRequest { /// /// Der Umschlag, der mit dem Empfänger verknüpft ist. diff --git a/EnvelopeGenerator.Application/Envelopes/Queries/ReceiverName/ReadReceiverNameQuery.cs b/EnvelopeGenerator.Application/Envelopes/Queries/ReceiverName/ReadReceiverNameQuery.cs new file mode 100644 index 00000000..fe114dd8 --- /dev/null +++ b/EnvelopeGenerator.Application/Envelopes/Queries/ReceiverName/ReadReceiverNameQuery.cs @@ -0,0 +1,13 @@ +using EnvelopeGenerator.Application.Receivers.Queries.Read; + +namespace EnvelopeGenerator.Application.Envelopes.Queries.ReceiverName; + +/// +/// Eine Abfrage, um die zuletzt verwendete Anrede eines Empfängers zu ermitteln, +/// damit diese für zukünftige Umschläge wiederverwendet werden kann. +/// +/// Der Umschlag, für den die Anrede des Empfängers ermittelt werden soll. +/// Gibt an, ob nur die zuletzt verwendete Anrede zurückgegeben werden soll. +public record ReadReceiverNameQuery(EnvelopeQuery? Envelope = null, bool OnlyLast = true) : ReadReceiverQuery +{ +} diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs index 98d51b47..f785d4ce 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs @@ -2,6 +2,8 @@ using EnvelopeGenerator.Application.Contracts.Services; using EnvelopeGenerator.Application.EnvelopeReceivers.Commands.Create; using EnvelopeGenerator.Application.EnvelopeReceivers.Queries.Read; +using EnvelopeGenerator.Application.Envelopes.Queries.ReceiverName; +using EnvelopeGenerator.Common; using MediatR; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; @@ -48,7 +50,9 @@ public class EnvelopeReceiverController : ControllerBase /// Wenn der Benutzername nicht ermittelt werden kann, wird ein Serverfehler zurückgegeben. /// /// Die Liste der Umschlagempfänger wurde erfolgreich abgerufen. + /// Wenn kein autorisierter Token vorhanden ist /// Ein unerwarteter Fehler ist aufgetreten. + [Authorize] [HttpGet] public async Task GetEnvelopeReceiver([FromQuery] ReadEnvelopeReceiverQuery envelopeReceiver) { @@ -79,23 +83,24 @@ public class EnvelopeReceiverController : ControllerBase } /// - /// Ruft den Namen des letzten verwendeten Empfängers basierend auf der angegebenen E-Mail-Adresse ab. + /// Ruft den Namen des zuletzt verwendeten Empfängers basierend auf der angegebenen E-Mail-Adresse ab. /// - /// Die E-Mail-Adresse des Empfängers. + /// Die Abfrage, die die E-Mail-Adresse des Empfängers enthält. /// Eine HTTP-Antwort mit dem Namen des Empfängers oder einem Fehlerstatus. /// - /// Dieser Endpunkt ermöglicht es, den Namen des letzten Empfängers abzurufen, der mit der angegebenen E-Mail-Adresse verknüpft ist. - /// Wenn kein Empfänger gefunden wird, wird ein leerer String zurückgegeben. + /// Dieser Endpunkt ermöglicht es, den Namen des zuletzt verwendeten Empfängers basierend auf der E-Mail-Adresse abzurufen. /// /// Der Name des Empfängers wurde erfolgreich abgerufen. - /// Kein Empfänger mit der angegebenen E-Mail-Adresse gefunden. + /// Wenn kein autorisierter Token vorhanden ist + /// Kein Empfänger gefunden. /// Ein unerwarteter Fehler ist aufgetreten. - [HttpGet("receiver-name/{mail}")] - public async Task GetReceiverName([FromRoute] string mail) + [Authorize] + [HttpGet("salute")] + public async Task GetReceiverName([FromQuery] ReadReceiverNameQuery receiverName) { try { - return await _erService.ReadLastUsedReceiverNameByMail(mail).ThenAsync( + return await _erService.ReadLastUsedReceiverNameByMail(receiverName.EmailAddress).ThenAsync( Success: res => res is null ? Ok(string.Empty) : Ok(res), Fail: IActionResult (msg, ntc) => { From c1e81c546f5cd799fcba5895cf15da03bfe5aec7 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Fri, 11 Apr 2025 19:39:58 +0200 Subject: [PATCH 54/76] Add OnlyLast parameter to history query records Updated `EnvelopeHistoryQuery` and `ReadEnvelopeHistoryQuery` to include a new optional `OnlyLast` parameter, removing the `Status` parameter. Documentation comments have been revised to reflect these changes, including updates in the `HistoryController` class. --- .../EnvelopeHistories/EnvelopeHistoryQuery.cs | 4 ++-- .../Queries/Read/ReadEnvelopeHistoryQuery.cs | 6 +++--- .../Controllers/HistoryController.cs | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/EnvelopeGenerator.Application/EnvelopeHistories/EnvelopeHistoryQuery.cs b/EnvelopeGenerator.Application/EnvelopeHistories/EnvelopeHistoryQuery.cs index 3d917027..70513435 100644 --- a/EnvelopeGenerator.Application/EnvelopeHistories/EnvelopeHistoryQuery.cs +++ b/EnvelopeGenerator.Application/EnvelopeHistories/EnvelopeHistoryQuery.cs @@ -10,8 +10,8 @@ namespace EnvelopeGenerator.Application.EnvelopeHistories; /// Die eindeutige Kennung des Umschlags. /// Die Abfrage, die den Umschlag beschreibt. /// Die Abfrage, die den Empfänger beschreibt. -/// Die Abfrage, die den Status des Umschlags beschreibt. -public record EnvelopeHistoryQuery(int EnvelopeId, TEnvelopeQuery? Envelope, TReceiverQuery? Receiver = null, StatusQuery? Status = null) +/// Abfrage zur Steuerung, ob nur der aktuelle Status oder der gesamte Datensatz zurückgegeben wird. +public record EnvelopeHistoryQuery(int EnvelopeId, TEnvelopeQuery? Envelope, TReceiverQuery? Receiver = null, bool? OnlyLast = null) where TEnvelopeQuery : EnvelopeQuery where TReceiverQuery : ReceiverQuery { diff --git a/EnvelopeGenerator.Application/EnvelopeHistories/Queries/Read/ReadEnvelopeHistoryQuery.cs b/EnvelopeGenerator.Application/EnvelopeHistories/Queries/Read/ReadEnvelopeHistoryQuery.cs index be1854de..298ca76c 100644 --- a/EnvelopeGenerator.Application/EnvelopeHistories/Queries/Read/ReadEnvelopeHistoryQuery.cs +++ b/EnvelopeGenerator.Application/EnvelopeHistories/Queries/Read/ReadEnvelopeHistoryQuery.cs @@ -9,10 +9,10 @@ namespace EnvelopeGenerator.Application.EnvelopeHistories.Queries.Read; /// Die eindeutige Kennung des Umschlags. /// Die Abfrage, die den Umschlag beschreibt. /// Die Abfrage, die den Empfänger beschreibt. -/// Die Abfrage, die den Status des Umschlags beschreibt. +/// Abfrage zur Steuerung, ob nur der aktuelle Status oder der gesamte Datensatz zurückgegeben wird. public record ReadEnvelopeHistoryQuery( int EnvelopeId, ReadEnvelopeQuery? Envelope = null, ReadReceiverQuery? Receiver = null, - StatusQuery? Status = null) - : EnvelopeHistoryQuery(EnvelopeId, Envelope, Receiver, Status); + bool? OnlyLast = true) + : EnvelopeHistoryQuery(EnvelopeId, Envelope, Receiver, OnlyLast); diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs index d6eee03e..844b7f7e 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs @@ -60,7 +60,7 @@ public class HistoryController : ControllerBase /// Ruft die gesamte Umschlaghistorie basierend auf den angegebenen Abfrageparametern ab. /// /// Die Abfrageparameter, die die Filterkriterien für die Umschlaghistorie definieren. - /// Eine Liste von Historieneinträgen, die den angegebenen Kriterien entsprechen. + /// Eine Liste von Historieneinträgen, die den angegebenen Kriterien entsprechen, oder nur der letzte Eintrag. /// Die Anfrage war erfolgreich, und die Umschlaghistorie wird zurückgegeben. /// Die Anfrage war ungültig oder unvollständig. /// Der Benutzer ist nicht authentifiziert. From a78912260a089c940c826e030de5313b9f402757 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Fri, 11 Apr 2025 19:43:09 +0200 Subject: [PATCH 55/76] Remove GetReferenceTypes method from HistoryController This commit removes the entire GetReferenceTypes method, along with its XML documentation comments, from the HistoryController class. The method was responsible for retrieving reference types as key-value pairs and returning them in an HTTP response. Its removal indicates a change in functionality, suggesting that reference types are no longer needed or will be managed differently in the application. --- .../Controllers/HistoryController.cs | 26 ------------------- 1 file changed, 26 deletions(-) diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs index 844b7f7e..a05dcf2b 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs @@ -30,32 +30,6 @@ public class HistoryController : ControllerBase _service = service; } - /// - /// Ruft die verfügbaren Referenztypen ab und gibt sie als Schlüssel-Wert-Paare zurück. - /// - /// Ein Ok-Ergebnis mit einem Wörterbuch, das die Referenztypen als Schlüssel-Wert-Paare enthält. - /// Die Anfrage war erfolgreich, und die Referenztypen werden zurückgegeben. - /// Die Anfrage war ungültig oder unvollständig. - /// Der Benutzer ist nicht authentifiziert. - /// Der Benutzer hat keine Berechtigung, auf die Ressource zuzugreifen. - /// Ein unerwarteter Fehler ist aufgetreten. - [HttpGet("reference-type")] - [Authorize] - public IActionResult GetReferenceTypes() - { - // Enum zu Schlüssel-Wert-Paar - var referenceTypes = Enum.GetValues(typeof(ReferenceType)) - .Cast() - .ToDictionary(rt => - { - var key = rt.ToString(); - var keyAsCamelCase = char.ToLower(key[0]) + key[1..]; - return keyAsCamelCase; - }, rt => (int)rt); - - return Ok(referenceTypes); - } - /// /// Ruft die gesamte Umschlaghistorie basierend auf den angegebenen Abfrageparametern ab. /// From ff34e6afab286c807e815eb5f3b7e1c781d6b247 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Fri, 11 Apr 2025 19:45:12 +0200 Subject: [PATCH 56/76] Revert "Remove GetReferenceTypes method from HistoryController" This reverts commit a78912260a089c940c826e030de5313b9f402757. --- .../Controllers/HistoryController.cs | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs index a05dcf2b..844b7f7e 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs @@ -30,6 +30,32 @@ public class HistoryController : ControllerBase _service = service; } + /// + /// Ruft die verfügbaren Referenztypen ab und gibt sie als Schlüssel-Wert-Paare zurück. + /// + /// Ein Ok-Ergebnis mit einem Wörterbuch, das die Referenztypen als Schlüssel-Wert-Paare enthält. + /// Die Anfrage war erfolgreich, und die Referenztypen werden zurückgegeben. + /// Die Anfrage war ungültig oder unvollständig. + /// Der Benutzer ist nicht authentifiziert. + /// Der Benutzer hat keine Berechtigung, auf die Ressource zuzugreifen. + /// Ein unerwarteter Fehler ist aufgetreten. + [HttpGet("reference-type")] + [Authorize] + public IActionResult GetReferenceTypes() + { + // Enum zu Schlüssel-Wert-Paar + var referenceTypes = Enum.GetValues(typeof(ReferenceType)) + .Cast() + .ToDictionary(rt => + { + var key = rt.ToString(); + var keyAsCamelCase = char.ToLower(key[0]) + key[1..]; + return keyAsCamelCase; + }, rt => (int)rt); + + return Ok(referenceTypes); + } + /// /// Ruft die gesamte Umschlaghistorie basierend auf den angegebenen Abfrageparametern ab. /// From 4551e5dc64251abe0e869466ed06d041ecc66828 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Fri, 11 Apr 2025 20:23:51 +0200 Subject: [PATCH 57/76] Refactor envelope history queries and namespaces Renamed `EnvelopeHistoryQuery` to `HistoryQuery` and `ReadEnvelopeHistoryQuery` to `ReadHistoryQuery` to improve clarity. Moved `StatusQuery` to the new `EnvelopeGenerator.Application.Histories` namespace. Updated `HistoryController` to use `ReadHistoryQuery`. Removed unused `using` directives and added relevant ones to align with the new structure. These changes enhance code maintainability and organization. --- .../EnvelopeHistories/StatusQuery.cs | 41 ----------------- .../EnvelopeReceiverQuery.cs | 44 ++++++++++++++++++- .../Queries/Read/ReadEnvelopeReceiverQuery.cs | 4 +- .../HistoryQuery.cs} | 4 +- .../Queries/Read/ReadHistoryQuery.cs} | 6 +-- .../Controllers/EnvelopeController.cs | 2 - .../Controllers/EnvelopeReceiverController.cs | 3 +- .../Controllers/HistoryController.cs | 4 +- 8 files changed, 52 insertions(+), 56 deletions(-) delete mode 100644 EnvelopeGenerator.Application/EnvelopeHistories/StatusQuery.cs rename EnvelopeGenerator.Application/{EnvelopeHistories/EnvelopeHistoryQuery.cs => Histories/HistoryQuery.cs} (85%) rename EnvelopeGenerator.Application/{EnvelopeHistories/Queries/Read/ReadEnvelopeHistoryQuery.cs => Histories/Queries/Read/ReadHistoryQuery.cs} (76%) diff --git a/EnvelopeGenerator.Application/EnvelopeHistories/StatusQuery.cs b/EnvelopeGenerator.Application/EnvelopeHistories/StatusQuery.cs deleted file mode 100644 index 1f7961fd..00000000 --- a/EnvelopeGenerator.Application/EnvelopeHistories/StatusQuery.cs +++ /dev/null @@ -1,41 +0,0 @@ -namespace EnvelopeGenerator.Application.EnvelopeHistories; - -/// -/// Repräsentiert den Status eines Umschlags und dessen Beziehung zum Empfänger. (vgl. auch -/// -/// Invalid (0): Ungültiger Status. -/// EnvelopeCreated (1001): Der Umschlag wurde erstellt. -/// EnvelopeSaved (1002): Der Umschlag wurde gespeichert. -/// EnvelopeQueued (1003): Der Umschlag wurde zur Verarbeitung eingeplant. -/// EnvelopeSent (1004): Der Umschlag wurde versendet. (Nicht verwendet) -/// EnvelopePartlySigned (1005): Der Umschlag wurde teilweise unterschrieben. -/// EnvelopeCompletelySigned (1006): Der Umschlag wurde vollständig unterschrieben. -/// EnvelopeReportCreated (1007): Ein Abschlussbericht wurde für den Umschlag erstellt. -/// EnvelopeArchived (1008): Der Umschlag wurde archiviert. -/// EnvelopeDeleted (1009): Der Umschlag wurde gelöscht. -/// AccessCodeRequested (2001): Der Zugriffscode wurde angefordert. -/// AccessCodeCorrect (2002): Der Zugriffscode war korrekt. -/// AccessCodeIncorrect (2003): Der Zugriffscode war falsch. -/// DocumentOpened (2004): Das Dokument wurde geöffnet. -/// DocumentSigned (2005): Ein Dokument wurde unterschrieben. -/// SignatureConfirmed (2006): Die Signatur wurde bestätigt. -/// DocumentRejected (2007): Ein Dokument wurde abgelehnt. -/// EnvelopeShared (2008): Der Umschlag wurde geteilt. -/// EnvelopeViewed (2009): Der Umschlag wurde angesehen. -/// DocumentForwarded (4001): Das Dokument wurde weitergeleitet. -/// MessageInvitationSent (3001): Einladung wurde gesendet (vom Trigger verwendet). -/// MessageAccessCodeSent (3002): Zugriffscode wurde gesendet. -/// MessageConfirmationSent (3003): Bestätigungsnachricht wurde gesendet. -/// MessageDeletionSent (3004): Löschbenachrichtigung wurde gesendet. -/// MessageCompletionSent (3005): Abschlussbenachrichtigung wurde gesendet. -/// -/// -/// Der minimale Statuswert, der berücksichtigt werden soll. -/// Der maximale Statuswert, der berücksichtigt werden soll. -/// Eine Liste von Statuswerten, die ignoriert werden sollen. -public record StatusQuery( - int? Min = null, - int? Max = null, - int[]? Ignore = null) -{ -} diff --git a/EnvelopeGenerator.Application/EnvelopeReceivers/EnvelopeReceiverQuery.cs b/EnvelopeGenerator.Application/EnvelopeReceivers/EnvelopeReceiverQuery.cs index 73f66e06..a4ed6142 100644 --- a/EnvelopeGenerator.Application/EnvelopeReceivers/EnvelopeReceiverQuery.cs +++ b/EnvelopeGenerator.Application/EnvelopeReceivers/EnvelopeReceiverQuery.cs @@ -1,4 +1,4 @@ -using EnvelopeGenerator.Application.EnvelopeHistories; +using EnvelopeGenerator.Application.Histories; namespace EnvelopeGenerator.Application.EnvelopeReceivers; @@ -6,4 +6,44 @@ namespace EnvelopeGenerator.Application.EnvelopeReceivers; /// Stellt eine Abfrage für einen Envelope-Empfänger dar. /// /// Der Status der Abfrage, optional. -public record EnvelopeReceiverQuery(StatusQuery? Status = null); +public record EnvelopeReceiverQuery(EnvelopeStatusQuery? Status = null); + +/// +/// Repräsentiert den Status eines Umschlags und dessen Beziehung zum Empfänger. (vgl. auch +/// +/// Invalid (0): Ungültiger Status. +/// EnvelopeCreated (1001): Der Umschlag wurde erstellt. +/// EnvelopeSaved (1002): Der Umschlag wurde gespeichert. +/// EnvelopeQueued (1003): Der Umschlag wurde zur Verarbeitung eingeplant. +/// EnvelopeSent (1004): Der Umschlag wurde versendet. (Nicht verwendet) +/// EnvelopePartlySigned (1005): Der Umschlag wurde teilweise unterschrieben. +/// EnvelopeCompletelySigned (1006): Der Umschlag wurde vollständig unterschrieben. +/// EnvelopeReportCreated (1007): Ein Abschlussbericht wurde für den Umschlag erstellt. +/// EnvelopeArchived (1008): Der Umschlag wurde archiviert. +/// EnvelopeDeleted (1009): Der Umschlag wurde gelöscht. +/// AccessCodeRequested (2001): Der Zugriffscode wurde angefordert. +/// AccessCodeCorrect (2002): Der Zugriffscode war korrekt. +/// AccessCodeIncorrect (2003): Der Zugriffscode war falsch. +/// DocumentOpened (2004): Das Dokument wurde geöffnet. +/// DocumentSigned (2005): Ein Dokument wurde unterschrieben. +/// SignatureConfirmed (2006): Die Signatur wurde bestätigt. +/// DocumentRejected (2007): Ein Dokument wurde abgelehnt. +/// EnvelopeShared (2008): Der Umschlag wurde geteilt. +/// EnvelopeViewed (2009): Der Umschlag wurde angesehen. +/// DocumentForwarded (4001): Das Dokument wurde weitergeleitet. +/// MessageInvitationSent (3001): Einladung wurde gesendet (vom Trigger verwendet). +/// MessageAccessCodeSent (3002): Zugriffscode wurde gesendet. +/// MessageConfirmationSent (3003): Bestätigungsnachricht wurde gesendet. +/// MessageDeletionSent (3004): Löschbenachrichtigung wurde gesendet. +/// MessageCompletionSent (3005): Abschlussbenachrichtigung wurde gesendet. +/// +/// +/// Der minimale Statuswert, der berücksichtigt werden soll. +/// Der maximale Statuswert, der berücksichtigt werden soll. +/// Eine Liste von Statuswerten, die ignoriert werden sollen. +public record EnvelopeStatusQuery( + int? Min = null, + int? Max = null, + int[]? Ignore = null) +{ +} diff --git a/EnvelopeGenerator.Application/EnvelopeReceivers/Queries/Read/ReadEnvelopeReceiverQuery.cs b/EnvelopeGenerator.Application/EnvelopeReceivers/Queries/Read/ReadEnvelopeReceiverQuery.cs index c0465dc2..3abf9d84 100644 --- a/EnvelopeGenerator.Application/EnvelopeReceivers/Queries/Read/ReadEnvelopeReceiverQuery.cs +++ b/EnvelopeGenerator.Application/EnvelopeReceivers/Queries/Read/ReadEnvelopeReceiverQuery.cs @@ -1,4 +1,4 @@ -using EnvelopeGenerator.Application.EnvelopeHistories; +using EnvelopeGenerator.Application.Histories; using EnvelopeGenerator.Application.Envelopes.Queries.Read; using EnvelopeGenerator.Application.Receivers.Queries.Read; using MediatR; @@ -16,7 +16,7 @@ namespace EnvelopeGenerator.Application.EnvelopeReceivers.Queries.Read; /// sowie zusätzliche Metadaten. /// /// Umschlag oder Empfängerstatus. -public record ReadEnvelopeReceiverQuery(StatusQuery? Status = null) : EnvelopeReceiverQuery(Status), IRequest +public record ReadEnvelopeReceiverQuery(EnvelopeStatusQuery? Status = null) : EnvelopeReceiverQuery(Status), IRequest { /// /// Der Umschlag, der mit dem Empfänger verknüpft ist. diff --git a/EnvelopeGenerator.Application/EnvelopeHistories/EnvelopeHistoryQuery.cs b/EnvelopeGenerator.Application/Histories/HistoryQuery.cs similarity index 85% rename from EnvelopeGenerator.Application/EnvelopeHistories/EnvelopeHistoryQuery.cs rename to EnvelopeGenerator.Application/Histories/HistoryQuery.cs index 70513435..3b164539 100644 --- a/EnvelopeGenerator.Application/EnvelopeHistories/EnvelopeHistoryQuery.cs +++ b/EnvelopeGenerator.Application/Histories/HistoryQuery.cs @@ -2,7 +2,7 @@ using EnvelopeGenerator.Application.Receivers; using static EnvelopeGenerator.Common.Constants; -namespace EnvelopeGenerator.Application.EnvelopeHistories; +namespace EnvelopeGenerator.Application.Histories; /// /// Repräsentiert eine Abfrage für die Verlaufshistorie eines Umschlags. @@ -11,7 +11,7 @@ namespace EnvelopeGenerator.Application.EnvelopeHistories; /// Die Abfrage, die den Umschlag beschreibt. /// Die Abfrage, die den Empfänger beschreibt. /// Abfrage zur Steuerung, ob nur der aktuelle Status oder der gesamte Datensatz zurückgegeben wird. -public record EnvelopeHistoryQuery(int EnvelopeId, TEnvelopeQuery? Envelope, TReceiverQuery? Receiver = null, bool? OnlyLast = null) +public record HistoryQuery(int EnvelopeId, TEnvelopeQuery? Envelope, TReceiverQuery? Receiver = null, bool? OnlyLast = null) where TEnvelopeQuery : EnvelopeQuery where TReceiverQuery : ReceiverQuery { diff --git a/EnvelopeGenerator.Application/EnvelopeHistories/Queries/Read/ReadEnvelopeHistoryQuery.cs b/EnvelopeGenerator.Application/Histories/Queries/Read/ReadHistoryQuery.cs similarity index 76% rename from EnvelopeGenerator.Application/EnvelopeHistories/Queries/Read/ReadEnvelopeHistoryQuery.cs rename to EnvelopeGenerator.Application/Histories/Queries/Read/ReadHistoryQuery.cs index 298ca76c..83189eee 100644 --- a/EnvelopeGenerator.Application/EnvelopeHistories/Queries/Read/ReadEnvelopeHistoryQuery.cs +++ b/EnvelopeGenerator.Application/Histories/Queries/Read/ReadHistoryQuery.cs @@ -1,7 +1,7 @@ using EnvelopeGenerator.Application.Envelopes.Queries.Read; using EnvelopeGenerator.Application.Receivers.Queries.Read; -namespace EnvelopeGenerator.Application.EnvelopeHistories.Queries.Read; +namespace EnvelopeGenerator.Application.Histories.Queries.Read; /// /// Repräsentiert eine Abfrage für die Verlaufshistorie eines Umschlags. @@ -10,9 +10,9 @@ namespace EnvelopeGenerator.Application.EnvelopeHistories.Queries.Read; /// Die Abfrage, die den Umschlag beschreibt. /// Die Abfrage, die den Empfänger beschreibt. /// Abfrage zur Steuerung, ob nur der aktuelle Status oder der gesamte Datensatz zurückgegeben wird. -public record ReadEnvelopeHistoryQuery( +public record ReadHistoryQuery( int EnvelopeId, ReadEnvelopeQuery? Envelope = null, ReadReceiverQuery? Receiver = null, bool? OnlyLast = true) - : EnvelopeHistoryQuery(EnvelopeId, Envelope, Receiver, OnlyLast); + : HistoryQuery(EnvelopeId, Envelope, Receiver, OnlyLast); diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs index f3d5c7e4..049c0186 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs @@ -1,10 +1,8 @@ using DigitalData.Core.DTO; using EnvelopeGenerator.Application.Contracts.Services; -using EnvelopeGenerator.Application.EnvelopeHistories; using EnvelopeGenerator.Application.Envelopes.Queries.Read; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -using static EnvelopeGenerator.Common.Constants; namespace EnvelopeGenerator.GeneratorAPI.Controllers; diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs index f785d4ce..dd8e828a 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs @@ -3,7 +3,6 @@ using EnvelopeGenerator.Application.Contracts.Services; using EnvelopeGenerator.Application.EnvelopeReceivers.Commands.Create; using EnvelopeGenerator.Application.EnvelopeReceivers.Queries.Read; using EnvelopeGenerator.Application.Envelopes.Queries.ReceiverName; -using EnvelopeGenerator.Common; using MediatR; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; @@ -67,7 +66,7 @@ public class EnvelopeReceiverController : ControllerBase return StatusCode(StatusCodes.Status500InternalServerError); } - return await _erService.ReadByUsernameAsync(username: username, min_status: envelopeReceiver.Status.Min, max_status: envelopeReceiver.Status.Min, ignore_statuses: envelopeReceiver.Status.Ignore ?? Array.Empty()).ThenAsync( + return await _erService.ReadByUsernameAsync(username: username).ThenAsync( Success: Ok, Fail: IActionResult (msg, ntc) => { diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs index 844b7f7e..3372a6e1 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs @@ -1,5 +1,5 @@ using EnvelopeGenerator.Application.Contracts.Services; -using EnvelopeGenerator.Application.EnvelopeHistories.Queries.Read; +using EnvelopeGenerator.Application.Histories.Queries.Read; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using static EnvelopeGenerator.Common.Constants; @@ -68,7 +68,7 @@ public class HistoryController : ControllerBase /// Ein unerwarteter Fehler ist aufgetreten. [HttpGet] [Authorize] - public async Task GetAllAsync([FromQuery] ReadEnvelopeHistoryQuery history) + public async Task GetAllAsync([FromQuery] ReadHistoryQuery history) { ReferenceType? refTypEnum = history.ReferenceType; bool withReceiver = false; From 994c844f254a40be1838a5002939ff966169e27d Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Fri, 11 Apr 2025 20:51:21 +0200 Subject: [PATCH 58/76] Refactor envelope and history query structures - Removed `Sender` parameter and properties from `EnvelopeQuery`. - Deleted `SenderQuery` class entirely. - Cleaned up `HistoryQuery` by removing unused `using` directives and `ReferenceType` logic. - Added `Related` parameter to `ReadHistoryQuery` for reference type indication. - Updated `ReferenceType` enum in `Constants.vb` to use explicit integer values. - Modified `HistoryController` to utilize the new `Related` property for determining sender/receiver inclusion. --- .../Envelopes/EnvelopeQuery.cs | 16 ---------- .../Envelopes/SenderQuery.cs | 11 ------- .../Histories/HistoryQuery.cs | 30 ------------------- .../Queries/Read/ReadHistoryQuery.cs | 6 ++-- EnvelopeGenerator.Common/Constants.vb | 2 +- .../Controllers/HistoryController.cs | 5 ++-- 6 files changed, 7 insertions(+), 63 deletions(-) delete mode 100644 EnvelopeGenerator.Application/Envelopes/SenderQuery.cs delete mode 100644 EnvelopeGenerator.Application/Histories/HistoryQuery.cs diff --git a/EnvelopeGenerator.Application/Envelopes/EnvelopeQuery.cs b/EnvelopeGenerator.Application/Envelopes/EnvelopeQuery.cs index fcf6de9d..6c30fab4 100644 --- a/EnvelopeGenerator.Application/Envelopes/EnvelopeQuery.cs +++ b/EnvelopeGenerator.Application/Envelopes/EnvelopeQuery.cs @@ -6,27 +6,11 @@ namespace EnvelopeGenerator.Application.Envelopes; /// Repräsentiert eine Abfrage für Umschläge. /// /// Die eindeutige Kennung des Umschlags. -/// Absender des Schreibens /// Der Status des Umschlags. /// Die universell eindeutige Kennung des Umschlags. public record EnvelopeQuery( int? Id = null, - SenderQuery? Sender = null, int? Status = null, string? Uuid = null) : IRequest { - /// - /// Die eindeutige Kennung des Benutzers. - /// - public int? SenderId => Sender?.Id; - - /// - /// Der Benutzername des Absenders. - /// - public string? SenderUsername => Sender?.Username; - - /// - /// Die E-Mail-Adresse des Benutzers. - /// - public string? SenderEmail => Sender?.Username; }; \ No newline at end of file diff --git a/EnvelopeGenerator.Application/Envelopes/SenderQuery.cs b/EnvelopeGenerator.Application/Envelopes/SenderQuery.cs deleted file mode 100644 index ca0c70a1..00000000 --- a/EnvelopeGenerator.Application/Envelopes/SenderQuery.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace EnvelopeGenerator.Application.Envelopes; - -/// -/// Repräsentiert eine Abfrage für einen Absender. -/// -/// Die eindeutige Kennung des Absenders. -/// Der Benutzername des Absenders. -/// Die E-Mail-Adresse des Absenders. -public record SenderQuery(int? Id = null, string? Username = null, string? Email = null) -{ -} diff --git a/EnvelopeGenerator.Application/Histories/HistoryQuery.cs b/EnvelopeGenerator.Application/Histories/HistoryQuery.cs deleted file mode 100644 index 3b164539..00000000 --- a/EnvelopeGenerator.Application/Histories/HistoryQuery.cs +++ /dev/null @@ -1,30 +0,0 @@ -using EnvelopeGenerator.Application.Envelopes; -using EnvelopeGenerator.Application.Receivers; -using static EnvelopeGenerator.Common.Constants; - -namespace EnvelopeGenerator.Application.Histories; - -/// -/// Repräsentiert eine Abfrage für die Verlaufshistorie eines Umschlags. -/// -/// Die eindeutige Kennung des Umschlags. -/// Die Abfrage, die den Umschlag beschreibt. -/// Die Abfrage, die den Empfänger beschreibt. -/// Abfrage zur Steuerung, ob nur der aktuelle Status oder der gesamte Datensatz zurückgegeben wird. -public record HistoryQuery(int EnvelopeId, TEnvelopeQuery? Envelope, TReceiverQuery? Receiver = null, bool? OnlyLast = null) - where TEnvelopeQuery : EnvelopeQuery - where TReceiverQuery : ReceiverQuery -{ - /// - /// Gibt den Referenztyp des Umschlags an. - /// Wenn der Benutzer des Umschlags definiert ist, wird der Referenztyp als Empfänger betrachtet. - /// Andernfalls, wenn ein Empfänger definiert ist, wird der Referenztyp ebenfalls als Empfänger betrachtet. - /// Ist keiner von beiden definiert, wird der Referenztyp als System betrachtet. - /// - public ReferenceType ReferenceType => - Envelope?.Sender is not null - ? ReferenceType.Receiver - : Receiver is not null - ? ReferenceType.Receiver - : ReferenceType.System; -} diff --git a/EnvelopeGenerator.Application/Histories/Queries/Read/ReadHistoryQuery.cs b/EnvelopeGenerator.Application/Histories/Queries/Read/ReadHistoryQuery.cs index 83189eee..2f8ba313 100644 --- a/EnvelopeGenerator.Application/Histories/Queries/Read/ReadHistoryQuery.cs +++ b/EnvelopeGenerator.Application/Histories/Queries/Read/ReadHistoryQuery.cs @@ -1,5 +1,6 @@ using EnvelopeGenerator.Application.Envelopes.Queries.Read; using EnvelopeGenerator.Application.Receivers.Queries.Read; +using EnvelopeGenerator.Common; namespace EnvelopeGenerator.Application.Histories.Queries.Read; @@ -9,10 +10,11 @@ namespace EnvelopeGenerator.Application.Histories.Queries.Read; /// Die eindeutige Kennung des Umschlags. /// Die Abfrage, die den Umschlag beschreibt. /// Die Abfrage, die den Empfänger beschreibt. +/// Abfrage, die angibt, worauf sich der Datensatz bezieht. Ob er sich auf den Empfänger, den Sender oder das System bezieht, wird durch 0, 1 bzw. 2 dargestellt. /// Abfrage zur Steuerung, ob nur der aktuelle Status oder der gesamte Datensatz zurückgegeben wird. public record ReadHistoryQuery( int EnvelopeId, ReadEnvelopeQuery? Envelope = null, ReadReceiverQuery? Receiver = null, - bool? OnlyLast = true) - : HistoryQuery(EnvelopeId, Envelope, Receiver, OnlyLast); + Constants.ReferenceType? Related = null, + bool? OnlyLast = true); \ No newline at end of file diff --git a/EnvelopeGenerator.Common/Constants.vb b/EnvelopeGenerator.Common/Constants.vb index 4b3d7a33..04905cc6 100644 --- a/EnvelopeGenerator.Common/Constants.vb +++ b/EnvelopeGenerator.Common/Constants.vb @@ -32,7 +32,7 @@ 'TODO: standardize in xwiki Public Enum ReferenceType - Receiver + Receiver = 0 Sender System Unknown diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs index 3372a6e1..63716b05 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs @@ -70,11 +70,10 @@ public class HistoryController : ControllerBase [Authorize] public async Task GetAllAsync([FromQuery] ReadHistoryQuery history) { - ReferenceType? refTypEnum = history.ReferenceType; bool withReceiver = false; bool withSender = false; - switch (refTypEnum) + switch (history.Related) { case ReferenceType.Receiver: withReceiver = true; @@ -86,7 +85,7 @@ public class HistoryController : ControllerBase var histories = await _service.ReadAsync( envelopeId: history.EnvelopeId, - referenceType: refTypEnum, + referenceType: history.Related, withSender: withSender, withReceiver: withReceiver); From afa6dda16f8ee8c117fcc55120ce5fb6c804a950 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Fri, 11 Apr 2025 21:08:23 +0200 Subject: [PATCH 59/76] Update documentation for GetReferenceTypes method Significantly revised the comments for the GetReferenceTypes method in the HistoryController class. Removed previous summary and response code details, and added a detailed description of the roles involved in the envelope sending process (Receiver, Sender, System, Unknown). Improved clarity with a list format and simplified return type documentation. --- .../Controllers/HistoryController.cs | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs index 63716b05..2edc4e41 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs @@ -31,15 +31,20 @@ public class HistoryController : ControllerBase } /// - /// Ruft die verfügbaren Referenztypen ab und gibt sie als Schlüssel-Wert-Paare zurück. + /// An der Versendung eines Umschlags können mehrere Beteiligte beteiligt sein, darunter der Absender, der Empfänger und das System selbst. + /// Der Prozess liefert alle relevanten Nenner, die mit der Schlüsselnummer verbunden sind, und ermöglicht es dem Kunden, + /// die Aktualität und Richtigkeit der Informationen zu überprüfen. + /// + /// 0: Receiver + /// 1: Sender + /// 2: System + /// 3: Unknown + /// (Ein unbekannter Datensatz weist auf einen möglichen Mangel oder eine Unstimmigkeit im Aktualisierungsprozess der Anwendung hin.) + /// /// - /// Ein Ok-Ergebnis mit einem Wörterbuch, das die Referenztypen als Schlüssel-Wert-Paare enthält. - /// Die Anfrage war erfolgreich, und die Referenztypen werden zurückgegeben. - /// Die Anfrage war ungültig oder unvollständig. - /// Der Benutzer ist nicht authentifiziert. - /// Der Benutzer hat keine Berechtigung, auf die Ressource zuzugreifen. - /// Ein unerwarteter Fehler ist aufgetreten. - [HttpGet("reference-type")] + /// + /// + [HttpGet("related")] [Authorize] public IActionResult GetReferenceTypes() { From 1b9b51fbd2b78147f2a8f196287078013bdb9eef Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Fri, 11 Apr 2025 22:35:47 +0200 Subject: [PATCH 60/76] Add GetEnvelopeStatus method to HistoryController Implemented a new method `GetEnvelopeStatus` in the `HistoryController` class. This method is accessible via HTTP GET and requires authorization. It returns a dictionary of envelope statuses, enhancing the API's functionality. Additional comments and documentation have been included to clarify the method's purpose and the statuses it handles. --- .../Controllers/HistoryController.cs | 52 ++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs index 2edc4e41..03a74911 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs @@ -32,7 +32,7 @@ public class HistoryController : ControllerBase /// /// An der Versendung eines Umschlags können mehrere Beteiligte beteiligt sein, darunter der Absender, der Empfänger und das System selbst. - /// Der Prozess liefert alle relevanten Nenner, die mit der Schlüsselnummer verbunden sind, und ermöglicht es dem Kunden, + /// Der Prozess liefert alle relevanten Nenner, die mit der Schlüsselnummer verbunden sind, und ermöglicht es dem Client, /// die Aktualität und Richtigkeit der Informationen zu überprüfen. /// /// 0: Receiver @@ -61,6 +61,56 @@ public class HistoryController : ControllerBase return Ok(referenceTypes); } + /// + /// Gibt alle möglichen Status in einem Verlaufsdatensatz zurück. + /// Dies wird hinzugefügt, damit Client-Anwendungen sich selbst auf dem neuesten Stand halten können. + /// + /// 0: Invalid + /// 1001: EnvelopeCreated + /// 1002: EnvelopeSaved + /// 1003: EnvelopeQueued + /// 1004: EnvelopeSent (Nicht verwendet) + /// 1005: EnvelopePartlySigned + /// 1006: EnvelopeCompletelySigned + /// 1007: EnvelopeReportCreated + /// 1008: EnvelopeArchived + /// 1009: EnvelopeDeleted + /// 2001: AccessCodeRequested + /// 2002: AccessCodeCorrect + /// 2003: AccessCodeIncorrect + /// 2004: DocumentOpened + /// 2005: DocumentSigned + /// 4001: DocumentForwarded + /// 2006: SignatureConfirmed + /// 2007: DocumentRejected + /// 2008: EnvelopeShared + /// 2009: EnvelopeViewed + /// 3001: MessageInvitationSent (Wird von Trigger verwendet) + /// 3002: MessageAccessCodeSent + /// 3003: MessageConfirmationSent + /// 3004: MessageDeletionSent + /// 3005: MessageCompletionSent + /// + /// + /// + /// + [HttpGet("status")] + [Authorize] + public IActionResult GetEnvelopeStatus(ReferenceType? related = null) + { + // Enum zu Schlüssel-Wert-Paar + var referenceTypes = Enum.GetValues(typeof(EnvelopeStatus)) + .Cast() + .ToDictionary(rt => + { + var key = rt.ToString(); + var keyAsCamelCase = char.ToLower(key[0]) + key[1..]; + return keyAsCamelCase; + }, rt => (int)rt); + + return Ok(referenceTypes); + } + /// /// Ruft die gesamte Umschlaghistorie basierend auf den angegebenen Abfrageparametern ab. /// From ded88383b35ef6115dc25966dde7e9b6351d14ba Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Fri, 11 Apr 2025 22:51:40 +0200 Subject: [PATCH 61/76] refactor(HistoryController): Added new using directives for EmailProfiler and EF Core. - Expanded XML documentation for GetEnvelopeStatus method, clarifying the related parameter and its usage. - Updated method signature to include [FromQuery] for better parameter binding from the query string. --- .../Controllers/HistoryController.cs | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs index 03a74911..35bd2a79 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs @@ -1,7 +1,11 @@ -using EnvelopeGenerator.Application.Contracts.Services; +using DigitalData.EmailProfilerDispatcher.Abstraction.Entities; +using EnvelopeGenerator.Application.Contracts.Services; using EnvelopeGenerator.Application.Histories.Queries.Read; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore.Metadata.Internal; +using System.Drawing; +using System.Runtime.ConstrainedExecution; using static EnvelopeGenerator.Common.Constants; @@ -92,11 +96,18 @@ public class HistoryController : ControllerBase /// 3005: MessageCompletionSent /// /// - /// + /// + /// Abfrageparameter, der angibt, auf welche Referenz sich der Status bezieht. + /// 0 - Sender: Die Status des Senders werden von der Anwendung Envelope.Form aktualisiert und haben die Codes, die mit 1* beginnen. + /// 1 - Receiver: Die Status der Empfänger werden von der Anwendung Envelope.Web aktualisiert und haben die Codes, die mit 2* beginnen. + /// 2 - System: Diese werden durch Datenbank-Trigger aktualisiert und sind in den Tabellen EnvelopeHistory und EmailOut zu finden.Sie arbeiten + /// integriert mit der Anwendung EmailProfiler, um E-Mails zu versenden und haben die Codes, die mit 3* beginnen. + /// + /// Gibt die HTTP-Antwort zurück. /// [HttpGet("status")] [Authorize] - public IActionResult GetEnvelopeStatus(ReferenceType? related = null) + public IActionResult GetEnvelopeStatus([FromQuery] ReferenceType? related = null) { // Enum zu Schlüssel-Wert-Paar var referenceTypes = Enum.GetValues(typeof(EnvelopeStatus)) From 7389909d774ec09f6714b6588ff0a933cda448e2 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Fri, 11 Apr 2025 22:56:38 +0200 Subject: [PATCH 62/76] Update comments in HistoryController class Revised comments to remove outdated information about letter sending parties. Added new comments to clarify the method's functionality in returning status references for history records, enabling client applications to stay updated. --- .../Controllers/HistoryController.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs index 35bd2a79..91f2286a 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs @@ -35,9 +35,8 @@ public class HistoryController : ControllerBase } /// - /// An der Versendung eines Umschlags können mehrere Beteiligte beteiligt sein, darunter der Absender, der Empfänger und das System selbst. - /// Der Prozess liefert alle relevanten Nenner, die mit der Schlüsselnummer verbunden sind, und ermöglicht es dem Client, - /// die Aktualität und Richtigkeit der Informationen zu überprüfen. + /// Gibt alle möglichen Verweise auf alle möglichen Status in einem Verlaufsdatensatz zurück. (z. B. DocumentSigned bezieht sich auf Receiver.) + /// Dies wird hinzugefügt, damit Client-Anwendungen sich selbst auf dem neuesten Stand halten können. /// /// 0: Receiver /// 1: Sender From fbd09cb570227f097abdd55b6d455efe6a6aeaa2 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Fri, 11 Apr 2025 23:18:30 +0200 Subject: [PATCH 63/76] Update comments in HistoryController for clarity Improved descriptions of historical records related to sender, receiver, system, and unknown statuses. Enhanced formatting and provided detailed explanations of associated status codes for better readability. --- .../Controllers/HistoryController.cs | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs index 91f2286a..68fbf780 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs @@ -38,11 +38,14 @@ public class HistoryController : ControllerBase /// Gibt alle möglichen Verweise auf alle möglichen Status in einem Verlaufsdatensatz zurück. (z. B. DocumentSigned bezieht sich auf Receiver.) /// Dies wird hinzugefügt, damit Client-Anwendungen sich selbst auf dem neuesten Stand halten können. /// - /// 0: Receiver - /// 1: Sender - /// 2: System - /// 3: Unknown - /// (Ein unbekannter Datensatz weist auf einen möglichen Mangel oder eine Unstimmigkeit im Aktualisierungsprozess der Anwendung hin.) + /// 0 - Receiver: + /// Historische Datensätze, die sich auf den Status des Absenders beziehen. Sie haben Statuscodes, die mit 1* beginnen. + /// 1 - Sender: + /// Historische Datensätze über den Status der Empfänger. Diese haben Statuscodes, die mit 2* beginnen. + /// 2 - System: + /// Historische Datensätze, die sich auf den allgemeinen Zustand des Umschlags beziehen. Diese haben Statuscodes, die mit 3* beginnen. + /// 3 - Unknown: + /// Ein unbekannter Datensatz weist auf einen möglichen Mangel oder eine Unstimmigkeit im Aktualisierungsprozess der Anwendung hin. /// /// /// @@ -97,8 +100,8 @@ public class HistoryController : ControllerBase /// /// /// Abfrageparameter, der angibt, auf welche Referenz sich der Status bezieht. - /// 0 - Sender: Die Status des Senders werden von der Anwendung Envelope.Form aktualisiert und haben die Codes, die mit 1* beginnen. - /// 1 - Receiver: Die Status der Empfänger werden von der Anwendung Envelope.Web aktualisiert und haben die Codes, die mit 2* beginnen. + /// 0 - Sender: Historische Datensätze, die sich auf den Status des Absenders beziehen. Sie haben Statuscodes, die mit 1* beginnen. + /// 1 - Receiver: Historische Datensätze über den Status der Empfänger. Diese haben Statuscodes, die mit 2* beginnen. /// 2 - System: Diese werden durch Datenbank-Trigger aktualisiert und sind in den Tabellen EnvelopeHistory und EmailOut zu finden.Sie arbeiten /// integriert mit der Anwendung EmailProfiler, um E-Mails zu versenden und haben die Codes, die mit 3* beginnen. /// From 6e641395d51e09d2d8a2541dc9cbf88f566b6f7e Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Fri, 11 Apr 2025 23:34:43 +0200 Subject: [PATCH 64/76] Add JWT Bearer authentication to Swagger setup Implemented security definitions and requirements for JWT Bearer authentication in the Swagger configuration. This includes defining a "Bearer" security scheme and adding a security requirement to support JWT authorization via the Authorization header. --- EnvelopeGenerator.GeneratorAPI/Program.cs | 25 +++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/EnvelopeGenerator.GeneratorAPI/Program.cs b/EnvelopeGenerator.GeneratorAPI/Program.cs index 3bffafe9..81a01f4c 100644 --- a/EnvelopeGenerator.GeneratorAPI/Program.cs +++ b/EnvelopeGenerator.GeneratorAPI/Program.cs @@ -49,6 +49,31 @@ builder.Services.AddSwaggerGen(options => }, }); + options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme + { + Name = "Authorization", + Type = SecuritySchemeType.Http, + Scheme = "Bearer", + BearerFormat = "JWT", + In = ParameterLocation.Header, + Description = "JWT-Autorisierungs-Header unter Verwendung des Bearer-Schemas.", + }); + + options.AddSecurityRequirement(new OpenApiSecurityRequirement + { + { + new OpenApiSecurityScheme + { + Reference = new OpenApiReference + { + Type = ReferenceType.SecurityScheme, + Id = "Bearer" + } + }, + new string[] {} + } + }); + var xmlFiles = Directory.GetFiles(AppContext.BaseDirectory, "*.xml"); foreach (var xmlFile in xmlFiles) { From e3dfa8dd3957e8579f7e3fdc9a3beba1836ff99d Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Fri, 11 Apr 2025 23:41:47 +0200 Subject: [PATCH 65/76] Add ApiExplorerSettings to DTOs and update controllers This commit introduces the `[ApiExplorerSettings(IgnoreApi = true)]` attribute to various DTO classes to exclude them from API documentation. The `using Microsoft.AspNetCore.Mvc;` directive has been added to several files to support ASP.NET Core MVC features. Additionally, comments in `HistoryController.cs` have been reformatted for clarity, and `LocalizationController.cs` has been updated with standard API controller attributes. These changes improve code organization and maintain cleaner API documentation. --- .../DTOs/ConfigDto.cs | 2 + .../DTOs/DocumentReceiverElementDto.cs | 2 + .../DTOs/DocumentStatusDto.cs | 2 + .../DTOs/EmailTemplateDto.cs | 2 + .../DTOs/EnvelopeCertificateDto.cs | 2 + .../DTOs/EnvelopeDocumentDto.cs | 2 + .../DTOs/EnvelopeDto.cs | 2 + .../EnvelopeHistoryCreateDto.cs | 5 +- .../EnvelopeHistory/EnvelopeHistoryDto.cs | 2 + .../EnvelopeReceiverBasicDto.cs | 2 + .../EnvelopeReceiver/EnvelopeReceiverDto.cs | 2 + .../EnvelopeReceiverSecretDto.cs | 5 +- .../EnvelopeReceiverReadOnlyCreateDto.cs | 4 +- .../EnvelopeReceiverReadOnlyDto.cs | 2 + .../EnvelopeReceiverReadOnlyUpdateDto.cs | 2 + .../DTOs/EnvelopeTypeDto.cs | 2 + .../DTOs/Messaging/GtxMessagingResponse.cs | 5 +- .../DTOs/Messaging/SmsResponse.cs | 5 +- .../DTOs/Receiver/ReceiverCreateDto.cs | 4 +- .../DTOs/Receiver/ReceiverReadDto.cs | 2 + .../DTOs/Receiver/ReceiverUpdateDto.cs | 2 + .../DTOs/UserReceiverDto.cs | 2 + .../Controllers/HistoryController.cs | 73 +++++++++---------- .../Controllers/LocalizationController.cs | 1 + 24 files changed, 88 insertions(+), 46 deletions(-) diff --git a/EnvelopeGenerator.Application/DTOs/ConfigDto.cs b/EnvelopeGenerator.Application/DTOs/ConfigDto.cs index 2dc76824..721d7524 100644 --- a/EnvelopeGenerator.Application/DTOs/ConfigDto.cs +++ b/EnvelopeGenerator.Application/DTOs/ConfigDto.cs @@ -1,9 +1,11 @@ using DigitalData.Core.Abstractions; +using Microsoft.AspNetCore.Mvc; using System.ComponentModel.DataAnnotations.Schema; using System.Text.Json.Serialization; namespace EnvelopeGenerator.Application.DTOs { + [ApiExplorerSettings(IgnoreApi = true)] public record ConfigDto( string DocumentPath, int SendingProfile, diff --git a/EnvelopeGenerator.Application/DTOs/DocumentReceiverElementDto.cs b/EnvelopeGenerator.Application/DTOs/DocumentReceiverElementDto.cs index aff23a33..04b9d0ad 100644 --- a/EnvelopeGenerator.Application/DTOs/DocumentReceiverElementDto.cs +++ b/EnvelopeGenerator.Application/DTOs/DocumentReceiverElementDto.cs @@ -1,7 +1,9 @@ using DigitalData.Core.Abstractions; +using Microsoft.AspNetCore.Mvc; namespace EnvelopeGenerator.Application.DTOs { + [ApiExplorerSettings(IgnoreApi = true)] public record DocumentReceiverElementDto( int Id, int DocumentId, diff --git a/EnvelopeGenerator.Application/DTOs/DocumentStatusDto.cs b/EnvelopeGenerator.Application/DTOs/DocumentStatusDto.cs index b24724ef..a098746a 100644 --- a/EnvelopeGenerator.Application/DTOs/DocumentStatusDto.cs +++ b/EnvelopeGenerator.Application/DTOs/DocumentStatusDto.cs @@ -1,7 +1,9 @@ using DigitalData.Core.Abstractions; +using Microsoft.AspNetCore.Mvc; namespace EnvelopeGenerator.Application.DTOs { + [ApiExplorerSettings(IgnoreApi = true)] public record DocumentStatusDto( int Id, int EnvelopeId, diff --git a/EnvelopeGenerator.Application/DTOs/EmailTemplateDto.cs b/EnvelopeGenerator.Application/DTOs/EmailTemplateDto.cs index 8eaa798f..e22a4844 100644 --- a/EnvelopeGenerator.Application/DTOs/EmailTemplateDto.cs +++ b/EnvelopeGenerator.Application/DTOs/EmailTemplateDto.cs @@ -1,7 +1,9 @@ using DigitalData.Core.Abstractions; +using Microsoft.AspNetCore.Mvc; namespace EnvelopeGenerator.Application.DTOs { + [ApiExplorerSettings(IgnoreApi = true)] public record EmailTemplateDto( int Id, string Name, diff --git a/EnvelopeGenerator.Application/DTOs/EnvelopeCertificateDto.cs b/EnvelopeGenerator.Application/DTOs/EnvelopeCertificateDto.cs index 34d38990..49852dce 100644 --- a/EnvelopeGenerator.Application/DTOs/EnvelopeCertificateDto.cs +++ b/EnvelopeGenerator.Application/DTOs/EnvelopeCertificateDto.cs @@ -1,7 +1,9 @@ using DigitalData.Core.Abstractions; +using Microsoft.AspNetCore.Mvc; namespace EnvelopeGenerator.Application.DTOs { + [ApiExplorerSettings(IgnoreApi = true)] public record EnvelopeCertificateDto( int Id, int EnvelopeId, diff --git a/EnvelopeGenerator.Application/DTOs/EnvelopeDocumentDto.cs b/EnvelopeGenerator.Application/DTOs/EnvelopeDocumentDto.cs index a9422f02..97ca20c2 100644 --- a/EnvelopeGenerator.Application/DTOs/EnvelopeDocumentDto.cs +++ b/EnvelopeGenerator.Application/DTOs/EnvelopeDocumentDto.cs @@ -1,7 +1,9 @@ using DigitalData.Core.Abstractions; +using Microsoft.AspNetCore.Mvc; namespace EnvelopeGenerator.Application.DTOs { + [ApiExplorerSettings(IgnoreApi = true)] public record EnvelopeDocumentDto ( int Id, diff --git a/EnvelopeGenerator.Application/DTOs/EnvelopeDto.cs b/EnvelopeGenerator.Application/DTOs/EnvelopeDto.cs index e0bbe042..6a038d83 100644 --- a/EnvelopeGenerator.Application/DTOs/EnvelopeDto.cs +++ b/EnvelopeGenerator.Application/DTOs/EnvelopeDto.cs @@ -2,9 +2,11 @@ using DigitalData.EmailProfilerDispatcher.Abstraction.Attributes; using DigitalData.UserManager.Application.DTOs.User; using EnvelopeGenerator.Domain.Entities; +using Microsoft.AspNetCore.Mvc; namespace EnvelopeGenerator.Application.DTOs { + [ApiExplorerSettings(IgnoreApi = true)] public record EnvelopeDto() : IUnique { public int Id { get; set; } diff --git a/EnvelopeGenerator.Application/DTOs/EnvelopeHistory/EnvelopeHistoryCreateDto.cs b/EnvelopeGenerator.Application/DTOs/EnvelopeHistory/EnvelopeHistoryCreateDto.cs index 92264d05..731b33a1 100644 --- a/EnvelopeGenerator.Application/DTOs/EnvelopeHistory/EnvelopeHistoryCreateDto.cs +++ b/EnvelopeGenerator.Application/DTOs/EnvelopeHistory/EnvelopeHistoryCreateDto.cs @@ -1,5 +1,8 @@ -namespace EnvelopeGenerator.Application.DTOs.EnvelopeHistory +using Microsoft.AspNetCore.Mvc; + +namespace EnvelopeGenerator.Application.DTOs.EnvelopeHistory { + [ApiExplorerSettings(IgnoreApi = true)] public record EnvelopeHistoryCreateDto( int EnvelopeId, string UserReference, diff --git a/EnvelopeGenerator.Application/DTOs/EnvelopeHistory/EnvelopeHistoryDto.cs b/EnvelopeGenerator.Application/DTOs/EnvelopeHistory/EnvelopeHistoryDto.cs index 0de3f3fb..3d5e15dc 100644 --- a/EnvelopeGenerator.Application/DTOs/EnvelopeHistory/EnvelopeHistoryDto.cs +++ b/EnvelopeGenerator.Application/DTOs/EnvelopeHistory/EnvelopeHistoryDto.cs @@ -2,10 +2,12 @@ using DigitalData.Core.DTO; using DigitalData.UserManager.Application.DTOs.User; using EnvelopeGenerator.Application.DTOs.Receiver; +using Microsoft.AspNetCore.Mvc; using static EnvelopeGenerator.Common.Constants; namespace EnvelopeGenerator.Application.DTOs.EnvelopeHistory { + [ApiExplorerSettings(IgnoreApi = true)] public record EnvelopeHistoryDto( long Id, int EnvelopeId, diff --git a/EnvelopeGenerator.Application/DTOs/EnvelopeReceiver/EnvelopeReceiverBasicDto.cs b/EnvelopeGenerator.Application/DTOs/EnvelopeReceiver/EnvelopeReceiverBasicDto.cs index 64c5b869..5bbf3891 100644 --- a/EnvelopeGenerator.Application/DTOs/EnvelopeReceiver/EnvelopeReceiverBasicDto.cs +++ b/EnvelopeGenerator.Application/DTOs/EnvelopeReceiver/EnvelopeReceiverBasicDto.cs @@ -1,8 +1,10 @@ using DigitalData.Core.Abstractions; using DigitalData.EmailProfilerDispatcher.Abstraction.Attributes; +using Microsoft.AspNetCore.Mvc; namespace EnvelopeGenerator.Application.DTOs.EnvelopeReceiver { + [ApiExplorerSettings(IgnoreApi = true)] public record EnvelopeReceiverBasicDto() : IUnique<(int Envelope, int Receiver)> { public (int Envelope, int Receiver) Id => (Envelope: EnvelopeId, Receiver: ReceiverId); diff --git a/EnvelopeGenerator.Application/DTOs/EnvelopeReceiver/EnvelopeReceiverDto.cs b/EnvelopeGenerator.Application/DTOs/EnvelopeReceiver/EnvelopeReceiverDto.cs index 49625eee..0ab1ac58 100644 --- a/EnvelopeGenerator.Application/DTOs/EnvelopeReceiver/EnvelopeReceiverDto.cs +++ b/EnvelopeGenerator.Application/DTOs/EnvelopeReceiver/EnvelopeReceiverDto.cs @@ -1,7 +1,9 @@ using EnvelopeGenerator.Application.DTOs.Receiver; +using Microsoft.AspNetCore.Mvc; namespace EnvelopeGenerator.Application.DTOs.EnvelopeReceiver { + [ApiExplorerSettings(IgnoreApi = true)] public record EnvelopeReceiverDto() : EnvelopeReceiverBasicDto() { public EnvelopeDto? Envelope { get; set; } diff --git a/EnvelopeGenerator.Application/DTOs/EnvelopeReceiver/EnvelopeReceiverSecretDto.cs b/EnvelopeGenerator.Application/DTOs/EnvelopeReceiver/EnvelopeReceiverSecretDto.cs index 9470766e..df380980 100644 --- a/EnvelopeGenerator.Application/DTOs/EnvelopeReceiver/EnvelopeReceiverSecretDto.cs +++ b/EnvelopeGenerator.Application/DTOs/EnvelopeReceiver/EnvelopeReceiverSecretDto.cs @@ -1,5 +1,8 @@ -namespace EnvelopeGenerator.Application.DTOs.EnvelopeReceiver +using Microsoft.AspNetCore.Mvc; + +namespace EnvelopeGenerator.Application.DTOs.EnvelopeReceiver { + [ApiExplorerSettings(IgnoreApi = true)] public record EnvelopeReceiverSecretDto() : EnvelopeReceiverDto() { public string? AccessCode { get; init; } diff --git a/EnvelopeGenerator.Application/DTOs/EnvelopeReceiverReadOnly/EnvelopeReceiverReadOnlyCreateDto.cs b/EnvelopeGenerator.Application/DTOs/EnvelopeReceiverReadOnly/EnvelopeReceiverReadOnlyCreateDto.cs index 434b9fd9..2cb09b81 100644 --- a/EnvelopeGenerator.Application/DTOs/EnvelopeReceiverReadOnly/EnvelopeReceiverReadOnlyCreateDto.cs +++ b/EnvelopeGenerator.Application/DTOs/EnvelopeReceiverReadOnly/EnvelopeReceiverReadOnlyCreateDto.cs @@ -1,8 +1,10 @@ -using System.ComponentModel.DataAnnotations; +using Microsoft.AspNetCore.Mvc; +using System.ComponentModel.DataAnnotations; using System.Text.Json.Serialization; namespace EnvelopeGenerator.Application.DTOs.EnvelopeReceiverReadOnly { + [ApiExplorerSettings(IgnoreApi = true)] public record EnvelopeReceiverReadOnlyCreateDto( DateTime DateValid) { diff --git a/EnvelopeGenerator.Application/DTOs/EnvelopeReceiverReadOnly/EnvelopeReceiverReadOnlyDto.cs b/EnvelopeGenerator.Application/DTOs/EnvelopeReceiverReadOnly/EnvelopeReceiverReadOnlyDto.cs index 88417d66..b2427694 100644 --- a/EnvelopeGenerator.Application/DTOs/EnvelopeReceiverReadOnly/EnvelopeReceiverReadOnlyDto.cs +++ b/EnvelopeGenerator.Application/DTOs/EnvelopeReceiverReadOnly/EnvelopeReceiverReadOnlyDto.cs @@ -1,7 +1,9 @@ using EnvelopeGenerator.Application.DTOs.Receiver; +using Microsoft.AspNetCore.Mvc; namespace EnvelopeGenerator.Application.DTOs.EnvelopeReceiverReadOnly { + [ApiExplorerSettings(IgnoreApi = true)] public record EnvelopeReceiverReadOnlyDto( long Id, long EnvelopeId, diff --git a/EnvelopeGenerator.Application/DTOs/EnvelopeReceiverReadOnly/EnvelopeReceiverReadOnlyUpdateDto.cs b/EnvelopeGenerator.Application/DTOs/EnvelopeReceiverReadOnly/EnvelopeReceiverReadOnlyUpdateDto.cs index 356524a2..532caee1 100644 --- a/EnvelopeGenerator.Application/DTOs/EnvelopeReceiverReadOnly/EnvelopeReceiverReadOnlyUpdateDto.cs +++ b/EnvelopeGenerator.Application/DTOs/EnvelopeReceiverReadOnly/EnvelopeReceiverReadOnlyUpdateDto.cs @@ -1,7 +1,9 @@ using DigitalData.Core.Abstractions; +using Microsoft.AspNetCore.Mvc; namespace EnvelopeGenerator.Application.DTOs.EnvelopeReceiverReadOnly { + [ApiExplorerSettings(IgnoreApi = true)] public record EnvelopeReceiverReadOnlyUpdateDto( long Id, DateTime DateValid, diff --git a/EnvelopeGenerator.Application/DTOs/EnvelopeTypeDto.cs b/EnvelopeGenerator.Application/DTOs/EnvelopeTypeDto.cs index f7f55ac3..05be1eac 100644 --- a/EnvelopeGenerator.Application/DTOs/EnvelopeTypeDto.cs +++ b/EnvelopeGenerator.Application/DTOs/EnvelopeTypeDto.cs @@ -1,7 +1,9 @@ using DigitalData.Core.Abstractions; +using Microsoft.AspNetCore.Mvc; namespace EnvelopeGenerator.Application.DTOs { + [ApiExplorerSettings(IgnoreApi = true)] public record EnvelopeTypeDto( int Id, string Title, diff --git a/EnvelopeGenerator.Application/DTOs/Messaging/GtxMessagingResponse.cs b/EnvelopeGenerator.Application/DTOs/Messaging/GtxMessagingResponse.cs index e198038c..33feb685 100644 --- a/EnvelopeGenerator.Application/DTOs/Messaging/GtxMessagingResponse.cs +++ b/EnvelopeGenerator.Application/DTOs/Messaging/GtxMessagingResponse.cs @@ -1,4 +1,7 @@ -namespace EnvelopeGenerator.Application.DTOs.Messaging +using Microsoft.AspNetCore.Mvc; + +namespace EnvelopeGenerator.Application.DTOs.Messaging { + [ApiExplorerSettings(IgnoreApi = true)] public class GtxMessagingResponse : Dictionary { } } \ No newline at end of file diff --git a/EnvelopeGenerator.Application/DTOs/Messaging/SmsResponse.cs b/EnvelopeGenerator.Application/DTOs/Messaging/SmsResponse.cs index 1d82020b..3977cc1a 100644 --- a/EnvelopeGenerator.Application/DTOs/Messaging/SmsResponse.cs +++ b/EnvelopeGenerator.Application/DTOs/Messaging/SmsResponse.cs @@ -1,5 +1,8 @@ -namespace EnvelopeGenerator.Application.DTOs.Messaging +using Microsoft.AspNetCore.Mvc; + +namespace EnvelopeGenerator.Application.DTOs.Messaging { + [ApiExplorerSettings(IgnoreApi = true)] public record SmsResponse { public required bool Ok { get; init; } diff --git a/EnvelopeGenerator.Application/DTOs/Receiver/ReceiverCreateDto.cs b/EnvelopeGenerator.Application/DTOs/Receiver/ReceiverCreateDto.cs index 54b90b4b..b5605c94 100644 --- a/EnvelopeGenerator.Application/DTOs/Receiver/ReceiverCreateDto.cs +++ b/EnvelopeGenerator.Application/DTOs/Receiver/ReceiverCreateDto.cs @@ -1,9 +1,11 @@ -using System.ComponentModel.DataAnnotations; +using Microsoft.AspNetCore.Mvc; +using System.ComponentModel.DataAnnotations; using System.Security.Cryptography; using System.Text; namespace EnvelopeGenerator.Application.DTOs.Receiver { + [ApiExplorerSettings(IgnoreApi = true)] public record ReceiverCreateDto([EmailAddress] string EmailAddress, string? TotpSecretkey = null) { public string Signature => sha256HexOfMail.Value; diff --git a/EnvelopeGenerator.Application/DTOs/Receiver/ReceiverReadDto.cs b/EnvelopeGenerator.Application/DTOs/Receiver/ReceiverReadDto.cs index 7759885a..41e380c8 100644 --- a/EnvelopeGenerator.Application/DTOs/Receiver/ReceiverReadDto.cs +++ b/EnvelopeGenerator.Application/DTOs/Receiver/ReceiverReadDto.cs @@ -2,10 +2,12 @@ using DigitalData.Core.DTO; using DigitalData.EmailProfilerDispatcher.Abstraction.Attributes; using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver; +using Microsoft.AspNetCore.Mvc; using System.Text.Json.Serialization; namespace EnvelopeGenerator.Application.DTOs.Receiver; +[ApiExplorerSettings(IgnoreApi = true)] public record ReceiverReadDto( int Id, string EmailAddress, diff --git a/EnvelopeGenerator.Application/DTOs/Receiver/ReceiverUpdateDto.cs b/EnvelopeGenerator.Application/DTOs/Receiver/ReceiverUpdateDto.cs index 88482822..f4d89410 100644 --- a/EnvelopeGenerator.Application/DTOs/Receiver/ReceiverUpdateDto.cs +++ b/EnvelopeGenerator.Application/DTOs/Receiver/ReceiverUpdateDto.cs @@ -1,5 +1,7 @@ using DigitalData.Core.Abstractions; +using Microsoft.AspNetCore.Mvc; namespace EnvelopeGenerator.Application.DTOs.Receiver; +[ApiExplorerSettings(IgnoreApi = true)] public record ReceiverUpdateDto(int Id, string? TotpSecretkey = null, DateTime? TfaRegDeadline = null) : IUnique; \ No newline at end of file diff --git a/EnvelopeGenerator.Application/DTOs/UserReceiverDto.cs b/EnvelopeGenerator.Application/DTOs/UserReceiverDto.cs index 8630838a..5a46789f 100644 --- a/EnvelopeGenerator.Application/DTOs/UserReceiverDto.cs +++ b/EnvelopeGenerator.Application/DTOs/UserReceiverDto.cs @@ -1,7 +1,9 @@ using DigitalData.Core.Abstractions; +using Microsoft.AspNetCore.Mvc; namespace EnvelopeGenerator.Application.DTOs { + [ApiExplorerSettings(IgnoreApi = true)] public record UserReceiverDto( int Id, int UserId, diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs index 68fbf780..0569bf0d 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs @@ -3,9 +3,6 @@ using EnvelopeGenerator.Application.Contracts.Services; using EnvelopeGenerator.Application.Histories.Queries.Read; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -using Microsoft.EntityFrameworkCore.Metadata.Internal; -using System.Drawing; -using System.Runtime.ConstrainedExecution; using static EnvelopeGenerator.Common.Constants; @@ -37,16 +34,14 @@ public class HistoryController : ControllerBase /// /// Gibt alle möglichen Verweise auf alle möglichen Status in einem Verlaufsdatensatz zurück. (z. B. DocumentSigned bezieht sich auf Receiver.) /// Dies wird hinzugefügt, damit Client-Anwendungen sich selbst auf dem neuesten Stand halten können. - /// - /// 0 - Receiver: - /// Historische Datensätze, die sich auf den Status des Absenders beziehen. Sie haben Statuscodes, die mit 1* beginnen. - /// 1 - Sender: - /// Historische Datensätze über den Status der Empfänger. Diese haben Statuscodes, die mit 2* beginnen. - /// 2 - System: - /// Historische Datensätze, die sich auf den allgemeinen Zustand des Umschlags beziehen. Diese haben Statuscodes, die mit 3* beginnen. - /// 3 - Unknown: - /// Ein unbekannter Datensatz weist auf einen möglichen Mangel oder eine Unstimmigkeit im Aktualisierungsprozess der Anwendung hin. - /// + /// 0 - Receiver: + /// Historische Datensätze, die sich auf den Status des Absenders beziehen. Sie haben Statuscodes, die mit 1* beginnen. + /// 1 - Sender: + /// Historische Datensätze über den Status der Empfänger. Diese haben Statuscodes, die mit 2* beginnen. + /// 2 - System: + /// Historische Datensätze, die sich auf den allgemeinen Zustand des Umschlags beziehen. Diese haben Statuscodes, die mit 3* beginnen. + /// 3 - Unknown: + /// Ein unbekannter Datensatz weist auf einen möglichen Mangel oder eine Unstimmigkeit im Aktualisierungsprozess der Anwendung hin. /// /// /// @@ -70,33 +65,31 @@ public class HistoryController : ControllerBase /// /// Gibt alle möglichen Status in einem Verlaufsdatensatz zurück. /// Dies wird hinzugefügt, damit Client-Anwendungen sich selbst auf dem neuesten Stand halten können. - /// - /// 0: Invalid - /// 1001: EnvelopeCreated - /// 1002: EnvelopeSaved - /// 1003: EnvelopeQueued - /// 1004: EnvelopeSent (Nicht verwendet) - /// 1005: EnvelopePartlySigned - /// 1006: EnvelopeCompletelySigned - /// 1007: EnvelopeReportCreated - /// 1008: EnvelopeArchived - /// 1009: EnvelopeDeleted - /// 2001: AccessCodeRequested - /// 2002: AccessCodeCorrect - /// 2003: AccessCodeIncorrect - /// 2004: DocumentOpened - /// 2005: DocumentSigned - /// 4001: DocumentForwarded - /// 2006: SignatureConfirmed - /// 2007: DocumentRejected - /// 2008: EnvelopeShared - /// 2009: EnvelopeViewed - /// 3001: MessageInvitationSent (Wird von Trigger verwendet) - /// 3002: MessageAccessCodeSent - /// 3003: MessageConfirmationSent - /// 3004: MessageDeletionSent - /// 3005: MessageCompletionSent - /// + /// 0: Invalid + /// 1001: EnvelopeCreated + /// 1002: EnvelopeSaved + /// 1003: EnvelopeQueued + /// 1004: EnvelopeSent (Nicht verwendet) + /// 1005: EnvelopePartlySigned + /// 1006: EnvelopeCompletelySigned + /// 1007: EnvelopeReportCreated + /// 1008: EnvelopeArchived + /// 1009: EnvelopeDeleted + /// 2001: AccessCodeRequested + /// 2002: AccessCodeCorrect + /// 2003: AccessCodeIncorrect + /// 2004: DocumentOpened + /// 2005: DocumentSigned + /// 4001: DocumentForwarded + /// 2006: SignatureConfirmed + /// 2007: DocumentRejected + /// 2008: EnvelopeShared + /// 2009: EnvelopeViewed + /// 3001: MessageInvitationSent (Wird von Trigger verwendet) + /// 3002: MessageAccessCodeSent + /// 3003: MessageConfirmationSent + /// 3004: MessageDeletionSent + /// 3005: MessageCompletionSent /// /// /// Abfrageparameter, der angibt, auf welche Referenz sich der Status bezieht. diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/LocalizationController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/LocalizationController.cs index 244bbc47..b0919211 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/LocalizationController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/LocalizationController.cs @@ -11,6 +11,7 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers; /// /// Controller für die Verwaltung der Lokalisierung und Spracheinstellungen. /// +[ApiExplorerSettings(IgnoreApi = true)] [Route("api/[controller]")] [ApiController] public class LocalizationController : ControllerBase From 48240f2f30ec4ddecee759600be4ac2ff01033da Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Fri, 11 Apr 2025 23:43:46 +0200 Subject: [PATCH 66/76] Change namespace and update documentation comments Updated the namespace for the `EnvelopeReceiverQuery` class to `EnvelopeGenerator.Application.EnvelopeReceivers`. Revised the documentation for the `EnvelopeStatusQuery` record to provide a more concise list of envelope statuses while keeping the existing parameters. --- .../EnvelopeReceiverQuery.cs | 54 +++++++++---------- 1 file changed, 26 insertions(+), 28 deletions(-) diff --git a/EnvelopeGenerator.Application/EnvelopeReceivers/EnvelopeReceiverQuery.cs b/EnvelopeGenerator.Application/EnvelopeReceivers/EnvelopeReceiverQuery.cs index a4ed6142..93f171f4 100644 --- a/EnvelopeGenerator.Application/EnvelopeReceivers/EnvelopeReceiverQuery.cs +++ b/EnvelopeGenerator.Application/EnvelopeReceivers/EnvelopeReceiverQuery.cs @@ -10,37 +10,35 @@ public record EnvelopeReceiverQuery(EnvelopeStatusQuery? Status = null); /// /// Repräsentiert den Status eines Umschlags und dessen Beziehung zum Empfänger. (vgl. auch -/// -/// Invalid (0): Ungültiger Status. -/// EnvelopeCreated (1001): Der Umschlag wurde erstellt. -/// EnvelopeSaved (1002): Der Umschlag wurde gespeichert. -/// EnvelopeQueued (1003): Der Umschlag wurde zur Verarbeitung eingeplant. -/// EnvelopeSent (1004): Der Umschlag wurde versendet. (Nicht verwendet) -/// EnvelopePartlySigned (1005): Der Umschlag wurde teilweise unterschrieben. -/// EnvelopeCompletelySigned (1006): Der Umschlag wurde vollständig unterschrieben. -/// EnvelopeReportCreated (1007): Ein Abschlussbericht wurde für den Umschlag erstellt. -/// EnvelopeArchived (1008): Der Umschlag wurde archiviert. -/// EnvelopeDeleted (1009): Der Umschlag wurde gelöscht. -/// AccessCodeRequested (2001): Der Zugriffscode wurde angefordert. -/// AccessCodeCorrect (2002): Der Zugriffscode war korrekt. -/// AccessCodeIncorrect (2003): Der Zugriffscode war falsch. -/// DocumentOpened (2004): Das Dokument wurde geöffnet. -/// DocumentSigned (2005): Ein Dokument wurde unterschrieben. -/// SignatureConfirmed (2006): Die Signatur wurde bestätigt. -/// DocumentRejected (2007): Ein Dokument wurde abgelehnt. -/// EnvelopeShared (2008): Der Umschlag wurde geteilt. -/// EnvelopeViewed (2009): Der Umschlag wurde angesehen. -/// DocumentForwarded (4001): Das Dokument wurde weitergeleitet. -/// MessageInvitationSent (3001): Einladung wurde gesendet (vom Trigger verwendet). -/// MessageAccessCodeSent (3002): Zugriffscode wurde gesendet. -/// MessageConfirmationSent (3003): Bestätigungsnachricht wurde gesendet. -/// MessageDeletionSent (3004): Löschbenachrichtigung wurde gesendet. -/// MessageCompletionSent (3005): Abschlussbenachrichtigung wurde gesendet. -/// -/// +/// Invalid (0): Ungültiger Status. +/// EnvelopeCreated (1001): Der Umschlag wurde erstellt. +/// EnvelopeSaved (1002): Der Umschlag wurde gespeichert. +/// EnvelopeQueued (1003): Der Umschlag wurde zur Verarbeitung eingeplant. +/// EnvelopeSent (1004): Der Umschlag wurde versendet. (Nicht verwendet) +/// EnvelopePartlySigned (1005): Der Umschlag wurde teilweise unterschrieben. +/// EnvelopeCompletelySigned (1006): Der Umschlag wurde vollständig unterschrieben. +/// EnvelopeReportCreated (1007): Ein Abschlussbericht wurde für den Umschlag erstellt. +/// EnvelopeArchived (1008): Der Umschlag wurde archiviert. +/// EnvelopeDeleted (1009): Der Umschlag wurde gelöscht. +/// AccessCodeRequested (2001): Der Zugriffscode wurde angefordert. +/// AccessCodeCorrect (2002): Der Zugriffscode war korrekt. +/// AccessCodeIncorrect (2003): Der Zugriffscode war falsch. +/// DocumentOpened (2004): Das Dokument wurde geöffnet. +/// DocumentSigned (2005): Ein Dokument wurde unterschrieben. +/// SignatureConfirmed (2006): Die Signatur wurde bestätigt. +/// DocumentRejected (2007): Ein Dokument wurde abgelehnt. +/// EnvelopeShared (2008): Der Umschlag wurde geteilt. +/// EnvelopeViewed (2009): Der Umschlag wurde angesehen. +/// DocumentForwarded (4001): Das Dokument wurde weitergeleitet. +/// MessageInvitationSent (3001): Einladung wurde gesendet (vom Trigger verwendet). +/// MessageAccessCodeSent (3002): Zugriffscode wurde gesendet. +/// MessageConfirmationSent (3003): Bestätigungsnachricht wurde gesendet. +/// MessageDeletionSent (3004): Löschbenachrichtigung wurde gesendet. +/// MessageCompletionSent (3005): Abschlussbenachrichtigung wurde gesendet. /// Der minimale Statuswert, der berücksichtigt werden soll. /// Der maximale Statuswert, der berücksichtigt werden soll. /// Eine Liste von Statuswerten, die ignoriert werden sollen. +/// public record EnvelopeStatusQuery( int? Min = null, int? Max = null, From 778a498e001484f39484637c703bda882beb3ad8 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Fri, 11 Apr 2025 23:46:14 +0200 Subject: [PATCH 67/76] Refactor command records for envelope creation Updated `CreateEnvelopeReceiverCommand` to use new types for `Document` and `Receivers`. Renamed `ReceiverGetOrCreateDto` to `ReceiverGetOrCreateCommand` and `DocumentCreateDto` to `DocumentCreateCommand` to align with the new command structure. Properties within these records remain unchanged. --- .../Commands/Create/CreateEnvelopeReceiverCommand.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/EnvelopeGenerator.Application/EnvelopeReceivers/Commands/Create/CreateEnvelopeReceiverCommand.cs b/EnvelopeGenerator.Application/EnvelopeReceivers/Commands/Create/CreateEnvelopeReceiverCommand.cs index 4b2ae1e1..7000950d 100644 --- a/EnvelopeGenerator.Application/EnvelopeReceivers/Commands/Create/CreateEnvelopeReceiverCommand.cs +++ b/EnvelopeGenerator.Application/EnvelopeReceivers/Commands/Create/CreateEnvelopeReceiverCommand.cs @@ -14,8 +14,8 @@ namespace EnvelopeGenerator.Application.EnvelopeReceivers.Commands.Create; public record CreateEnvelopeReceiverCommand( [Required] string Title, [Required] string Message, - [Required] DocumentCreateDto Document, - [Required] IEnumerable Receivers, + [Required] DocumentCreateCommand Document, + [Required] IEnumerable Receivers, bool TFAEnabled = false ) : IRequest; @@ -35,7 +35,7 @@ public record Signature([Required] int X, [Required] int Y, [Required] int Page) /// Unterschriften auf Dokumenten. /// Der Name, mit dem der Empfänger angesprochen werden soll. Bei Null oder keinem Wert wird der zuletzt verwendete Name verwendet. /// Sollte mit Vorwahl geschrieben werden -public record ReceiverGetOrCreateDto([Required] IEnumerable Signatures, string? Salution = null, string? PhoneNumber = null) +public record ReceiverGetOrCreateCommand([Required] IEnumerable Signatures, string? Salution = null, string? PhoneNumber = null) { private string _emailAddress = string.Empty; @@ -55,5 +55,5 @@ public record ReceiverGetOrCreateDto([Required] IEnumerable Signature /// /// Die Dokumentdaten im Base64-String-Format. Wird verwendet, wenn das Dokument als Base64-codierter String bereitgestellt wird. /// -public record DocumentCreateDto(byte[]? DataAsByte = null, string? DataAsBase64 = null); +public record DocumentCreateCommand(byte[]? DataAsByte = null, string? DataAsBase64 = null); #endregion \ No newline at end of file From c220b9e1c84befadb5aea32386a2b44cf8c313a5 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Sat, 12 Apr 2025 00:11:21 +0200 Subject: [PATCH 68/76] Add new email template types and query records - Updated `Constants.vb` to include new email template types: `DocumentRejected_ADM`, `DocumentRejected_REC`, and `DocumentRejected_REC_2`. - Introduced `EmailTemplateQuery` record in `EmailTemplateQuery.cs` with parameters for `Id`, `Type`, and `Culture`, along with German documentation. - Added `ReadEmailTemplateQuery` record in `ReadEmailTemplateQuery.cs` that inherits from `EmailTemplateQuery` for reading email templates. --- .../EmailTemplates/EmailTemplateQuery.cs | 25 +++++++++++++++++++ .../Query/Read/ReadEmailTemplateQuery.cs | 10 ++++++++ EnvelopeGenerator.Common/Constants.vb | 5 +++- 3 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 EnvelopeGenerator.Application/EmailTemplates/EmailTemplateQuery.cs create mode 100644 EnvelopeGenerator.Application/EmailTemplates/Query/Read/ReadEmailTemplateQuery.cs diff --git a/EnvelopeGenerator.Application/EmailTemplates/EmailTemplateQuery.cs b/EnvelopeGenerator.Application/EmailTemplates/EmailTemplateQuery.cs new file mode 100644 index 00000000..54ac2f71 --- /dev/null +++ b/EnvelopeGenerator.Application/EmailTemplates/EmailTemplateQuery.cs @@ -0,0 +1,25 @@ +using EnvelopeGenerator.Common; + +namespace EnvelopeGenerator.Application.EmailTemplates; + +/// +/// Repräsentiert eine Abfrage für E-Mail-Vorlagen, die für Absender und Empfänger von Umschlägen verwendet werden. +/// Die Standardkultur ist "de-DE". +/// +/// Die eindeutige Kennung der E-Mail-Vorlage (optional). +/// Der Typ der E-Mail-Vorlage, z. B. (optional). Beispiele: +/// 0 - DocumentReceived: Benachrichtigung über den Empfang eines Dokuments. +/// 1 - DocumentSigned: Benachrichtigung über die Unterzeichnung eines Dokuments. +/// 2 - DocumentDeleted: Benachrichtigung über das Löschen eines Dokuments. +/// 3 - DocumentCompleted: Benachrichtigung über den Abschluss eines Dokuments. +/// 4 - DocumentAccessCodeReceived: Benachrichtigung über den Erhalt eines Zugangscodes. +/// 5 - DocumentShared: Benachrichtigung über das Teilen eines Dokuments. +/// 6 - TotpSecret: Benachrichtigung über ein TOTP-Geheimnis. +/// 7 - DocumentRejected_ADM: Ablehnung eines Dokuments durch den Administrator. +/// 8 - DocumentRejected_REC: Ablehnung eines Dokuments durch den Empfänger. +/// 9 - DocumentRejected_REC_2: Zweite Ablehnung eines Dokuments durch den Empfänger. +/// +/// Die Kultur der E-Mail-Vorlage, z. B. "de-DE" (optional). +public record EmailTemplateQuery(int? Id = null, Constants.EmailTemplateType? Type = null, string? Culture = null) +{ +} diff --git a/EnvelopeGenerator.Application/EmailTemplates/Query/Read/ReadEmailTemplateQuery.cs b/EnvelopeGenerator.Application/EmailTemplates/Query/Read/ReadEmailTemplateQuery.cs new file mode 100644 index 00000000..c94ed22d --- /dev/null +++ b/EnvelopeGenerator.Application/EmailTemplates/Query/Read/ReadEmailTemplateQuery.cs @@ -0,0 +1,10 @@ +namespace EnvelopeGenerator.Application.EmailTemplates.Query.Read; + + +/// +/// Stellt eine Abfrage dar, um eine E-Mail-Vorlage zu lesen. +/// Diese Klasse erbt von . +/// +public record ReadEmailTemplateQuery : EmailTemplateQuery +{ +} diff --git a/EnvelopeGenerator.Common/Constants.vb b/EnvelopeGenerator.Common/Constants.vb index 04905cc6..8b222b0f 100644 --- a/EnvelopeGenerator.Common/Constants.vb +++ b/EnvelopeGenerator.Common/Constants.vb @@ -94,13 +94,16 @@ End Enum Public Enum EmailTemplateType - DocumentReceived + DocumentReceived = 0 DocumentSigned DocumentDeleted DocumentCompleted DocumentAccessCodeReceived DocumentShared TotpSecret + DocumentRejected_ADM + DocumentRejected_REC + DocumentRejected_REC_2 End Enum Public Enum EncodeType From dd4afc5ddfdbff695d1ae9d5a9bfbbf5f65d86c7 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Sat, 12 Apr 2025 00:18:14 +0200 Subject: [PATCH 69/76] Refactor email template query and response structures Updated `EmailTemplateQuery` to use `Language` instead of `Culture` and added an explicit body. Introduced a new namespace for better organization and added `ReadEmailTemplateResponse` to provide a structured response for querying email templates, including relevant parameters. --- .../EmailTemplates/EmailTemplateQuery.cs | 4 ++-- .../Query/Read/ReadEmailTemplateResponse.cs | 22 +++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 EnvelopeGenerator.Application/EmailTemplates/Query/Read/ReadEmailTemplateResponse.cs diff --git a/EnvelopeGenerator.Application/EmailTemplates/EmailTemplateQuery.cs b/EnvelopeGenerator.Application/EmailTemplates/EmailTemplateQuery.cs index 54ac2f71..54f6e730 100644 --- a/EnvelopeGenerator.Application/EmailTemplates/EmailTemplateQuery.cs +++ b/EnvelopeGenerator.Application/EmailTemplates/EmailTemplateQuery.cs @@ -19,7 +19,7 @@ namespace EnvelopeGenerator.Application.EmailTemplates; /// 8 - DocumentRejected_REC: Ablehnung eines Dokuments durch den Empfänger. /// 9 - DocumentRejected_REC_2: Zweite Ablehnung eines Dokuments durch den Empfänger. /// -/// Die Kultur der E-Mail-Vorlage, z. B. "de-DE" (optional). -public record EmailTemplateQuery(int? Id = null, Constants.EmailTemplateType? Type = null, string? Culture = null) +/// Die Sprache der E-Mail-Vorlage, z. B. "de-DE" (optional). +public record EmailTemplateQuery(int? Id = null, Constants.EmailTemplateType? Type = null, string? Language = null) { } diff --git a/EnvelopeGenerator.Application/EmailTemplates/Query/Read/ReadEmailTemplateResponse.cs b/EnvelopeGenerator.Application/EmailTemplates/Query/Read/ReadEmailTemplateResponse.cs new file mode 100644 index 00000000..56152db2 --- /dev/null +++ b/EnvelopeGenerator.Application/EmailTemplates/Query/Read/ReadEmailTemplateResponse.cs @@ -0,0 +1,22 @@ +namespace EnvelopeGenerator.Application.EmailTemplates.Query.Read; + +/// +/// Stellt die Antwort für eine Abfrage von E-Mail-Vorlagen bereit. +/// +/// Die eindeutige Kennung der E-Mail-Vorlage. +/// Der Typ der E-Mail-Vorlage. +/// Das Datum und die Uhrzeit, wann die Vorlage hinzugefügt wurde. +/// Die Sprache der E-Mail-Vorlage. +/// Der Inhalt (Body) der E-Mail-Vorlage. Kann null sein. +/// Der Betreff der E-Mail-Vorlage. Kann null sein. +/// Das Datum und die Uhrzeit, wann die Vorlage zuletzt geändert wurde. Kann null sein. +public record ReadEmailTemplateResponse( + int Id, + int Type, + DateTime AddedWhen, + string Language, + string? Body = null, + string? Subject = null, + DateTime? ChangedWhen = null) +{ +} From a21c993cb59987d02ce58ec8bd4077c32cde0d9a Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Sat, 12 Apr 2025 00:37:13 +0200 Subject: [PATCH 70/76] Refactor email template handling and namespaces Updated namespaces for email template files and improved class structures. Removed the Language parameter from EmailTemplateQuery. Added ReadEmailTemplateQuery and ReadEmailTemplateResponse with updated parameters. Introduced UpdateEmailTemplateCommand for template updates. These changes enhance clarity and functionality in the email template management system. --- .../Update/UpdateEmailTemplateCommand.cs | 18 ++++++++++++++++++ .../EmailTemplates/EmailTemplateQuery.cs | 9 ++++----- .../Read/ReadEmailTemplateQuery.cs | 0 .../Read/ReadEmailTemplateResponse.cs | 4 +--- 4 files changed, 23 insertions(+), 8 deletions(-) create mode 100644 EnvelopeGenerator.Application/EmailTemplates/Commands/Update/UpdateEmailTemplateCommand.cs rename EnvelopeGenerator.Application/EmailTemplates/{Query => Queries}/Read/ReadEmailTemplateQuery.cs (100%) rename EnvelopeGenerator.Application/EmailTemplates/{Query => Queries}/Read/ReadEmailTemplateResponse.cs (83%) diff --git a/EnvelopeGenerator.Application/EmailTemplates/Commands/Update/UpdateEmailTemplateCommand.cs b/EnvelopeGenerator.Application/EmailTemplates/Commands/Update/UpdateEmailTemplateCommand.cs new file mode 100644 index 00000000..bc1af611 --- /dev/null +++ b/EnvelopeGenerator.Application/EmailTemplates/Commands/Update/UpdateEmailTemplateCommand.cs @@ -0,0 +1,18 @@ +namespace EnvelopeGenerator.Application.EmailTemplates.Commands.Update; + + +/// +/// Befehl zum Aktualisieren einer E-Mail-Vorlage. +/// +/// +/// Die Abfrage, die die E-Mail-Vorlage darstellt, die aktualisiert werden soll. +/// +/// +/// (Optional)Der neue Inhalt des E-Mail-Textkörpers. Wenn null, bleibt der vorhandene Inhalt unverändert. +/// +/// +/// (Optional) Der neue Betreff der E-Mail. Wenn null, bleibt der vorhandene Betreff unverändert. +/// +public record UpdateEmailTemplateCommand(EmailTemplateQuery EmailTemplate, string? Body = null, string? Subject = null) +{ +} diff --git a/EnvelopeGenerator.Application/EmailTemplates/EmailTemplateQuery.cs b/EnvelopeGenerator.Application/EmailTemplates/EmailTemplateQuery.cs index 54f6e730..00f390a3 100644 --- a/EnvelopeGenerator.Application/EmailTemplates/EmailTemplateQuery.cs +++ b/EnvelopeGenerator.Application/EmailTemplates/EmailTemplateQuery.cs @@ -15,11 +15,10 @@ namespace EnvelopeGenerator.Application.EmailTemplates; /// 4 - DocumentAccessCodeReceived: Benachrichtigung über den Erhalt eines Zugangscodes. /// 5 - DocumentShared: Benachrichtigung über das Teilen eines Dokuments. /// 6 - TotpSecret: Benachrichtigung über ein TOTP-Geheimnis. -/// 7 - DocumentRejected_ADM: Ablehnung eines Dokuments durch den Administrator. -/// 8 - DocumentRejected_REC: Ablehnung eines Dokuments durch den Empfänger. -/// 9 - DocumentRejected_REC_2: Zweite Ablehnung eines Dokuments durch den Empfänger. +/// 7 - DocumentRejected_ADM (Für den Absender): Mail an den Absender, wenn das Dokument abgelehnt wird. +/// 8 - DocumentRejected_REC (Für den ablehnenden Empfänger): Mail an den ablehnenden Empfänger, wenn das Dokument abgelehnt wird. +/// 9 - DocumentRejected_REC_2 (Für sonstige Empfänger): Mail an andere Empfänger (Brief), wenn das Dokument abgelehnt wird. /// -/// Die Sprache der E-Mail-Vorlage, z. B. "de-DE" (optional). -public record EmailTemplateQuery(int? Id = null, Constants.EmailTemplateType? Type = null, string? Language = null) +public record EmailTemplateQuery(int? Id = null, Constants.EmailTemplateType? Type = null) { } diff --git a/EnvelopeGenerator.Application/EmailTemplates/Query/Read/ReadEmailTemplateQuery.cs b/EnvelopeGenerator.Application/EmailTemplates/Queries/Read/ReadEmailTemplateQuery.cs similarity index 100% rename from EnvelopeGenerator.Application/EmailTemplates/Query/Read/ReadEmailTemplateQuery.cs rename to EnvelopeGenerator.Application/EmailTemplates/Queries/Read/ReadEmailTemplateQuery.cs diff --git a/EnvelopeGenerator.Application/EmailTemplates/Query/Read/ReadEmailTemplateResponse.cs b/EnvelopeGenerator.Application/EmailTemplates/Queries/Read/ReadEmailTemplateResponse.cs similarity index 83% rename from EnvelopeGenerator.Application/EmailTemplates/Query/Read/ReadEmailTemplateResponse.cs rename to EnvelopeGenerator.Application/EmailTemplates/Queries/Read/ReadEmailTemplateResponse.cs index 56152db2..3234c86a 100644 --- a/EnvelopeGenerator.Application/EmailTemplates/Query/Read/ReadEmailTemplateResponse.cs +++ b/EnvelopeGenerator.Application/EmailTemplates/Queries/Read/ReadEmailTemplateResponse.cs @@ -1,4 +1,4 @@ -namespace EnvelopeGenerator.Application.EmailTemplates.Query.Read; +namespace EnvelopeGenerator.Application.EmailTemplates.Queries.Read; /// /// Stellt die Antwort für eine Abfrage von E-Mail-Vorlagen bereit. @@ -6,7 +6,6 @@ /// Die eindeutige Kennung der E-Mail-Vorlage. /// Der Typ der E-Mail-Vorlage. /// Das Datum und die Uhrzeit, wann die Vorlage hinzugefügt wurde. -/// Die Sprache der E-Mail-Vorlage. /// Der Inhalt (Body) der E-Mail-Vorlage. Kann null sein. /// Der Betreff der E-Mail-Vorlage. Kann null sein. /// Das Datum und die Uhrzeit, wann die Vorlage zuletzt geändert wurde. Kann null sein. @@ -14,7 +13,6 @@ public record ReadEmailTemplateResponse( int Id, int Type, DateTime AddedWhen, - string Language, string? Body = null, string? Subject = null, DateTime? ChangedWhen = null) From f17820e0115025ecc222a92379d8be686e1a2a37 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Sat, 12 Apr 2025 00:42:04 +0200 Subject: [PATCH 71/76] Add UpdateToDefaultCommand for email template reset Introduces a new namespace `EnvelopeGenerator.Application.EmailTemplates.Commands.UpdateToDefault` and defines the `UpdateToDefaultCommand` record. This command allows resetting an email template to its default values, inheriting from `EmailTemplateQuery`. It includes optional parameters for `Id` and `Type`, with comprehensive XML documentation detailing the command's purpose and the possible email template types. --- .../UpdateToDefault/UpdateToDefaultCommand.cs | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 EnvelopeGenerator.Application/EmailTemplates/Commands/UpdateToDefault/UpdateToDefaultCommand.cs diff --git a/EnvelopeGenerator.Application/EmailTemplates/Commands/UpdateToDefault/UpdateToDefaultCommand.cs b/EnvelopeGenerator.Application/EmailTemplates/Commands/UpdateToDefault/UpdateToDefaultCommand.cs new file mode 100644 index 00000000..ee79caf2 --- /dev/null +++ b/EnvelopeGenerator.Application/EmailTemplates/Commands/UpdateToDefault/UpdateToDefaultCommand.cs @@ -0,0 +1,20 @@ +namespace EnvelopeGenerator.Application.EmailTemplates.Commands.UpdateToDefault; + +/// +/// Ein Befehl zum Zurücksetzen einer E-Mail-Vorlage auf die Standardwerte. +/// Erbt von und ermöglicht die Angabe einer optionalen ID und eines Typs der E-Mail-Vorlage. +/// +/// Die optionale ID der E-Mail-Vorlage, die zurückgesetzt werden soll. +/// Der Typ der E-Mail-Vorlage, z. B. (optional). Beispiele: +/// 0 - DocumentReceived: Benachrichtigung über den Empfang eines Dokuments. +/// 1 - DocumentSigned: Benachrichtigung über die Unterzeichnung eines Dokuments. +/// 2 - DocumentDeleted: Benachrichtigung über das Löschen eines Dokuments. +/// 3 - DocumentCompleted: Benachrichtigung über den Abschluss eines Dokuments. +/// 4 - DocumentAccessCodeReceived: Benachrichtigung über den Erhalt eines Zugangscodes. +/// 5 - DocumentShared: Benachrichtigung über das Teilen eines Dokuments. +/// 6 - TotpSecret: Benachrichtigung über ein TOTP-Geheimnis. +/// 7 - DocumentRejected_ADM (Für den Absender): Mail an den Absender, wenn das Dokument abgelehnt wird. +/// 8 - DocumentRejected_REC (Für den ablehnenden Empfänger): Mail an den ablehnenden Empfänger, wenn das Dokument abgelehnt wird. +/// 9 - DocumentRejected_REC_2 (Für sonstige Empfänger): Mail an andere Empfänger (Brief), wenn das Dokument abgelehnt wird. +/// +public record UpdateToDefaultCommand(int? Id, Common.Constants.EmailTemplateType? Type) : EmailTemplateQuery(Id, Type); From fe252b9979c2213acdbf2dadaf5e82af8775ef93 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Sat, 12 Apr 2025 01:20:04 +0200 Subject: [PATCH 72/76] Refactor email template commands and add controller - Updated `UpdateEmailTemplateCommand` to use a property for `EmailTemplateQuery` with `JsonIgnore`, allowing optional body and subject parameters. - Simplified `UpdateToDefaultCommand` by removing documentation comments and constructor parameters. - Corrected namespace for `ReadEmailTemplateQuery` from `Query.Read` to `Queries.Read`. - Introduced `ResetEnvelopeTemplateCommand` with optional ID and type, inheriting from `EmailTemplateQuery`, along with detailed XML documentation. - Added `EmailTemplateController` to manage email templates, including methods for retrieval and updates, utilizing AutoMapper and authorization attributes. --- .../ResetEnvelopeTemplateCommand.cs} | 6 +- .../Update/UpdateEmailTemplateCommand.cs | 14 ++- .../Queries/Read/ReadEmailTemplateQuery.cs | 2 +- .../Controllers/EmailTemplateController.cs | 91 +++++++++++++++++++ 4 files changed, 105 insertions(+), 8 deletions(-) rename EnvelopeGenerator.Application/EmailTemplates/Commands/{UpdateToDefault/UpdateToDefaultCommand.cs => Reset/ResetEnvelopeTemplateCommand.cs} (85%) create mode 100644 EnvelopeGenerator.GeneratorAPI/Controllers/EmailTemplateController.cs diff --git a/EnvelopeGenerator.Application/EmailTemplates/Commands/UpdateToDefault/UpdateToDefaultCommand.cs b/EnvelopeGenerator.Application/EmailTemplates/Commands/Reset/ResetEnvelopeTemplateCommand.cs similarity index 85% rename from EnvelopeGenerator.Application/EmailTemplates/Commands/UpdateToDefault/UpdateToDefaultCommand.cs rename to EnvelopeGenerator.Application/EmailTemplates/Commands/Reset/ResetEnvelopeTemplateCommand.cs index ee79caf2..79ce1295 100644 --- a/EnvelopeGenerator.Application/EmailTemplates/Commands/UpdateToDefault/UpdateToDefaultCommand.cs +++ b/EnvelopeGenerator.Application/EmailTemplates/Commands/Reset/ResetEnvelopeTemplateCommand.cs @@ -1,4 +1,6 @@ -namespace EnvelopeGenerator.Application.EmailTemplates.Commands.UpdateToDefault; +using EnvelopeGenerator.Common; + +namespace EnvelopeGenerator.Application.EmailTemplates.Commands.Reset; /// /// Ein Befehl zum Zurücksetzen einer E-Mail-Vorlage auf die Standardwerte. @@ -17,4 +19,4 @@ /// 8 - DocumentRejected_REC (Für den ablehnenden Empfänger): Mail an den ablehnenden Empfänger, wenn das Dokument abgelehnt wird. /// 9 - DocumentRejected_REC_2 (Für sonstige Empfänger): Mail an andere Empfänger (Brief), wenn das Dokument abgelehnt wird. /// -public record UpdateToDefaultCommand(int? Id, Common.Constants.EmailTemplateType? Type) : EmailTemplateQuery(Id, Type); +public record ResetEnvelopeTemplateCommand(int? Id, Constants.EmailTemplateType? Type) : EmailTemplateQuery(Id, Type); diff --git a/EnvelopeGenerator.Application/EmailTemplates/Commands/Update/UpdateEmailTemplateCommand.cs b/EnvelopeGenerator.Application/EmailTemplates/Commands/Update/UpdateEmailTemplateCommand.cs index bc1af611..63d2a7fd 100644 --- a/EnvelopeGenerator.Application/EmailTemplates/Commands/Update/UpdateEmailTemplateCommand.cs +++ b/EnvelopeGenerator.Application/EmailTemplates/Commands/Update/UpdateEmailTemplateCommand.cs @@ -1,18 +1,22 @@ -namespace EnvelopeGenerator.Application.EmailTemplates.Commands.Update; +using System.Text.Json.Serialization; + +namespace EnvelopeGenerator.Application.EmailTemplates.Commands.Update; /// /// Befehl zum Aktualisieren einer E-Mail-Vorlage. /// -/// -/// Die Abfrage, die die E-Mail-Vorlage darstellt, die aktualisiert werden soll. -/// /// /// (Optional)Der neue Inhalt des E-Mail-Textkörpers. Wenn null, bleibt der vorhandene Inhalt unverändert. /// /// /// (Optional) Der neue Betreff der E-Mail. Wenn null, bleibt der vorhandene Betreff unverändert. /// -public record UpdateEmailTemplateCommand(EmailTemplateQuery EmailTemplate, string? Body = null, string? Subject = null) +public record UpdateEmailTemplateCommand(string? Body = null, string? Subject = null) { + /// + /// Die Abfrage, die die E-Mail-Vorlage darstellt, die aktualisiert werden soll. + /// + [JsonIgnore] + public EmailTemplateQuery? EmailTemplateQuery { get; set; } } diff --git a/EnvelopeGenerator.Application/EmailTemplates/Queries/Read/ReadEmailTemplateQuery.cs b/EnvelopeGenerator.Application/EmailTemplates/Queries/Read/ReadEmailTemplateQuery.cs index c94ed22d..0c82bab2 100644 --- a/EnvelopeGenerator.Application/EmailTemplates/Queries/Read/ReadEmailTemplateQuery.cs +++ b/EnvelopeGenerator.Application/EmailTemplates/Queries/Read/ReadEmailTemplateQuery.cs @@ -1,4 +1,4 @@ -namespace EnvelopeGenerator.Application.EmailTemplates.Query.Read; +namespace EnvelopeGenerator.Application.EmailTemplates.Queries.Read; /// diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/EmailTemplateController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/EmailTemplateController.cs new file mode 100644 index 00000000..fa4fb84a --- /dev/null +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/EmailTemplateController.cs @@ -0,0 +1,91 @@ +using AutoMapper; +using EnvelopeGenerator.Application.EmailTemplates; +using EnvelopeGenerator.Application.EmailTemplates.Commands.Update; +using EnvelopeGenerator.Application.EmailTemplates.Commands.Reset; +using EnvelopeGenerator.Application.EmailTemplates.Queries.Read; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace EnvelopeGenerator.GeneratorAPI.Controllers; + +/// +/// Controller for managing email templates. +/// Steuerung zur Verwaltung von E-Mail-Vorlagen. +/// +[Route("api/[controller]")] +[ApiController] +[Authorize] +public class EmailTemplateController : ControllerBase +{ + private readonly IMapper _mapper; + + /// + /// Initialisiert eine neue Instanz der -Klasse. + /// + /// + /// Die AutoMapper-Instanz, die zum Zuordnen von Objekten verwendet wird. + /// + public EmailTemplateController(IMapper mapper) + { + _mapper = mapper; + } + + /// + /// Ruft E-Mail-Vorlagen basierend auf der angegebenen Abfrage ab. + /// Gibt alles zurück, wenn keine Id- oder Typ-Informationen eingegeben wurden. + /// + /// Die Abfrageparameter zum Abrufen von E-Mail-Vorlagen. + /// Gibt HTTP-Antwort zurück + /// + /// Sample request: + /// GET /api/EmailTemplate?emailTemplateId=123 + /// + /// Wenn die E-Mail-Vorlagen erfolgreich abgerufen werden. + /// Wenn die Abfrageparameter ungültig sind. + /// Wenn der Benutzer nicht authentifiziert ist. + /// Wenn die gesuchte Abfrage nicht gefunden wird. + [HttpGet] + public IActionResult Get([FromQuery] ReadEmailTemplateQuery? emailTemplate = null) + { + // Implementation logic here + return Ok(); // Placeholder for actual implementation + } + + /// + /// Updates an email template or resets it if no update command is provided. + /// Aktualisiert eine E-Mail-Vorlage oder setzt sie zurück, wenn kein Aktualisierungsbefehl angegeben ist. + /// + /// Die E-Mail-Vorlagenabfrage. + /// Der Aktualisierungsbefehl für die E-Mail-Vorlage. + /// Wird auf Standardwert aktualisiert, wenn die Anfrage ohne http-Body gesendet wird. + /// + /// Gibt HTTP-Antwort zurück + /// + /// Sample request: + /// PUT /api/EmailTemplate + /// { + /// "emailTemplateId": 123, + /// "newContent": "Updated content" + /// } + /// + /// Wenn die E-Mail-Vorlage erfolgreich aktualisiert oder zurückgesetzt wird. + /// Wenn die Abfrage ohne einen String gesendet wird. + /// Wenn der Benutzer nicht authentifiziert ist. + /// Wenn die gesuchte Abfrage nicht gefunden wird. + [HttpPut] + public IActionResult Update([FromQuery] EmailTemplateQuery email, [FromBody] UpdateEmailTemplateCommand? update = null) + { + if (update is null) + { + var reset = _mapper.Map(email); + // Logic for resetting the email template + } + else + { + update.EmailTemplateQuery = email; + // Logic for updating the email template + } + + return Ok(); // Placeholder for actual implementation + } +} From 7b75a373bdd525387f3202dcb8e68303c1137825 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Sat, 12 Apr 2025 02:11:43 +0200 Subject: [PATCH 73/76] Fix casing of Bearer scheme in Swagger configuration --- EnvelopeGenerator.GeneratorAPI/Program.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EnvelopeGenerator.GeneratorAPI/Program.cs b/EnvelopeGenerator.GeneratorAPI/Program.cs index 81a01f4c..bd05027f 100644 --- a/EnvelopeGenerator.GeneratorAPI/Program.cs +++ b/EnvelopeGenerator.GeneratorAPI/Program.cs @@ -53,7 +53,7 @@ builder.Services.AddSwaggerGen(options => { Name = "Authorization", Type = SecuritySchemeType.Http, - Scheme = "Bearer", + Scheme = "bearer", BearerFormat = "JWT", In = ParameterLocation.Header, Description = "JWT-Autorisierungs-Header unter Verwendung des Bearer-Schemas.", From 0dc65a53b58e0d01662380b284f407a55c7d8f99 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Mon, 14 Apr 2025 10:02:03 +0200 Subject: [PATCH 74/76] =?UTF-8?q?chore:=20Hinzuf=C3=BCgen=20von=20IIS-Ver?= =?UTF-8?q?=C3=B6ffentlichungsprofilen=20f=C3=BCr=20.NET=207=20und=20.NET?= =?UTF-8?q?=209?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IISProfileNet7Win64.pubxml | 22 +++++++++++++++++++ .../IISProfileNet9Win64.pubxml | 22 +++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 EnvelopeGenerator.GeneratorAPI/Properties/PublishProfiles/IISProfileNet7Win64.pubxml create mode 100644 EnvelopeGenerator.GeneratorAPI/Properties/PublishProfiles/IISProfileNet9Win64.pubxml diff --git a/EnvelopeGenerator.GeneratorAPI/Properties/PublishProfiles/IISProfileNet7Win64.pubxml b/EnvelopeGenerator.GeneratorAPI/Properties/PublishProfiles/IISProfileNet7Win64.pubxml new file mode 100644 index 00000000..99e4e6ad --- /dev/null +++ b/EnvelopeGenerator.GeneratorAPI/Properties/PublishProfiles/IISProfileNet7Win64.pubxml @@ -0,0 +1,22 @@ + + + + + Package + Release + Any CPU + + true + false + 4fdae4ba-f512-444a-9e18-111047d3ef02 + P:\Install .Net\0 DD - Smart UP\signFLOW\Gen\Api\net7\win64\$(Version)\$(Version).zip + true + SignFlowGen + <_TargetId>IISWebDeployPackage + net7.0 + win-x64 + true + + \ No newline at end of file diff --git a/EnvelopeGenerator.GeneratorAPI/Properties/PublishProfiles/IISProfileNet9Win64.pubxml b/EnvelopeGenerator.GeneratorAPI/Properties/PublishProfiles/IISProfileNet9Win64.pubxml new file mode 100644 index 00000000..8d3b72df --- /dev/null +++ b/EnvelopeGenerator.GeneratorAPI/Properties/PublishProfiles/IISProfileNet9Win64.pubxml @@ -0,0 +1,22 @@ + + + + + Package + Release + Any CPU + + true + false + 4fdae4ba-f512-444a-9e18-111047d3ef02 + P:\Install .Net\0 DD - Smart UP\signFLOW\Gen\Api\net9\win64\$(Version)\$(Version).zip + true + SignFlowGen + <_TargetId>IISWebDeployPackage + net9.0 + win-x64 + true + + \ No newline at end of file From 8f6847c06024f4144805bc83ab5920283aa0fc2c Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Mon, 14 Apr 2025 10:36:25 +0200 Subject: [PATCH 75/76] =?UTF-8?q?chore:=20Aktualisierung=20der=20Version?= =?UTF-8?q?=20auf=201.2.0=20f=C3=BCr=20das=20GeneratorAPI-Projekt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EnvelopeGenerator.GeneratorAPI.csproj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/EnvelopeGenerator.GeneratorAPI/EnvelopeGenerator.GeneratorAPI.csproj b/EnvelopeGenerator.GeneratorAPI/EnvelopeGenerator.GeneratorAPI.csproj index 9ac01c63..e20cd48a 100644 --- a/EnvelopeGenerator.GeneratorAPI/EnvelopeGenerator.GeneratorAPI.csproj +++ b/EnvelopeGenerator.GeneratorAPI/EnvelopeGenerator.GeneratorAPI.csproj @@ -10,9 +10,9 @@ Digital Data GmbH Digital Data GmbH EnvelopeGenerator.GeneratorAPI - 1.1.0 - 1.1.0 - 1.1.0 + 1.2.0 + 1.2.0 + 1.2.0 Copyright © 2025 Digital Data GmbH. All rights reserved. bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml From c61b497ef280e8b57049b7bcb5240ee8c1380d0b Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Mon, 14 Apr 2025 10:49:51 +0200 Subject: [PATCH 76/76] Update target framework and clean up using directives Changed target frameworks in `EnvelopeGenerator.GeneratorAPI.csproj` to only `net9.0`. Removed unused `using System.Reflection;` directive in `Program.cs` to streamline the code. --- .../EnvelopeGenerator.GeneratorAPI.csproj | 2 +- EnvelopeGenerator.GeneratorAPI/Program.cs | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/EnvelopeGenerator.GeneratorAPI/EnvelopeGenerator.GeneratorAPI.csproj b/EnvelopeGenerator.GeneratorAPI/EnvelopeGenerator.GeneratorAPI.csproj index 82f000a6..e20cd48a 100644 --- a/EnvelopeGenerator.GeneratorAPI/EnvelopeGenerator.GeneratorAPI.csproj +++ b/EnvelopeGenerator.GeneratorAPI/EnvelopeGenerator.GeneratorAPI.csproj @@ -1,7 +1,7 @@  - net7.0;net8.0;net9.0 + net9.0 enable enable true diff --git a/EnvelopeGenerator.GeneratorAPI/Program.cs b/EnvelopeGenerator.GeneratorAPI/Program.cs index bd05027f..1ff1f7c4 100644 --- a/EnvelopeGenerator.GeneratorAPI/Program.cs +++ b/EnvelopeGenerator.GeneratorAPI/Program.cs @@ -9,7 +9,6 @@ using Microsoft.EntityFrameworkCore; using System.Globalization; using Scalar.AspNetCore; using Microsoft.OpenApi.Models; -using System.Reflection; var builder = WebApplication.CreateBuilder(args);