Merged new dev changes

This commit is contained in:
uppuv
2023-09-13 13:16:42 -04:00
137 changed files with 2247 additions and 1254 deletions

View File

@ -1,10 +1,8 @@
using DamageAssesment.Api.Surveys.Interfaces;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace DamageAssesment.Api.Surveys.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class SurveysController : ControllerBase
{
@ -14,29 +12,43 @@ namespace DamageAssesment.Api.Surveys.Controllers
{
this.surveyProvider = surveyProvider;
}
/// <summary>
/// GET request for retrieving surveys.
/// </summary>
[Route("Surveys")]
[Route("Surveys/{language:alpha}")]
[HttpGet]
public async Task<ActionResult> GetSurveysAsync()
public async Task<ActionResult> GetSurveysAsync(string? language)
{
var result = await this.surveyProvider.GetSurveysAsync();
var result = await this.surveyProvider.GetSurveysAsync(language);
if (result.IsSuccess)
{
return Ok(result.Surveys);
}
return NoContent();
}
[HttpGet("{Id}")]
public async Task<ActionResult> GetSurveysAsync(int Id)
/// <summary>
/// GET request for retrieving surveys by ID.
/// </summary>
[Route("Surveys/{id:int}")]
[Route("Surveys/{id:int}/{language:alpha}")]
[HttpGet]
public async Task<ActionResult> GetSurveysAsync(int id, string? language)
{
var result = await this.surveyProvider.GetSurveysAsync(Id);
var result = await this.surveyProvider.GetSurveysAsync(id, language);
if (result.IsSuccess)
{
return Ok(result.Surveys);
}
return NotFound();
}
/// <summary>
/// POST request for creating a new survey.
/// </summary>
[HttpPost]
[HttpPost("Surveys")]
public async Task<ActionResult> PostSurveysAsync(Models.Survey survey)
{
var result = await this.surveyProvider.PostSurveyAsync(survey);
@ -46,25 +58,32 @@ namespace DamageAssesment.Api.Surveys.Controllers
}
return BadRequest(result.ErrorMessage);
}
/// <summary>
/// PUT request for updating an existing survey (surveyId,Updated Survey data).
/// </summary>
[HttpPut("{Id}")]
public async Task<ActionResult> PutSurveysAsync(int Id, Models.Survey survey)
[HttpPut("Surveys/{id}")]
public async Task<ActionResult> PutSurveysAsync(int id, Models.Survey survey)
{
var result = await this.surveyProvider.PutSurveyAsync(Id,survey);
var result = await this.surveyProvider.PutSurveyAsync(id, survey);
if (result.IsSuccess)
{
return Ok(result.Survey);
}
if (result.ErrorMessage == "Not Found")
return NotFound(result.ErrorMessage);
return BadRequest(result.ErrorMessage);
}
[HttpDelete("{Id}")]
public async Task<ActionResult> DeleteSurveysAsync(int Id)
/// <summary>
/// DELETE request for deleting a survey by ID.
/// </summary>
[HttpDelete("Surveys/{id}")]
public async Task<ActionResult> DeleteSurveysAsync(int id)
{
var result = await this.surveyProvider.DeleteSurveyAsync(Id);
var result = await this.surveyProvider.DeleteSurveyAsync(id);
if (result.IsSuccess)
{
return Ok(result.Survey);

View File

@ -1,9 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<GenerateDocumentationFile>True</GenerateDocumentationFile>
</PropertyGroup>
<ItemGroup>
@ -19,6 +20,9 @@
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.21" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.5" />
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.5" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
</ItemGroup>

View File

@ -1,4 +1,5 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace DamageAssesment.Api.Surveys.Db
{
@ -6,23 +7,20 @@ namespace DamageAssesment.Api.Surveys.Db
{
[Key]
public int Id { get; set; }
[StringLength(100)]
[Required]
public string Title { get; set; }
//[StringLength(1000)]
//public string Description { get; set; }
public bool IsEnabled { get; set; }
public DateTime? StartDate { get; set; }
public DateTime StartDate { get; set; }
public DateTime? EndDate { get; set; }
public DateTime EndDate { get; set; }
//public DateTime CreatedDate { get; set; }
//[StringLength(6)]
//public string EmployeeID { get; set; }
public DateTime CreatedDate { get; set; } = DateTime.Now;
/*
[StringLength(10)]
[ForeignKey("Employee")]
public string EmployeeId { get; set; }
*/
}
}

View File

@ -0,0 +1,23 @@
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
namespace DamageAssesment.Api.Surveys.Db
{
public class SurveyTranslation
{
[Key]
public int Id { get; set; }
[ForeignKey("Survey")]
public int SurveyId { get; set; }
[StringLength(200)]
[Required]
public string Title { get; set; }
public string Language { get; set; }
}
}

View File

@ -2,19 +2,32 @@
namespace DamageAssesment.Api.Surveys.Db
{
public class SurveysDbContext:DbContext
public class SurveysDbContext : DbContext
{
private IConfiguration _Configuration { get; set; }
public SurveysDbContext(DbContextOptions options, IConfiguration configuration) : base(options)
{
_Configuration = configuration;
}
public DbSet<Db.Survey> Surveys { get; set; }
public DbSet<Db.SurveyTranslation> SurveysTranslation { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder options)
{
// connect to sql server with connection string from app settings
options.UseSqlServer(_Configuration.GetConnectionString("SurveyConnection"));
}
public DbSet<Db.Survey> Surveys { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Survey>()
.Property(item => item.Id)
.ValueGeneratedOnAdd();
modelBuilder.Entity<SurveyTranslation>()
.Property(item => item.Id)
.ValueGeneratedOnAdd();
}
}
}

View File

@ -2,11 +2,12 @@
{
public interface ISurveyProvider
{
Task<(bool IsSuccess, IEnumerable< Models.Survey> Surveys, string ErrorMessage)> GetSurveysAsync();
Task<(bool IsSuccess, Models.Survey Surveys, string ErrorMessage)> GetSurveysAsync(int Id);
Task<(bool IsSuccess, Models.Survey Survey, string ErrorMessage)> PostSurveyAsync(Models.Survey Survey);
Task<(bool IsSuccess, Models.Survey Survey, string ErrorMessage)> PutSurveyAsync(int Id,Models.Survey Survey);
Task<(bool IsSuccess, Models.Survey Survey, string ErrorMessage)> DeleteSurveyAsync(int Id);
Task<(bool IsSuccess, IEnumerable< Models.MultiLanSurvey> Surveys, string ErrorMessage)> GetSurveysAsync(string language);
Task<(bool IsSuccess, Models.MultiLanSurvey Surveys, string ErrorMessage)> GetSurveysAsync(int id, string language);
Task<(bool IsSuccess, Models.MultiLanSurvey Survey, string ErrorMessage)> PostSurveyAsync(Models.Survey Survey);
Task<(bool IsSuccess, Models.MultiLanSurvey Survey, string ErrorMessage)> PutSurveyAsync(int id, Models.Survey Survey);
Task<(bool IsSuccess, Models.MultiLanSurvey Survey, string ErrorMessage)> DeleteSurveyAsync(int id);
void seedData();
}
}

View File

@ -2,27 +2,20 @@
namespace DamageAssesment.Api.Surveys.Models
{
public class Survey
public class MultiLanSurvey : BaseSurvey
{
public object Titles { get; set; }
}
public class Survey : BaseSurvey
{
public IEnumerable<SurveyTranslation> Titles { get; set; }
}
public class BaseSurvey
{
[Key]
public int Id { get; set; }
[StringLength(100)]
public string Title { get; set; }
//[StringLength(1000)]
// public string? Description { get; set; }
public bool IsEnabled { get; set; }
public DateTime? StartDate { get; set; }
public DateTime? EndDate { get; set; }
//public DateTime CreatedDate { get; set; }
//[StringLength(6)]
//public string EmployeeID { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public DateTime CreatedDate { get; set; }
}
}

View File

@ -0,0 +1,13 @@
namespace DamageAssesment.Api.Surveys.Models
{
public class SurveyTranslation
{
public string Title { get; set; }
public string Language { get; set; }
}
}

View File

@ -3,8 +3,10 @@
public class SurveysProfile:AutoMapper.Profile
{
public SurveysProfile() {
CreateMap<Db.Survey, Models.Survey>();
CreateMap<Db.Survey, Models.MultiLanSurvey>();
CreateMap<Models.Survey, Db.Survey>();
CreateMap<Db.SurveyTranslation, Models.SurveyTranslation>();
CreateMap<Models.SurveyTranslation, Db.SurveyTranslation>();
}
}
}

View File

@ -1,18 +1,47 @@
using DamageAssesment.Api.Surveys.Db;
using DamageAssesment.Api.Surveys.Interfaces;
using DamageAssesment.Api.Surveys.Providers;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.EntityFrameworkCore;
using Microsoft.IdentityModel.Tokens;
using System.Text;
using System.Reflection;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
var authkey = builder.Configuration.GetValue<string>("JwtSettings:securitykey");
builder.Services.AddAuthentication(item =>
{
item.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
item.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(item =>
{
item.RequireHttpsMetadata = true;
item.SaveToken = true;
item.TokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(authkey)),
ValidateIssuer = false,
ValidateAudience = false,
ClockSkew = TimeSpan.Zero
};
});
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddScoped<ISurveyProvider, SurveysProvider>();
builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
//builder.Services.AddSwaggerGen();
builder.Services.AddSwaggerGen(c =>
{
// Include XML comments from your assembly
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
c.IncludeXmlComments(xmlPath);
});
builder.Services.AddDbContext<SurveysDbContext>(option =>
{
option.UseSqlServer("SurveyConnection");
@ -24,8 +53,16 @@ if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
using (var serviceScope = app.Services.CreateScope())
{
var services = serviceScope.ServiceProvider;
var surveyProvider = services.GetRequiredService<ISurveyProvider>();
surveyProvider.seedData();
}
}
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();

View File

@ -1,7 +1,9 @@
using AutoMapper;
using DamageAssesment.Api.Surveys.Db;
using DamageAssesment.Api.Surveys.Interfaces;
using DamageAssesment.Api.Surveys.Models;
using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
namespace DamageAssesment.Api.Surveys.Providers
{
@ -16,31 +18,91 @@ namespace DamageAssesment.Api.Surveys.Providers
this.surveyDbContext = surveysDbContext;
this.logger = logger;
this.mapper = mapper;
seedData();
//seedData();
}
private void seedData()
public void seedData()
{
if (!surveyDbContext.Surveys.Any())
{
surveyDbContext.Surveys.Add(new Db.Survey { Title = "Sample Survey Title:Damage Assesment 2014", IsEnabled = true, StartDate = DateTime.Now, EndDate = DateTime.Now.AddDays(90) });
surveyDbContext.Surveys.Add(new Db.Survey { Title = "Sample Survey Title: Damage Assesment 2016", IsEnabled = true, StartDate = DateTime.Now, EndDate = DateTime.Now.AddDays(90) });
surveyDbContext.Surveys.Add(new Db.Survey { Title = "Sample Survey Title: Damage Assesment 2018", IsEnabled = true, StartDate = DateTime.Now, EndDate = DateTime.Now.AddDays(90) });
surveyDbContext.Surveys.Add(new Db.Survey { IsEnabled = true, StartDate = DateTime.Now, EndDate = DateTime.Now.AddDays(90) });
surveyDbContext.Surveys.Add(new Db.Survey { IsEnabled = true, StartDate = DateTime.Now, EndDate = DateTime.Now.AddDays(90) });
surveyDbContext.Surveys.Add(new Db.Survey { IsEnabled = true, StartDate = DateTime.Now, EndDate = DateTime.Now.AddDays(90) });
surveyDbContext.SaveChanges();
}
if (!surveyDbContext.SurveysTranslation.Any())
{
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" });
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" });
surveyDbContext.SurveysTranslation.Add(new Db.SurveyTranslation { SurveyId = 3, Language = "en", Title = "Public Perception of Hurricane Michael's Response" });
surveyDbContext.SurveysTranslation.Add(new Db.SurveyTranslation { SurveyId = 3, Language = "es", Title = "Percepción pública de la respuesta del huracán Michael" });
surveyDbContext.SurveysTranslation.Add(new Db.SurveyTranslation { SurveyId = 3, Language = "fr", Title = "Perception du public de la réponse de l'ouragan Michael" });
surveyDbContext.SaveChangesAsync();
}
}
public async Task<(bool IsSuccess, IEnumerable<Models.Survey> Surveys, string ErrorMessage)> GetSurveysAsync()
public IEnumerable<Models.SurveyTranslation> GetSurveyTranslations(int id, IEnumerable<Models.SurveyTranslation> SurveyTranslation,string? language)
{
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;
try
{
logger?.LogInformation("Gell all Surveys from DB");
var surveys = await surveyDbContext.Surveys.ToListAsync();
var surveys = await surveyDbContext.Surveys.Where(s => s.IsEnabled == true).ToListAsync();
//var surveyTranslations = await surveyDbContext.SurveysTranslation.ToListAsync();
if (surveys != null)
{
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))
};
logger?.LogInformation($"{surveys.Count} Items(s) found");
var result = mapper.Map<IEnumerable<Db.Survey>, IEnumerable<Models.Survey>>(surveys);
return (true, result, null);
return (true, surveysList, null);
}
return (false, null, "Not found");
}
@ -50,16 +112,27 @@ namespace DamageAssesment.Api.Surveys.Providers
return (false, null, ex.Message);
}
}
public async Task<(bool IsSuccess, Models.Survey Surveys, string ErrorMessage)> GetSurveysAsync(int Id)
public async Task<(bool IsSuccess, Models.MultiLanSurvey Surveys, string ErrorMessage)> GetSurveysAsync(int id, string language)
{
try
{
logger?.LogInformation("Query Survey");
var survey = await surveyDbContext.Surveys.SingleOrDefaultAsync(s => s.Id == Id);
var survey = await surveyDbContext.Surveys.SingleOrDefaultAsync(s => s.Id == id && s.IsEnabled == true);
if (survey != null)
{
logger?.LogInformation($"Survey Id: {Id} found");
var result = mapper.Map<Db.Survey, Models.Survey>(survey);
Models.MultiLanSurvey result = null;
var surveyTranslations = await surveyDbContext.SurveysTranslation.Where(s => s.SurveyId == survey.Id).ToListAsync();
result = new Models.MultiLanSurvey
{
Id = survey.Id,
StartDate = survey.StartDate,
EndDate = survey.EndDate,
IsEnabled = survey.IsEnabled,
CreatedDate = survey.CreatedDate,
Titles = CreateMultiLanguageObject(GetSurveyTranslations(survey.Id,null, language))
};
logger?.LogInformation($"Survey Id: {id} found");
return (true, result, null);
}
return (false, null, "Not found");
@ -71,17 +144,26 @@ namespace DamageAssesment.Api.Surveys.Providers
}
}
public async Task<(bool IsSuccess, Models.Survey Survey, string ErrorMessage)> PostSurveyAsync(Models.Survey survey)
public async Task<(bool IsSuccess, Models.MultiLanSurvey Survey, string ErrorMessage)> PostSurveyAsync(Models.Survey survey)
{
try
{
if (survey != null)
{
var surveys = await surveyDbContext.Surveys.ToListAsync();
survey.Id = surveys.Count + 1;
surveyDbContext.Surveys.Add(mapper.Map<Models.Survey, Db.Survey>(survey));
surveyDbContext.SaveChanges();
return (true, survey, "Successful");
survey.CreatedDate = DateTime.Now;
Db.Survey _survey = mapper.Map<Models.Survey, Db.Survey>(survey);
surveyDbContext.Surveys.Add(_survey);
await surveyDbContext.SaveChangesAsync();
foreach (var title in survey.Titles)
{
surveyDbContext.SurveysTranslation.Add(new Db.SurveyTranslation {SurveyId = _survey.Id, Language = title.Language, Title = title.Title });
}
await surveyDbContext.SaveChangesAsync();
var result = mapper.Map<Db.Survey, Models.MultiLanSurvey>(_survey);
result.Titles = CreateMultiLanguageObject(GetSurveyTranslations(_survey.Id, survey.Titles, ""));
return (true, result, "Successful");
}
else
{
@ -96,22 +178,35 @@ namespace DamageAssesment.Api.Surveys.Providers
}
}
public async Task<(bool IsSuccess, Models.Survey Survey, string ErrorMessage)> PutSurveyAsync(int Id, Models.Survey survey)
public async Task<(bool IsSuccess, Models.MultiLanSurvey Survey, string ErrorMessage)> PutSurveyAsync(int Id, Models.Survey survey)
{
try
{
if (survey != null)
{
var _survey = await surveyDbContext.Surveys.Where(s => s.Id == Id).SingleOrDefaultAsync();
var _survey = await surveyDbContext.Surveys.AsNoTracking().Where(s => s.Id == Id).SingleOrDefaultAsync();
if (_survey != null)
{
_survey.Title = survey.Title;
_survey.IsEnabled = survey.IsEnabled;
_survey.StartDate = survey.StartDate;
_survey.EndDate = survey.EndDate;
surveyDbContext.SaveChanges();
return (true, mapper.Map<Db.Survey, Models.Survey>(_survey), "Successful");
var surveysTranslation = await surveyDbContext.SurveysTranslation.Where(s => s.SurveyId == Id).ToListAsync();
surveyDbContext.SurveysTranslation.RemoveRange(surveysTranslation);
await surveyDbContext.SaveChangesAsync();
_survey = mapper.Map<Models.Survey, Db.Survey>(survey);
surveyDbContext.Surveys.Update(_survey);
await surveyDbContext.SaveChangesAsync();
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();
var result = mapper.Map<Db.Survey, Models.MultiLanSurvey>(_survey);
result.Titles = CreateMultiLanguageObject(GetSurveyTranslations(_survey.Id, survey.Titles, ""));
return (true, result, "Successful");
}
else
{
@ -132,7 +227,7 @@ namespace DamageAssesment.Api.Surveys.Providers
}
}
public async Task<(bool IsSuccess, Models.Survey Survey, string ErrorMessage)> DeleteSurveyAsync(int Id)
public async Task<(bool IsSuccess, Models.MultiLanSurvey Survey, string ErrorMessage)> DeleteSurveyAsync(int Id)
{
try
{
@ -140,9 +235,11 @@ namespace DamageAssesment.Api.Surveys.Providers
if (survey != null)
{
var result = mapper.Map<Db.Survey, Models.MultiLanSurvey>(survey);
result.Titles = CreateMultiLanguageObject(GetSurveyTranslations(survey.Id, null, ""));
surveyDbContext.Surveys.Remove(survey);
surveyDbContext.SaveChanges();
return (true, mapper.Map<Db.Survey, Models.Survey>(survey), $"Survey Id: {Id} deleted Successfuly");
await surveyDbContext.SaveChangesAsync();
return (true, result, $"Survey Id: {Id} deleted Successfuly");
}
else
{

View File

@ -1,4 +1,7 @@
{
"JwtSettings": {
"securitykey": "bWlhbWkgZGFkZSBzY2hvb2xzIHNlY3JldCBrZXk="
},
"Logging": {
"LogLevel": {
"Default": "Information",