CourseWork_Bank/Bank/BankBusinessLogics/BusinessLogic/PaymentLogic.cs

116 lines
4.9 KiB
C#
Raw Permalink Normal View History

using BankContracts.BindingModels;
using BankContracts.BusinessLogicContracts;
using BankContracts.SearchModels;
using BankContracts.StoragesContracts;
using BankContracts.ViewModels;
using Microsoft.Extensions.Logging;
2024-04-28 21:55:25 +04:00
namespace BankBusinessLogics.BusinessLogic
{
public class PaymentLogic : IPaymentLogic
2024-04-28 21:55:25 +04:00
{
private readonly ILogger _logger;
private readonly IPaymentStorage _paymentStorage;
private readonly IOperationStorage _operationStorage;
public PaymentLogic(ILogger<PaymentLogic> logger, IPaymentStorage paymentStorage, IOperationStorage operationStorage)
{
_logger = logger;
_paymentStorage = paymentStorage;
_operationStorage = operationStorage;
}
private void CheckModel(PaymentBindingModel model, bool withParams = true)
{
if (model == null)
{
throw new ArgumentNullException(nameof(model));
}
if (!withParams)
{
return;
}
if (model.PaidPrice < 0)
{
throw new ArgumentNullException(nameof(model.PaidPrice), "Оплаченная стоимость отрицательна");
}
}
public bool Create(PaymentBindingModel model)
{
try
{
CheckModel(model);
var result = _paymentStorage.Insert(model);
if (result == null)
{
throw new ArgumentNullException($"Оплата не создалась");
}
_logger.LogInformation("Создана сущность: {@PaymentViewModel}", result);
return true;
}
catch (Exception e)
{
_logger.LogError(e, "Ошибка при попытки создать элемент по {@PaymentBindingModel} модели", model);
throw;
}
}
public PaymentViewModel ReadElement(PaymentSearchModel model)
{
try
{
var result = _paymentStorage.GetElement(model);
if (result == null)
{
throw new ArgumentNullException($"Не получилось получить эдемент с id {model.Id}");
}
_logger.LogInformation("Извлечение оплаты {@PaymentViewModel} по {@PaymentSearchModel} модели", result, model);
return result;
}
catch (Exception e)
{
_logger.LogError(e, "Произошла ошибка при попытки получить элемент по {@PaymentSearchModel} модели", model);
throw;
}
}
public List<PaymentViewModel> ReadList(PaymentSearchModel model)
{
try
{
var results = model != null ? _paymentStorage.GetFilteredList(model) : _paymentStorage.GetFullList();
_logger.LogDebug("Список оплат {@payments}", results);
_logger.LogInformation("Извлечение списка в количестве {Count} c оплатой по модели: {@PaymentSearchModel}", results.Count, model);
return results;
}
catch (Exception e)
{
_logger.LogError(e, "Произошла ошибка при попытки получить список по {@PaymentSearchModel} модели", model);
throw;
}
}
public bool GetPaymentInfo(PaymentSearchModel model, out double fullPrice, out double paidPrice)
{
try
{
var payments = ReadList(model); // Вызываем метод из бизнес логики, чтобы залогировать доп информацию
if (payments == null || payments.Count == 0)
{
fullPrice = _operationStorage.GetElement(new() { Id = model.OperationId })?.Price ?? throw new InvalidOperationException("Не получена операция для оплаты"); ;
paidPrice = 0;
return true;
}
fullPrice = payments[0].FullPrice;
paidPrice = payments.Sum(x => x.PaidPrice);
_logger.LogInformation("По покупке({Id}) и операцийе({Id}) получена полная стоимостиь {fullPrice} и оплаченная стоимость {paidPrice}", model.PurchaseId, model.OperationId, fullPrice, paidPrice);
return true;
}
catch (Exception e)
{
_logger.LogError(e, "При попытке получения оплат по {@searchModel} произошла ошибка", model);
throw;
}
}
2024-04-28 21:55:25 +04:00
}
}