2024-04-29 19:16:39 +04:00
using Microsoft.Extensions.Logging ;
2024-05-29 14:28:43 +04:00
using System.Text.RegularExpressions ;
2024-04-29 19:16:39 +04:00
using TravelAgencyContracts.BindingModels ;
using TravelAgencyContracts.BusinessLogicsContracts ;
using TravelAgencyContracts.SearchModels ;
using TravelAgencyContracts.StoragesContracts ;
using TravelAgencyContracts.ViewModels ;
namespace TravelAgencyBusinessLogic.BusinessLogics
{
public class UserLogic : IUserLogic
{
private readonly ILogger _logger ;
private readonly IUserStorage _userStorage ;
public UserLogic ( ILogger < UserLogic > logger , IUserStorage userStorage )
{
_logger = logger ;
_userStorage = userStorage ;
}
public List < UserViewModel > ? ReadList ( UserSearchModel ? model )
{
_logger . LogInformation ( "ReadList. UserFIO: {UserFIO}. Id: {Id} " , model ? . UserFIO , model ? . Id ) ;
var list = ( model = = null ) ? _userStorage . GetFullList ( ) : _userStorage . GetFilteredList ( model ) ;
if ( list = = null )
{
_logger . LogWarning ( "ReadList return null list" ) ;
return null ;
}
_logger . LogInformation ( "ReadList. Count: {Count}" , list . Count ) ;
return list ;
}
public UserViewModel ? ReadElement ( UserSearchModel model )
{
if ( model = = null )
{
throw new ArgumentNullException ( nameof ( model ) ) ;
}
_logger . LogInformation ( "ReadElement. User id: {Id}, User email: {Email}, User phone number: {PhoneNumber}, User password: {Password}" , model ? . Id , model ? . Email , model ? . PhoneNumber , model ? . Password ) ;
var element = _userStorage . GetElement ( model ! ) ;
if ( element = = null )
{
_logger . LogWarning ( "ReadElement element not found" ) ;
return null ;
}
_logger . LogInformation ( "ReadElement find. Id: {Id}" , element . Id ) ;
return element ;
}
public bool Create ( UserBindingModel model )
{
CheckModel ( model ) ;
if ( _userStorage . Insert ( model ) = = null )
{
_logger . LogWarning ( "Insert operation failed" ) ;
return false ;
}
return true ;
}
public bool Update ( UserBindingModel model )
{
CheckModel ( model ) ;
if ( _userStorage . Update ( model ) = = null )
{
_logger . LogWarning ( "Update operation failed" ) ;
return false ;
}
return true ;
}
public bool Delete ( UserBindingModel model )
{
CheckModel ( model , false ) ;
_logger . LogInformation ( "Delete. Id: {Id}" , model . Id ) ;
if ( _userStorage . Delete ( model ) = = null )
{
_logger . LogWarning ( "Delete operation failed" ) ;
return false ;
}
return true ;
}
private void CheckModel ( UserBindingModel model , bool withParams = true )
{
if ( model = = null )
{
throw new ArgumentNullException ( nameof ( model ) ) ;
}
if ( ! withParams )
{
return ;
}
if ( string . IsNullOrEmpty ( model . UserFIO ) )
{
throw new ArgumentNullException ( "Нет ФИО пользователя" , nameof ( model . UserFIO ) ) ;
}
2024-05-29 14:28:43 +04:00
if ( string . IsNullOrEmpty ( model . Email ) | | ! Regex . IsMatch ( model . Email , @"^[a-z0-9._%+-]+\@([a-z0-9-]+\.)+[a-z]{2,4}$" ) )
2024-04-29 19:16:39 +04:00
{
2024-05-29 14:28:43 +04:00
throw new ArgumentNullException ( "Некорректно введен логин(почта) пользователя" , nameof ( model . Email ) ) ;
2024-04-29 19:16:39 +04:00
}
if ( string . IsNullOrEmpty ( model . PhoneNumber ) )
{
2024-05-29 14:30:06 +04:00
throw new ArgumentNullException ( "Нет номера телефона пользователя" , nameof ( model . PhoneNumber ) ) ;
2024-04-29 19:16:39 +04:00
}
2024-05-30 02:33:02 +04:00
if ( string . IsNullOrEmpty ( model . Password ) | | model . Password . Length < 8 | | model . Password . Length > 50 )
2024-04-29 19:16:39 +04:00
{
throw new ArgumentNullException ( "Нет пароля пользователя" , nameof ( model . Password ) ) ;
}
_logger . LogInformation ( "User. Id: {id}, FIO: {fio}, email: {email}, phone number: {PhoneNumber}, password: {password}" , model . Id , model . UserFIO , model . Email , model . PhoneNumber ,
model . Password ) ;
var element = _userStorage . GetElement ( new UserSearchModel
{
Email = model . Email ,
PhoneNumber = model . PhoneNumber ,
} ) ;
if ( element ! = null & & element . Id ! = model . Id )
{
throw new InvalidOperationException ( "Пользователь с таким логином(почтой) или номером телефона уже есть" ) ;
}
}
}
}