refactor: extract interface for storage provider
This commit is contained in:
@@ -0,0 +1,39 @@
|
|||||||
|
namespace StevanFreeborn.Extensions.Configuration.Secure.Storage;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Defines a contract for a provider that stores and retrieves secure configuration data.
|
||||||
|
/// </summary>
|
||||||
|
public interface ISecureStorageProvider
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Reads the value associated with the specified key asynchronously.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="key">The key of the configuration value to read.</param>
|
||||||
|
/// <param name="ct">A cancellation token that can be used to cancel the read operation.</param>
|
||||||
|
/// <returns>A task that represents the asynchronous read operation. The task result contains the value associated with the specified key, or an empty string if the key is not found.</returns>
|
||||||
|
Task<string> ReadAsync(string key, CancellationToken ct = default);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Reads all configuration values asynchronously.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ct">A cancellation token that can be used to cancel the read operation.</param>
|
||||||
|
/// <returns>A task that represents the asynchronous read operation. The task result contains a dictionary of all configuration keys and their encrypted values.</returns>
|
||||||
|
Task<IDictionary<string, string>> ReadAllAsync(CancellationToken ct = default);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Writes the specified key and encrypted data asynchronously.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="key">The key of the configuration value to write.</param>
|
||||||
|
/// <param name="encryptedData">The encrypted configuration data to write.</param>
|
||||||
|
/// <param name="ct">A cancellation token that can be used to cancel the write operation.</param>
|
||||||
|
/// <returns>A task that represents the asynchronous write operation.</returns>
|
||||||
|
Task WriteAsync(string key, string encryptedData, CancellationToken ct = default);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Deletes the configuration value associated with the specified key asynchronously.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="key">The key of the configuration value to delete.</param>
|
||||||
|
/// <param name="ct">A cancellation token that can be used to cancel the delete operation.</param>
|
||||||
|
/// <returns>A task that represents the asynchronous delete operation. The task result contains <c>true</c> if the value was successfully deleted; otherwise, <c>false</c>.</returns>
|
||||||
|
Task<bool> DeleteAsync(string key, CancellationToken ct = default);
|
||||||
|
}
|
||||||
+3
-3
@@ -6,7 +6,7 @@ namespace StevanFreeborn.Extensions.Configuration.Secure.Storage;
|
|||||||
/// Provides a mechanism to store and retrieve secure configuration data in a JSON file.
|
/// Provides a mechanism to store and retrieve secure configuration data in a JSON file.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="options">The <see cref="JsonStorageOptions"/> configuring the storage provider, including file paths.</param>
|
/// <param name="options">The <see cref="JsonStorageOptions"/> configuring the storage provider, including file paths.</param>
|
||||||
public sealed class JsonFileStorageProvider(JsonStorageOptions options)
|
public sealed class JsonFileStorageProvider(JsonStorageOptions options) : ISecureStorageProvider
|
||||||
{
|
{
|
||||||
private static readonly SemaphoreSlim FileLock = new(1, 1);
|
private static readonly SemaphoreSlim FileLock = new(1, 1);
|
||||||
private static readonly JsonSerializerOptions JsonOptions = new()
|
private static readonly JsonSerializerOptions JsonOptions = new()
|
||||||
@@ -39,7 +39,7 @@ public sealed class JsonFileStorageProvider(JsonStorageOptions options)
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="ct">A cancellation token that can be used to cancel the read operation.</param>
|
/// <param name="ct">A cancellation token that can be used to cancel the read operation.</param>
|
||||||
/// <returns>A task that represents the asynchronous read operation. The task result contains a dictionary of all configuration keys and their values.</returns>
|
/// <returns>A task that represents the asynchronous read operation. The task result contains a dictionary of all configuration keys and their values.</returns>
|
||||||
public Task<Dictionary<string, string>> ReadAllAsync(CancellationToken ct = default)
|
public Task<IDictionary<string, string>> ReadAllAsync(CancellationToken ct = default)
|
||||||
{
|
{
|
||||||
return AcquireLockAndLoadAsync(ct);
|
return AcquireLockAndLoadAsync(ct);
|
||||||
}
|
}
|
||||||
@@ -95,7 +95,7 @@ public sealed class JsonFileStorageProvider(JsonStorageOptions options)
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="ct">A cancellation token to observe while waiting for the lock or during the load operation.</param>
|
/// <param name="ct">A cancellation token to observe while waiting for the lock or during the load operation.</param>
|
||||||
/// <returns>A dictionary containing the loaded configuration data.</returns>
|
/// <returns>A dictionary containing the loaded configuration data.</returns>
|
||||||
private async Task<Dictionary<string, string>> AcquireLockAndLoadAsync(CancellationToken ct)
|
private async Task<IDictionary<string, string>> AcquireLockAndLoadAsync(CancellationToken ct)
|
||||||
{
|
{
|
||||||
await FileLock.WaitAsync(ct).ConfigureAwait(false);
|
await FileLock.WaitAsync(ct).ConfigureAwait(false);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user