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.
This commit is contained in:
Developer 02 2025-04-10 16:35:40 +02:00
parent 9f186afdff
commit 2cb5d0c0d5
5 changed files with 106 additions and 65 deletions

View File

@ -1,5 +1,6 @@
using EnvelopeGenerator.Application.Envelopes; using EnvelopeGenerator.Application.Envelopes;
using EnvelopeGenerator.Application.Receivers; using EnvelopeGenerator.Application.Receivers;
using static EnvelopeGenerator.Common.Constants;
namespace EnvelopeGenerator.Application.EnvelopeHistories; namespace EnvelopeGenerator.Application.EnvelopeHistories;
@ -13,4 +14,10 @@ public record EnvelopeHistoryQuery<TEnvelopeQuery, TReceiverQuery>(int EnvelopeI
where TEnvelopeQuery : EnvelopeQuery where TEnvelopeQuery : EnvelopeQuery
where TReceiverQuery : ReceiverQuery where TReceiverQuery : ReceiverQuery
{ {
public ReferenceType ReferenceType =>
Envelope?.User is not null
? ReferenceType.Receiver
: Receiver is not null
? ReferenceType.Receiver
: ReferenceType.System;
} }

View File

@ -0,0 +1,17 @@
using EnvelopeGenerator.Application.Envelopes.Queries.Read;
using EnvelopeGenerator.Application.Receivers.Queries.Read;
namespace EnvelopeGenerator.Application.EnvelopeHistories.Queries.Read;
/// <summary>
/// Repräsentiert eine Abfrage für die Verlaufshistorie eines Umschlags.
/// </summary>
/// <param name="EnvelopeId">Die eindeutige Kennung des Umschlags.</param>
/// <param name="Envelope">Die Abfrage, die den Umschlag beschreibt.</param>
/// <param name="Receiver">Die Abfrage, die den Empfänger beschreibt.</param>
public record ReadEnvelopeHistoryQuery(
int EnvelopeId,
ReadEnvelopeQuery? Envelope,
ReadReceiverQuery? Receiver,
StatusQuery? Status)
: EnvelopeHistoryQuery<ReadEnvelopeQuery, ReadReceiverQuery>(EnvelopeId, Envelope, Receiver, Status);

View File

@ -6,15 +6,18 @@ namespace EnvelopeGenerator.Application.Envelopes;
/// Repräsentiert eine Abfrage für Umschläge. /// Repräsentiert eine Abfrage für Umschläge.
/// </summary> /// </summary>
/// <param name="Id">Die eindeutige Kennung des Umschlags.</param> /// <param name="Id">Die eindeutige Kennung des Umschlags.</param>
/// <param name="UserId">Die Kennung des Benutzers, der den Umschlag erstellt hat.</param> /// <param name="User">Absender des Schreibens</param>
/// <param name="Username">Der Benutzername des Benutzers, der den Umschlag erstellt hat.</param>
/// <param name="Email">Die E-Mail-Adresse des Benutzers, der den Umschlag erstellt hat.</param>
/// <param name="Status">Der Status des Umschlags.</param> /// <param name="Status">Der Status des Umschlags.</param>
/// <param name="Uuid">Die universell eindeutige Kennung des Umschlags.</param> /// <param name="Uuid">Die universell eindeutige Kennung des Umschlags.</param>
public record EnvelopeQuery( public record EnvelopeQuery(
int? Id = null, int? Id = null,
int? UserId = null, UserQuery? User = null,
string? Username = null,
string? Email = null,
int? Status = null, int? Status = null,
string? Uuid = null) : IRequest; string? Uuid = null) : IRequest
{
public int? UserId => User?.Id;
public string? Username => User?.Username;
public string? UserEmail => User?.Username;
};

View File

@ -0,0 +1,5 @@
namespace EnvelopeGenerator.Application.Envelopes;
public record UserQuery(int? Id = null, string? Username = null, string? Email = null)
{
}

View File

@ -1,11 +1,15 @@
using EnvelopeGenerator.Application.Contracts.Services; using EnvelopeGenerator.Application.Contracts.Services;
using EnvelopeGenerator.Application.EnvelopeHistories.Queries.Read;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using System;
using static EnvelopeGenerator.Common.Constants; using static EnvelopeGenerator.Common.Constants;
namespace EnvelopeGenerator.GeneratorAPI.Controllers
{ namespace EnvelopeGenerator.GeneratorAPI.Controllers;
/// <summary>
/// Dieser Controller bietet Endpunkte für den Zugriff auf die Verlaufshistorie von Umschlägen.
/// </summary>
[Route("api/[controller]")] [Route("api/[controller]")]
[ApiController] [ApiController]
[Authorize] [Authorize]
@ -15,6 +19,11 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers
private readonly IEnvelopeHistoryService _service; private readonly IEnvelopeHistoryService _service;
/// <summary>
/// Konstruktor für den HistoryController.
/// </summary>
/// <param name="logger">Der Logger, der für das Protokollieren von Informationen verwendet wird.</param>
/// <param name="service">Der Dienst, der für die Verarbeitung der Verlaufshistorie verantwortlich ist.</param>
public HistoryController(ILogger<HistoryController> logger, IEnvelopeHistoryService service) public HistoryController(ILogger<HistoryController> logger, IEnvelopeHistoryService service)
{ {
_logger = logger; _logger = logger;
@ -38,31 +47,32 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers
return Ok(referenceTypes); return Ok(referenceTypes);
} }
/// <summary>
/// Ruft die gesamte Verlaufshistorie von Umschlägen basierend auf den angegebenen Abfrageparametern ab.
/// </summary>
/// <param name="history">Die Abfrageparameter, die die Filterkriterien für die Verlaufshistorie definieren.</param>
/// <returns>Eine Liste von Verlaufseinträgen, die den angegebenen Kriterien entsprechen.</returns>
[HttpGet] [HttpGet]
[Authorize] [Authorize]
public async Task<IActionResult> GetAllAsync([FromQuery] int? envelopeId = null, [FromQuery] string? userReference = null, [FromQuery] int? referenceType = null, [FromQuery] bool withSender = false, [FromQuery] bool withReceiver = false) public async Task<IActionResult> GetAllAsync([FromQuery] ReadEnvelopeHistoryQuery history)
{ {
ReferenceType? refTypEnum = null; ReferenceType? refTypEnum = history.ReferenceType;
bool withReceiver = false;
bool withSender = false;
if (referenceType is int refTypInt) switch (refTypEnum)
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: case ReferenceType.Receiver:
withReceiver = true; withReceiver = true;
break; break;
case (int)ReferenceType.Sender: case ReferenceType.Sender:
withSender = true; withSender = true;
break; break;
} }
var histories = await _service.ReadAsync( var histories = await _service.ReadAsync(
envelopeId: envelopeId, envelopeId: history.EnvelopeId,
userReference: userReference, //userReference: history.r,
referenceType: refTypEnum, referenceType: refTypEnum,
withSender: withSender, withSender: withSender,
withReceiver: withReceiver); withReceiver: withReceiver);
@ -70,4 +80,3 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers
return Ok(histories); return Ok(histories);
} }
} }
}