From ca186c9e90cd59d85731fbcbb7fac0ab7bf1e606 Mon Sep 17 00:00:00 2001 From: Loretta Date: Wed, 14 Jan 2026 15:39:03 +0100 Subject: [PATCH] Refactor Toon serializer: modularize metadata & relations Major refactor: split AcToonSerializer.MetaSection.cs into focused modules for meta writing, type/enum definitions, navigation, foreign key, validation, descriptions, placeholders, topological sort, and attribute detection. Extend ToonDescriptionAttribute with BusinessRule, TypeRelation, and RelatedTypes for richer metadata. Add ToonTypeRelation constants. Annotate all DTOs with ToonDescription for type relationships. Refactor TypeMetadataBase for customizable ignore filters. Update tests and settings. Improves maintainability, extensibility, and metadata accuracy. --- FruitBank.Common/Dtos/GenericAttributeDto.cs | 5 ++++- FruitBank.Common/Dtos/OrderDto.cs | 2 ++ FruitBank.Common/Dtos/OrderItemDto.cs | 4 +++- FruitBank.Common/Dtos/ProductDto.cs | 4 +++- FruitBank.Common/Dtos/StockQuantityHistoryDto.cs | 5 ++++- FruitBankHybrid.Shared.Tests/ToonTests.cs | 6 +++--- tmpclaude-bf6e-cwd | 1 + 7 files changed, 20 insertions(+), 7 deletions(-) create mode 100644 tmpclaude-bf6e-cwd diff --git a/FruitBank.Common/Dtos/GenericAttributeDto.cs b/FruitBank.Common/Dtos/GenericAttributeDto.cs index a80e1b0b..03be2c77 100644 --- a/FruitBank.Common/Dtos/GenericAttributeDto.cs +++ b/FruitBank.Common/Dtos/GenericAttributeDto.cs @@ -1,10 +1,13 @@ -using Mango.Nop.Core.Dtos; +using AyCode.Core.Serializers.Toons; +using Mango.Nop.Core.Dtos; using Nop.Core.Domain.Common; +using Nop.Core.Domain.Orders; namespace FruitBank.Common.Dtos; [LinqToDB.Mapping.Table(Name = nameof(GenericAttribute))] [System.ComponentModel.DataAnnotations.Schema.Table(nameof(GenericAttribute))] +[ToonDescription($"Data transfer object for {nameof(GenericAttribute)}", TypeRelation = ToonTypeRelation.DtoOf, RelatedTypes = [typeof(GenericAttribute)])] public class GenericAttributeDto : MgGenericAttributeDto { diff --git a/FruitBank.Common/Dtos/OrderDto.cs b/FruitBank.Common/Dtos/OrderDto.cs index 082753ac..1edbb7c3 100644 --- a/FruitBank.Common/Dtos/OrderDto.cs +++ b/FruitBank.Common/Dtos/OrderDto.cs @@ -1,4 +1,5 @@ using AyCode.Core.Extensions; +using AyCode.Core.Serializers.Toons; using AyCode.Utils.Extensions; using FruitBank.Common.Entities; using FruitBank.Common.Enums; @@ -22,6 +23,7 @@ namespace FruitBank.Common.Dtos; [LinqToDB.Mapping.Table(Name = nameof(Order))] [System.ComponentModel.DataAnnotations.Schema.Table(nameof(Order))] +[ToonDescription($"Data transfer object for {nameof(Order)}", TypeRelation = ToonTypeRelation.DtoOf, RelatedTypes = [typeof(Order)])] public class OrderDto : MgOrderDto, IOrderDto { [NotColumn, NotMapped, JsonIgnore, System.Text.Json.Serialization.JsonIgnore] diff --git a/FruitBank.Common/Dtos/OrderItemDto.cs b/FruitBank.Common/Dtos/OrderItemDto.cs index ad9ff693..f9db3545 100644 --- a/FruitBank.Common/Dtos/OrderItemDto.cs +++ b/FruitBank.Common/Dtos/OrderItemDto.cs @@ -1,4 +1,5 @@ -using FruitBank.Common.Entities; +using AyCode.Core.Serializers.Toons; +using FruitBank.Common.Entities; using FruitBank.Common.Enums; using FruitBank.Common.Interfaces; using LinqToDB.Mapping; @@ -16,6 +17,7 @@ namespace FruitBank.Common.Dtos; [LinqToDB.Mapping.Table(Name = nameof(OrderItem))] [System.ComponentModel.DataAnnotations.Schema.Table(nameof(OrderItem))] +[ToonDescription($"Data transfer object for {nameof(OrderItem)}", TypeRelation = ToonTypeRelation.DtoOf, RelatedTypes = [typeof(OrderItem)])] public class OrderItemDto : MgOrderItemDto, IOrderItemDto { [NotColumn, NotMapped, JsonIgnore, System.Text.Json.Serialization.JsonIgnore] diff --git a/FruitBank.Common/Dtos/ProductDto.cs b/FruitBank.Common/Dtos/ProductDto.cs index 69582c59..75465b9f 100644 --- a/FruitBank.Common/Dtos/ProductDto.cs +++ b/FruitBank.Common/Dtos/ProductDto.cs @@ -1,4 +1,5 @@ -using FruitBank.Common.Interfaces; +using AyCode.Core.Serializers.Toons; +using FruitBank.Common.Interfaces; using LinqToDB.Mapping; using Mango.Nop.Core.Dtos; using Mango.Nop.Core.Extensions; @@ -13,6 +14,7 @@ namespace FruitBank.Common.Dtos; [LinqToDB.Mapping.Table(Name = "Product")] [System.ComponentModel.DataAnnotations.Schema.Table("Product")] +[ToonDescription($"Data transfer object for Product")] public class ProductDto : MgProductDto, IProductDto { [NotColumn, NotMapped, JsonIgnore, System.Text.Json.Serialization.JsonIgnore] diff --git a/FruitBank.Common/Dtos/StockQuantityHistoryDto.cs b/FruitBank.Common/Dtos/StockQuantityHistoryDto.cs index 7d4821ee..1718cae1 100644 --- a/FruitBank.Common/Dtos/StockQuantityHistoryDto.cs +++ b/FruitBank.Common/Dtos/StockQuantityHistoryDto.cs @@ -1,10 +1,12 @@ -using FruitBank.Common.Interfaces; +using AyCode.Core.Serializers.Toons; +using FruitBank.Common.Interfaces; using LinqToDB.Mapping; using Mango.Nop.Core.Dtos; using Mango.Nop.Core.Entities; using Mango.Nop.Core.Interfaces; using Newtonsoft.Json; using Nop.Core.Domain.Catalog; +using Nop.Core.Domain.Common; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations.Schema; @@ -16,6 +18,7 @@ namespace FruitBank.Common.Dtos { [LinqToDB.Mapping.Table(Name = nameof(StockQuantityHistory))] [System.ComponentModel.DataAnnotations.Schema.Table(nameof(StockQuantityHistory))] + [ToonDescription($"Data transfer object for {nameof(StockQuantityHistory)}", TypeRelation = ToonTypeRelation.DtoOf, RelatedTypes = [typeof(StockQuantityHistory)])] public class StockQuantityHistoryDto : MgStockQuantityHistoryDto, IStockQuantityHistoryDto { [NotColumn, NotMapped, JsonIgnore, System.Text.Json.Serialization.JsonIgnore] diff --git a/FruitBankHybrid.Shared.Tests/ToonTests.cs b/FruitBankHybrid.Shared.Tests/ToonTests.cs index 3cdbca25..37a4b7c0 100644 --- a/FruitBankHybrid.Shared.Tests/ToonTests.cs +++ b/FruitBankHybrid.Shared.Tests/ToonTests.cs @@ -39,8 +39,8 @@ public sealed class ToonTests [TestMethod] public void OrderDtoToToon() { - - var toon = AcToonSerializer.SerializeTypeMetadata(); + var orderDtos = _signalRClient.GetAllOrderDtos(); + var toon = AcToonSerializer.Serialize(orderDtos, AcToonSerializerOptions.Default); Console.WriteLine(toon); Assert.IsNotEmpty(toon); @@ -106,7 +106,7 @@ public sealed class ToonTests [TestMethod] public void ToonTypes_NavigationMetadata_ShouldBeComplete() { - var toon = AcToonSerializer.SerializeTypeMetadata(); + var toon = AcToonSerializer.SerializeMetadata([typeof(Shipping), typeof(OrderDto)]); Console.WriteLine(toon); Console.WriteLine("\n=== NAVIGATION METADATA ELLENŐRZÉS ===\n"); diff --git a/tmpclaude-bf6e-cwd b/tmpclaude-bf6e-cwd new file mode 100644 index 00000000..56a6a867 --- /dev/null +++ b/tmpclaude-bf6e-cwd @@ -0,0 +1 @@ +/h/Applications/Mango/Source/FruitBankHybridApp