2023-03-17 16:47:49 +04:00
using System.Text.RegularExpressions ;
using ConfectioneryBusinessLogic.BusinessLogics ;
2023-03-04 14:23:29 +04:00
using ConfectioneryContracts.BindingModels ;
using ConfectioneryContracts.BusinessLogicsContracts ;
using ConfectioneryContracts.SearchModels ;
using ConfectioneryContracts.StoragesContract ;
using ConfectioneryContracts.ViewModels ;
using Microsoft.Extensions.Logging ;
2023-03-17 16:47:49 +04:00
// ReSharper disable All
2023-03-04 12:30:59 +04:00
namespace ConfectioneryBusinessLogic
{
2023-03-04 14:23:29 +04:00
public class ClientLogic : IClientLogic
2023-03-04 12:30:59 +04:00
{
2023-03-04 14:23:29 +04:00
private readonly ILogger _logger ;
private readonly IClientStorage _clientStorage ;
public ClientLogic ( ILogger < ClientLogic > logger , IClientStorage clientStorage )
{
_logger = logger ;
_clientStorage = clientStorage ;
}
public bool Create ( ClientBindingModel model )
{
CheckModel ( model ) ;
if ( _clientStorage . Insert ( model ) = = null )
{
_logger . LogWarning ( "Insert operation failed" ) ;
return false ;
}
return true ;
}
public bool Delete ( ClientBindingModel model )
{
CheckModel ( model , false ) ;
_logger . LogInformation ( "Delete. Id:{Id}" , model . Id ) ;
if ( _clientStorage . Delete ( model ) = = null )
{
_logger . LogWarning ( "Delete operation failed" ) ;
return false ;
}
return true ;
}
public ClientViewModel ? ReadElement ( ClientSearchModel model )
{
if ( model = = null )
{
throw new ArgumentNullException ( nameof ( model ) ) ;
}
_logger . LogInformation ( "ReadElement. Email:{Email}.Id:{ Id}" ,
model . Email , model . Id ) ;
var element = _clientStorage . 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 < ClientViewModel > ? ReadList ( ClientSearchModel ? model )
{
_logger . LogInformation ( "ReadList. Email:{Email}.Id:{ Id} " , model ? . Email , model ? . Id ) ;
var list = ( model = = null ) ? _clientStorage . GetFullList ( ) :
_clientStorage . GetFilteredList ( model ) ;
if ( list = = null )
{
_logger . LogWarning ( "ReadList return null list" ) ;
return null ;
}
_logger . LogInformation ( "ReadList. Count:{Count}" , list . Count ) ;
return list ;
}
public bool Update ( ClientBindingModel model )
{
CheckModel ( model ) ;
if ( _clientStorage . Update ( model ) = = null )
{
_logger . LogWarning ( "Update operation failed" ) ;
return false ;
}
return true ;
}
private void CheckModel ( ClientBindingModel model , bool withParams = true )
{
if ( model = = null )
{
throw new ArgumentNullException ( nameof ( model ) ) ;
}
if ( ! withParams )
{
return ;
}
if ( string . IsNullOrEmpty ( model . ClientFIO ) )
{
throw new ArgumentNullException ( "Нет фио клиента" , nameof ( model . ClientFIO ) ) ;
}
if ( string . IsNullOrEmpty ( model . Email ) )
{
throw new ArgumentNullException ( "Нет логина клиента" , nameof ( model . Email ) ) ;
}
2023-03-17 16:47:49 +04:00
if ( ! Regex . IsMatch ( model . Email , @"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$" ) )
{
throw new ArgumentException ( "Некорретно введенный email" , nameof ( model . Email ) ) ;
}
2023-03-17 16:49:36 +04:00
// Запасной (вероятно более правильный): ^((\w+\d+\W+)|(\w+\W+\d+)|(\d+\w+\W+)|(\d+\W+\w+)|(\W+\w+\d+)|(\W+\d+\w+))+$
2023-03-17 16:47:49 +04:00
// Просматриваем наперед последовательность (де-факто оператор &&) цифр, небуквенных символов и букв (не цифр и не пробельных символов)
if ( ! Regex . IsMatch ( model . Password , @"^(?=.*\d)(?=.*\W)(?=.*[^\d\s]).+$" ) )
{
throw new ArgumentException ( "Некорректно введенный пароль. Пароль должен содержать хотя бы одну букву, цифру и не буквенный символ" , nameof ( model . Password ) ) ;
}
2023-03-04 14:23:29 +04:00
_logger . LogInformation ( "Client. Id: {Id}, FIO: {fio}, email: {email}" , model . Id , model . ClientFIO , model . Email ) ;
var element = _clientStorage . GetElement ( new ClientSearchModel
{
Email = model . Email ,
} ) ;
if ( element ! = null & & element . Id ! = model . Id )
{
throw new InvalidOperationException ( "Клиент с таким логином уже есть" ) ;
}
}
2023-03-04 12:30:59 +04:00
}
}