diff --git a/src/ReC.Client/Api/BaseCrudApi.cs b/src/ReC.Client/Api/BaseCrudApi.cs
new file mode 100644
index 0000000..cce0594
--- /dev/null
+++ b/src/ReC.Client/Api/BaseCrudApi.cs
@@ -0,0 +1,71 @@
+using System;
+using System.Net.Http;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace ReC.Client.Api
+{
+ ///
+ /// Provides shared CRUD operations for API resources.
+ ///
+ public abstract class BaseCrudApi
+ {
+ ///
+ /// The HTTP client used to send requests.
+ ///
+ protected readonly HttpClient Http;
+
+ ///
+ /// The base resource path for the API endpoint.
+ ///
+ protected readonly string ResourcePath;
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The HTTP client used for requests.
+ /// The base resource path for the API endpoint.
+ protected BaseCrudApi(HttpClient http, string resourcePath)
+ {
+ Http = http ?? throw new ArgumentNullException(nameof(http));
+ ResourcePath = resourcePath ?? throw new ArgumentNullException(nameof(resourcePath));
+ }
+
+ ///
+ /// Creates a resource.
+ ///
+ /// The payload type.
+ /// The payload to send.
+ /// A token to cancel the operation.
+ /// The HTTP response message.
+ public Task CreateAsync(T payload, CancellationToken cancel = default)
+ => Http.PostAsync(ResourcePath, ReCClientHelpers.ToJsonContent(payload), cancel);
+
+ ///
+ /// Updates a resource by identifier.
+ ///
+ /// The payload type.
+ /// The resource identifier.
+ /// The payload to send.
+ /// A token to cancel the operation.
+ /// The HTTP response message.
+ public Task UpdateAsync(long id, T payload, CancellationToken cancel = default)
+ => Http.PutAsync($"{ResourcePath}/{id}", ReCClientHelpers.ToJsonContent(payload), cancel);
+
+ ///
+ /// Deletes resources with identifiers supplied in the payload.
+ ///
+ /// The payload type containing identifiers.
+ /// The payload to send.
+ /// A token to cancel the operation.
+ /// The HTTP response message.
+ public Task DeleteAsync(T payload, CancellationToken cancel = default)
+ {
+ var request = new HttpRequestMessage(HttpMethod.Delete, ResourcePath)
+ {
+ Content = ReCClientHelpers.ToJsonContent(payload)
+ };
+ return Http.SendAsync(request, cancel);
+ }
+ }
+}
diff --git a/src/ReC.Client/Api/CommonApi.cs b/src/ReC.Client/Api/CommonApi.cs
index 5dd4f1a..aea3cdf 100644
--- a/src/ReC.Client/Api/CommonApi.cs
+++ b/src/ReC.Client/Api/CommonApi.cs
@@ -7,53 +7,14 @@ namespace ReC.Client.Api
///
/// Provides access to common object endpoints.
///
- public class CommonApi
+ public class CommonApi : BaseCrudApi
{
- private readonly HttpClient _http;
-
///
/// Initializes a new instance of the class.
///
/// The HTTP client used for requests.
- public CommonApi(HttpClient http)
+ public CommonApi(HttpClient http) : base(http, "api/Common")
{
- _http = http;
- }
-
- ///
- /// Creates an object.
- ///
- /// The payload type.
- /// The payload to send.
- /// A token to cancel the operation.
- /// The HTTP response message.
- public Task CreateAsync(T procedure, CancellationToken cancel = default)
- => _http.PostAsync("api/Common", ReCClientHelpers.ToJsonContent(procedure), cancel);
-
- ///
- /// Updates an object.
- ///
- /// The payload type.
- /// The payload to send.
- /// A token to cancel the operation.
- /// The HTTP response message.
- public Task UpdateAsync(T procedure, CancellationToken cancel = default)
- => _http.PutAsync("api/Common", ReCClientHelpers.ToJsonContent(procedure), cancel);
-
- ///
- /// Deletes objects.
- ///
- /// The payload type containing identifiers.
- /// The payload to send.
- /// A token to cancel the operation.
- /// The HTTP response message.
- public Task DeleteAsync(T procedure, CancellationToken cancel = default)
- {
- var request = new HttpRequestMessage(HttpMethod.Delete, "api/Common")
- {
- Content = ReCClientHelpers.ToJsonContent(procedure)
- };
- return _http.SendAsync(request, cancel);
}
}
}
diff --git a/src/ReC.Client/Api/EndpointAuthApi.cs b/src/ReC.Client/Api/EndpointAuthApi.cs
index e583bbd..287d6d0 100644
--- a/src/ReC.Client/Api/EndpointAuthApi.cs
+++ b/src/ReC.Client/Api/EndpointAuthApi.cs
@@ -7,54 +7,14 @@ namespace ReC.Client.Api
///
/// Provides access to endpoint authentication endpoints.
///
- public class EndpointAuthApi
+ public class EndpointAuthApi : BaseCrudApi
{
- private readonly HttpClient _http;
-
///
/// Initializes a new instance of the class.
///
/// The HTTP client used for requests.
- public EndpointAuthApi(HttpClient http)
+ public EndpointAuthApi(HttpClient http) : base(http, "api/EndpointAuth")
{
- _http = http;
- }
-
- ///
- /// Creates endpoint authentication configuration.
- ///
- /// The payload type.
- /// The payload to send.
- /// A token to cancel the operation.
- /// The HTTP response message.
- public Task CreateAsync(T procedure, CancellationToken cancel = default)
- => _http.PostAsync("api/EndpointAuth", ReCClientHelpers.ToJsonContent(procedure), cancel);
-
- ///
- /// Updates endpoint authentication configuration.
- ///
- /// The payload type.
- /// The authentication identifier.
- /// The payload to send.
- /// A token to cancel the operation.
- /// The HTTP response message.
- public Task UpdateAsync(long id, T procedure, CancellationToken cancel = default)
- => _http.PutAsync($"api/EndpointAuth/{id}", ReCClientHelpers.ToJsonContent(procedure), cancel);
-
- ///
- /// Deletes endpoint authentications.
- ///
- /// The payload type containing identifiers.
- /// The payload to send.
- /// A token to cancel the operation.
- /// The HTTP response message.
- public Task DeleteAsync(T procedure, CancellationToken cancel = default)
- {
- var request = new HttpRequestMessage(HttpMethod.Delete, "api/EndpointAuth")
- {
- Content = ReCClientHelpers.ToJsonContent(procedure)
- };
- return _http.SendAsync(request, cancel);
}
}
}
diff --git a/src/ReC.Client/Api/EndpointParamsApi.cs b/src/ReC.Client/Api/EndpointParamsApi.cs
index 0cd96e5..ac7b781 100644
--- a/src/ReC.Client/Api/EndpointParamsApi.cs
+++ b/src/ReC.Client/Api/EndpointParamsApi.cs
@@ -7,54 +7,14 @@ namespace ReC.Client.Api
///
/// Provides access to endpoint parameter endpoints.
///
- public class EndpointParamsApi
+ public class EndpointParamsApi : BaseCrudApi
{
- private readonly HttpClient _http;
-
///
/// Initializes a new instance of the class.
///
/// The HTTP client used for requests.
- public EndpointParamsApi(HttpClient http)
+ public EndpointParamsApi(HttpClient http) : base(http, "api/EndpointParams")
{
- _http = http;
- }
-
- ///
- /// Creates endpoint parameters.
- ///
- /// The payload type.
- /// The payload to send.
- /// A token to cancel the operation.
- /// The HTTP response message.
- public Task CreateAsync(T procedure, CancellationToken cancel = default)
- => _http.PostAsync("api/EndpointParams", ReCClientHelpers.ToJsonContent(procedure), cancel);
-
- ///
- /// Updates endpoint parameters.
- ///
- /// The payload type.
- /// The parameter identifier.
- /// The payload to send.
- /// A token to cancel the operation.
- /// The HTTP response message.
- public Task UpdateAsync(long id, T procedure, CancellationToken cancel = default)
- => _http.PutAsync($"api/EndpointParams/{id}", ReCClientHelpers.ToJsonContent(procedure), cancel);
-
- ///
- /// Deletes endpoint parameters.
- ///
- /// The payload type containing identifiers.
- /// The payload to send.
- /// A token to cancel the operation.
- /// The HTTP response message.
- public Task DeleteAsync(T procedure, CancellationToken cancel = default)
- {
- var request = new HttpRequestMessage(HttpMethod.Delete, "api/EndpointParams")
- {
- Content = ReCClientHelpers.ToJsonContent(procedure)
- };
- return _http.SendAsync(request, cancel);
}
}
}
diff --git a/src/ReC.Client/Api/EndpointsApi.cs b/src/ReC.Client/Api/EndpointsApi.cs
index 015434c..cc8634e 100644
--- a/src/ReC.Client/Api/EndpointsApi.cs
+++ b/src/ReC.Client/Api/EndpointsApi.cs
@@ -7,54 +7,14 @@ namespace ReC.Client.Api
///
/// Provides access to endpoint definitions.
///
- public class EndpointsApi
+ public class EndpointsApi : BaseCrudApi
{
- private readonly HttpClient _http;
-
///
/// Initializes a new instance of the class.
///
/// The HTTP client used for requests.
- public EndpointsApi(HttpClient http)
+ public EndpointsApi(HttpClient http) : base(http, "api/Endpoints")
{
- _http = http;
- }
-
- ///
- /// Creates an endpoint.
- ///
- /// The payload type.
- /// The payload to send.
- /// A token to cancel the operation.
- /// The HTTP response message.
- public Task CreateAsync(T procedure, CancellationToken cancel = default)
- => _http.PostAsync("api/Endpoints", ReCClientHelpers.ToJsonContent(procedure), cancel);
-
- ///
- /// Updates an endpoint.
- ///
- /// The payload type.
- /// The endpoint identifier.
- /// The payload to send.
- /// A token to cancel the operation.
- /// The HTTP response message.
- public Task UpdateAsync(long id, T procedure, CancellationToken cancel = default)
- => _http.PutAsync($"api/Endpoints/{id}", ReCClientHelpers.ToJsonContent(procedure), cancel);
-
- ///
- /// Deletes endpoints.
- ///
- /// The payload type containing identifiers.
- /// The payload to send.
- /// A token to cancel the operation.
- /// The HTTP response message.
- public Task DeleteAsync(T procedure, CancellationToken cancel = default)
- {
- var request = new HttpRequestMessage(HttpMethod.Delete, "api/Endpoints")
- {
- Content = ReCClientHelpers.ToJsonContent(procedure)
- };
- return _http.SendAsync(request, cancel);
}
}
}
diff --git a/src/ReC.Client/Api/ProfileApi.cs b/src/ReC.Client/Api/ProfileApi.cs
index e27ab68..a2f6827 100644
--- a/src/ReC.Client/Api/ProfileApi.cs
+++ b/src/ReC.Client/Api/ProfileApi.cs
@@ -7,17 +7,14 @@ namespace ReC.Client.Api
///
/// Provides access to profile endpoints.
///
- public class ProfileApi
+ public class ProfileApi : BaseCrudApi
{
- private readonly HttpClient _http;
-
///
/// Initializes a new instance of the class.
///
/// The HTTP client used for requests.
- public ProfileApi(HttpClient http)
+ public ProfileApi(HttpClient http) : base(http, "api/Profile")
{
- _http = http;
}
///
@@ -30,44 +27,7 @@ namespace ReC.Client.Api
public Task GetAsync(long id, bool includeActions = false, CancellationToken cancel = default)
{
var query = ReCClientHelpers.BuildQuery(("Id", id), ("IncludeActions", includeActions));
- return _http.GetAsync($"api/Profile{query}", cancel);
- }
-
- ///
- /// Creates a profile.
- ///
- /// The payload type.
- /// The payload to send.
- /// A token to cancel the operation.
- /// The HTTP response message.
- public Task CreateAsync(T procedure, CancellationToken cancel = default)
- => _http.PostAsync("api/Profile", ReCClientHelpers.ToJsonContent(procedure), cancel);
-
- ///
- /// Updates a profile.
- ///
- /// The payload type.
- /// The profile identifier.
- /// The payload to send.
- /// A token to cancel the operation.
- /// The HTTP response message.
- public Task UpdateAsync(long id, T procedure, CancellationToken cancel = default)
- => _http.PutAsync($"api/Profile/{id}", ReCClientHelpers.ToJsonContent(procedure), cancel);
-
- ///
- /// Deletes profiles.
- ///
- /// The payload type containing identifiers.
- /// The payload to send.
- /// A token to cancel the operation.
- /// The HTTP response message.
- public Task DeleteAsync(T procedure, CancellationToken cancel = default)
- {
- var request = new HttpRequestMessage(HttpMethod.Delete, "api/Profile")
- {
- Content = ReCClientHelpers.ToJsonContent(procedure)
- };
- return _http.SendAsync(request, cancel);
+ return Http.GetAsync($"{ResourcePath}{query}", cancel);
}
}
}
diff --git a/src/ReC.Client/Api/RecActionApi.cs b/src/ReC.Client/Api/RecActionApi.cs
index b1025f6..830c76d 100644
--- a/src/ReC.Client/Api/RecActionApi.cs
+++ b/src/ReC.Client/Api/RecActionApi.cs
@@ -7,17 +7,14 @@ namespace ReC.Client.Api
///
/// Provides access to RecAction endpoints.
///
- public class RecActionApi
+ public class RecActionApi : BaseCrudApi
{
- private readonly HttpClient _http;
-
///
/// Initializes a new instance of the class.
///
/// The HTTP client used for requests.
- public RecActionApi(HttpClient http)
+ public RecActionApi(HttpClient http) : base(http, "api/RecAction")
{
- _http = http;
}
///
@@ -28,7 +25,7 @@ namespace ReC.Client.Api
/// if the request succeeds; otherwise, .
public async Task InvokeAsync(int profileId, CancellationToken cancellationToken = default)
{
- var resp = await _http.PostAsync($"api/RecAction/invoke/{profileId}", content: null, cancellationToken);
+ var resp = await Http.PostAsync($"{ResourcePath}/invoke/{profileId}", content: null, cancellationToken);
return resp.IsSuccessStatusCode;
}
@@ -42,44 +39,7 @@ namespace ReC.Client.Api
public Task GetAsync(long? profileId = null, bool? invoked = null, CancellationToken cancel = default)
{
var query = ReCClientHelpers.BuildQuery(("ProfileId", profileId), ("Invoked", invoked));
- return _http.GetAsync($"api/RecAction{query}", cancel);
- }
-
- ///
- /// Creates a Rec action.
- ///
- /// The payload type.
- /// The payload to send.
- /// A token to cancel the operation.
- /// The HTTP response message.
- public Task CreateAsync(T procedure, CancellationToken cancel = default)
- => _http.PostAsync("api/RecAction", ReCClientHelpers.ToJsonContent(procedure), cancel);
-
- ///
- /// Updates a Rec action.
- ///
- /// The payload type.
- /// The action identifier.
- /// The payload to send.
- /// A token to cancel the operation.
- /// The HTTP response message.
- public Task UpdateAsync(long id, T procedure, CancellationToken cancel = default)
- => _http.PutAsync($"api/RecAction/{id}", ReCClientHelpers.ToJsonContent(procedure), cancel);
-
- ///
- /// Deletes Rec actions.
- ///
- /// The payload type containing identifiers.
- /// The payload to send.
- /// A token to cancel the operation.
- /// The HTTP response message.
- public Task DeleteAsync(T procedure, CancellationToken cancel = default)
- {
- var request = new HttpRequestMessage(HttpMethod.Delete, "api/RecAction")
- {
- Content = ReCClientHelpers.ToJsonContent(procedure)
- };
- return _http.SendAsync(request, cancel);
+ return Http.GetAsync($"{ResourcePath}{query}", cancel);
}
}
}
diff --git a/src/ReC.Client/Api/ResultApi.cs b/src/ReC.Client/Api/ResultApi.cs
index bf4f308..37dca07 100644
--- a/src/ReC.Client/Api/ResultApi.cs
+++ b/src/ReC.Client/Api/ResultApi.cs
@@ -7,17 +7,14 @@ namespace ReC.Client.Api
///
/// Provides access to output result endpoints.
///
- public class ResultApi
+ public class ResultApi : BaseCrudApi
{
- private readonly HttpClient _http;
-
///
/// Initializes a new instance of the class.
///
/// The HTTP client used for requests.
- public ResultApi(HttpClient http)
+ public ResultApi(HttpClient http) : base(http, "api/Result")
{
- _http = http;
}
///
@@ -31,44 +28,7 @@ namespace ReC.Client.Api
public Task GetAsync(long? id = null, long? actionId = null, long? profileId = null, CancellationToken cancel = default)
{
var query = ReCClientHelpers.BuildQuery(("Id", id), ("ActionId", actionId), ("ProfileId", profileId));
- return _http.GetAsync($"api/Result{query}", cancel);
- }
-
- ///
- /// Creates a result.
- ///
- /// The payload type.
- /// The payload to send.
- /// A token to cancel the operation.
- /// The HTTP response message.
- public Task CreateAsync(T procedure, CancellationToken cancel = default)
- => _http.PostAsync("api/Result", ReCClientHelpers.ToJsonContent(procedure), cancel);
-
- ///
- /// Updates a result.
- ///
- /// The payload type.
- /// The result identifier.
- /// The payload to send.
- /// A token to cancel the operation.
- /// The HTTP response message.
- public Task UpdateAsync(long id, T procedure, CancellationToken cancel = default)
- => _http.PutAsync($"api/Result/{id}", ReCClientHelpers.ToJsonContent(procedure), cancel);
-
- ///
- /// Deletes results.
- ///
- /// The payload type containing identifiers.
- /// The payload to send.
- /// A token to cancel the operation.
- /// The HTTP response message.
- public Task DeleteAsync(T procedure, CancellationToken cancel = default)
- {
- var request = new HttpRequestMessage(HttpMethod.Delete, "api/Result")
- {
- Content = ReCClientHelpers.ToJsonContent(procedure)
- };
- return _http.SendAsync(request, cancel);
+ return Http.GetAsync($"{ResourcePath}{query}", cancel);
}
}
}