Consolidate envelope querying logic by extending ReadEnvelopeQuery to support user filtering and status options, and introduce ReadEnvelopeQueryHandler to process all envelope queries. Remove ReadUserEnvelopesQuery and its handler, reducing duplication and improving maintainability.
141 lines
5.2 KiB
C#
141 lines
5.2 KiB
C#
using MediatR;
|
|
using EnvelopeGenerator.Domain.Constants;
|
|
using EnvelopeGenerator.Application.Common.Query;
|
|
using EnvelopeGenerator.Application.Common.Dto;
|
|
using AutoMapper;
|
|
using DigitalData.Core.Abstraction.Application.Repository;
|
|
using EnvelopeGenerator.Domain.Entities;
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
namespace EnvelopeGenerator.Application.Envelopes.Queries;
|
|
|
|
/// <summary>
|
|
/// Repräsentiert eine Abfrage für Umschläge.
|
|
/// </summary>
|
|
public record ReadEnvelopeQuery : EnvelopeQueryBase, IRequest<IEnumerable<EnvelopeDto>>
|
|
{
|
|
/// <summary>
|
|
/// Abfrage des Include des Umschlags
|
|
/// </summary>
|
|
public EnvelopeStatusQuery? Status { get; init; }
|
|
|
|
/// <summary>
|
|
/// Optionaler Benutzerfilter; wenn gesetzt, werden nur Umschläge des Benutzers geladen.
|
|
/// </summary>
|
|
public int? UserId { get; init; }
|
|
|
|
/// <summary>
|
|
/// Setzt den Benutzerkontext für die Abfrage.
|
|
/// </summary>
|
|
public ReadEnvelopeQuery Authorize(int userId) => this with { UserId = userId };
|
|
}
|
|
|
|
/// <summary>
|
|
/// Repräsentiert den Include eines Umschlags und dessen Beziehung zum Empfänger. (vgl. auch <see cref="EnvelopeStatusQuery"/>
|
|
/// Invalid (0): Ungültiger Include.
|
|
/// 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.
|
|
/// </summary>
|
|
|
|
public record EnvelopeStatusQuery
|
|
{
|
|
/// <summary>
|
|
/// Der minimale Statuswert, der berücksichtigt werden.
|
|
/// </summary>
|
|
public EnvelopeStatus? Min { get; init; }
|
|
|
|
/// <summary>
|
|
/// Der maximale Statuswert, der berücksichtigt werden.
|
|
/// </summary>
|
|
public EnvelopeStatus? Max { get; init; }
|
|
|
|
/// <summary>
|
|
/// Eine Liste von Statuswerten, die einbezogen werden.
|
|
/// </summary>
|
|
public EnvelopeStatus[]? Include { get; init; }
|
|
|
|
/// <summary>
|
|
/// Eine Liste von Statuswerten, die ignoriert werden werden.
|
|
/// </summary>
|
|
public EnvelopeStatus[]? Ignore { get; init; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Verarbeitet <see cref="ReadEnvelopeQuery"/> und liefert passende <see cref="EnvelopeDto"/>-Ergebnisse.
|
|
/// </summary>
|
|
public class ReadEnvelopeQueryHandler : IRequestHandler<ReadEnvelopeQuery, IEnumerable<EnvelopeDto>>
|
|
{
|
|
private readonly IRepository<Envelope> _repository;
|
|
private readonly IMapper _mapper;
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <param name="repository"></param>
|
|
/// <param name="mapper"></param>
|
|
public ReadEnvelopeQueryHandler(IRepository<Envelope> repository, IMapper mapper)
|
|
{
|
|
_repository = repository;
|
|
_mapper = mapper;
|
|
}
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <param name="request"></param>
|
|
/// <param name="cancel"></param>
|
|
/// <returns></returns>
|
|
public async Task<IEnumerable<EnvelopeDto>> Handle(ReadEnvelopeQuery request, CancellationToken cancel)
|
|
{
|
|
var query = _repository.Query;
|
|
|
|
if (request.UserId is int userId)
|
|
query = query.Where(e => e.UserId == userId);
|
|
|
|
if (request.Id is int id)
|
|
query = query.Where(e => e.Id == id);
|
|
|
|
if (request.Uuid is string uuid)
|
|
query = query.Where(e => e.Uuid == uuid);
|
|
|
|
if (request.Status is { } status)
|
|
{
|
|
if (status.Min is not null)
|
|
query = query.Where(e => e.Status >= status.Min);
|
|
if (status.Max is not null)
|
|
query = query.Where(e => e.Status <= status.Max);
|
|
if (status.Include?.Length > 0)
|
|
query = query.Where(e => status.Include.Contains(e.Status));
|
|
if (status.Ignore?.Length > 0)
|
|
query = query.Where(e => !status.Ignore.Contains(e.Status));
|
|
}
|
|
|
|
var envelopes = await query
|
|
.Include(e => e.Documents)
|
|
.ToListAsync(cancel);
|
|
|
|
return _mapper.Map<IEnumerable<EnvelopeDto>>(envelopes);
|
|
}
|
|
} |