using System.Linq; namespace OpenNest.Data; /// /// Builds the shareable metadata from a live . /// Counts are computed here (not carried on itself) so every caller /// that saves to the nest server gets the same definition of "plate" and "part" counts. /// public static class NestRecordFactory { /// /// Builds a record for uploading . is the /// client-tracked id: for a first save (the server /// assigns one), or the previously returned id to update an existing record. /// is the size of the serialized .nest archive being /// uploaded alongside this record; the server also recomputes it independently. /// public static NestRecord FromNest(Nest nest, System.Guid id, long fileSize) { ArgumentNullException.ThrowIfNull(nest); return new NestRecord { Id = id, Name = nest.Name ?? "", Customer = nest.Customer ?? "", DateCreated = nest.DateCreated, DateModified = nest.DateLastModified, Material = nest.Material?.Name ?? "", Thickness = nest.Thickness, Status = nest.Status, PlateCount = nest.Plates.Count, PartCount = nest.Plates.Sum(CountNonCutoffParts), // Nest has no separate "comments" field; Notes is the closest analog // shown in the nest info dialog, so it round-trips as Comments here. Comments = nest.Notes ?? "", MadeBy = nest.MadeBy ?? "", FileSize = fileSize, }; } private static int CountNonCutoffParts(Plate plate) => plate.Parts.Count(part => !part.BaseDrawing.IsCutOff); }