payment methods
This commit is contained in:
@@ -0,0 +1,124 @@
|
||||
// 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user