124 lines
5.2 KiB
C#
124 lines
5.2 KiB
C#
// 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<AdminPaymentMethodDto>
|
|
{
|
|
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<PaymentGatewayType>(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<BankTransferConfigurationDto>(configOptions);
|
|
break;
|
|
case PaymentGatewayType.Stripe:
|
|
dto.Configuration = configElement.Deserialize<StripeConfigurationDto>(configOptions);
|
|
break;
|
|
case PaymentGatewayType.PayPal:
|
|
dto.Configuration = configElement.Deserialize<PayPalConfigurationDto>(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();
|
|
}
|
|
}
|
|
} |