178 lines
6.4 KiB
C#
Raw 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.Cashier;
using BankContracts.BindingModels.Client;
using BankContracts.BusinessLogicsContracts.Cashier;
using BankContracts.SearchModels.Cashier;
using BankContracts.StoragesModels.Cashier;
using BankContracts.StoragesModels.Client;
using BankContracts.ViewModels.Cashier.ViewModels;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BankBusinessLogic.BusinessLogic.Cashier
{
public class MoneyTransferLogic : IMoneyTransferLogic
{
private readonly ILogger _logger;
private readonly IMoneyTransferStorage _moneyTransferStorage;
public readonly ICreditingStorage _creditingStorage;
// Конструктор
public MoneyTransferLogic(ILogger<MoneyTransferLogic> logger, IMoneyTransferStorage moneyTransferStorage, ICreditingStorage creditingStorage)
{
_logger = logger;
_moneyTransferStorage = moneyTransferStorage;
_creditingStorage = creditingStorage;
}
// Вывод конкретной операции
public MoneyTransferViewModel? ReadElement(MoneyTransferSearchModel model)
{
if (model == null)
{
throw new ArgumentNullException(nameof(model));
}
_logger.LogInformation("ReadElement. AccountSenderId:{AccountSenderId}. AccountPayeeId:{AccountPayeeId}. Sum:{Sum}. Id:{Id}",
model.AccountSenderId, model.AccountPayeeId, model.Sum, model?.Id);
var element = _moneyTransferStorage.GetElement(model);
if (element == null)
{
_logger.LogWarning("ReadElement element not found");
return null;
}
_logger.LogInformation("ReadElement find. Id:{Id}", element.Id);
return element;
}
// Вывод всего списка операций
public List<MoneyTransferViewModel>? ReadList(MoneyTransferSearchModel? model)
{
_logger.LogInformation("ReadElement. AccountSenderId:{AccountSenderId}. AccountPayeeId:{AccountPayeeId}. Sum:{Sum}. Id:{Id}",
model?.AccountSenderId, model?.AccountPayeeId, model?.Sum, model?.Id);
// list хранит весь список в случае, если model пришло со значением null на вход метода
var list = model == null ? _moneyTransferStorage.GetFullList() : _moneyTransferStorage.GetFilteredList(model);
if (list == null)
{
_logger.LogWarning("ReadList return null list");
return null;
}
_logger.LogInformation("ReadList. Count:{Count}", list.Count);
return list;
}
// Создание операции на перевод
public bool Create(MoneyTransferBindingModel model)
{
CheckModel(model);
if (_moneyTransferStorage.Insert(model) == null)
{
_logger.LogWarning("Insert operation failed");
return false;
}
//проверка на то, что это зачисление на карту, а не перевод между счетами
if (model.CreditingId.HasValue)
{
_creditingStorage.Update(new CreditingBindingModel
{
Id = model.CreditingId.Value,
});
}
return true;
}
// Обновление операции на перевод
public bool Update(MoneyTransferBindingModel model)
{
CheckModel(model);
if (_moneyTransferStorage.Update(model) == null)
{
_logger.LogWarning("Update operation failed");
return false;
}
return true;
}
// Удаление операции на перевод
public bool Delete(MoneyTransferBindingModel model)
{
CheckModel(model, false);
_logger.LogInformation("Delete. Id:{Id}", model.Id);
if (_moneyTransferStorage.Delete(model) == null)
{
_logger.LogWarning("Delete operation failed");
return false;
}
return true;
}
// Проверка входного аргумента для методов Insert, Update и Delete
private void CheckModel(MoneyTransferBindingModel model, bool withParams = true)
{
if (model == null)
{
throw new ArgumentNullException(nameof(model));
}
// Так как при удалении передаём как параметр false
if (!withParams)
{
return;
}
// Проверка корректности Id счёта отправителя
if (model.AccountSenderId < 0)
{
throw new ArgumentNullException("Отсутствие Id у счёта отправителя", nameof(model.AccountSenderId));
}
// Проверка корректности Id счёта получателя
if (model.AccountPayeeId < 0)
{
throw new ArgumentNullException("Отсутствие Id у счёта получателя", nameof(model.AccountPayeeId));
}
// Проверка на корректную сумму перевода
if (model.Sum <= 0)
{
throw new ArgumentNullException("Сумма перевода не может раняться нулю или быть меньше его", nameof(model.Sum));
}
// Проверка на корректную дату открытия счёта
if (model.DateTransfer > DateTime.Now)
{
throw new ArgumentNullException("Дата операции не может быть ранее текущей", nameof(model.DateTransfer));
}
_logger.LogInformation("ReadElement. AccountSenderId:{AccountSenderId}. AccountPayeeId:{AccountPayeeId}. Sum:{Sum}. DateTransfer:{DateTransfer}. Id:{Id}",
model.AccountSenderId, model.AccountPayeeId, model.Sum, model.DateTransfer, model?.Id);
}
}
}