aboutsummaryrefslogtreecommitdiffstats
path: root/code/api/Services
diff options
context:
space:
mode:
Diffstat (limited to 'code/api/Services')
-rw-r--r--code/api/Services/Abstractions/IResourceService.cs12
-rw-r--r--code/api/Services/System/ChunkUploaderService.cs16
-rw-r--r--code/api/Services/System/DefaultResourceService.cs40
-rw-r--r--code/api/Services/System/PermissionService.cs19
-rw-r--r--code/api/Services/System/ShareService.cs6
-rw-r--r--code/api/Services/System/StorageService.cs39
6 files changed, 125 insertions, 7 deletions
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<byte[]> GetBlobAsync(StorageBlobId id, CancellationToken cancellationToken = default);
+ public Task RemoveBlobAsync(StorageBlobId id, CancellationToken cancellationToken = default);
+ public Task SetBlobMetadataAsync(StorageBlobId id, Dictionary<string, string> metadata, CancellationToken cancellationToken = default);
+ public Task<Dictionary<string,string>> 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<ChunkUploaderService> _logger;
+ private readonly AppDatabase _database;
+
+ public ChunkUploaderService(AppDatabase database, ILogger<ChunkUploaderService> logger) {
+ _database = database;
+ _logger = logger;
+ }
+
+ public async Task<Guid> 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<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());
+ }
+} \ 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<PermissionService> _logger;
+
+ public PermissionService(ILogger<PermissionService> 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<KeysetPaginationResult<FileSystemEntry>> GetFileSystemEntriesAsync(Guid parent = default) {
- var keysetQuery = _database.Folders
+ public async Task<List<FileSystemEntry>> 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<FileSystemEntry> 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