From 3c188c2949af9d0e08db74a850f8a87dad52de49 Mon Sep 17 00:00:00 2001 From: ivarlovlie Date: Fri, 30 Dec 2022 20:22:55 +0100 Subject: feat: Yes --- code/api/Services/Abstractions/IResourceService.cs | 12 +++++++ code/api/Services/System/ChunkUploaderService.cs | 16 +++++++++ code/api/Services/System/DefaultResourceService.cs | 40 ++++++++++++++++++++++ code/api/Services/System/PermissionService.cs | 19 ++++++++++ code/api/Services/System/ShareService.cs | 6 ++++ code/api/Services/System/StorageService.cs | 39 +++++++++++++++++---- 6 files changed, 125 insertions(+), 7 deletions(-) create mode 100644 code/api/Services/Abstractions/IResourceService.cs create mode 100644 code/api/Services/System/ChunkUploaderService.cs create mode 100644 code/api/Services/System/DefaultResourceService.cs create mode 100644 code/api/Services/System/PermissionService.cs create mode 100644 code/api/Services/System/ShareService.cs (limited to 'code/api/Services') diff --git a/code/api/Services/Abstractions/IResourceService.cs b/code/api/Services/Abstractions/IResourceService.cs new file mode 100644 index 0000000..904d59b --- /dev/null +++ b/code/api/Services/Abstractions/IResourceService.cs @@ -0,0 +1,12 @@ +using I2R.Storage.Api.Services.System; + +namespace I2R.Storage.Api.Services.Abstractions; + +public interface IResourceService +{ + public Task SetBlobAsync(StorageBlobId id, Stream stream, CancellationToken cancellationToken = default); + public Task GetBlobAsync(StorageBlobId id, CancellationToken cancellationToken = default); + public Task RemoveBlobAsync(StorageBlobId id, CancellationToken cancellationToken = default); + public Task SetBlobMetadataAsync(StorageBlobId id, Dictionary metadata, CancellationToken cancellationToken = default); + public Task> GetBlobMetadataAsync(StorageBlobId id, CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/code/api/Services/System/ChunkUploaderService.cs b/code/api/Services/System/ChunkUploaderService.cs new file mode 100644 index 0000000..d650fa4 --- /dev/null +++ b/code/api/Services/System/ChunkUploaderService.cs @@ -0,0 +1,16 @@ +namespace I2R.Storage.Api.Services.System; + +public class ChunkUploaderService +{ + private readonly ILogger _logger; + private readonly AppDatabase _database; + + public ChunkUploaderService(AppDatabase database, ILogger logger) { + _database = database; + _logger = logger; + } + + public async Task StartUploadSession() { + return default; + } +} \ No newline at end of file diff --git a/code/api/Services/System/DefaultResourceService.cs b/code/api/Services/System/DefaultResourceService.cs new file mode 100644 index 0000000..5198432 --- /dev/null +++ b/code/api/Services/System/DefaultResourceService.cs @@ -0,0 +1,40 @@ +using I2R.Storage.Api.Services.Abstractions; +using File = System.IO.File; + +namespace I2R.Storage.Api.Services.System; + +public class DefaultResourceService : IResourceService +{ + private readonly IConfiguration _configuration; + + public DefaultResourceService(IConfiguration configuration) { + _configuration = configuration; + } + + public async Task SetBlobAsync(StorageBlobId id, Stream stream, CancellationToken cancellationToken = default) { + await stream.CopyToAsync(File.OpenWrite(EnsureCreatedAndReturnBasedPath(id)), cancellationToken); + } + + public Task 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 metadata, CancellationToken cancellationToken = default) { + await File.OpenWrite(EnsureCreatedAndReturnBasedPath(id) + SystemConstants.MetadataFileExtension).WriteAsync(JsonSerializer.SerializeToUtf8Bytes(metadata), cancellationToken); + } + + public async Task> GetBlobMetadataAsync(StorageBlobId id, CancellationToken cancellationToken = default) { + return JsonSerializer.Deserialize>(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()); + } +} \ No newline at end of file diff --git a/code/api/Services/System/PermissionService.cs b/code/api/Services/System/PermissionService.cs new file mode 100644 index 0000000..f55d8c1 --- /dev/null +++ b/code/api/Services/System/PermissionService.cs @@ -0,0 +1,19 @@ +namespace I2R.Storage.Api.Services.System; + +public class PermissionService +{ + private readonly AppDatabase _database; + private readonly ILogger _logger; + + public PermissionService(ILogger logger, AppDatabase database) { + _logger = logger; + _database = database; + } + + public async Task GrantAllOnFile(Guid fileId, Guid userId) { } + public async Task GrantAllOnFolder(Guid fileId, Guid userId) { } + public async Task UserCanReadFile(Guid fileId, Guid userId) { } + public async Task UserCanReadFolder(Guid folderId, Guid userId) { } + public async Task UserCanWriteFile(Guid fileId, Guid userId) { } + public async Task UserCanWriteFolder(Guid folderId, Guid userId) { } +} \ No newline at end of file diff --git a/code/api/Services/System/ShareService.cs b/code/api/Services/System/ShareService.cs new file mode 100644 index 0000000..047e607 --- /dev/null +++ b/code/api/Services/System/ShareService.cs @@ -0,0 +1,6 @@ +namespace I2R.Storage.Api.Services.System; + +public class ShareService +{ + +} \ No newline at end of file diff --git a/code/api/Services/System/StorageService.cs b/code/api/Services/System/StorageService.cs index adbb883..328be2c 100644 --- a/code/api/Services/System/StorageService.cs +++ b/code/api/Services/System/StorageService.cs @@ -1,6 +1,3 @@ -using MR.AspNetCore.Pagination; -using MR.EntityFrameworkCore.KeysetPagination; - namespace I2R.Storage.Api.Services.System; public class StorageService @@ -13,11 +10,39 @@ public class StorageService _logger = logger; } - public async Task> GetFileSystemEntriesAsync(Guid parent = default) { - var keysetQuery = _database.Folders + public async Task> GetFileSystemEntriesAsync(Guid parent = default) { + var fileSystemEntriesContext = _database.Folders .Include(c => c.Files) .ConditionalWhere(() => parent != default, folder => folder.ParentId == parent) - .Select(p => new FileSystemEntry() { }); - return default; + .Select(p => new FileSystemEntry() { + Id = p.Id, + Name = p.Name, + MimeType = SystemConstants.FolderMimeType, + SizeInBytes = -1, + Files = p.Files.Select(c => new FileSystemEntry() { + Id = c.Id, + Name = c.Name, + MimeType = c.MimeType, + SizeInBytes = c.SizeInBytes + }).ToList() + }) + .KeysetPaginate(builder => { builder.Ascending(entry => entry.Name); }); + var fileSystemEntries = await fileSystemEntriesContext.Query.ToListAsync(); + fileSystemEntriesContext.EnsureCorrectOrder(fileSystemEntries); + return fileSystemEntries; + } + + public async Task GetFileSystemEntryAsync(Guid folder) { + return _database.Folders.Include(c => c.Files).Select(c => new FileSystemEntry() { + Id = c.Id, + SizeInBytes = -1, + MimeType = SystemConstants.FolderMimeType, + Files = c.Files.Select(p => new FileSystemEntry() { + SizeInBytes = p.SizeInBytes, + MimeType = p.MimeType, + Id = p.Id, + Name = p.Name + }).ToList() + }).FirstOrDefault(c => c.Id == folder); } } \ No newline at end of file -- cgit v1.3