2023-04-06 17:58:51 +04:00
using HotelContracts.BindingModels ;
using HotelContracts.BusinessLogicsContracts ;
using HotelContracts.SearchModels ;
using HotelContracts.StoragesContracts ;
using HotelContracts.ViewModels ;
using Microsoft.Extensions.Logging ;
2023-05-18 22:07:09 +04:00
using HotelBusinessLogic.MailWorker ;
2023-04-06 17:58:51 +04:00
namespace HotelBusinessLogic.BusinessLogics
{
public class MemberLogic : IMemberLogic
{
private readonly ILogger _logger ;
private readonly IMemberStorage _memberStorage ;
2023-05-18 22:07:09 +04:00
private readonly AbstractMailWorker _mailWorker ;
private readonly IOrganiserLogic _organiserLogic ;
2023-04-06 17:58:51 +04:00
2023-05-18 22:07:09 +04:00
public MemberLogic ( ILogger < MemberLogic > logger , IMemberStorage memberStorage , AbstractMailWorker mailWorker , IOrganiserLogic organiserLogic )
2023-04-06 17:58:51 +04:00
{
_logger = logger ;
_memberStorage = memberStorage ;
2023-05-18 22:07:09 +04:00
_mailWorker = mailWorker ;
_organiserLogic = organiserLogic ;
2023-04-06 17:58:51 +04:00
}
public bool Create ( MemberBindingModel model )
{
CheckModel ( model ) ;
2023-05-18 22:07:09 +04:00
var result = _memberStorage . Insert ( model ) ;
if ( result = = null )
2023-04-06 17:58:51 +04:00
{
_logger . LogWarning ( "Insert operation failed" ) ;
return false ;
}
2023-05-18 22:07:09 +04:00
SendMemberMessage ( result . OrganiserId , $"Гостиница \" Р а з в и т и е \ ", Участник №{result.Id}" , $"Участник №{result.Id} по имени {result.MemberFIO} и с гражданством {result.Citizenship} добавлен" ) ;
2023-04-06 17:58:51 +04:00
return true ;
}
public bool Delete ( MemberBindingModel model )
{
CheckModel ( model , false ) ;
_logger . LogInformation ( "Delete. Id:{Id}" , model . Id ) ;
2023-05-18 22:07:09 +04:00
var result = _memberStorage . Delete ( model ) ;
if ( result = = null )
2023-04-06 17:58:51 +04:00
{
_logger . LogWarning ( "Delete operation failed" ) ;
return false ;
}
2023-05-18 22:07:09 +04:00
SendMemberMessage ( result . OrganiserId , $"Гостиница \" Р а з в и т и е \ ", Участник №{result.Id}" , $"Участник №{result.Id} по имени {result.MemberFIO} и с гражданством {result.Citizenship} удален" ) ;
2023-04-06 17:58:51 +04:00
return true ;
}
public MemberViewModel ? ReadElement ( MemberSearchModel model )
{
if ( model = = null )
{
throw new ArgumentNullException ( nameof ( model ) ) ;
}
_logger . LogInformation ( "ReadElement. MemberFIO:{MemberFIO}.Id:{Id}" , model . MemberFIO , model . Id ) ;
var element = _memberStorage . 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 < MemberViewModel > ? ReadList ( MemberSearchModel ? model )
{
_logger . LogInformation ( "ReadList. MemberFIO:{MemberFIO}.Id:{ Id}" , model ? . MemberFIO , model ? . Id ) ;
var list = model = = null ? _memberStorage . GetFullList ( ) : _memberStorage . 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 ( MemberBindingModel model )
{
CheckModel ( model ) ;
if ( _memberStorage . Update ( model ) = = null )
{
_logger . LogWarning ( "Update operation failed" ) ;
return false ;
}
return true ;
}
private void CheckModel ( MemberBindingModel model , bool withParams = true )
{
if ( model = = null )
{
throw new ArgumentNullException ( nameof ( model ) ) ;
}
if ( ! withParams )
{
return ;
}
if ( string . IsNullOrEmpty ( model . MemberFIO ) )
{
throw new ArgumentNullException ( "Нет ФИО участника" , nameof ( model . MemberFIO ) ) ;
}
if ( string . IsNullOrEmpty ( model . Citizenship ) )
{
throw new ArgumentNullException ( "Н е указано гражданство участника" , nameof ( model . Citizenship ) ) ;
}
_logger . LogInformation ( "Member. MemberFIO:{MemberFIO}.Citizenship:{ Citizenship}. Id: { Id}" , model . MemberFIO , model . Citizenship , model . Id ) ;
}
2023-05-18 22:07:09 +04:00
private bool SendMemberMessage ( int organiserId , string subject , string text )
{
var organiser = _organiserLogic . ReadElement ( new ( ) { Id = organiserId } ) ;
if ( organiser = = null )
{
return false ;
}
_mailWorker . MailSendAsync ( new ( )
{
MailAddress = organiser . OrganiserEmail ,
Subject = subject ,
Text = text
} ) ;
return true ;
}
2023-04-06 17:58:51 +04:00
}
}