mirror of
https://github.com/ajisaacs/OpenNest.git
synced 2026-11-02 04:31:34 -05:00
fix(server): reject duplicate nest ids, invalid metadata and bare --database
- POST /api/nests with an existing id (active or deleted) now returns 409 with the current record instead of a 500 from the UNIQUE constraint. - Uploaded nest metadata must have string text fields and a defined status; null fields and undefined statuses (e.g. 99) are 400 instead of a 500 or a stored invalid value. - --database <path> is accepted alongside --database=<path>; a missing or repeated path fails startup instead of silently using OPENNEST_DB/default. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
3a7073d38c
commit
5dff83cfb8
7 files changed
+309
-37
No files matched your search
@@ -0,0 +1,60 @@
|
||||
using System.Text.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
using OpenNest.Data;
|
||||
|
||||
namespace OpenNest.Server;
|
||||
|
||||
/// <summary>
|
||||
/// Reads and checks uploaded nest metadata. Text fields must be present and the status
|
||||
/// must be a defined value, so invalid metadata is a 400 and never reaches storage.
|
||||
/// </summary>
|
||||
internal static class NestMetadata
|
||||
{
|
||||
// Integer statuses stay accepted for existing callers; GetError refuses undefined ones.
|
||||
public static readonly JsonSerializerOptions Options = new(JsonSerializerDefaults.Web)
|
||||
{
|
||||
PropertyNameCaseInsensitive = true,
|
||||
Converters = { new JsonStringEnumConverter(JsonNamingPolicy.CamelCase) },
|
||||
};
|
||||
|
||||
public static bool TryRead(string? json, out NestRecord record, out string error)
|
||||
{
|
||||
record = new NestRecord();
|
||||
if (string.IsNullOrWhiteSpace(json))
|
||||
{
|
||||
error = "Missing 'metadata' part.";
|
||||
return false;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
if (JsonSerializer.Deserialize<NestRecord>(json, Options) is not { } parsed)
|
||||
{
|
||||
error = "Missing metadata.";
|
||||
return false;
|
||||
}
|
||||
|
||||
record = parsed;
|
||||
}
|
||||
catch (JsonException)
|
||||
{
|
||||
error = "Invalid metadata JSON.";
|
||||
return false;
|
||||
}
|
||||
|
||||
error = GetError(record) ?? "";
|
||||
return error.Length == 0;
|
||||
}
|
||||
|
||||
public static string? GetError(NestRecord record)
|
||||
{
|
||||
if (record.Name is null) return "name must be a string.";
|
||||
if (record.Customer is null) return "customer must be a string.";
|
||||
if (record.Material is null) return "material must be a string.";
|
||||
if (record.Comments is null) return "comments must be a string.";
|
||||
if (record.MadeBy is null) return "madeBy must be a string.";
|
||||
if (!Enum.IsDefined(record.Status)) return "status must be quote, toBeCut or hasBeenCut.";
|
||||
if (!double.IsFinite(record.Thickness)) return "thickness must be a finite number.";
|
||||
return null;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user