refactor(HomeController): remove culture binding as viewdata; bind via string localizer
This commit is contained in:
@@ -1,7 +1,8 @@
|
||||
using EnvelopeGenerator.Application.Dto.EnvelopeReceiver;
|
||||
using EnvelopeGenerator.Web.Models;
|
||||
using Microsoft.AspNetCore.Authentication.Cookies;
|
||||
using Microsoft.AspNetCore.Authentication;
|
||||
using Microsoft.AspNetCore.Authentication.Cookies;
|
||||
using Microsoft.AspNetCore.Localization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using System.Security.Claims;
|
||||
|
||||
@@ -55,6 +56,25 @@ namespace EnvelopeGenerator.Web.Controllers
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Cookie
|
||||
public static string? GetCulture(this IRequestCookieCollection cookies)
|
||||
=> cookies[CookieRequestCultureProvider.DefaultCookieName];
|
||||
|
||||
public static void SetCulture(this IResponseCookies cookies, string culture)
|
||||
{
|
||||
var cookieOptions = new CookieOptions
|
||||
{
|
||||
Secure = false,
|
||||
SameSite = SameSiteMode.Strict,
|
||||
HttpOnly = true
|
||||
};
|
||||
cookies.Append(
|
||||
CookieRequestCultureProvider.DefaultCookieName,
|
||||
CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)),
|
||||
cookieOptions);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region View error
|
||||
//TODO: integrate localizer for ready-to-use views
|
||||
//TODO: integrate to global exception handler middleware
|
||||
|
||||
@@ -58,8 +58,6 @@ public class HomeController : ViewControllerBase
|
||||
[HttpGet("/")]
|
||||
public IActionResult Main()
|
||||
{
|
||||
ViewData["UserCulture"] = _cultures[UserLanguage];
|
||||
|
||||
return View(new MainViewModel()
|
||||
{
|
||||
Title = _configuration["MainPageTitle"]
|
||||
@@ -118,8 +116,6 @@ public class HomeController : ViewControllerBase
|
||||
{
|
||||
try
|
||||
{
|
||||
ViewData["UserCulture"] = _cultures[UserLanguage];
|
||||
|
||||
return await _envRcvService.ReadByEnvelopeReceiverIdAsync(envelopeReceiverId: envelopeReceiverId).ThenAsync(
|
||||
SuccessAsync: async er => {
|
||||
if (User.IsInRole(ReceiverRole.FullyAuth))
|
||||
@@ -151,7 +147,6 @@ public class HomeController : ViewControllerBase
|
||||
{
|
||||
try
|
||||
{
|
||||
ViewData["UserCulture"] = _cultures[UserLanguage];
|
||||
ViewData["EnvelopeKey"] = envelopeReceiverId;
|
||||
|
||||
envelopeReceiverId = _sanitizer.Sanitize(envelopeReceiverId);
|
||||
@@ -310,7 +305,6 @@ public class HomeController : ViewControllerBase
|
||||
{
|
||||
try
|
||||
{
|
||||
ViewData["UserCulture"] = _cultures[UserLanguage];
|
||||
ViewData["EnvelopeKey"] = envelopeReceiverId;
|
||||
|
||||
envelopeReceiverId = _sanitizer.Sanitize(envelopeReceiverId);
|
||||
@@ -398,7 +392,6 @@ public class HomeController : ViewControllerBase
|
||||
return base.Redirect($"/EnvelopeKey/{envelopeReceiverId}/Locked");
|
||||
|
||||
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
|
||||
ViewData["UserCulture"] = _cultures[UserLanguage];
|
||||
ViewData["EnvelopeKey"] = envelopeReceiverId;
|
||||
return base.View();
|
||||
}),
|
||||
@@ -428,8 +421,6 @@ public class HomeController : ViewControllerBase
|
||||
return await _envRcvService.ReadByEnvelopeReceiverIdAsync(envelopeReceiverId).ThenAsync(
|
||||
SuccessAsync: async (er) =>
|
||||
{
|
||||
ViewData["UserCulture"] = _cultures[UserLanguage];
|
||||
ViewData["UserCulture"] = _cultures[UserLanguage];
|
||||
return await _historyService.IsRejected(envelopeId: er.EnvelopeId)
|
||||
? View(er)
|
||||
: Redirect($"/EnvelopeKey/{envelopeReceiverId}/Locked");
|
||||
@@ -454,8 +445,6 @@ public class HomeController : ViewControllerBase
|
||||
{
|
||||
try
|
||||
{
|
||||
ViewData["UserCulture"] = _cultures[UserLanguage];
|
||||
|
||||
readOnlyKey = _sanitizer.Sanitize(readOnlyKey);
|
||||
|
||||
// check if the readOnlyId is valid
|
||||
@@ -530,26 +519,15 @@ public class HomeController : ViewControllerBase
|
||||
return Ok(new { EnvelopeUuid = envelopeUuid, ReceiverSignature = receiverSignature });
|
||||
}
|
||||
|
||||
[HttpPost("lang/{language}")]
|
||||
public IActionResult SetLanguage([FromRoute] string language)
|
||||
[HttpPost("lang/{culture}")]
|
||||
public IActionResult SetLanguage([FromRoute] string culture)
|
||||
{
|
||||
try
|
||||
{
|
||||
language = _sanitizer.Sanitize(language);
|
||||
if (!_cultures.Languages.Contains(language))
|
||||
if (!_cultures.Languages.Contains(culture))
|
||||
return BadRequest();
|
||||
|
||||
var cookieOptions = new CookieOptions()
|
||||
{
|
||||
Secure = false,
|
||||
SameSite = SameSiteMode.Strict,
|
||||
HttpOnly = true
|
||||
};
|
||||
|
||||
Response.Cookies.Append(
|
||||
CookieRequestCultureProvider.DefaultCookieName,
|
||||
CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(language)),
|
||||
cookieOptions);
|
||||
Response.Cookies.SetCulture(culture);
|
||||
|
||||
return Redirect(Request.Headers["Referer"].ToString());
|
||||
}
|
||||
@@ -563,7 +541,5 @@ public class HomeController : ViewControllerBase
|
||||
[HttpGet("lang")]
|
||||
public IActionResult GetLanguages() => Ok(_cultures.Languages);
|
||||
|
||||
private string? UserLanguage => Request.Cookies[CookieRequestCultureProvider.DefaultCookieName];
|
||||
|
||||
public IActionResult Error404() => this.ViewError404();
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
using EnvelopeGenerator.Web.Models;
|
||||
using EnvelopeGenerator.Web.Controllers;
|
||||
using EnvelopeGenerator.Web.Models;
|
||||
using Microsoft.AspNetCore.Localization;
|
||||
using Microsoft.Extensions.Options;
|
||||
using System.Globalization;
|
||||
@@ -23,20 +24,7 @@ public class CultureMiddleware
|
||||
|
||||
if (string.IsNullOrEmpty(cookieValue))
|
||||
{
|
||||
var culture = new RequestCulture(_cultures.Default.Language);
|
||||
|
||||
var cookieOptions = new CookieOptions
|
||||
{
|
||||
Secure = false,
|
||||
SameSite = SameSiteMode.Strict,
|
||||
HttpOnly = true
|
||||
};
|
||||
|
||||
context.Response.Cookies.Append(
|
||||
cookieName,
|
||||
CookieRequestCultureProvider.MakeCookieValue(culture),
|
||||
cookieOptions);
|
||||
|
||||
context.Response.Cookies.SetCulture(_cultures.Default.Language);
|
||||
CultureInfo.CurrentCulture = new CultureInfo(_cultures.Default.Language);
|
||||
CultureInfo.CurrentUICulture = new CultureInfo(_cultures.Default.Language);
|
||||
}
|
||||
|
||||
@@ -90,7 +90,7 @@ try
|
||||
|
||||
//AddEF Core dbcontext
|
||||
var useDbMigration = Environment.GetEnvironmentVariable("MIGRATION_TEST_MODE") == true.ToString() || config.GetValue<bool>("UseDbMigration");
|
||||
var cnnStrName = useDbMigration ? Key.DbMigrationTest : Key.Default;
|
||||
var cnnStrName = useDbMigration ? "DbMigrationTest" : "Default";
|
||||
var connStr = config.GetConnectionString(cnnStrName)
|
||||
?? throw new InvalidOperationException($"Connection string '{cnnStrName}' is missing in the application configuration.");
|
||||
|
||||
|
||||
@@ -57,7 +57,7 @@ namespace EnvelopeGenerator.Web.Services
|
||||
_logger = logger;
|
||||
|
||||
_logger.LogInformation("Establishing MSSQL Database connection..");
|
||||
MSSQL = new MSSQLServer(logConfig, config.GetConnectionString(Key.Default));
|
||||
MSSQL = new MSSQLServer(logConfig, config.GetConnectionString("Default"));
|
||||
|
||||
if (MSSQL.DBInitialized == true)
|
||||
{
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
var nonce = _accessor.HttpContext?.Items["csp-nonce"] as string;
|
||||
var cImg = _cImgOpt.Value;
|
||||
ViewData["Title"] = _localizer[WebKey.DocProtected];
|
||||
var userCulture = ViewData["UserCulture"] as Culture;
|
||||
string codeType = ViewData["CodeType"] is string _codeType ? _codeType : "accessCode";
|
||||
string codeKeyName = (char.ToUpper(codeType[0]) + codeType.Substring(1)).Replace("Code", "");
|
||||
bool viaSms = codeType == "smsCode";
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
@using Newtonsoft.Json.Serialization
|
||||
@model EnvelopeReceiverDto;
|
||||
@{
|
||||
var userCulture = ViewData["UserCulture"] as Culture;
|
||||
var envelope = Model.Envelope;
|
||||
var document = Model.Envelope?.Documents?.FirstOrDefault();
|
||||
var sender = Model.Envelope?.User;
|
||||
|
||||
@@ -3,9 +3,6 @@
|
||||
@using Newtonsoft.Json.Serialization
|
||||
@{
|
||||
var nonce = _accessor.HttpContext?.Items["csp-nonce"] as string;
|
||||
var userCulture = ViewData["UserCulture"] as Culture;
|
||||
//TODO: instead of default assignment add a middleware for culture
|
||||
userCulture ??= _cultures.Default;
|
||||
var isReadOnly = false;
|
||||
if (ViewData["IsReadOnly"] is bool isReadOnly_bool)
|
||||
isReadOnly = isReadOnly_bool;
|
||||
@@ -83,7 +80,7 @@
|
||||
<span>© SignFlow 2023-2024 <a href="https://digitaldata.works" target="_blank">Digital Data GmbH</a></span>
|
||||
<div class="dropup flag-dropdown">
|
||||
<button class="btn btn-outline-secondary dropdown-toggle" type="button" id="langDropdownMenuButton" data-bs-toggle="dropdown" aria-expanded="false">
|
||||
<span class="fi @userCulture?.FIClass.TrySanitize(_sanitizer) me-2" id="selectedFlag"></span><span id="selectedLanguage"></span>
|
||||
<span class="fi @_localizer.FiClass() me-2" id="selectedFlag"></span><span id="selectedLanguage"></span>
|
||||
</button>
|
||||
<ul class="dropdown-menu" aria-labelledby="langDropdownMenuButton">
|
||||
@foreach (var culture in _cultures)
|
||||
@@ -98,7 +95,7 @@
|
||||
}
|
||||
</ul>
|
||||
</div>
|
||||
<a href="/privacy-policy.@(userCulture?.Language).html" target="_blank">@_localizer[WebKey.Privacy]</a>
|
||||
<a href="/privacy-policy.@(_localizer.Culture()).html" target="_blank">@_localizer[WebKey.Privacy]</a>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user