CourseWork_Bank/Bank/BankBusinessLogics/BusinessLogic/PaymentLogic.cs

116 lines
4.9 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using BankContracts.BindingModels;
using BankContracts.BusinessLogicContracts;
using BankContracts.SearchModels;
using BankContracts.StoragesContracts;
using BankContracts.ViewModels;
using Microsoft.Extensions.Logging;
namespace BankBusinessLogics.BusinessLogic
{
public class PaymentLogic : IPaymentLogic
{
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;
}
}
}
}