using DigitalData.Core.API;
using EnvelopeGenerator.Application.Resources;
using EnvelopeGenerator.Common;
using Microsoft.AspNetCore.Localization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Localization;
namespace EnvelopeGenerator.GeneratorAPI.Controllers;
///
/// Controller für die Verwaltung der Lokalisierung und Spracheinstellungen.
///
[Route("api/[controller]")]
[ApiController]
public class LocalizationController : ControllerBase
{
private static readonly Guid L_KEY = Guid.NewGuid();
private readonly ILogger _logger;
private readonly IStringLocalizer _mLocalizer;
private readonly IStringLocalizer _localizer;
private readonly IMemoryCache _cache;
///
/// Konstruktor für den .
///
/// Logger für die Protokollierung.
/// Lokalisierungsdienst für Ressourcen.
/// Speicher-Cache für die Zwischenspeicherung von Daten.
/// Lokalisierungsdienst für Modelle.
public LocalizationController(
ILogger logger,
IStringLocalizer localizer,
IMemoryCache memoryCache,
IStringLocalizer _modelLocalizer)
{
_logger = logger;
_localizer = localizer;
_cache = memoryCache;
_mLocalizer = _modelLocalizer;
}
///
/// Ruft alle lokalisierten Daten ab.
///
/// Eine Liste aller lokalisierten Daten.
[HttpGet]
public IActionResult GetAll() => Ok(_cache.GetOrCreate(Language ?? string.Empty + L_KEY, _ => _mLocalizer.ToDictionary()));
///
/// Ruft die aktuelle Sprache ab.
///
/// Die aktuelle Sprache oder ein NotFound-Ergebnis, wenn keine Sprache gesetzt ist.
[HttpGet("lang")]
public IActionResult GetLanguage() => Language is null ? NotFound() : Ok(Language);
///
/// Setzt die Sprache.
///
/// Die zu setzende Sprache.
/// Ein Ok-Ergebnis, wenn die Sprache erfolgreich gesetzt wurde, oder ein BadRequest-Ergebnis, wenn die Eingabe ungültig ist.
[HttpPost("lang")]
public IActionResult SetLanguage([FromQuery] string language)
{
if (string.IsNullOrEmpty(language))
return BadRequest();
Language = language;
return Ok();
}
///
/// Löscht die aktuelle Sprache.
///
/// Ein Ok-Ergebnis, wenn die Sprache erfolgreich gelöscht wurde.
[HttpDelete("lang")]
public IActionResult DeleteLanguage()
{
Language = null;
return Ok();
}
///
/// Eigenschaft für die Verwaltung der aktuellen Sprache über Cookies.
///
private string? Language
{
get
{
var cookieValue = Request.Cookies[CookieRequestCultureProvider.DefaultCookieName];
if (string.IsNullOrEmpty(cookieValue))
return null;
var culture = CookieRequestCultureProvider.ParseCookieValue(cookieValue)?.Cultures[0];
return culture?.Value ?? null;
}
set
{
if (value is null)
Response.Cookies.Delete(CookieRequestCultureProvider.DefaultCookieName);
else
{
var cookieOptions = new CookieOptions()
{
Expires = DateTimeOffset.UtcNow.AddYears(1),
Secure = false,
SameSite = SameSiteMode.Strict,
HttpOnly = true
};
Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(value)),
cookieOptions);
}
}
}
}