payment methods

This commit is contained in:
Tizian.Breuch
2025-07-31 14:01:39 +02:00
parent b89f0d0dd0
commit 9eef4df3d0
7 changed files with 260 additions and 12 deletions

View File

@@ -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();
}
}
}