mirror of
https://github.com/ajisaacs/OpenNest.git
synced 2026-10-05 07:52:11 -04:00
GET /api/nests/query filters name, customer, material, made by, comments and status (stored and display names) with an escaped LIKE parameter, orders newest saved first with an id tie-break, and returns one page of at most 500 records plus the total match count, read in one database hold. Unknown, repeated or out-of-range parameters return 400. RemoteNestRepository.QueryAsync validates the same bounds before sending, rejects oversized pages, and reports a 404 from an older server as a server that needs updating. GET /api/nests stays the full enumeration used by backup, restore checks and the container smoke.
40 lines
1.5 KiB
C#
40 lines
1.5 KiB
C#
namespace OpenNest.Data;
|
|
|
|
/// <summary>
|
|
/// One bounded page request for browsing saved nests (<c>GET /api/nests/query</c>).
|
|
/// The server filters and pages in SQL; the client and server share these bounds.
|
|
/// </summary>
|
|
public sealed class NestQuery
|
|
{
|
|
public const int DefaultLimit = 100;
|
|
public const int MaxLimit = 500;
|
|
public const int MaxSearchLength = 200;
|
|
|
|
/// <summary>
|
|
/// Case-insensitive substring matched against name, customer, material, made by,
|
|
/// comments and status (stored and display names). Blank means no filter.
|
|
/// </summary>
|
|
public string Search { get; init; } = "";
|
|
|
|
/// <summary>Number of matching records to skip, zero or greater.</summary>
|
|
public int Offset { get; init; }
|
|
|
|
/// <summary>Maximum records returned, 1 to <see cref="MaxLimit"/>.</summary>
|
|
public int Limit { get; init; } = DefaultLimit;
|
|
|
|
/// <summary>The search text as matched: trimmed, never null.</summary>
|
|
public string NormalizedSearch => (Search ?? "").Trim();
|
|
|
|
/// <summary>The first violated bound, or null when the query may be sent.</summary>
|
|
public string? GetValidationError()
|
|
{
|
|
if (Offset < 0)
|
|
return "offset must be zero or greater.";
|
|
if (Limit < 1 || Limit > MaxLimit)
|
|
return $"limit must be between 1 and {MaxLimit}.";
|
|
if (NormalizedSearch.Length > MaxSearchLength)
|
|
return $"search must be at most {MaxSearchLength} characters.";
|
|
return null;
|
|
}
|
|
}
|