aboutsummaryrefslogtreecommitdiffstats
path: root/code/api/src/Endpoints
diff options
context:
space:
mode:
Diffstat (limited to 'code/api/src/Endpoints')
-rw-r--r--code/api/src/Endpoints/EndpointBase.cs21
-rw-r--r--code/api/src/Endpoints/Internal/Account/GetAccountRoute.cs4
-rw-r--r--code/api/src/Endpoints/Internal/Account/UpdateAccountRoute.cs4
-rw-r--r--code/api/src/Endpoints/Internal/INT_EndpointBase.cs2
-rw-r--r--code/api/src/Endpoints/Internal/Root/ValidateRoute.cs23
-rw-r--r--code/api/src/Endpoints/Internal/RouteBaseAsync.cs118
-rw-r--r--code/api/src/Endpoints/Internal/RouteBaseSync.cs78
-rw-r--r--code/api/src/Endpoints/V1/ApiSpecV1.cs26
-rw-r--r--code/api/src/Endpoints/V1/ApiTokens/CreateTokenRoute.cs4
-rw-r--r--code/api/src/Endpoints/V1/ApiTokens/DeleteTokenRoute.cs4
-rw-r--r--code/api/src/Endpoints/V1/RouteBaseAsync.cs118
-rw-r--r--code/api/src/Endpoints/V1/RouteBaseSync.cs78
-rw-r--r--code/api/src/Endpoints/V1/V1_EndpointBase.cs8
13 files changed, 239 insertions, 249 deletions
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
/// <summary>
/// User data for the currently logged on user.
/// </summary>
- 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<string, string[]> errors = default)
- {
+ protected ActionResult KnownProblem(string title = default, string subtitle = default, Dictionary<string, string[]> 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<Lo
public override async Task<ActionResult<LoggedInUserModel>> 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<Lo
await HttpContext.SignOutAsync();
return Unauthorized();
}
-} \ No newline at end of file
+}
diff --git a/code/api/src/Endpoints/Internal/Account/UpdateAccountRoute.cs b/code/api/src/Endpoints/Internal/Account/UpdateAccountRoute.cs
index 1081240..f6e18af 100644
--- a/code/api/src/Endpoints/Internal/Account/UpdateAccountRoute.cs
+++ b/code/api/src/Endpoints/Internal/Account/UpdateAccountRoute.cs
@@ -19,7 +19,7 @@ public class UpdateAccountRoute : RouteBaseAsync.WithRequest<UpdateAccountRoute.
[HttpPost("~/_/account/update")]
public override async Task<ActionResult> 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<UpdateAccountRoute.
await _database.SaveChangesAsync(cancellationToken);
return Ok();
}
-} \ No newline at end of file
+}
diff --git a/code/api/src/Endpoints/Internal/INT_EndpointBase.cs b/code/api/src/Endpoints/Internal/INT_EndpointBase.cs
index 699a976..0ba6c82 100644
--- a/code/api/src/Endpoints/Internal/INT_EndpointBase.cs
+++ b/code/api/src/Endpoints/Internal/INT_EndpointBase.cs
@@ -6,4 +6,4 @@ namespace IOL.GreatOffice.Api.Endpoints.Internal;
public class INT_EndpointBase : EndpointBase
{
-}
+} \ No newline at end of file
diff --git a/code/api/src/Endpoints/Internal/Root/ValidateRoute.cs b/code/api/src/Endpoints/Internal/Root/ValidateRoute.cs
index d8ec85a..f141fe9 100644
--- a/code/api/src/Endpoints/Internal/Root/ValidateRoute.cs
+++ b/code/api/src/Endpoints/Internal/Root/ValidateRoute.cs
@@ -6,8 +6,7 @@ public class ValidateRoute : RouteBaseSync.WithRequest<ValidateRoute.QueryParams
private readonly string CanonicalFrontendUrl;
private readonly ILogger<ValidateRoute> _logger;
- public ValidateRoute(EmailValidationService emailValidation, ILogger<ValidateRoute> logger)
- {
+ public ValidateRoute(EmailValidationService emailValidation, ILogger<ValidateRoute> logger) {
_emailValidation = emailValidation;
_logger = logger;
CanonicalFrontendUrl = Program.AppConfiguration.CANONICAL_FRONTEND_URL;
@@ -20,20 +19,18 @@ public class ValidateRoute : RouteBaseSync.WithRequest<ValidateRoute.QueryParams
}
[HttpGet("~/_/validate")]
- public override ActionResult Handle([FromQuery] QueryParams request)
- {
+ public override ActionResult Handle([FromQuery] QueryParams request) {
var isFulfilled = _emailValidation.FulfillEmailValidationRequest(request.Id, LoggedInUser.Id);
- if (!isFulfilled)
- {
+ if (!isFulfilled) {
_logger.LogError("Email validation fulfillment failed for request {requestId} and user {userId}", request.Id, LoggedInUser.Id);
return StatusCode(400, $"""
-<html>
-<body>
-<h3>The validation could not be completed</h3>
-<p>We are working on fixing this, in the meantime, have patience.</p>
-<a href="{CanonicalFrontendUrl}">Click here to go back to {CanonicalFrontendUrl}</a>
-</body>
-""");
+ <html>
+ <body>
+ <h3>The validation could not be completed</h3>
+ <p>We are working on fixing this, in the meantime, have patience.</p>
+ <a href="{CanonicalFrontendUrl}">Click here to go back to {CanonicalFrontendUrl}</a>
+ </body>
+ """);
}
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;
/// </summary>
public static class RouteBaseAsync
{
- public static class WithRequest<TRequest>
- {
- public abstract class WithResult<TResponse> : INT_EndpointBase
- {
- public abstract Task<TResponse> HandleAsync(
- TRequest request,
- CancellationToken cancellationToken = default
- );
- }
+ public static class WithRequest<TRequest>
+ {
+ public abstract class WithResult<TResponse> : INT_EndpointBase
+ {
+ public abstract Task<TResponse> 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<TResponse> : INT_EndpointBase
- {
- public abstract Task<ActionResult<TResponse>> HandleAsync(
- TRequest request,
- CancellationToken cancellationToken = default
- );
- }
+ public abstract class WithActionResult<TResponse> : INT_EndpointBase
+ {
+ public abstract Task<ActionResult<TResponse>> HandleAsync(
+ TRequest request,
+ CancellationToken cancellationToken = default
+ );
+ }
- public abstract class WithActionResult : INT_EndpointBase
- {
- public abstract Task<ActionResult> HandleAsync(
- TRequest request,
- CancellationToken cancellationToken = default
- );
- }
- }
+ public abstract class WithActionResult : INT_EndpointBase
+ {
+ public abstract Task<ActionResult> HandleAsync(
+ TRequest request,
+ CancellationToken cancellationToken = default
+ );
+ }
+ }
- public static class WithoutRequest
- {
- public abstract class WithResult<TResponse> : INT_EndpointBase
- {
- public abstract Task<TResponse> HandleAsync(
- CancellationToken cancellationToken = default
- );
- }
+ public static class WithoutRequest
+ {
+ public abstract class WithResult<TResponse> : INT_EndpointBase
+ {
+ public abstract Task<TResponse> 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<TResponse> : INT_EndpointBase
- {
- public abstract Task<ActionResult<TResponse>> HandleAsync(
- CancellationToken cancellationToken = default
- );
- }
+ public abstract class WithActionResult<TResponse> : INT_EndpointBase
+ {
+ public abstract Task<ActionResult<TResponse>> HandleAsync(
+ CancellationToken cancellationToken = default
+ );
+ }
- public abstract class WithActionResult : INT_EndpointBase
- {
- public abstract Task<ActionResult> HandleAsync(
- CancellationToken cancellationToken = default
- );
- }
- }
-}
+ public abstract class WithActionResult : INT_EndpointBase
+ {
+ public abstract Task<ActionResult> 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;
/// </summary>
public static class RouteBaseSync
{
- public static class WithRequest<TRequest>
- {
- public abstract class WithResult<TResponse> : INT_EndpointBase
- {
- public abstract TResponse Handle(TRequest request);
- }
+ public static class WithRequest<TRequest>
+ {
+ public abstract class WithResult<TResponse> : INT_EndpointBase
+ {
+ public abstract TResponse Handle(TRequest request);
+ }
- public abstract class WithoutResult : INT_EndpointBase
- {
- public abstract void Handle(TRequest request);
- }
+ public abstract class WithoutResult : INT_EndpointBase
+ {
+ public abstract void Handle(TRequest request);
+ }
- public abstract class WithActionResult<TResponse> : INT_EndpointBase
- {
- public abstract ActionResult<TResponse> Handle(TRequest request);
- }
+ public abstract class WithActionResult<TResponse> : INT_EndpointBase
+ {
+ public abstract ActionResult<TResponse> 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<TResponse> : INT_EndpointBase
- {
- public abstract TResponse Handle();
- }
+ public static class WithoutRequest
+ {
+ public abstract class WithResult<TResponse> : INT_EndpointBase
+ {
+ public abstract TResponse Handle();
+ }
- public abstract class WithoutResult : INT_EndpointBase
- {
- public abstract void Handle();
- }
+ public abstract class WithoutResult : INT_EndpointBase
+ {
+ public abstract void Handle();
+ }
- public abstract class WithActionResult<TResponse> : INT_EndpointBase
- {
- public abstract ActionResult<TResponse> Handle();
- }
+ public abstract class WithActionResult<TResponse> : INT_EndpointBase
+ {
+ public abstract ActionResult<TResponse> 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<CreateTokenRoute.Paylo
[HttpPost("~/v{version:apiVersion}/api-tokens/create")]
public override ActionResult Handle(Payload request)
{
- var user = _database.Users.SingleOrDefault(c => 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<CreateTokenRoute.Paylo
_database.SaveChanges();
return Ok(Convert.ToBase64String(Encoding.UTF8.GetBytes(accessToken.Id.ToString().EncryptWithAes(tokenEntropy))));
}
-} \ No newline at end of file
+}
diff --git a/code/api/src/Endpoints/V1/ApiTokens/DeleteTokenRoute.cs b/code/api/src/Endpoints/V1/ApiTokens/DeleteTokenRoute.cs
index ee19e40..62f7c8d 100644
--- a/code/api/src/Endpoints/V1/ApiTokens/DeleteTokenRoute.cs
+++ b/code/api/src/Endpoints/V1/ApiTokens/DeleteTokenRoute.cs
@@ -18,7 +18,7 @@ public class DeleteTokenRoute : RouteBaseSync.WithRequest<Guid>.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<Guid>.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;
/// </summary>
public class RouteBaseAsync
{
- public class WithRequest<TRequest>
- {
- public abstract class WithResult<TResponse> : V1_EndpointBase
- {
- public abstract Task<TResponse> HandleAsync(
- TRequest request,
- CancellationToken cancellationToken = default
- );
- }
+ public class WithRequest<TRequest>
+ {
+ public abstract class WithResult<TResponse> : V1_EndpointBase
+ {
+ public abstract Task<TResponse> 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<TResponse> : V1_EndpointBase
- {
- public abstract Task<ActionResult<TResponse>> HandleAsync(
- TRequest request,
- CancellationToken cancellationToken = default
- );
- }
+ public abstract class WithActionResult<TResponse> : V1_EndpointBase
+ {
+ public abstract Task<ActionResult<TResponse>> HandleAsync(
+ TRequest request,
+ CancellationToken cancellationToken = default
+ );
+ }
- public abstract class WithActionResult : V1_EndpointBase
- {
- public abstract Task<ActionResult> HandleAsync(
- TRequest request,
- CancellationToken cancellationToken = default
- );
- }
- }
+ public abstract class WithActionResult : V1_EndpointBase
+ {
+ public abstract Task<ActionResult> HandleAsync(
+ TRequest request,
+ CancellationToken cancellationToken = default
+ );
+ }
+ }
- public static class WithoutRequest
- {
- public abstract class WithResult<TResponse> : V1_EndpointBase
- {
- public abstract Task<TResponse> HandleAsync(
- CancellationToken cancellationToken = default
- );
- }
+ public static class WithoutRequest
+ {
+ public abstract class WithResult<TResponse> : V1_EndpointBase
+ {
+ public abstract Task<TResponse> 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<TResponse> : V1_EndpointBase
- {
- public abstract Task<ActionResult<TResponse>> HandleAsync(
- CancellationToken cancellationToken = default
- );
- }
+ public abstract class WithActionResult<TResponse> : V1_EndpointBase
+ {
+ public abstract Task<ActionResult<TResponse>> HandleAsync(
+ CancellationToken cancellationToken = default
+ );
+ }
- public abstract class WithActionResult : V1_EndpointBase
- {
- public abstract Task<ActionResult> HandleAsync(
- CancellationToken cancellationToken = default
- );
- }
- }
-}
+ public abstract class WithActionResult : V1_EndpointBase
+ {
+ public abstract Task<ActionResult> 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;
/// </summary>
public static class RouteBaseSync
{
- public static class WithRequest<TRequest>
- {
- public abstract class WithResult<TResponse> : V1_EndpointBase
- {
- public abstract TResponse Handle(TRequest request);
- }
+ public static class WithRequest<TRequest>
+ {
+ public abstract class WithResult<TResponse> : V1_EndpointBase
+ {
+ public abstract TResponse Handle(TRequest request);
+ }
- public abstract class WithoutResult : V1_EndpointBase
- {
- public abstract void Handle(TRequest request);
- }
+ public abstract class WithoutResult : V1_EndpointBase
+ {
+ public abstract void Handle(TRequest request);
+ }
- public abstract class WithActionResult<TResponse> : V1_EndpointBase
- {
- public abstract ActionResult<TResponse> Handle(TRequest request);
- }
+ public abstract class WithActionResult<TResponse> : V1_EndpointBase
+ {
+ public abstract ActionResult<TResponse> 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<TResponse> : V1_EndpointBase
- {
- public abstract TResponse Handle();
- }
+ public static class WithoutRequest
+ {
+ public abstract class WithResult<TResponse> : V1_EndpointBase
+ {
+ public abstract TResponse Handle();
+ }
- public abstract class WithoutResult : V1_EndpointBase
- {
- public abstract void Handle();
- }
+ public abstract class WithoutResult : V1_EndpointBase
+ {
+ public abstract void Handle();
+ }
- public abstract class WithActionResult<TResponse> : V1_EndpointBase
- {
- public abstract ActionResult<TResponse> Handle();
- }
+ public abstract class WithActionResult<TResponse> : V1_EndpointBase
+ {
+ public abstract ActionResult<TResponse> 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"
};