using System.Text.Json; using System.Text.Json.Serialization; using OpenNest.Data; namespace OpenNest.Server; /// /// /api/materials: the company material list. Adding is idempotent by /// : 201 when a material or grade was added, 200 when both /// were already listed. Either way the reply is the material as listed. /// internal static class MaterialRoutes { private static readonly JsonSerializerOptions AdditionOptions = new(JsonSerializerDefaults.Web) { PropertyNameCaseInsensitive = true, UnmappedMemberHandling = JsonUnmappedMemberHandling.Disallow, }; public static void MapMaterials(this IEndpointRouteBuilder app) { app.MapGet("/api/materials", (NestDatabase db) => Results.Ok(db.ListMaterials())); app.MapPost("/api/materials", async (HttpRequest request, NestDatabase db) => { var (json, error) = await DrawingSetRoutes.ReadJson(request, "material"); if (error is not null) return error; MaterialListAddition? addition; try { addition = JsonSerializer.Deserialize(json!, AdditionOptions); } catch (JsonException) { return Results.BadRequest("Invalid material JSON."); } if (MaterialListRules.GetError(addition) is { } invalid) return Results.BadRequest(invalid); var (entry, added) = db.AddMaterial(addition!); return added ? Results.Created("/api/materials", entry) : Results.Ok(entry); }); } }