From f356f15d3a7dce1669944d23ab395ec96d042293 Mon Sep 17 00:00:00 2001 From: ivar Date: Sun, 28 Apr 2024 22:37:48 +0200 Subject: Misc --- code/api/src/Endpoints/EndpointBase.cs | 21 ++-- .../Endpoints/Internal/Account/GetAccountRoute.cs | 4 +- .../Internal/Account/UpdateAccountRoute.cs | 4 +- .../api/src/Endpoints/Internal/INT_EndpointBase.cs | 2 +- .../src/Endpoints/Internal/Root/ValidateRoute.cs | 23 ++-- code/api/src/Endpoints/Internal/RouteBaseAsync.cs | 118 ++++++++++----------- code/api/src/Endpoints/Internal/RouteBaseSync.cs | 92 ++++++++-------- code/api/src/Endpoints/V1/ApiSpecV1.cs | 26 ++--- .../src/Endpoints/V1/ApiTokens/CreateTokenRoute.cs | 4 +- .../src/Endpoints/V1/ApiTokens/DeleteTokenRoute.cs | 4 +- code/api/src/Endpoints/V1/RouteBaseAsync.cs | 118 ++++++++++----------- code/api/src/Endpoints/V1/RouteBaseSync.cs | 92 ++++++++-------- code/api/src/Endpoints/V1/V1_EndpointBase.cs | 8 +- 13 files changed, 253 insertions(+), 263 deletions(-) (limited to 'code/api/src/Endpoints') diff --git a/code/api/src/Endpoints/EndpointBase.cs b/code/api/src/Endpoints/EndpointBase.cs index e8e2494..584f43e 100644 --- a/code/api/src/Endpoints/EndpointBase.cs +++ b/code/api/src/Endpoints/EndpointBase.cs @@ -8,18 +8,15 @@ public class EndpointBase : ControllerBase /// /// User data for the currently logged on user. /// - protected LoggedInUserModel LoggedInUser => new() - { + protected LoggedInUserModel LoggedInUser => new() { Username = User.FindFirstValue(AppClaims.NAME), Id = User.FindFirstValue(AppClaims.USER_ID).AsGuid(), }; [NonAction] - protected ActionResult KnownProblem(string title = default, string subtitle = default, Dictionary errors = default) - { + protected ActionResult KnownProblem(string title = default, string subtitle = default, Dictionary errors = default) { HttpContext.Response.Headers.Append(AppHeaders.IS_KNOWN_PROBLEM, "1"); - return BadRequest(new KnownProblemModel - { + return BadRequest(new KnownProblemModel { Title = title, Subtitle = subtitle, Errors = errors, @@ -28,31 +25,27 @@ public class EndpointBase : ControllerBase } [NonAction] - protected ActionResult KnownProblem(KnownProblemModel problem) - { + protected ActionResult KnownProblem(KnownProblemModel problem) { HttpContext.Response.Headers.Append(AppHeaders.IS_KNOWN_PROBLEM, "1"); problem.TraceId = HttpContext.TraceIdentifier; return BadRequest(problem); } [NonAction] - protected RequestTimeZoneInfo GetRequestTimeZone(ILogger logger = default) - { + protected RequestTimeZoneInfo GetRequestTimeZone(ILogger logger = default) { Request.Headers.TryGetValue(AppHeaders.BROWSER_TIME_ZONE, out var timeZoneHeader); var tz = TimeZoneInfo.FindSystemTimeZoneById(timeZoneHeader.ToString().HasValue() ? timeZoneHeader.ToString() : "UTC"); var offset = tz.BaseUtcOffset.Hours; // This is fine as long as the client is not connecting from Australia: Lord Howe Island, // according to https://en.wikipedia.org/wiki/Daylight_saving_time_by_country - if (tz.IsDaylightSavingTime(AppDateTime.UtcNow)) - { + if (tz.IsDaylightSavingTime(AppDateTime.UtcNow)) { offset++; } logger?.LogInformation("Request time zone (" + tz.Id + ") offset is: " + offset + " hours"); - return new RequestTimeZoneInfo() - { + return new RequestTimeZoneInfo() { TimeZoneInfo = tz, Offset = offset, LocalDateTime = TimeZoneInfo.ConvertTimeFromUtc(AppDateTime.UtcNow, tz) diff --git a/code/api/src/Endpoints/Internal/Account/GetAccountRoute.cs b/code/api/src/Endpoints/Internal/Account/GetAccountRoute.cs index 121b40f..67c4d4d 100644 --- a/code/api/src/Endpoints/Internal/Account/GetAccountRoute.cs +++ b/code/api/src/Endpoints/Internal/Account/GetAccountRoute.cs @@ -12,7 +12,7 @@ public class GetAccountRoute : RouteBaseAsync.WithoutRequest.WithActionResult> HandleAsync(CancellationToken cancellationToken = default) { var user = _database.Users .Select(x => new {x.Username, x.Id}) - .SingleOrDefault(c => c.Id == LoggedInUser.Id); + .FirstOrDefault(c => c.Id == LoggedInUser.Id); if (user != default) { return Ok(new LoggedInUserModel { Id = LoggedInUser.Id, @@ -23,4 +23,4 @@ public class GetAccountRoute : RouteBaseAsync.WithoutRequest.WithActionResult HandleAsync(Payload request, CancellationToken cancellationToken = default) { - var user = _database.Users.SingleOrDefault(c => c.Id == LoggedInUser.Id); + var user = _database.Users.FirstOrDefault(c => c.Id == LoggedInUser.Id); if (user == default) { await HttpContext.SignOutAsync(); return Unauthorized(); @@ -56,4 +56,4 @@ public class UpdateAccountRoute : RouteBaseAsync.WithRequest _logger; - public ValidateRoute(EmailValidationService emailValidation, ILogger logger) - { + public ValidateRoute(EmailValidationService emailValidation, ILogger logger) { _emailValidation = emailValidation; _logger = logger; CanonicalFrontendUrl = Program.AppConfiguration.CANONICAL_FRONTEND_URL; @@ -20,20 +19,18 @@ public class ValidateRoute : RouteBaseSync.WithRequest - -

The validation could not be completed

-

We are working on fixing this, in the meantime, have patience.

-Click here to go back to {CanonicalFrontendUrl} - -"""); + + +

The validation could not be completed

+

We are working on fixing this, in the meantime, have patience.

+ Click here to go back to {CanonicalFrontendUrl} + + """); } return Redirect(CanonicalFrontendUrl + "/portal?msg=emailValidated"); diff --git a/code/api/src/Endpoints/Internal/RouteBaseAsync.cs b/code/api/src/Endpoints/Internal/RouteBaseAsync.cs index a87facf..dc25499 100644 --- a/code/api/src/Endpoints/Internal/RouteBaseAsync.cs +++ b/code/api/src/Endpoints/Internal/RouteBaseAsync.cs @@ -5,69 +5,69 @@ namespace IOL.GreatOffice.Api.Endpoints.Internal; /// public static class RouteBaseAsync { - public static class WithRequest - { - public abstract class WithResult : INT_EndpointBase - { - public abstract Task HandleAsync( - TRequest request, - CancellationToken cancellationToken = default - ); - } + public static class WithRequest + { + public abstract class WithResult : INT_EndpointBase + { + public abstract Task HandleAsync( + TRequest request, + CancellationToken cancellationToken = default + ); + } - public abstract class WithoutResult : INT_EndpointBase - { - public abstract Task HandleAsync( - TRequest request, - CancellationToken cancellationToken = default - ); - } + public abstract class WithoutResult : INT_EndpointBase + { + public abstract Task HandleAsync( + TRequest request, + CancellationToken cancellationToken = default + ); + } - public abstract class WithActionResult : INT_EndpointBase - { - public abstract Task> HandleAsync( - TRequest request, - CancellationToken cancellationToken = default - ); - } + public abstract class WithActionResult : INT_EndpointBase + { + public abstract Task> HandleAsync( + TRequest request, + CancellationToken cancellationToken = default + ); + } - public abstract class WithActionResult : INT_EndpointBase - { - public abstract Task HandleAsync( - TRequest request, - CancellationToken cancellationToken = default - ); - } - } + public abstract class WithActionResult : INT_EndpointBase + { + public abstract Task HandleAsync( + TRequest request, + CancellationToken cancellationToken = default + ); + } + } - public static class WithoutRequest - { - public abstract class WithResult : INT_EndpointBase - { - public abstract Task HandleAsync( - CancellationToken cancellationToken = default - ); - } + public static class WithoutRequest + { + public abstract class WithResult : INT_EndpointBase + { + public abstract Task HandleAsync( + CancellationToken cancellationToken = default + ); + } - public abstract class WithoutResult : INT_EndpointBase - { - public abstract Task HandleAsync( - CancellationToken cancellationToken = default - ); - } + public abstract class WithoutResult : INT_EndpointBase + { + public abstract Task HandleAsync( + CancellationToken cancellationToken = default + ); + } - public abstract class WithActionResult : INT_EndpointBase - { - public abstract Task> HandleAsync( - CancellationToken cancellationToken = default - ); - } + public abstract class WithActionResult : INT_EndpointBase + { + public abstract Task> HandleAsync( + CancellationToken cancellationToken = default + ); + } - public abstract class WithActionResult : INT_EndpointBase - { - public abstract Task HandleAsync( - CancellationToken cancellationToken = default - ); - } - } -} + public abstract class WithActionResult : INT_EndpointBase + { + public abstract Task HandleAsync( + CancellationToken cancellationToken = default + ); + } + } +} \ No newline at end of file diff --git a/code/api/src/Endpoints/Internal/RouteBaseSync.cs b/code/api/src/Endpoints/Internal/RouteBaseSync.cs index 9d9bd5a..4bbfa16 100644 --- a/code/api/src/Endpoints/Internal/RouteBaseSync.cs +++ b/code/api/src/Endpoints/Internal/RouteBaseSync.cs @@ -5,49 +5,49 @@ namespace IOL.GreatOffice.Api.Endpoints.Internal; /// public static class RouteBaseSync { - public static class WithRequest - { - public abstract class WithResult : INT_EndpointBase - { - public abstract TResponse Handle(TRequest request); - } - - public abstract class WithoutResult : INT_EndpointBase - { - public abstract void Handle(TRequest request); - } - - public abstract class WithActionResult : INT_EndpointBase - { - public abstract ActionResult Handle(TRequest request); - } - - public abstract class WithActionResult : INT_EndpointBase - { - public abstract ActionResult Handle(TRequest request); - } - } - - public static class WithoutRequest - { - public abstract class WithResult : INT_EndpointBase - { - public abstract TResponse Handle(); - } - - public abstract class WithoutResult : INT_EndpointBase - { - public abstract void Handle(); - } - - public abstract class WithActionResult : INT_EndpointBase - { - public abstract ActionResult Handle(); - } - - public abstract class WithActionResult : INT_EndpointBase - { - public abstract ActionResult Handle(); - } - } -} + public static class WithRequest + { + public abstract class WithResult : INT_EndpointBase + { + public abstract TResponse Handle(TRequest request); + } + + public abstract class WithoutResult : INT_EndpointBase + { + public abstract void Handle(TRequest request); + } + + public abstract class WithActionResult : INT_EndpointBase + { + public abstract ActionResult Handle(TRequest request); + } + + public abstract class WithActionResult : INT_EndpointBase + { + public abstract ActionResult Handle(TRequest request); + } + } + + public static class WithoutRequest + { + public abstract class WithResult : INT_EndpointBase + { + public abstract TResponse Handle(); + } + + public abstract class WithoutResult : INT_EndpointBase + { + public abstract void Handle(); + } + + public abstract class WithActionResult : INT_EndpointBase + { + public abstract ActionResult Handle(); + } + + public abstract class WithActionResult : INT_EndpointBase + { + public abstract ActionResult Handle(); + } + } +} \ No newline at end of file diff --git a/code/api/src/Endpoints/V1/ApiSpecV1.cs b/code/api/src/Endpoints/V1/ApiSpecV1.cs index e4f9cc9..7a54eb0 100644 --- a/code/api/src/Endpoints/V1/ApiSpecV1.cs +++ b/code/api/src/Endpoints/V1/ApiSpecV1.cs @@ -2,17 +2,17 @@ namespace IOL.GreatOffice.Api.Endpoints.V1; public static class ApiSpecV1 { - private const int MAJOR = 1; - private const int MINOR = 0; - public const string VERSION_STRING = "1.0"; + private const int MAJOR = 1; + private const int MINOR = 0; + public const string VERSION_STRING = "1.0"; - public static ApiSpecDocument Document => new() { - Version = new ApiVersion(MAJOR, MINOR), - VersionName = VERSION_STRING, - SwaggerPath = $"/swagger/{VERSION_STRING}/swagger.json", - OpenApiInfo = new OpenApiInfo { - Title = AppConstants.API_NAME, - Version = VERSION_STRING - } - }; -} + public static ApiSpecDocument Document => new() { + Version = new ApiVersion(MAJOR, MINOR), + VersionName = VERSION_STRING, + SwaggerPath = $"/swagger/{VERSION_STRING}/swagger.json", + OpenApiInfo = new OpenApiInfo { + Title = AppConstants.API_NAME, + Version = VERSION_STRING + } + }; +} \ No newline at end of file diff --git a/code/api/src/Endpoints/V1/ApiTokens/CreateTokenRoute.cs b/code/api/src/Endpoints/V1/ApiTokens/CreateTokenRoute.cs index c28f534..b9876c6 100644 --- a/code/api/src/Endpoints/V1/ApiTokens/CreateTokenRoute.cs +++ b/code/api/src/Endpoints/V1/ApiTokens/CreateTokenRoute.cs @@ -31,7 +31,7 @@ public class CreateTokenRoute : RouteBaseSync.WithRequest c.Id == LoggedInUser.Id); + var user = _database.Users.FirstOrDefault(c => c.Id == LoggedInUser.Id); if (user == default) { return NotFound(new KnownProblemModel("User does not exist")); @@ -58,4 +58,4 @@ public class CreateTokenRoute : RouteBaseSync.WithRequest.WithActionResult [ApiVersion(ApiSpecV1.VERSION_STRING)] [HttpDelete("~/v{version:apiVersion}/api-tokens/delete")] public override ActionResult Handle(Guid id) { - var token = _database.AccessTokens.SingleOrDefault(c => c.Id == id); + var token = _database.AccessTokens.FirstOrDefault(c => c.Id == id); if (token == default) { _logger.LogWarning("A deletion request of an already deleted (maybe) api token was received."); return NotFound(); @@ -28,4 +28,4 @@ public class DeleteTokenRoute : RouteBaseSync.WithRequest.WithActionResult _database.SaveChanges(); return Ok(); } -} \ No newline at end of file +} diff --git a/code/api/src/Endpoints/V1/RouteBaseAsync.cs b/code/api/src/Endpoints/V1/RouteBaseAsync.cs index 33b6f5f..cc30aa6 100644 --- a/code/api/src/Endpoints/V1/RouteBaseAsync.cs +++ b/code/api/src/Endpoints/V1/RouteBaseAsync.cs @@ -5,69 +5,69 @@ namespace IOL.GreatOffice.Api.Endpoints.V1; /// public class RouteBaseAsync { - public class WithRequest - { - public abstract class WithResult : V1_EndpointBase - { - public abstract Task HandleAsync( - TRequest request, - CancellationToken cancellationToken = default - ); - } + public class WithRequest + { + public abstract class WithResult : V1_EndpointBase + { + public abstract Task HandleAsync( + TRequest request, + CancellationToken cancellationToken = default + ); + } - public abstract class WithoutResult : V1_EndpointBase - { - public abstract Task HandleAsync( - TRequest request, - CancellationToken cancellationToken = default - ); - } + public abstract class WithoutResult : V1_EndpointBase + { + public abstract Task HandleAsync( + TRequest request, + CancellationToken cancellationToken = default + ); + } - public abstract class WithActionResult : V1_EndpointBase - { - public abstract Task> HandleAsync( - TRequest request, - CancellationToken cancellationToken = default - ); - } + public abstract class WithActionResult : V1_EndpointBase + { + public abstract Task> HandleAsync( + TRequest request, + CancellationToken cancellationToken = default + ); + } - public abstract class WithActionResult : V1_EndpointBase - { - public abstract Task HandleAsync( - TRequest request, - CancellationToken cancellationToken = default - ); - } - } + public abstract class WithActionResult : V1_EndpointBase + { + public abstract Task HandleAsync( + TRequest request, + CancellationToken cancellationToken = default + ); + } + } - public static class WithoutRequest - { - public abstract class WithResult : V1_EndpointBase - { - public abstract Task HandleAsync( - CancellationToken cancellationToken = default - ); - } + public static class WithoutRequest + { + public abstract class WithResult : V1_EndpointBase + { + public abstract Task HandleAsync( + CancellationToken cancellationToken = default + ); + } - public abstract class WithoutResult : V1_EndpointBase - { - public abstract Task HandleAsync( - CancellationToken cancellationToken = default - ); - } + public abstract class WithoutResult : V1_EndpointBase + { + public abstract Task HandleAsync( + CancellationToken cancellationToken = default + ); + } - public abstract class WithActionResult : V1_EndpointBase - { - public abstract Task> HandleAsync( - CancellationToken cancellationToken = default - ); - } + public abstract class WithActionResult : V1_EndpointBase + { + public abstract Task> HandleAsync( + CancellationToken cancellationToken = default + ); + } - public abstract class WithActionResult : V1_EndpointBase - { - public abstract Task HandleAsync( - CancellationToken cancellationToken = default - ); - } - } -} + public abstract class WithActionResult : V1_EndpointBase + { + public abstract Task HandleAsync( + CancellationToken cancellationToken = default + ); + } + } +} \ No newline at end of file diff --git a/code/api/src/Endpoints/V1/RouteBaseSync.cs b/code/api/src/Endpoints/V1/RouteBaseSync.cs index 6a86074..3a06d14 100644 --- a/code/api/src/Endpoints/V1/RouteBaseSync.cs +++ b/code/api/src/Endpoints/V1/RouteBaseSync.cs @@ -5,49 +5,49 @@ namespace IOL.GreatOffice.Api.Endpoints.V1; /// public static class RouteBaseSync { - public static class WithRequest - { - public abstract class WithResult : V1_EndpointBase - { - public abstract TResponse Handle(TRequest request); - } - - public abstract class WithoutResult : V1_EndpointBase - { - public abstract void Handle(TRequest request); - } - - public abstract class WithActionResult : V1_EndpointBase - { - public abstract ActionResult Handle(TRequest request); - } - - public abstract class WithActionResult : V1_EndpointBase - { - public abstract ActionResult Handle(TRequest request); - } - } - - public static class WithoutRequest - { - public abstract class WithResult : V1_EndpointBase - { - public abstract TResponse Handle(); - } - - public abstract class WithoutResult : V1_EndpointBase - { - public abstract void Handle(); - } - - public abstract class WithActionResult : V1_EndpointBase - { - public abstract ActionResult Handle(); - } - - public abstract class WithActionResult : V1_EndpointBase - { - public abstract ActionResult Handle(); - } - } -} + public static class WithRequest + { + public abstract class WithResult : V1_EndpointBase + { + public abstract TResponse Handle(TRequest request); + } + + public abstract class WithoutResult : V1_EndpointBase + { + public abstract void Handle(TRequest request); + } + + public abstract class WithActionResult : V1_EndpointBase + { + public abstract ActionResult Handle(TRequest request); + } + + public abstract class WithActionResult : V1_EndpointBase + { + public abstract ActionResult Handle(TRequest request); + } + } + + public static class WithoutRequest + { + public abstract class WithResult : V1_EndpointBase + { + public abstract TResponse Handle(); + } + + public abstract class WithoutResult : V1_EndpointBase + { + public abstract void Handle(); + } + + public abstract class WithActionResult : V1_EndpointBase + { + public abstract ActionResult Handle(); + } + + public abstract class WithActionResult : V1_EndpointBase + { + public abstract ActionResult Handle(); + } + } +} \ No newline at end of file diff --git a/code/api/src/Endpoints/V1/V1_EndpointBase.cs b/code/api/src/Endpoints/V1/V1_EndpointBase.cs index 08ce4ab..a5835a5 100644 --- a/code/api/src/Endpoints/V1/V1_EndpointBase.cs +++ b/code/api/src/Endpoints/V1/V1_EndpointBase.cs @@ -7,11 +7,11 @@ namespace IOL.GreatOffice.Api.Endpoints.V1; public class V1_EndpointBase : EndpointBase { private const string AuthSchemes = CookieAuthenticationDefaults.AuthenticationScheme + "," + AppConstants.BASIC_AUTH_SCHEME; - + protected bool IsApiCall() { - if (!Request.Headers.ContainsKey("Authorization")) return false; + if (!Request.Headers.TryGetValue("Authorization", out var value)) return false; try { - var authHeader = AuthenticationHeaderValue.Parse(Request.Headers["Authorization"]); + var authHeader = AuthenticationHeaderValue.Parse(value); if (authHeader.Parameter == null) return false; } catch { return false; @@ -21,7 +21,7 @@ public class V1_EndpointBase : EndpointBase } protected bool HasApiPermission(string permission_key) { - var permission_claim = User.Claims.SingleOrDefault(c => c.Type == permission_key); + var permission_claim = User.Claims.FirstOrDefault(c => c.Type == permission_key); return permission_claim is { Value: "True" }; -- cgit v1.3