// src/Webshop.Api/JsonConverters/AdminPaymentMethodDtoConverter.cs using System; using System.Text.Json; using System.Text.Json.Serialization; using Webshop.Application.DTOs.Payments; using Webshop.Domain.Enums; namespace Webshop.Api.JsonConverters { public class AdminPaymentMethodDtoConverter : JsonConverter { public override AdminPaymentMethodDto Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.StartObject) { throw new JsonException("Expected StartObject token."); } // Ein temporäres JsonDocument erstellen, um das Objekt zu analysieren using var jsonDocument = JsonDocument.ParseValue(ref reader); var jsonObject = jsonDocument.RootElement; var dto = new AdminPaymentMethodDto(); // Lese alle Standard-Eigenschaften if (jsonObject.TryGetProperty(nameof(AdminPaymentMethodDto.Id), out var idElement)) { dto.Id = idElement.GetGuid(); } if (jsonObject.TryGetProperty(nameof(AdminPaymentMethodDto.Name), out var nameElement)) { dto.Name = nameElement.GetString() ?? string.Empty; } if (jsonObject.TryGetProperty(nameof(AdminPaymentMethodDto.Description), out var descriptionElement)) { dto.Description = descriptionElement.GetString(); } if (jsonObject.TryGetProperty(nameof(AdminPaymentMethodDto.IsActive), out var isActiveElement)) { dto.IsActive = isActiveElement.GetBoolean(); } if (jsonObject.TryGetProperty(nameof(AdminPaymentMethodDto.ProcessingFee), out var processingFeeElement)) { dto.ProcessingFee = processingFeeElement.GetDecimal(); } // Lese den PaymentGatewayType, um zu entscheiden, wie die Konfiguration deserialisiert werden soll if (!jsonObject.TryGetProperty(nameof(AdminPaymentMethodDto.PaymentGatewayType), out var typeElement) || !Enum.TryParse(typeElement.GetString(), true, out var gatewayType)) { throw new JsonException("PaymentGatewayType is missing or invalid."); } dto.PaymentGatewayType = gatewayType; // Deserialisiere die Konfiguration basierend auf dem Typ if (jsonObject.TryGetProperty(nameof(AdminPaymentMethodDto.Configuration), out var configElement) && configElement.ValueKind != JsonValueKind.Null) { var configOptions = new JsonSerializerOptions(options); // Klonen der Optionen configOptions.Converters.Remove(this); // Entferne diesen Konverter, um eine Endlosschleife zu vermeiden switch (gatewayType) { case PaymentGatewayType.BankTransfer: dto.Configuration = configElement.Deserialize(configOptions); break; case PaymentGatewayType.Stripe: dto.Configuration = configElement.Deserialize(configOptions); break; case PaymentGatewayType.PayPal: dto.Configuration = configElement.Deserialize(configOptions); break; // Fügen Sie hier weitere Fälle hinzu default: // Behandeln Sie den Fall, dass keine spezifische Konfiguration benötigt wird dto.Configuration = null; break; } } return dto; } public override void Write(Utf8JsonWriter writer, AdminPaymentMethodDto value, JsonSerializerOptions options) { var writeOptions = new JsonSerializerOptions(options); writeOptions.Converters.Remove(this); // Entferne diesen Konverter, um eine Endlosschleife zu vermeiden writer.WriteStartObject(); writer.WriteString("id", value.Id); writer.WriteString("name", value.Name); writer.WriteString("description", value.Description); writer.WriteBoolean("isActive", value.IsActive); // Schreibe den Enum als String writer.WriteString("paymentGatewayType", value.PaymentGatewayType.ToString()); if (value.Configuration != null) { writer.WritePropertyName("configuration"); // Serialisiere das Konfigurationsobjekt mit seinem konkreten Typ JsonSerializer.Serialize(writer, value.Configuration, value.Configuration.GetType(), writeOptions); } else { writer.WriteNull("configuration"); } if (value.ProcessingFee.HasValue) { writer.WriteNumber("processingFee", value.ProcessingFee.Value); } else { writer.WriteNull("processingFee"); } writer.WriteEndObject(); } } }