using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations.Schema; using System.Text.Json.Serialization; using System.Text.Json; using eprintServer.Enums; namespace eprintServer.Entities; [JsonConverter(typeof(QuantityPricingConfigConverter))] public class QuantityPricingConfig { public List Tiers { get; set; } = new(); } public class QuantityPricingConfigConverter : JsonConverter { public override QuantityPricingConfig? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType == JsonTokenType.StartArray) { using var doc = JsonDocument.ParseValue(ref reader); var tiers = new List(); foreach (var element in doc.RootElement.EnumerateArray()) { var tier = JsonSerializer.Deserialize(element.GetRawText(), options); if (tier != null) tiers.Add(tier); } return tiers.Count == 0 ? null : new QuantityPricingConfig { Tiers = tiers }; } if (reader.TokenType == JsonTokenType.Null) return null; if (reader.TokenType == JsonTokenType.StartObject) { using var doc = JsonDocument.ParseValue(ref reader); var tiers = new List(); if (doc.RootElement.TryGetProperty("tiers", out var tiersElement)) { foreach (var element in tiersElement.EnumerateArray()) { var tier = JsonSerializer.Deserialize(element.GetRawText(), options); if (tier != null) tiers.Add(tier); } } return new QuantityPricingConfig { Tiers = tiers }; } throw new JsonException($"Unexpected token {reader.TokenType} when parsing QuantityPricingConfig."); } public override void Write(Utf8JsonWriter writer, QuantityPricingConfig? value, JsonSerializerOptions options) { if (value == null) { writer.WriteNullValue(); return; } writer.WriteStartObject(); writer.WritePropertyName("tiers"); JsonSerializer.Serialize(writer, value.Tiers, options); writer.WriteEndObject(); } }