feat: modularize external providers

This commit is contained in:
2026-07-27 17:47:21 +08:00
parent db4c7b4496
commit 70b99e6063
47 changed files with 1219 additions and 667 deletions

View File

@@ -1,49 +1,41 @@
using System.Text.Json;
using Microsoft.EntityFrameworkCore;
using Tiku.Application.Commerce;
using Tiku.Application.Tenancy;
using Tiku.Domain.Tenancy;
using Tiku.Domain.Commerce;
using Tiku.Infrastructure.Persistence;
namespace Tiku.Infrastructure.Commerce;
internal sealed class PaymentProviderConfigService(
TikuDbContext dbContext,
ITenantSecretService tenantSecretService) : IPaymentProviderConfigService
ITenantExternalProviderConfigService providerConfigService) : IPaymentProviderConfigService
{
public async Task<PaymentProviderAccount> GetActiveAccountAsync(
Guid tenantId,
string provider,
CancellationToken cancellationToken = default)
{
var normalizedProvider = NormalizeProvider(provider);
var account = await dbContext.TenantPaymentAccounts
.AsNoTracking()
.Where(item =>
item.TenantId == tenantId &&
item.Provider == normalizedProvider &&
item.Status == TenantPaymentAccountStatus.Active)
.SingleOrDefaultAsync(cancellationToken);
if (account is null)
TenantExternalProviderAccount account;
try
{
throw new PaymentProviderException(
"Payment provider account is not configured.",
"payment_provider_not_configured");
}
var secretPayload = normalizedProvider == PaymentProviders.Manual
? JsonDocument.Parse("{}").RootElement.Clone()
: await tenantSecretService.GetActiveSecretPayloadAsync(
account = await providerConfigService.GetActiveProviderAsync(
tenantId,
GetString(account.ConfigPublic, "secretRef", "secret_ref") ?? string.Empty,
TenantExternalProviderCapability.Payment,
NormalizeProvider(provider),
cancellationToken);
}
catch (TenantExternalProviderException exception)
{
throw new PaymentProviderException(exception.Message, "payment_provider_not_configured");
}
return new PaymentProviderAccount(
account.TenantId,
normalizedProvider,
account.Mode.ToString(),
account.Provider,
GetString(account.ConfigPublic, "mode") ?? "TenantCollect",
account.ConfigPublic,
secretPayload);
account.SecretPayload);
}
private static string NormalizeProvider(string provider)