MailSharp / MailSharp.MailClient / Controllers / Api / LanguageApiController.cs
Code · 39 lines · 1217 bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39using MailSharp.MailClient.Services;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace MailSharp.MailClient.Controllers.Api;

// Translations must be available on the (logged-out) login page too, so this whole
// controller stays anonymous-accessible even though most other API controllers now require login.
[AllowAnonymous]
[ApiController]
[Route("api/language")]
public class LanguageApiController(LocalizationService localizer) : ControllerBase
{
	[HttpGet("state")]
	public IActionResult State() => Ok(BuildState(localizer.CurrentLanguage));

	[HttpPost("set")]
	public IActionResult Set(SetLanguageRequest request)
	{
		if (!localizer.LanguageExists(request.Lang)) return BadRequest();

		Response.Cookies.Append("lang", request.Lang, new CookieOptions
		{
			Expires = DateTimeOffset.UtcNow.AddYears(1),
			IsEssential = true,
			SameSite = SameSiteMode.Lax,
			HttpOnly = true
		});

		return Ok(BuildState(request.Lang));
	}

	private LanguageStateDto BuildState(string lang) => new()
	{
		Current = lang,
		Languages = [.. localizer.AvailableLanguages().Select(l => new LanguageOptionDto { Code = l.Code, Name = l.Name })],
		Strings = localizer.GetAllStrings(lang)
	};
}