174 lines
8.2 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|