gehgassi_backend/gehGassi.Core/Services/PaymentTransactionService.cs

174 lines
8.2 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
using gehGassi.Core.Interfaces;
using gehGassi.Domain.Common;
using gehGassi.Domain.Payment;
namespace gehGassi.Core.Services
{
/// <summary>
/// Service der die Verwaltung von Zahlungstransaktionen ermöglicht
/// </summary>
public class PaymentTransactionService : ServiceBase<PaymentTransaction>, IPaymentTransactionService
{
/// <summary>
/// Erstellt eine Instanz
/// </summary>
/// <param name="unitOfWork">Instanz eines IUnitOfWork</param>
public PaymentTransactionService(IUnitOfWork unitOfWork) : base(unitOfWork)
{
}
/// <summary>
/// Erstellen einer Zahlungs-Transaktion
/// </summary>
/// <returns>Zahlungs-Transaktion</returns>
public PaymentTransaction Create()
{
var item = new PaymentTransaction
{
Created = DateTimeOffset.UtcNow,
ErrorMessage = string.Empty,
ErrorType = string.Empty,
ErrorMessages = string.Empty
};
return item;
}
/// <summary>
/// Gibt eine Transaktion anhand der MangoPay TransaktionsId zurück.
/// Diese muss den entsprechenden TransaktionsTyp und Status haben
/// </summary>
/// <param name="transactionId">Id der Transaktion bei MangoPay</param>
/// <param name="type">Typ der Transaktion</param>
/// <param name="status">Status der Transaktion</param>
/// <returns>Transaktion oder null, wenn nicht gefunden</returns>
public async Task<PaymentTransaction> GetAsync(string transactionId, PaymentTransactionType type, PaymentTransactionStatus status)
{
return await Repository.FirstOrDefaultAsync(c => c.TransactionId == transactionId && c.Type == type && c.Status == status).ConfigureAwait(false);
}
/// <summary>
/// Gibt eine Transaktion anhand der MangoPay TransaktionsId zurück. Hier wird die zuletzt erstellte Transaktion zurückgegeben.
/// Diese muss den entsprechenden TransaktionsTyp und Status haben
/// </summary>
/// <param name="transactionId">Id der Transaktion bei MangoPay</param>
/// <param name="type">Typ der Transaktion</param>
/// <returns>Transaktion oder null, wenn nicht gefunden</returns>
public async Task<PaymentTransaction> GetAsync(string transactionId, PaymentTransactionType type)
{
var transactions = await Repository.FindAsync(c => c.TransactionId == transactionId && c.Type == type).ConfigureAwait(false);
var transaction = transactions.MaxBy(c => c.Created);
return transaction;
}
/// <summary>
/// Erstellen einer Zahlungs-Transaktion
/// </summary>
/// <param name="transactionId">Id der Transaktion bei MangoPay</param>
/// <param name="type">Typ der Transaktion</param>
/// <param name="status">Status der Transaktion</param>
/// <param name="walkId">Id des Walks</param>
/// <param name="targetAppUserId">Id des AppUsers der die Zahlung erhält</param>
/// <param name="targetWalletId">Id des Wallets, auf das die Transaktion angewendet wird</param>
/// <param name="sourceAppUserId">Id des AppUsers der die Zahlung veranlasst</param>
/// <param name="sourceWalletId">Id des Wallets, von dem die Transaktion ausgeht</param>
/// <param name="ammount">Betrag in der kleinsten Einheit der Währung</param>
/// <param name="fromCredit">Zusätzlich vom Guthabenkonto in der kleinsten Einheit der Währung</param>
/// <param name="currency">Währung ISO 4217 Code</param>
/// <param name="payInType">Art der Zahlung</param>
/// <returns>Zahlungs-Transaktion</returns>
public PaymentTransaction Create(string transactionId, PaymentTransactionType type, PaymentTransactionStatus status, string walkId, string targetAppUserId, string targetWalletId, string sourceAppUserId,
string sourceWalletId, long ammount, long fromCredit, string currency, PayInType? payInType)
{
var item = new PaymentTransaction()
{
TransactionId = transactionId,
Type = type,
Status = status,
WalkId = walkId,
TargetAppUserId = targetAppUserId,
TargetWalletId = targetWalletId,
SourceAppUserId = sourceAppUserId,
SourceWalletId = sourceWalletId,
Ammount = ammount,
FromCredit = fromCredit,
Currency = currency,
ErrorMessage = string.Empty,
ErrorType = string.Empty,
ErrorMessages = string.Empty,
Created = DateTimeOffset.UtcNow,
PayInType = payInType
};
return item;
}
/// <summary>
/// Erstellen einer Zahlungs-Transaktion mit Fehlern nach Mangopay
/// </summary>
/// <param name="transactionId">Id der Transaktion bei MangoPay</param>
/// <param name="type">Typ der Transaktion</param>
/// <param name="status">Status der Transaktion</param>
/// <param name="walkId">Id des Walks</param>
/// <param name="targetAppUserId">Id des AppUsers der die Zahlung erhält</param>
/// <param name="targetWalletId">Id des Wallets, auf das die Transaktion angewendet wird</param>
/// <param name="sourceAppUserId">Id des AppUsers der die Zahlung veranlasst</param>
/// <param name="sourceWalletId">Id des Wallets, von dem die Transaktion ausgeht</param>
/// <param name="ammount">Betrag in der kleinsten Einheit der Währung</param>
/// <param name="fromCredit">Zusätzlich vom Guthabenkonto in der kleinsten Einheit der Währung</param>
/// <param name="currency">Währung ISO 4217 Code</param>
/// <param name="errorMessage">Fehlermeldung Mangopay</param>
/// <param name="errorType">Fehlertyp nach Mangopay</param>
/// <param name="errorMessages">Fehlermledungen nach Mangopay - Zusatzinfo</param>
/// <param name="payInType">Art der Zahlung</param>
/// <returns>Zahlungs-Transaktion</returns>
public PaymentTransaction Create(string transactionId, PaymentTransactionType type, PaymentTransactionStatus status, string walkId, string targetAppUserId, string targetWalletId, string sourceAppUserId,
string sourceWalletId, long ammount, long fromCredit, string currency, string errorMessage, string errorType, Dictionary<string, string> errorMessages, PayInType? payInType)
{
var item = new PaymentTransaction()
{
TransactionId = transactionId,
Type = type,
Status = status,
WalkId = walkId,
TargetAppUserId = targetAppUserId,
TargetWalletId = targetWalletId,
SourceAppUserId = sourceAppUserId,
SourceWalletId = sourceWalletId,
Ammount = ammount,
FromCredit = fromCredit,
Currency = currency,
ErrorMessage = string.Empty,
ErrorType = string.Empty,
ErrorMessages = string.Empty,
Created = DateTimeOffset.UtcNow,
PayInType = payInType
};
if (!string.IsNullOrEmpty(errorMessage))
{
item.ErrorMessage = errorMessage.Length <= 500 ? errorMessage : errorMessage[..500];
}
if (!string.IsNullOrEmpty(errorType))
{
item.ErrorType = errorType.Length <= 255 ? errorType : errorType[..255];
}
if (errorMessages != null && errorMessages.Any())
{
item.ErrorMessages = JsonSerializer.Serialize(errorMessages);
if (item.ErrorMessages.Length > 1000)
{
item.ErrorMessages = item.ErrorMessages[..1000];
}
}
return item;
}
}
}