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 +namespace EnvelopeGenerator.GeneratorAPI.Controllers; + +/// +/// 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 { - [Route("api/[controller]")] - [Authorize] - [ApiController] - public class EnvelopeReceiverController : ControllerBase + private readonly ILogger _logger; + + private readonly IEnvelopeReceiverService _erService; + + private readonly IMediator _mediator; + + /// + /// 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) { - private readonly ILogger _logger; + _logger = logger; + _erService = envelopeReceiverService; + _mediator = mediator; + } - private readonly IEnvelopeReceiverService _erService; - - private readonly IMediator _mediator; - - public EnvelopeReceiverController(ILogger logger, IEnvelopeReceiverService envelopeReceiverService, IMediator mediator) + /// + /// 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 { - _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(); + + if (username is null) { - var username = User.GetUsername(); - - 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); - } - - ignore_status ??= Array.Empty(); - - 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); - } - } - - [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); + _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); - } } - - /// - /// 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) + catch(Exception ex) { - await _mediator.Send(createEnvelopeQuery, cancellationToken); - return Accepted(); + _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); + } + } + + /// + /// 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) + { + _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