Refactor controllers for MediatR and cleaner API design

- Switch EnvelopeController and ReceiverController to MediatR for all operations
- Encapsulate UserId in CreateEnvelopeCommand via Authorize() method
- Change CreateEnvelopeCommand binding to [FromBody]
- Add CancellationToken support to EnvelopeReceiverController
- Remove obsolete CRUD logic from ReceiverController; now only supports GET via MediatR
- Clean up unused dependencies and update controller summaries for clarity
This commit is contained in:
2026-01-28 14:14:04 +01:00
parent 114555c843
commit a3afeb175f
4 changed files with 34 additions and 78 deletions

View File

@@ -33,7 +33,18 @@ public record CreateEnvelopeCommand : IRequest<EnvelopeDto?>
/// <summary> /// <summary>
/// ID des Absenders /// ID des Absenders
/// </summary> /// </summary>
public int UserId { get; set; } internal int UserId { get; private set; }
/// <summary>
///
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
public bool Authorize(int userId)
{
UserId = userId;
return true;
}
/// <summary> /// <summary>
/// Determines which component is used for envelope processing. /// Determines which component is used for envelope processing.

View File

@@ -90,19 +90,18 @@ public class EnvelopeController : ControllerBase
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
/// <param name="envelope"></param> /// <param name="command"></param>
/// <returns></returns> /// <returns></returns>
[NonAction] [NonAction]
[Authorize] [Authorize]
[HttpPost] [HttpPost]
public async Task<IActionResult> CreateAsync([FromQuery] CreateEnvelopeCommand envelope) public async Task<IActionResult> CreateAsync([FromBody] CreateEnvelopeCommand command)
{ {
envelope.UserId = User.GetId(); var res = await _mediator.Send(command.Authorize(User.GetId()));
var res = await _mediator.Send(envelope);
if (res is null) if (res is null)
{ {
_logger.LogError("Failed to create envelope. Envelope details: {EnvelopeDetails}", JsonConvert.SerializeObject(envelope)); _logger.LogError("Failed to create envelope. Envelope details: {EnvelopeDetails}", JsonConvert.SerializeObject(command));
return StatusCode(StatusCodes.Status500InternalServerError); return StatusCode(StatusCodes.Status500InternalServerError);
} }
else else

View File

@@ -105,6 +105,7 @@ public class EnvelopeReceiverController : ControllerBase
/// Datenübertragungsobjekt mit Informationen zu Umschlägen, Empfängern und Unterschriften. /// Datenübertragungsobjekt mit Informationen zu Umschlägen, Empfängern und Unterschriften.
/// </summary> /// </summary>
/// <param name="request"></param> /// <param name="request"></param>
/// <param name="cancel"></param>
/// <returns>HTTP-Antwort</returns> /// <returns>HTTP-Antwort</returns>
/// <remarks> /// <remarks>
/// Sample request: /// Sample request:
@@ -140,13 +141,10 @@ public class EnvelopeReceiverController : ControllerBase
/// <response code="500">Es handelt sich um einen unerwarteten Fehler. Die Protokolle sollten überprüft werden.</response> /// <response code="500">Es handelt sich um einen unerwarteten Fehler. Die Protokolle sollten überprüft werden.</response>
[Authorize] [Authorize]
[HttpPost] [HttpPost]
public async Task<IActionResult> CreateAsync([FromBody] CreateEnvelopeReceiverCommand request) public async Task<IActionResult> CreateAsync([FromBody] CreateEnvelopeReceiverCommand request, CancellationToken cancel)
{ {
CancellationToken cancel = default;
int userId = User.GetId();
#region Create Envelope #region Create Envelope
var envelope = await _envelopeExecutor.CreateEnvelopeAsync(userId, request.Title, request.Message, request.TFAEnabled, cancel); var envelope = await _envelopeExecutor.CreateEnvelopeAsync(User.GetId(), request.Title, request.Message, request.TFAEnabled, cancel);
#endregion #endregion
#region Add receivers #region Add receivers

View File

@@ -1,12 +1,7 @@
using DigitalData.Core.Abstraction.Application.DTO; using MediatR;
using DigitalData.Core.API;
using EnvelopeGenerator.Application.Receivers.Queries; using EnvelopeGenerator.Application.Receivers.Queries;
using EnvelopeGenerator.Domain.Entities;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using EnvelopeGenerator.Application.Receivers.Commands;
using EnvelopeGenerator.Application.Common.Dto.Receiver;
using EnvelopeGenerator.Application.Common.Interfaces.Services;
namespace EnvelopeGenerator.GeneratorAPI.Controllers; namespace EnvelopeGenerator.GeneratorAPI.Controllers;
@@ -14,22 +9,22 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers;
/// Controller für die Verwaltung von Empfängern. /// Controller für die Verwaltung von Empfängern.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// Dieser Controller bietet Endpunkte für CRUD-Operationen (Erstellen, Lesen, Aktualisieren, Löschen) /// Dieser Controller bietet Endpunkte für das Abrufen von Empfängern basierend auf E-Mail-Adresse oder Signatur.
/// sowie zusätzliche Funktionen wie das Abrufen von Empfängern basierend auf E-Mail-Adresse oder Signatur.
/// </remarks> /// </remarks>
[Route("api/[controller]")] [Route("api/[controller]")]
[ApiController] [ApiController]
[Authorize] [Authorize]
[Obsolete("Use MediatR")] public class ReceiverController : ControllerBase
public class ReceiverController : CRUDControllerBaseWithErrorHandling<IReceiverService, CreateReceiverCommand, ReceiverDto, UpdateReceiverCommand, Receiver, int>
{ {
private readonly IMediator _mediator;
/// <summary> /// <summary>
/// Initialisiert eine neue Instanz des <see cref="ReceiverController"/>-Controllers. /// Initialisiert eine neue Instanz des <see cref="ReceiverController"/>-Controllers.
/// </summary> /// </summary>
/// <param name="logger">Der Logger für die Protokollierung.</param> /// <param name="mediator">Mediator für Anfragen.</param>
/// <param name="service">Der Dienst für Empfängeroperationen.</param> public ReceiverController(IMediator mediator)
public ReceiverController(ILogger<ReceiverController> logger, IReceiverService service) : base(logger, service)
{ {
_mediator = mediator;
} }
/// <summary> /// <summary>
@@ -40,60 +35,13 @@ public class ReceiverController : CRUDControllerBaseWithErrorHandling<IReceiverS
[HttpGet] [HttpGet]
public async Task<IActionResult> Get([FromQuery] ReadReceiverQuery receiver) public async Task<IActionResult> Get([FromQuery] ReadReceiverQuery receiver)
{ {
if (receiver.Id is null && receiver.EmailAddress is null && receiver.Signature is null) if (!receiver.HasAnyCriteria)
return await base.GetAll(); {
var all = await _mediator.Send(new ReadReceiverQuery());
return Ok(all);
}
if (receiver.Id is int id) var result = await _mediator.Send(receiver);
return await _service.ReadByIdAsync(id).ThenAsync( return result is null ? NotFound() : Ok(result);
Success: Ok,
Fail: IActionResult (msg, ntc) =>
{
return NotFound();
});
return await _service.ReadByAsync(emailAddress: receiver.EmailAddress, signature: receiver.Signature).ThenAsync(
Success: Ok,
Fail: IActionResult (msg, ntc) =>
{
return NotFound();
});
} }
#region REMOVED ENDPOINTS
/// <summary>
/// Diese Methode ist deaktiviert und wird nicht verwendet.
/// </summary>
[NonAction]
public override Task<IActionResult> GetAll() => base.GetAll();
/// <summary>
/// Diese Methode ist deaktiviert und wird nicht verwendet.
/// </summary>
[NonAction]
public override Task<IActionResult> Delete([FromRoute] int id) => base.Delete(id);
/// <summary>
/// Diese Methode ist deaktiviert und wird nicht verwendet.
/// </summary>
[NonAction]
public override Task<IActionResult> Update(UpdateReceiverCommand updateDto) => base.Update(updateDto);
/// <summary>
/// Diese Methode ist deaktiviert und wird nicht verwendet.
/// </summary>
[NonAction]
public override Task<IActionResult> Create(CreateReceiverCommand createDto)
{
return base.Create(createDto);
}
/// <summary>
/// Diese Methode ist deaktiviert und wird nicht verwendet.
/// </summary>
[NonAction]
public override Task<IActionResult> GetById([FromRoute] int id)
{
return base.GetById(id);
}
#endregion
} }