diff --git a/src/ReC.Client/ReCClient.cs b/src/ReC.Client/ReCClient.cs index e337664..dc73ccf 100644 --- a/src/ReC.Client/ReCClient.cs +++ b/src/ReC.Client/ReCClient.cs @@ -1,14 +1,7 @@ using Microsoft.Extensions.DependencyInjection; using System; -using System.Globalization; -using System.Linq; -using System.Net.Http.Json; -using System.Threading; -using System.Threading.Tasks; - -#if NETFRAMEWORK using System.Net.Http; -#endif +using System.Threading.Tasks; namespace ReC.Client { @@ -24,6 +17,41 @@ namespace ReC.Client /// public static readonly string ClientName = Guid.NewGuid().ToString(); + /// + /// Provides access to RecAction endpoints. + /// + public RecActionApi RecActions { get; } + + /// + /// Provides access to OutRes endpoints. + /// + public ResultApi Results { get; } + + /// + /// Provides access to Profile endpoints. + /// + public ProfileApi Profiles { get; } + + /// + /// Provides access to EndpointAuth endpoints. + /// + public EndpointAuthApi EndpointAuth { get; } + + /// + /// Provides access to EndpointParams endpoints. + /// + public EndpointParamsApi EndpointParams { get; } + + /// + /// Provides access to Endpoints endpoints. + /// + public EndpointsApi Endpoints { get; } + + /// + /// Provides access to Common endpoints. + /// + public CommonApi Common { get; } + /// /// Initializes a new instance of the class. /// @@ -31,402 +59,15 @@ namespace ReC.Client public ReCClient(IHttpClientFactory httpClientFactory) { _http = httpClientFactory.CreateClient(ClientName); + RecActions = new RecActionApi(_http); + Results = new ResultApi(_http); + Profiles = new ProfileApi(_http); + EndpointAuth = new EndpointAuthApi(_http); + EndpointParams = new EndpointParamsApi(_http); + Endpoints = new EndpointsApi(_http); + Common = new CommonApi(_http); } -#if NETFRAMEWORK - private static string BuildQuery(params (string Key, object Value)[] parameters) -#else - private static string BuildQuery(params (string Key, object? Value)[] parameters) -#endif - { - var parts = parameters - .Where(p => p.Value != null) - .Select(p => $"{Uri.EscapeDataString(p.Key)}={Uri.EscapeDataString(Convert.ToString(p.Value, CultureInfo.InvariantCulture) ?? string.Empty)}"); - - var query = string.Join("&", parts); - return string.IsNullOrWhiteSpace(query) ? string.Empty : $"?{query}"; - } - - private static JsonContent ToJsonContent(T payload) => JsonContent.Create(payload); - - #region RecActionController - /// - /// Asynchronously invokes a ReC action for a specific profile. - /// - /// - /// This method sends a POST request to the api/RecAction/invoke/{profileId} endpoint. - /// - /// The ID of the profile to invoke the action for. - /// A token to cancel the asynchronous operation. - /// A that represents the asynchronous operation. The task result is if the request was successful; otherwise, . - public async Task InvokeRecActionAsync(int profileId, CancellationToken cancellationToken = default) - { - var resp = await _http.PostAsync($"api/RecAction/invoke/{profileId}", content: null, cancellationToken); - return resp.IsSuccessStatusCode; - } - - /// - /// Asynchronously retrieves a list of ReC actions for the configured profile. - /// - /// - /// This method sends a GET request to the api/RecAction endpoint with optional query parameters. - /// - /// The ID of the profile to retrieve actions for. If null, actions for all profiles are retrieved. - /// Filter for invoked actions. If null, both invoked and not invoked actions are retrieved. - /// A token to cancel the asynchronous operation. - /// A task representing the asynchronous operation, with a result containing the response data. - public Task GetRecActionsAsync(long? profileId = null, bool? invoked = null, CancellationToken cancel = default) - { - var query = BuildQuery(("ProfileId", profileId), ("Invoked", invoked)); - return _http.GetAsync($"api/RecAction{query}", cancel); - } - - /// - /// Asynchronously creates a new ReC action. - /// - /// - /// This method sends a POST request to the api/RecAction endpoint with the action data as JSON. - /// - /// The action data to create. - /// A token to cancel the asynchronous operation. - /// A task representing the asynchronous operation, with a result containing the response data. - public Task CreateRecActionAsync(T procedure, CancellationToken cancel = default) - => _http.PostAsync("api/RecAction", ToJsonContent(procedure), cancel); - - /// - /// Asynchronously updates an existing ReC action. - /// - /// - /// This method sends a PUT request to the api/RecAction/{id} endpoint with the updated action data as JSON. - /// - /// The ID of the action to update. - /// The updated action data. - /// A token to cancel the asynchronous operation. - /// A task representing the asynchronous operation, with a result containing the response data. - public Task UpdateRecActionAsync(long id, T procedure, CancellationToken cancel = default) - => _http.PutAsync($"api/RecAction/{id}", ToJsonContent(procedure), cancel); - - /// - /// Asynchronously deletes one or more ReC actions. - /// - /// - /// This method sends a DELETE request to the api/RecAction endpoint with the IDs of the actions to delete as JSON. - /// - /// An object containing the IDs of the actions to delete. - /// A token to cancel the asynchronous operation. - /// A task representing the asynchronous operation, with a result containing the response data. - public Task DeleteRecActionsAsync(T procedure, CancellationToken cancel = default) - { - var request = new HttpRequestMessage(HttpMethod.Delete, "api/RecAction") - { - Content = ToJsonContent(procedure) - }; - return _http.SendAsync(request, cancel); - } - #endregion - - #region OutResController - /// - /// Asynchronously retrieves results for the configured profile. - /// - /// - /// This method sends a GET request to the api/OutRes endpoint with optional query parameters. - /// - /// Filter by result ID. - /// Filter by action ID. - /// Filter by profile ID. - /// A token to cancel the asynchronous operation. - /// A task representing the asynchronous operation, with a result containing the response data. - public Task GetResultsAsync(long? id = null, long? actionId = null, long? profileId = null, CancellationToken cancel = default) - { - var query = BuildQuery(("Id", id), ("ActionId", actionId), ("ProfileId", profileId)); - return _http.GetAsync($"api/OutRes{query}", cancel); - } - - /// - /// Asynchronously creates a new result. - /// - /// - /// This method sends a POST request to the api/OutRes endpoint with the result data as JSON. - /// - /// The result data to create. - /// A token to cancel the asynchronous operation. - /// A task representing the asynchronous operation, with a result containing the response data. - public Task CreateResultAsync(T procedure, CancellationToken cancel = default) - => _http.PostAsync("api/OutRes", ToJsonContent(procedure), cancel); - - /// - /// Asynchronously updates an existing result. - /// - /// - /// This method sends a PUT request to the api/OutRes/{id} endpoint with the updated result data as JSON. - /// - /// The ID of the result to update. - /// The updated result data. - /// A token to cancel the asynchronous operation. - /// A task representing the asynchronous operation, with a result containing the response data. - public Task UpdateResultAsync(long id, T procedure, CancellationToken cancel = default) - => _http.PutAsync($"api/OutRes/{id}", ToJsonContent(procedure), cancel); - - /// - /// Asynchronously deletes one or more results. - /// - /// - /// This method sends a DELETE request to the api/OutRes endpoint with the IDs of the results to delete as JSON. - /// - /// An object containing the IDs of the results to delete. - /// A token to cancel the asynchronous operation. - /// A task representing the asynchronous operation, with a result containing the response data. - public Task DeleteResultsAsync(T procedure, CancellationToken cancel = default) - { - var request = new HttpRequestMessage(HttpMethod.Delete, "api/OutRes") - { - Content = ToJsonContent(procedure) - }; - return _http.SendAsync(request, cancel); - } - #endregion - - #region ProfileController - /// - /// Asynchronously retrieves a profile by ID. - /// - /// - /// This method sends a GET request to the api/Profile endpoint with the profile ID as a query parameter. - /// - /// The ID of the profile to retrieve. - /// Whether to include associated actions in the response. - /// A token to cancel the asynchronous operation. - /// A task representing the asynchronous operation, with a result containing the response data. - public Task GetProfileAsync(long id, bool includeActions = false, CancellationToken cancel = default) - { - var query = BuildQuery(("Id", id), ("IncludeActions", includeActions)); - return _http.GetAsync($"api/Profile{query}", cancel); - } - - /// - /// Asynchronously creates a new profile. - /// - /// - /// This method sends a POST request to the api/Profile endpoint with the profile data as JSON. - /// - /// The profile data to create. - /// A token to cancel the asynchronous operation. - /// A task representing the asynchronous operation, with a result containing the response data. - public Task CreateProfileAsync(T procedure, CancellationToken cancel = default) - => _http.PostAsync("api/Profile", ToJsonContent(procedure), cancel); - - /// - /// Asynchronously updates an existing profile. - /// - /// - /// This method sends a PUT request to the api/Profile/{id} endpoint with the updated profile data as JSON. - /// - /// The ID of the profile to update. - /// The updated profile data. - /// A token to cancel the asynchronous operation. - /// A task representing the asynchronous operation, with a result containing the response data. - public Task UpdateProfileAsync(long id, T procedure, CancellationToken cancel = default) - => _http.PutAsync($"api/Profile/{id}", ToJsonContent(procedure), cancel); - - /// - /// Asynchronously deletes one or more profiles. - /// - /// - /// This method sends a DELETE request to the api/Profile endpoint with the IDs of the profiles to delete as JSON. - /// - /// An object containing the IDs of the profiles to delete. - /// A token to cancel the asynchronous operation. - /// A task representing the asynchronous operation, with a result containing the response data. - public Task DeleteProfilesAsync(T procedure, CancellationToken cancel = default) - { - var request = new HttpRequestMessage(HttpMethod.Delete, "api/Profile") - { - Content = ToJsonContent(procedure) - }; - return _http.SendAsync(request, cancel); - } - #endregion - - #region EndpointAuthController - /// - /// Asynchronously creates a new endpoint authentication. - /// - /// - /// This method sends a POST request to the api/EndpointAuth endpoint with the authentication data as JSON. - /// - /// The authentication data to create. - /// A token to cancel the asynchronous operation. - /// A task representing the asynchronous operation, with a result containing the response data. - public Task CreateEndpointAuthAsync(T procedure, CancellationToken cancel = default) - => _http.PostAsync("api/EndpointAuth", ToJsonContent(procedure), cancel); - - /// - /// Asynchronously updates an existing endpoint authentication. - /// - /// - /// This method sends a PUT request to the api/EndpointAuth/{id} endpoint with the updated authentication data as JSON. - /// - /// The ID of the authentication to update. - /// The updated authentication data. - /// A token to cancel the asynchronous operation. - /// A task representing the asynchronous operation, with a result containing the response data. - public Task UpdateEndpointAuthAsync(long id, T procedure, CancellationToken cancel = default) - => _http.PutAsync($"api/EndpointAuth/{id}", ToJsonContent(procedure), cancel); - - /// - /// Asynchronously deletes one or more endpoint authentications. - /// - /// - /// This method sends a DELETE request to the api/EndpointAuth endpoint with the IDs of the authentications to delete as JSON. - /// - /// An object containing the IDs of the authentications to delete. - /// A token to cancel the asynchronous operation. - /// A task representing the asynchronous operation, with a result containing the response data. - public Task DeleteEndpointAuthAsync(T procedure, CancellationToken cancel = default) - { - var request = new HttpRequestMessage(HttpMethod.Delete, "api/EndpointAuth") - { - Content = ToJsonContent(procedure) - }; - return _http.SendAsync(request, cancel); - } - #endregion - - #region EndpointParamsController - /// - /// Asynchronously creates new endpoint parameters. - /// - /// - /// This method sends a POST request to the api/EndpointParams endpoint with the parameters data as JSON. - /// - /// The parameters data to create. - /// A token to cancel the asynchronous operation. - /// A task representing the asynchronous operation, with a result containing the response data. - public Task CreateEndpointParamsAsync(T procedure, CancellationToken cancel = default) - => _http.PostAsync("api/EndpointParams", ToJsonContent(procedure), cancel); - - /// - /// Asynchronously updates existing endpoint parameters. - /// - /// - /// This method sends a PUT request to the api/EndpointParams/{id} endpoint with the updated parameters data as JSON. - /// - /// The ID of the parameters to update. - /// The updated parameters data. - /// A token to cancel the asynchronous operation. - /// A task representing the asynchronous operation, with a result containing the response data. - public Task UpdateEndpointParamsAsync(long id, T procedure, CancellationToken cancel = default) - => _http.PutAsync($"api/EndpointParams/{id}", ToJsonContent(procedure), cancel); - - /// - /// Asynchronously deletes one or more endpoint parameters. - /// - /// - /// This method sends a DELETE request to the api/EndpointParams endpoint with the IDs of the parameters to delete as JSON. - /// - /// An object containing the IDs of the parameters to delete. - /// A token to cancel the asynchronous operation. - /// A task representing the asynchronous operation, with a result containing the response data. - public Task DeleteEndpointParamsAsync(T procedure, CancellationToken cancel = default) - { - var request = new HttpRequestMessage(HttpMethod.Delete, "api/EndpointParams") - { - Content = ToJsonContent(procedure) - }; - return _http.SendAsync(request, cancel); - } - #endregion - - #region EndpointsController - /// - /// Asynchronously creates a new endpoint. - /// - /// - /// This method sends a POST request to the api/Endpoints endpoint with the endpoint data as JSON. - /// - /// The endpoint data to create. - /// A token to cancel the asynchronous operation. - /// A task representing the asynchronous operation, with a result containing the response data. - public Task CreateEndpointAsync(T procedure, CancellationToken cancel = default) - => _http.PostAsync("api/Endpoints", ToJsonContent(procedure), cancel); - - /// - /// Asynchronously updates an existing endpoint. - /// - /// - /// This method sends a PUT request to the api/Endpoints/{id} endpoint with the updated endpoint data as JSON. - /// - /// The ID of the endpoint to update. - /// The updated endpoint data. - /// A token to cancel the asynchronous operation. - /// A task representing the asynchronous operation, with a result containing the response data. - public Task UpdateEndpointAsync(long id, T procedure, CancellationToken cancel = default) - => _http.PutAsync($"api/Endpoints/{id}", ToJsonContent(procedure), cancel); - - /// - /// Asynchronously deletes one or more endpoints. - /// - /// - /// This method sends a DELETE request to the api/Endpoints endpoint with the IDs of the endpoints to delete as JSON. - /// - /// An object containing the IDs of the endpoints to delete. - /// A token to cancel the asynchronous operation. - /// A task representing the asynchronous operation, with a result containing the response data. - public Task DeleteEndpointAsync(T procedure, CancellationToken cancel = default) - { - var request = new HttpRequestMessage(HttpMethod.Delete, "api/Endpoints") - { - Content = ToJsonContent(procedure) - }; - return _http.SendAsync(request, cancel); - } - #endregion - - #region CommonController - /// - /// Asynchronously creates a new object. - /// - /// - /// This method sends a POST request to the api/Common endpoint with the object data as JSON. - /// - /// The object data to create. - /// A token to cancel the asynchronous operation. - /// A task representing the asynchronous operation, with a result containing the response data. - public Task CreateObjectAsync(T procedure, CancellationToken cancel = default) - => _http.PostAsync("api/Common", ToJsonContent(procedure), cancel); - - /// - /// Asynchronously updates an existing object. - /// - /// - /// This method sends a PUT request to the api/Common endpoint with the updated object data as JSON. - /// - /// The updated object data. - /// A token to cancel the asynchronous operation. - /// A task representing the asynchronous operation, with a result containing the response data. - public Task UpdateObjectAsync(T procedure, CancellationToken cancel = default) - => _http.PutAsync("api/Common", ToJsonContent(procedure), cancel); - - /// - /// Asynchronously deletes one or more objects. - /// - /// - /// This method sends a DELETE request to the api/Common endpoint with the IDs of the objects to delete as JSON. - /// - /// An object containing the IDs of the objects to delete. - /// A token to cancel the asynchronous operation. - /// A task representing the asynchronous operation, with a result containing the response data. - public Task DeleteObjectAsync(T procedure, CancellationToken cancel = default) - { - var request = new HttpRequestMessage(HttpMethod.Delete, "api/Common") - { - Content = ToJsonContent(procedure) - }; - return _http.SendAsync(request, cancel); - } - #endregion - #region Static private static readonly IServiceCollection Services = new ServiceCollection();