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;
///
/// Repräsentiert eine Abfrage für Umschläge.
///
public record ReadEnvelopeQuery : EnvelopeQueryBase, IRequest>
{
///
/// Abfrage des Include des Umschlags
///
public EnvelopeStatusQuery? Status { get; init; }
///
/// Optionaler Benutzerfilter; wenn gesetzt, werden nur Umschläge des Benutzers geladen.
///
public int? UserId { get; init; }
///
/// Setzt den Benutzerkontext für die Abfrage.
///
public ReadEnvelopeQuery Authorize(int userId) => this with { UserId = userId };
}
///
/// Repräsentiert den Include eines Umschlags und dessen Beziehung zum Empfänger. (vgl. auch
/// 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.
///
public record EnvelopeStatusQuery
{
///
/// Der minimale Statuswert, der berücksichtigt werden.
///
public EnvelopeStatus? Min { get; init; }
///
/// Der maximale Statuswert, der berücksichtigt werden.
///
public EnvelopeStatus? Max { get; init; }
///
/// Eine Liste von Statuswerten, die einbezogen werden.
///
public EnvelopeStatus[]? Include { get; init; }
///
/// Eine Liste von Statuswerten, die ignoriert werden werden.
///
public EnvelopeStatus[]? Ignore { get; init; }
}
///
/// Verarbeitet und liefert passende -Ergebnisse.
///
public class ReadEnvelopeQueryHandler : IRequestHandler>
{
private readonly IRepository _repository;
private readonly IMapper _mapper;
///
///
///
///
///
public ReadEnvelopeQueryHandler(IRepository repository, IMapper mapper)
{
_repository = repository;
_mapper = mapper;
}
///
///
///
///
///
///
public async Task> 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>(envelopes);
}
}