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); } }