2023-04-11 00:52:16 +04:00
using ConfectioneryContracts.BindingModels ;
using ConfectioneryContracts.BusinessLogicsContracts ;
using ConfectioneryContracts.SearchModels ;
using ConfectioneryContracts.StoragesContracts ;
using ConfectioneryContracts.ViewModels ;
using Microsoft.Extensions.Logging ;
using System ;
using System.Collections.Generic ;
using System.Linq ;
using System.Text ;
2023-05-04 21:14:24 +04:00
using System.Text.RegularExpressions ;
2023-04-11 00:52:16 +04:00
using System.Threading.Tasks ;
namespace ConfectioneryBusinessLogic.BusinessLogics
{
public class ClientLogic : IClientLogic
{
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 ) ;
2023-04-25 00:01:49 +04:00
var list = ( model = = null ) ? _clientStorage . GetFullList ( ) : _clientStorage . GetFilteredList ( model ) ;
2023-04-11 00:52:16 +04:00
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-05-04 21:14:24 +04:00
if ( ! Regex . IsMatch ( model . Email , @"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$" ) )
2023-04-25 00:01:49 +04:00
{
2023-05-04 21:14:24 +04:00
throw new ArgumentException ( "Некорретно введенный email" , nameof ( model . Email ) ) ;
2023-04-25 00:01:49 +04:00
}
2023-05-04 21:14:24 +04:00
if ( ! Regex . IsMatch ( model . Password , @"^(?=.*\d)(?=.*\W)(?=.*[^\d\s]).+$" ) )
{
throw new ArgumentException ( "Некорректно введенный пароль. Пароль должен содержать хотя бы одну букву, цифру и не буквенный символ" , nameof ( model . Password ) ) ;
}
2023-04-25 00:01:49 +04:00
_logger . LogInformation ( "Client. Id: {Id}, FIO: {fio}, email: {email}" , model . Id , model . ClientFIO , model . Email , model . Password ) ;
2023-04-11 00:52:16 +04:00
var element = _clientStorage . GetElement ( new ClientSearchModel
{
Email = model . Email ,
} ) ;
if ( element ! = null & & element . Id ! = model . Id )
{
throw new InvalidOperationException ( "Клиент с таким логином уже есть" ) ;
}
}
}
}