2024-04-28 22:16:14 +04:00
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
{
2024-04-28 22:16:14 +04:00
public class PaymentLogic : IPaymentLogic
2024-04-28 21:55:25 +04:00
{
2024-04-28 22:16:14 +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
}
}