Jelajahi Sumber

Fixed json api inventory serialization (#254)

Tim Jones 3 minggu lalu
induk
melakukan
f70720f753

+ 4 - 12
RackPeek.Domain/Api/UpsertInventoryUseCase.cs

@@ -1,9 +1,11 @@
+using System.Collections.Specialized;
 using System.ComponentModel.DataAnnotations;
 using System.Text.Json;
 using System.Text.Json.Serialization;
 using RackPeek.Domain.Persistence;
 using RackPeek.Domain.Persistence.Yaml;
 using RackPeek.Domain.Resources;
+using RackPeek.Domain.Resources.Connections;
 using YamlDotNet.Serialization;
 using YamlDotNet.Serialization.NamingConventions;
 
@@ -49,24 +51,14 @@ public class UpsertInventoryUseCase(
                                rawJson,
                                _jsonOptions)
                            ?? throw new ValidationException("Invalid JSON structure.");
-            // Generate YAML only for persistence layer
-            ISerializer yamlSerializer = new SerializerBuilder()
-                .WithNamingConvention(CamelCaseNamingConvention.Instance)
-                .WithTypeConverter(new StorageSizeYamlConverter())
-                .WithTypeConverter(new NotesStringYamlConverter())
-                .ConfigureDefaultValuesHandling(
-                    DefaultValuesHandling.OmitNull |
-                    DefaultValuesHandling.OmitEmptyCollections)
-                .Build();
-
-            yamlInput = yamlSerializer.Serialize(incomingRoot);
+
+            yamlInput = YamlResourceCollection.SerializeRootAsync(incomingRoot);
         }
 
         if (incomingRoot.Resources == null)
             throw new ValidationException("Missing 'resources' section.");
 
         // 2️Compute Diff
-
         List<Resource>? incomingResources = incomingRoot.Resources;
         IReadOnlyList<Resource> currentResources = await repo.GetAllOfTypeAsync<Resource>();
 

+ 9 - 3
RackPeek.Domain/Persistence/Yaml/YamlResourceCollection.cs

@@ -358,6 +358,11 @@ public sealed class YamlResourceCollection(
     }
 
     private async Task SaveRootAsync(YamlRoot? root) {
+        var contents = SerializeRootAsync(root);
+        await fileStore.WriteAllTextAsync(filePath, contents);
+    }
+
+    public static string SerializeRootAsync(YamlRoot? root) {
         ISerializer serializer = new SerializerBuilder()
             .WithNamingConvention(CamelCaseNamingConvention.Instance)
             .WithTypeConverter(new StorageSizeYamlConverter())
@@ -377,10 +382,11 @@ public sealed class YamlResourceCollection(
             ["connections"] = root.Connections ?? new List<Connection>()
         };
 
-        await fileStore.WriteAllTextAsync(filePath, serializer.Serialize(payload));
+        return serializer.Serialize(payload);
     }
 
-    private string GetKind(Resource resource) {
+
+    private static string GetKind(Resource resource) {
         return resource switch {
             Server => "Server",
             Switch => "Switch",
@@ -396,7 +402,7 @@ public sealed class YamlResourceCollection(
         };
     }
 
-    private OrderedDictionary SerializeResource(Resource resource) {
+    public static OrderedDictionary SerializeResource(Resource resource) {
         var map = new OrderedDictionary {
             ["kind"] = GetKind(resource)
         };