diff --git a/VoidCat/Controllers/DownloadController.cs b/VoidCat/Controllers/DownloadController.cs index 60d3c18..79ccea6 100644 --- a/VoidCat/Controllers/DownloadController.cs +++ b/VoidCat/Controllers/DownloadController.cs @@ -75,6 +75,15 @@ public class DownloadController : Controller Response.ContentLength = range.Size; } + var preResult = await _storage.StartEgress(egressReq); + if (preResult.Redirect != null) + { + Response.StatusCode = (int)HttpStatusCode.Redirect; + Response.Headers.Location = preResult.Redirect.ToString(); + Response.ContentLength = 0; + return; + } + var cts = HttpContext.RequestAborted; await Response.StartAsync(cts); await _storage.Egress(egressReq, Response.Body, cts); diff --git a/VoidCat/Model/EgressRequest.cs b/VoidCat/Model/EgressRequest.cs index 1f1bbb4..70ecbf4 100644 --- a/VoidCat/Model/EgressRequest.cs +++ b/VoidCat/Model/EgressRequest.cs @@ -1,7 +1,5 @@ -using VoidCat.Services.Abstractions; - namespace VoidCat.Model; -public sealed record EgressRequest(Guid Id, IEnumerable Ranges) -{ -} \ No newline at end of file +public sealed record EgressRequest(Guid Id, IEnumerable Ranges); + +public sealed record EgressResult(Uri? Redirect = null); \ No newline at end of file diff --git a/VoidCat/Services/Abstractions/IFileStore.cs b/VoidCat/Services/Abstractions/IFileStore.cs index df2f8d8..d7effef 100644 --- a/VoidCat/Services/Abstractions/IFileStore.cs +++ b/VoidCat/Services/Abstractions/IFileStore.cs @@ -29,6 +29,13 @@ public interface IFileStore /// ValueTask Egress(EgressRequest request, Stream outStream, CancellationToken cts); + /// + /// Pre-Egress checks + /// + /// + /// + ValueTask StartEgress(EgressRequest request); + /// /// Deletes file data only, metadata must be deleted with /// diff --git a/VoidCat/Services/Files/FileSystemFactory.cs b/VoidCat/Services/Files/FileSystemFactory.cs index 3cb61e9..e0a72f9 100644 --- a/VoidCat/Services/Files/FileSystemFactory.cs +++ b/VoidCat/Services/Files/FileSystemFactory.cs @@ -53,6 +53,13 @@ public class FileStoreFactory : IFileStore var store = await GetStore(request.Id); await store.Egress(request, outStream, cts); } + + /// + public async ValueTask StartEgress(EgressRequest request) + { + var store = await GetStore(request.Id); + return await store.StartEgress(request); + } /// public async ValueTask DeleteFile(Guid id) diff --git a/VoidCat/Services/Files/LocalDiskFileStorage.cs b/VoidCat/Services/Files/LocalDiskFileStorage.cs index b591916..8878211 100644 --- a/VoidCat/Services/Files/LocalDiskFileStorage.cs +++ b/VoidCat/Services/Files/LocalDiskFileStorage.cs @@ -30,6 +30,12 @@ public class LocalDiskFileStore : StreamFileStore, IFileStore await using var fs = await Open(request, cts); await EgressFromStream(fs, request, outStream, cts); } + + /// + public ValueTask StartEgress(EgressRequest request) + { + return ValueTask.FromResult(new EgressResult()); + } /// public string Key => "local-disk"; diff --git a/VoidCat/Services/Files/S3FileMetadataStore.cs b/VoidCat/Services/Files/S3FileMetadataStore.cs index 10087a2..4be3658 100644 --- a/VoidCat/Services/Files/S3FileMetadataStore.cs +++ b/VoidCat/Services/Files/S3FileMetadataStore.cs @@ -143,15 +143,6 @@ public class S3FileMetadataStore : IFileMetadataStore if (ret != default) { ret.Id = id; - if (_config.Direct) - { - var ub = new UriBuilder(_config.ServiceUrl!) - { - Path = $"/{_config.BucketName}/{id}" - }; - - ret.Url = ub.Uri; - } } return ret; diff --git a/VoidCat/Services/Files/S3FileStore.cs b/VoidCat/Services/Files/S3FileStore.cs index 5e8a37a..4242dd1 100644 --- a/VoidCat/Services/Files/S3FileStore.cs +++ b/VoidCat/Services/Files/S3FileStore.cs @@ -61,6 +61,19 @@ public class S3FileStore : StreamFileStore, IFileStore await EgressFull(request.Id, stream, outStream, cts); } + /// + public ValueTask StartEgress(EgressRequest request) + { + if (!_config.Direct) return ValueTask.FromResult(new EgressResult()); + + var ub = new UriBuilder(_config.ServiceUrl!) + { + Path = $"/{_config.BucketName}/{request.Id}" + }; + + return ValueTask.FromResult(new EgressResult(ub.Uri)); + } + public async ValueTask> ListFiles(PagedRequest request) { try diff --git a/VoidCat/spa/src/ApiKeyList.js b/VoidCat/spa/src/ApiKeyList.js index b0cdead..722d3ed 100644 --- a/VoidCat/spa/src/ApiKeyList.js +++ b/VoidCat/spa/src/ApiKeyList.js @@ -19,7 +19,9 @@ export default function ApiKeyList() { let rsp = await Api.createApiKey({ expiry: new Date(new Date().getTime() + DefaultExpiry) }); - setNewApiKey(await rsp.json()); + if (rsp.ok) { + setNewApiKey(await rsp.json()); + } } useEffect(() => { @@ -59,7 +61,7 @@ export default function ApiKeyList() { {newApiKey ? - + Please save this now as it will not be shown again:
{newApiKey.token}
setNewApiKey(undefined)}>Close