2023-08-15 22:52:30 -05:00
using AutoMapper ;
using DamageAssesment.Api.Surveys.Db ;
using DamageAssesment.Api.Surveys.Interfaces ;
2023-08-25 07:55:11 -05:00
using DamageAssesment.Api.Surveys.Models ;
2023-08-15 22:52:30 -05:00
using Microsoft.EntityFrameworkCore ;
2023-08-25 07:55:11 -05:00
using System.Collections.Generic ;
2023-08-15 22:52:30 -05:00
namespace DamageAssesment.Api.Surveys.Providers
{
public class SurveysProvider : ISurveyProvider
{
private readonly SurveysDbContext surveyDbContext ;
private readonly ILogger < SurveysProvider > logger ;
private readonly IMapper mapper ;
public SurveysProvider ( SurveysDbContext surveysDbContext , ILogger < SurveysProvider > logger , IMapper mapper )
{
this . surveyDbContext = surveysDbContext ;
this . logger = logger ;
this . mapper = mapper ;
2023-10-04 14:03:59 -05:00
seedData ( ) ;
2023-08-15 22:52:30 -05:00
}
2023-09-04 20:31:41 -05:00
public void seedData ( )
2023-08-15 22:52:30 -05:00
{
if ( ! surveyDbContext . Surveys . Any ( ) )
{
2023-10-04 14:03:59 -05:00
surveyDbContext . Surveys . Add ( new Db . Survey { IsEnabled = true , StartDate = DateTime . Now , EndDate = DateTime . Now . AddDays ( 90 ) , CreatedDate = DateTime . Now } ) ;
2023-10-05 14:42:41 -05:00
surveyDbContext . Surveys . Add ( new Db . Survey { IsEnabled = true , StartDate = DateTime . Now , EndDate = DateTime . Now . AddDays ( 90 ) , CreatedDate = DateTime . Now } ) ;
2023-10-04 14:03:59 -05:00
//surveyDbContext.Surveys.Add(new Db.Survey { Id = 2, IsEnabled = true, StartDate = DateTime.Now, EndDate = DateTime.Now.AddDays(90), CreatedDate = DateTime.Now });
//surveyDbContext.Surveys.Add(new Db.Survey { Id = 3, IsEnabled = true, StartDate = DateTime.Now, EndDate = DateTime.Now.AddDays(90), CreatedDate = DateTime.Now });
2023-08-25 07:55:11 -05:00
surveyDbContext . SaveChangesAsync ( ) ;
}
if ( ! surveyDbContext . SurveysTranslation . Any ( ) )
{
2023-10-04 14:03:59 -05:00
surveyDbContext . SurveysTranslation . Add ( new Db . SurveyTranslation { SurveyId = 1 , Language = "en" , Title = "Impact of Tropical Storm Emily on Florida's Economy" } ) ;
surveyDbContext . SurveysTranslation . Add ( new Db . SurveyTranslation { SurveyId = 1 , Language = "es" , Title = "Impacto de la tormenta tropical Emily en la economía de Florida" } ) ;
surveyDbContext . SurveysTranslation . Add ( new Db . SurveyTranslation { SurveyId = 1 , Language = "fr" , Title = "Impact de la tempête tropicale Emily sur l'économie de la Floride" } ) ;
2023-08-25 07:55:11 -05:00
2023-10-05 13:27:24 -05:00
surveyDbContext . SurveysTranslation . Add ( new Db . SurveyTranslation { SurveyId = 2 , Language = "en" , Title = "Hurricane Andrew Aftermath Survey" } ) ;
surveyDbContext . SurveysTranslation . Add ( new Db . SurveyTranslation { SurveyId = 2 , Language = "es" , Title = "Encuesta sobre las secuelas del huracán Andrew" } ) ;
surveyDbContext . SurveysTranslation . Add ( new Db . SurveyTranslation { SurveyId = 2 , Language = "fr" , Title = "Enquête sur les conséquences de l'ouragan Andrew" } ) ;
2023-08-25 07:55:11 -05:00
2023-10-04 14:03:59 -05:00
//surveyDbContext.SurveysTranslation.Add(new Db.SurveyTranslation { Id = 7, SurveyId = 3, Language = "en", Title = "Public Perception of Hurricane Michael's Response" });
//surveyDbContext.SurveysTranslation.Add(new Db.SurveyTranslation { Id = 8, SurveyId = 3, Language = "es", Title = "Percepción pública de la respuesta del huracán Michael" });
//surveyDbContext.SurveysTranslation.Add(new Db.SurveyTranslation { Id = 9, SurveyId = 3, Language = "fr", Title = "Perception du public de la réponse de l'ouragan Michael" });
2023-08-25 07:55:11 -05:00
2023-08-18 14:30:34 -05:00
surveyDbContext . SaveChangesAsync ( ) ;
2023-08-15 22:52:30 -05:00
}
}
2023-09-08 14:40:06 -05:00
public IEnumerable < Models . SurveyTranslation > GetSurveyTranslations ( int id , IEnumerable < Models . SurveyTranslation > SurveyTranslation , string? language )
2023-08-15 22:52:30 -05:00
{
2023-09-08 14:40:06 -05:00
if ( SurveyTranslation = = null )
{
if ( string . IsNullOrEmpty ( language ) )
{
SurveyTranslation = mapper . Map < IEnumerable < Db . SurveyTranslation > , IEnumerable < Models . SurveyTranslation > > (
surveyDbContext . SurveysTranslation . Where ( a = > a . SurveyId = = id ) . ToList ( ) ) ;
}
else
{
SurveyTranslation = mapper . Map < IEnumerable < Db . SurveyTranslation > , IEnumerable < Models . SurveyTranslation > > (
surveyDbContext . SurveysTranslation . Where ( a = > a . SurveyId = = id & & a . Language = = language ) . ToList ( ) ) ;
}
}
return SurveyTranslation ;
}
public object CreateMultiLanguageObject ( IEnumerable < Models . SurveyTranslation > surveyTranslations )
{
object MultiLanguage = new object ( ) ;
Dictionary < string , string > dict = new Dictionary < string , string > ( ) ;
foreach ( Models . SurveyTranslation item in surveyTranslations )
{
dict . Add ( item . Language , item . Title ) ;
}
MultiLanguage = dict ;
return MultiLanguage ;
}
public async Task < ( bool IsSuccess , IEnumerable < Models . MultiLanSurvey > Surveys , string ErrorMessage ) > GetSurveysAsync ( string language )
{
IEnumerable < Models . MultiLanSurvey > surveysList = null ;
2023-08-15 22:52:30 -05:00
try
{
logger ? . LogInformation ( "Gell all Surveys from DB" ) ;
2023-08-25 07:55:11 -05:00
var surveys = await surveyDbContext . Surveys . Where ( s = > s . IsEnabled = = true ) . ToListAsync ( ) ;
2023-09-08 14:40:06 -05:00
//var surveyTranslations = await surveyDbContext.SurveysTranslation.ToListAsync();
2023-08-25 07:55:11 -05:00
2023-08-15 22:52:30 -05:00
if ( surveys ! = null )
{
2023-09-08 14:40:06 -05:00
surveysList = from s in surveys
select new
Models . MultiLanSurvey
{
Id = s . Id ,
StartDate = s . StartDate ,
EndDate = s . EndDate ,
IsEnabled = s . IsEnabled ,
CreatedDate = s . CreatedDate ,
Titles = CreateMultiLanguageObject ( GetSurveyTranslations ( s . Id , null , language ) )
2023-08-25 07:55:11 -05:00
2023-09-08 14:40:06 -05:00
} ;
2023-08-25 07:55:11 -05:00
2023-08-15 22:52:30 -05:00
logger ? . LogInformation ( $"{surveys.Count} Items(s) found" ) ;
2023-08-25 07:55:11 -05:00
return ( true , surveysList , null ) ;
2023-08-15 22:52:30 -05:00
}
return ( false , null , "Not found" ) ;
}
catch ( Exception ex )
{
logger ? . LogError ( ex . ToString ( ) ) ;
return ( false , null , ex . Message ) ;
}
}
2023-09-08 14:40:06 -05:00
public async Task < ( bool IsSuccess , Models . MultiLanSurvey Surveys , string ErrorMessage ) > GetSurveysAsync ( int id , string language )
2023-08-15 22:52:30 -05:00
{
try
{
logger ? . LogInformation ( "Query Survey" ) ;
2023-09-08 14:40:06 -05:00
var survey = await surveyDbContext . Surveys . SingleOrDefaultAsync ( s = > s . Id = = id & & s . IsEnabled = = true ) ;
2023-08-15 22:52:30 -05:00
if ( survey ! = null )
{
2023-09-08 14:40:06 -05:00
Models . MultiLanSurvey result = null ;
2023-08-25 07:55:11 -05:00
var surveyTranslations = await surveyDbContext . SurveysTranslation . Where ( s = > s . SurveyId = = survey . Id ) . ToListAsync ( ) ;
2023-09-08 14:40:06 -05:00
result = new Models . MultiLanSurvey
2023-08-25 07:55:11 -05:00
{
2023-09-08 14:40:06 -05:00
Id = survey . Id ,
StartDate = survey . StartDate ,
EndDate = survey . EndDate ,
IsEnabled = survey . IsEnabled ,
CreatedDate = survey . CreatedDate ,
Titles = CreateMultiLanguageObject ( GetSurveyTranslations ( survey . Id , null , language ) )
2023-08-25 07:55:11 -05:00
2023-09-08 14:40:06 -05:00
} ;
logger ? . LogInformation ( $"Survey Id: {id} found" ) ;
2023-08-15 22:52:30 -05:00
return ( true , result , null ) ;
}
return ( false , null , "Not found" ) ;
}
catch ( Exception ex )
{
logger ? . LogError ( ex . ToString ( ) ) ;
return ( false , null , ex . Message ) ;
}
}
2023-09-08 14:40:06 -05:00
public async Task < ( bool IsSuccess , Models . MultiLanSurvey Survey , string ErrorMessage ) > PostSurveyAsync ( Models . Survey survey )
2023-08-15 22:52:30 -05:00
{
try
{
if ( survey ! = null )
{
2023-08-25 17:44:04 -05:00
survey . CreatedDate = DateTime . Now ;
Db . Survey _survey = mapper . Map < Models . Survey , Db . Survey > ( survey ) ;
2023-08-25 07:55:11 -05:00
2023-08-25 16:51:07 -05:00
surveyDbContext . Surveys . Add ( _survey ) ;
await surveyDbContext . SaveChangesAsync ( ) ;
2023-08-25 17:44:04 -05:00
2023-08-25 07:55:11 -05:00
foreach ( var title in survey . Titles )
{
2023-08-25 16:51:07 -05:00
surveyDbContext . SurveysTranslation . Add ( new Db . SurveyTranslation { SurveyId = _survey . Id , Language = title . Language , Title = title . Title } ) ;
2023-08-25 07:55:11 -05:00
}
2023-08-18 14:30:34 -05:00
await surveyDbContext . SaveChangesAsync ( ) ;
2023-09-08 14:40:06 -05:00
var result = mapper . Map < Db . Survey , Models . MultiLanSurvey > ( _survey ) ;
result . Titles = CreateMultiLanguageObject ( GetSurveyTranslations ( _survey . Id , survey . Titles , "" ) ) ;
return ( true , result , "Successful" ) ;
2023-08-15 22:52:30 -05:00
}
else
{
logger ? . LogInformation ( $"Survey Id: {survey.Id} cannot be added" ) ;
return ( false , null , $"Survey Id: {survey.Id} cannot be added" ) ;
}
}
catch ( Exception ex )
{
logger ? . LogError ( ex . ToString ( ) ) ;
return ( false , null , ex . Message ) ;
}
}
2023-09-08 14:40:06 -05:00
public async Task < ( bool IsSuccess , Models . MultiLanSurvey Survey , string ErrorMessage ) > PutSurveyAsync ( int Id , Models . Survey survey )
2023-08-15 22:52:30 -05:00
{
try
{
if ( survey ! = null )
{
2023-09-13 00:28:24 -05:00
var _survey = await surveyDbContext . Surveys . AsNoTracking ( ) . Where ( s = > s . Id = = Id ) . SingleOrDefaultAsync ( ) ;
2023-08-15 22:52:30 -05:00
if ( _survey ! = null )
{
2023-08-25 07:55:11 -05:00
var surveysTranslation = await surveyDbContext . SurveysTranslation . Where ( s = > s . SurveyId = = Id ) . ToListAsync ( ) ;
surveyDbContext . SurveysTranslation . RemoveRange ( surveysTranslation ) ;
await surveyDbContext . SaveChangesAsync ( ) ;
2023-09-13 00:28:24 -05:00
_survey = mapper . Map < Models . Survey , Db . Survey > ( survey ) ;
surveyDbContext . Surveys . Update ( _survey ) ;
2023-08-18 14:30:34 -05:00
await surveyDbContext . SaveChangesAsync ( ) ;
2023-08-25 07:55:11 -05:00
List < Db . SurveyTranslation > listSurveyTranslation = new List < Db . SurveyTranslation > ( ) ;
Random random = new Random ( ) ;
foreach ( var title in survey . Titles )
{
listSurveyTranslation . Add ( new Db . SurveyTranslation { Id = random . Next ( ) , SurveyId = _survey . Id , Language = title . Language , Title = title . Title } ) ;
}
surveyDbContext . SurveysTranslation . AddRange ( listSurveyTranslation ) ;
await surveyDbContext . SaveChangesAsync ( ) ;
2023-09-08 14:40:06 -05:00
var result = mapper . Map < Db . Survey , Models . MultiLanSurvey > ( _survey ) ;
result . Titles = CreateMultiLanguageObject ( GetSurveyTranslations ( _survey . Id , survey . Titles , "" ) ) ;
2023-08-25 07:55:11 -05:00
return ( true , result , "Successful" ) ;
2023-08-15 22:52:30 -05:00
}
else
{
logger ? . LogInformation ( $"Survey Id : {Id} Not found" ) ;
return ( false , null , "Not Found" ) ;
}
}
else
{
logger ? . LogInformation ( $"Survey Id: {Id} Bad Request" ) ;
return ( false , null , "Bad request" ) ;
}
}
catch ( Exception ex )
{
logger ? . LogError ( ex . ToString ( ) ) ;
return ( false , null , ex . Message ) ;
}
}
2023-09-08 14:40:06 -05:00
public async Task < ( bool IsSuccess , Models . MultiLanSurvey Survey , string ErrorMessage ) > DeleteSurveyAsync ( int Id )
2023-08-15 22:52:30 -05:00
{
try
{
var survey = await surveyDbContext . Surveys . Where ( x = > x . Id = = Id ) . SingleOrDefaultAsync ( ) ;
if ( survey ! = null )
{
2023-09-08 14:40:06 -05:00
var result = mapper . Map < Db . Survey , Models . MultiLanSurvey > ( survey ) ;
result . Titles = CreateMultiLanguageObject ( GetSurveyTranslations ( survey . Id , null , "" ) ) ;
2023-08-15 22:52:30 -05:00
surveyDbContext . Surveys . Remove ( survey ) ;
2023-08-18 14:30:34 -05:00
await surveyDbContext . SaveChangesAsync ( ) ;
2023-09-08 14:40:06 -05:00
return ( true , result , $"Survey Id: {Id} deleted Successfuly" ) ;
2023-08-15 22:52:30 -05:00
}
else
{
logger ? . LogInformation ( $"Survey Id : {Id} Not found" ) ;
return ( false , null , "Not Found" ) ;
}
}
catch ( Exception ex )
{
logger ? . LogError ( ex . ToString ( ) ) ;
return ( false , null , ex . Message ) ;
}
}
}
}