diff --git a/EnvelopeGenerator.Application/Histories/Queries/CountHistoryQuery.cs b/EnvelopeGenerator.Application/Histories/Queries/CountHistoryQuery.cs index 3bfc198c..bc5cc51e 100644 --- a/EnvelopeGenerator.Application/Histories/Queries/CountHistoryQuery.cs +++ b/EnvelopeGenerator.Application/Histories/Queries/CountHistoryQuery.cs @@ -31,7 +31,9 @@ public static class CountHistoryQueryExtensions var count = await sender.Send(new CountHistoryQuery { Envelope = new() { Uuid = uuid }, +#pragma warning disable CS0618 // Type or member is obsolete Status = status, +#pragma warning restore CS0618 // Type or member is obsolete }, cancel); return count > 0; } @@ -75,8 +77,26 @@ public class CountHistoryQueryHandler : IRequestHandler else throw new BadRequestException("Invalid request: An Envelope object or a valid EnvelopeId/UUID must be supplied."); +#pragma warning disable CS0618 // Type or member is obsolete if (request.Status is not null) query = query.Where(h => h.Status == request.Status); +#pragma warning restore CS0618 // Type or member is obsolete + + if (request.Statuses is not null) + { + var status = request.Statuses; + if (status.Min is not null) + query = query.Where(er => er.Envelope!.Status >= status.Min); + + if (status.Max is not null) + query = query.Where(er => er.Envelope!.Status <= status.Max); + + if (status.Include?.Length > 0) + query = query.Where(er => status.Include.Contains(er.Envelope!.Status)); + + if (status.Ignore is not null) + query = query.Where(er => !status.Ignore.Contains(er.Envelope!.Status)); + } return query.CountAsync(cancel); } diff --git a/EnvelopeGenerator.Application/Histories/Queries/HistoryQueryBase.cs b/EnvelopeGenerator.Application/Histories/Queries/HistoryQueryBase.cs index f9c70b34..ba3de6e4 100644 --- a/EnvelopeGenerator.Application/Histories/Queries/HistoryQueryBase.cs +++ b/EnvelopeGenerator.Application/Histories/Queries/HistoryQueryBase.cs @@ -19,10 +19,42 @@ public record HistoryQueryBase /// /// Der Include des Umschlags, der abgefragt werden soll. Kann optional angegeben werden, um die Ergebnisse zu filtern. /// + [Obsolete("Use statuses")] public EnvelopeStatus? Status { get; set; } + /// + /// + /// + public EnvelopeStatusQuery Statuses { get; set; } = new(); + /// /// /// public EnvelopeQueryBase Envelope { get; set; } = new EnvelopeQueryBase(); +} + +/// +/// +/// +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; } } \ No newline at end of file diff --git a/EnvelopeGenerator.Application/Histories/Queries/ReadHistoryQuery.cs b/EnvelopeGenerator.Application/Histories/Queries/ReadHistoryQuery.cs index 13887f8f..99cb4fc3 100644 --- a/EnvelopeGenerator.Application/Histories/Queries/ReadHistoryQuery.cs +++ b/EnvelopeGenerator.Application/Histories/Queries/ReadHistoryQuery.cs @@ -62,8 +62,26 @@ public class ReadHistoryQueryHandler : IRequestHandler h.Status == request.Status); +#pragma warning restore CS0618 // Type or member is obsolete + + if (request.Statuses is not null) + { + var status = request.Statuses; + if (status.Min is not null) + query = query.Where(er => er.Envelope!.Status >= status.Min); + + if (status.Max is not null) + query = query.Where(er => er.Envelope!.Status <= status.Max); + + if (status.Include?.Length > 0) + query = query.Where(er => status.Include.Contains(er.Envelope!.Status)); + + if (status.Ignore is not null) + query = query.Where(er => !status.Ignore.Contains(er.Envelope!.Status)); + } if (request.OnlyLast) query = query.OrderByDescending(x => x.AddedWhen);