feat(history-query): support multiple status filters in CountHistoryQueryHandler
- Added handling for `Statuses` property to filter by min, max, include, and ignore lists. - Deprecated single `Status` handling is now wrapped with pragma warnings for backward compatibility. - Ensures `AnyHistoryAsync` extension works correctly with enhanced query filtering.
This commit is contained in:
parent
28b8c311f9
commit
637b45efe0
@ -31,7 +31,9 @@ public static class CountHistoryQueryExtensions
|
|||||||
var count = await sender.Send(new CountHistoryQuery
|
var count = await sender.Send(new CountHistoryQuery
|
||||||
{
|
{
|
||||||
Envelope = new() { Uuid = uuid },
|
Envelope = new() { Uuid = uuid },
|
||||||
|
#pragma warning disable CS0618 // Type or member is obsolete
|
||||||
Status = status,
|
Status = status,
|
||||||
|
#pragma warning restore CS0618 // Type or member is obsolete
|
||||||
}, cancel);
|
}, cancel);
|
||||||
return count > 0;
|
return count > 0;
|
||||||
}
|
}
|
||||||
@ -75,8 +77,26 @@ public class CountHistoryQueryHandler : IRequestHandler<CountHistoryQuery, int>
|
|||||||
else
|
else
|
||||||
throw new BadRequestException("Invalid request: An Envelope object or a valid EnvelopeId/UUID must be supplied.");
|
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)
|
if (request.Status is not null)
|
||||||
query = query.Where(h => h.Status == request.Status);
|
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);
|
return query.CountAsync(cancel);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -19,10 +19,42 @@ public record HistoryQueryBase
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Der Include des Umschlags, der abgefragt werden soll. Kann optional angegeben werden, um die Ergebnisse zu filtern.
|
/// Der Include des Umschlags, der abgefragt werden soll. Kann optional angegeben werden, um die Ergebnisse zu filtern.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[Obsolete("Use statuses")]
|
||||||
public EnvelopeStatus? Status { get; set; }
|
public EnvelopeStatus? Status { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
public EnvelopeStatusQuery Statuses { get; set; } = new();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public EnvelopeQueryBase Envelope { get; set; } = new EnvelopeQueryBase();
|
public EnvelopeQueryBase Envelope { get; set; } = new EnvelopeQueryBase();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </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; }
|
||||||
|
}
|
||||||
@ -62,8 +62,26 @@ public class ReadHistoryQueryHandler : IRequestHandler<ReadHistoryQuery, IEnumer
|
|||||||
else
|
else
|
||||||
throw new BadRequestException("Invalid request: An Envelope object or a valid EnvelopeId/UUID must be supplied.");
|
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)
|
if (request.Status is not null)
|
||||||
query = query.Where(h => h.Status == request.Status);
|
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));
|
||||||
|
}
|
||||||
|
|
||||||
if (request.OnlyLast)
|
if (request.OnlyLast)
|
||||||
query = query.OrderByDescending(x => x.AddedWhen);
|
query = query.OrderByDescending(x => x.AddedWhen);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user