aboutsummaryrefslogtreecommitdiffstats
path: root/code/api/Services/System/DefaultResourceService.cs
blob: 5d053530772e4bbbb82a5849dfd53a34535c5d09 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
using Quality.Storage.Api.Services.Abstractions;
using File = System.IO.File;

namespace Quality.Storage.Api.Services.System;

public class DefaultResourceService(IConfiguration configuration) : IResourceService
{
	public async Task SetBlobAsync(StorageBlobId id, Stream stream, CancellationToken cancellationToken = default) {
        await stream.CopyToAsync(File.OpenWrite(EnsureCreatedAndReturnBasedPath(id)), cancellationToken);
    }

    public Task<byte[]> GetBlobAsync(StorageBlobId id, CancellationToken cancellationToken = default) {
        return File.ReadAllBytesAsync(EnsureCreatedAndReturnBasedPath(id), cancellationToken);
    }

    public Task RemoveBlobAsync(StorageBlobId id, CancellationToken cancellationToken = default) {
        File.Delete(EnsureCreatedAndReturnBasedPath(id));
        return Task.CompletedTask;
    }

    public async Task SetBlobMetadataAsync(StorageBlobId id, Dictionary<string, string> metadata, CancellationToken cancellationToken = default) {
        await File.OpenWrite(EnsureCreatedAndReturnBasedPath(id) + SystemConstants.MetadataFileExtension).WriteAsync(JsonSerializer.SerializeToUtf8Bytes(metadata), cancellationToken);
    }

    public async Task<Dictionary<string, string>> GetBlobMetadataAsync(StorageBlobId id, CancellationToken cancellationToken = default) {
        return JsonSerializer.Deserialize<Dictionary<string, string>>(await File.ReadAllBytesAsync(EnsureCreatedAndReturnBasedPath(id) + SystemConstants.MetadataFileExtension, cancellationToken));
    }

    private string EnsureCreatedAndReturnBasedPath(StorageBlobId id) {
        var withoutId = Path.Combine(Directory.GetCurrentDirectory(), configuration.GetValue(AppEnvVariables.STORAGE_ROOT, "__FILESYSTEM__"), id.Bucket.ToString());
        Directory.CreateDirectory(withoutId);
        return Path.Combine(withoutId, id.Id.ToString());
    }
}