tgstation-server 6.19.0
The /tg/station 13 server suite
Loading...
Searching...
No Matches
RestAuthorityInvoker{TAuthority}.cs
Go to the documentation of this file.
1using System;
2using System.Net;
3using System.Threading.Tasks;
4
5using Microsoft.AspNetCore.Mvc;
6
10
12{
14 sealed class RestAuthorityInvoker<TAuthority> : AuthorityInvokerBase<TAuthority>, IRestAuthorityInvoker<TAuthority>
15 where TAuthority : IAuthority
16 {
27 ApiController controller,
28 Func<TResult, TApiModel> resultTransformer,
29 AuthorityResponse<TResult> authorityResponse)
30 where TApiModel : notnull
31 {
32 if (authorityResponse.IsNoContent!.Value)
33 return controller.NoContent();
34
35 var successResponse = authorityResponse.SuccessResponse;
36 var result = resultTransformer(authorityResponse.Result!);
37 return successResponse switch
38 {
39 HttpSuccessResponse.Ok => controller.Json(result),
40 HttpSuccessResponse.Created => controller.Created(result),
41 HttpSuccessResponse.Accepted => controller.Accepted(result),
42 _ => throw new InvalidOperationException($"Invalid {nameof(HttpSuccessResponse)}: {successResponse}"),
43 };
44 }
45
52 static IActionResult? CreateErroredActionResult(
53 ApiController controller,
54 AuthorityResponse? authorityResponse)
55 {
56 if (authorityResponse == null)
57 return controller.Forbid();
58
59 if (authorityResponse.Success)
60 return null;
61
62 var errorMessage = authorityResponse.ErrorMessage;
63 var failureResponse = authorityResponse.FailureResponse;
64 return failureResponse switch
65 {
66 HttpFailureResponse.BadRequest => controller.BadRequest(errorMessage),
67 HttpFailureResponse.Unauthorized => controller.Unauthorized(),
68 HttpFailureResponse.Forbidden => controller.Forbid(),
69 HttpFailureResponse.NotFound => controller.NotFound(errorMessage),
70 HttpFailureResponse.NotAcceptable => controller.StatusCode(HttpStatusCode.NotAcceptable, errorMessage),
71 HttpFailureResponse.Conflict => controller.Conflict(errorMessage),
72 HttpFailureResponse.Gone => controller.StatusCode(HttpStatusCode.Gone, errorMessage),
73 HttpFailureResponse.UnprocessableEntity => controller.UnprocessableEntity(errorMessage),
74 HttpFailureResponse.FailedDependency => controller.StatusCode(HttpStatusCode.FailedDependency, errorMessage),
75 HttpFailureResponse.RateLimited => controller.StatusCode(HttpStatusCode.TooManyRequests, errorMessage),
76 HttpFailureResponse.NotImplemented => controller.StatusCode(HttpStatusCode.NotImplemented, errorMessage),
77 HttpFailureResponse.ServiceUnavailable => controller.StatusCode(HttpStatusCode.ServiceUnavailable, errorMessage),
78 _ => throw new InvalidOperationException($"Invalid {nameof(HttpFailureResponse)}: {failureResponse}"),
79 };
80 }
81
88 : base(authority, authorizationService)
89 {
90 }
91
93 async ValueTask<IActionResult> IRestAuthorityInvoker<TAuthority>.Invoke(ApiController controller, Func<TAuthority, RequirementsGated<AuthorityResponse>> authorityInvoker)
94 {
95 ArgumentNullException.ThrowIfNull(controller);
96 ArgumentNullException.ThrowIfNull(authorityInvoker);
97
98 var requirementsGate = authorityInvoker(Authority);
99 var authorityResponse = await ExecuteIfRequirementsSatisfied(requirementsGate);
100 return CreateErroredActionResult(controller, authorityResponse) ?? controller.NoContent();
101 }
102
104 async ValueTask<IActionResult> IRestAuthorityInvoker<TAuthority>.Invoke<TResult, TApiModel>(ApiController controller, Func<TAuthority, RequirementsGated<AuthorityResponse<TResult>>> authorityInvoker)
105 {
106 ArgumentNullException.ThrowIfNull(controller);
107 ArgumentNullException.ThrowIfNull(authorityInvoker);
108
109 var requirementsGate = authorityInvoker(Authority);
110 var authorityResponse = await ExecuteIfRequirementsSatisfied(requirementsGate);
111 var erroredResult = CreateErroredActionResult(controller, authorityResponse);
112 if (erroredResult != null)
113 return erroredResult;
114
115 return CreateSuccessfulActionResult(controller, result => result, authorityResponse!);
116 }
117
119 async ValueTask<IActionResult> IRestAuthorityInvoker<TAuthority>.InvokeTransformable<TResult, TApiModel>(ApiController controller, Func<TAuthority, RequirementsGated<AuthorityResponse<TResult>>> authorityInvoker)
120 {
121 ArgumentNullException.ThrowIfNull(controller);
122 ArgumentNullException.ThrowIfNull(authorityInvoker);
123
124 var requirementsGate = authorityInvoker(Authority);
125 var authorityResponse = await ExecuteIfRequirementsSatisfied(requirementsGate);
126 var erroredResult = CreateErroredActionResult(controller, authorityResponse);
127 if (erroredResult != null)
128 return erroredResult;
129
130 return CreateSuccessfulActionResult(controller, result => result.ToApi(), authorityResponse!);
131 }
132 }
133}
readonly Security.IAuthorizationService authorizationService
The authorization service for the AuthorityInvokerBase<TAuthority>.
virtual bool Success
Checks if the AuthorityResponse was successful.
ErrorMessageResponse? ErrorMessage
Gets the associated ErrorMessageResponse. Must only be used if Success is false.
HttpFailureResponse? FailureResponse
The HttpFailureResponse.
Evaluates a set of IAuthorizationRequirements to be checked before executing a response.
static IActionResult CreateSuccessfulActionResult< TResult, TApiModel >(ApiController controller, Func< TResult, TApiModel > resultTransformer, AuthorityResponse< TResult > authorityResponse)
Create an IActionResult for a given successfulyauthorityResponse .
RestAuthorityInvoker(TAuthority authority, IAuthorizationService authorizationService)
Initializes a new instance of the RestAuthorityInvoker<TAuthority> class.
static ? IActionResult CreateErroredActionResult(ApiController controller, AuthorityResponse? authorityResponse)
Create an IActionResult for a given authorityResponse if it is erroring.
Base Controller for API functions.
new NotFoundObjectResult NotFound()
Generic 404 response.
StatusCodeResult StatusCode(HttpStatusCode statusCode)
Strongly type calls to ControllerBase.StatusCode(int).
Business logic for interating with the server.
Definition IAuthority.cs:9
Invokes TAuthority methods and generates IActionResult responses.
ValueTask< IActionResult > Invoke(ApiController controller, Func< TAuthority, RequirementsGated< AuthorityResponse > > authorityInvoker)
Invoke a TAuthority method with no success result.
Interface for evaluating IAuthorizationRequirements.