diff --git a/src/IIIFPresentation/API.Tests/Converters/Streaming/S3StoredJsonProcessorTests.cs b/src/IIIFPresentation/API.Tests/Converters/Streaming/S3StoredJsonProcessorTests.cs index ed92afb9..4420f7dd 100644 --- a/src/IIIFPresentation/API.Tests/Converters/Streaming/S3StoredJsonProcessorTests.cs +++ b/src/IIIFPresentation/API.Tests/Converters/Streaming/S3StoredJsonProcessorTests.cs @@ -1,4 +1,5 @@ using System.Text; +using API.Converters; using API.Converters.Streaming; using LateApexEarlySpeed.Xunit.Assertion.Json; @@ -9,24 +10,38 @@ public class S3StoredJsonProcessorTests [Fact] public void ProcessJson_ChangesTopLevelId() { - const string requestSlug = "fnord/quark/4534"; + const string requestSlug = + "0004_hierarchical_iiif_collection_2O71nF/0004_hierarchical_iiif_collection_child_PWZnry"; + const int customerId = 52; + var urlRoots = new UrlRoots + { + BaseUrl = "http://localhost" + }; - var result = GetProcessed(ManifestJsonWithId, new(requestSlug)); + var result = GetProcessed(ManifestJsonWithId, new(requestSlug, customerId, urlRoots)); JsonAssertion.Meet(root => root.IsJsonObject() - .HasProperty("id", p => p.IsJsonString().Equal($"managed:{requestSlug}")), + .HasProperty("id", p => p.IsJsonString().Equal( + $"http://localhost/52/{requestSlug}")), result); } [Fact] public void ProcessJson_AddsTopLevelId() { - const string requestSlug = "fnord/quark/4534"; + const string requestSlug = + "0004_hierarchical_iiif_collection_2O71nF/0004_hierarchical_iiif_collection_child_PWZnry"; + const int customerId = 52; + var urlRoots = new UrlRoots + { + BaseUrl = "http://localhost" + }; - var result = GetProcessed(ManifestJsonWithoutId, new(requestSlug)); + var result = GetProcessed(ManifestJsonWithoutId, new(requestSlug, customerId, urlRoots)); JsonAssertion.Meet(root => root.IsJsonObject() - .HasProperty("id", p => p.IsJsonString().Equal($"managed:{requestSlug}")), + .HasProperty("id", p => p.IsJsonString().Equal( + $"http://localhost/52/{requestSlug}")), result); } diff --git a/src/IIIFPresentation/API/Converters/Streaming/S3StoredJsonProcessor.cs b/src/IIIFPresentation/API/Converters/Streaming/S3StoredJsonProcessor.cs index 33269f28..4e54ee1e 100644 --- a/src/IIIFPresentation/API/Converters/Streaming/S3StoredJsonProcessor.cs +++ b/src/IIIFPresentation/API/Converters/Streaming/S3StoredJsonProcessor.cs @@ -2,11 +2,16 @@ namespace API.Converters.Streaming; -public class S3StoredJsonProcessor(string requestSlug) +public class S3StoredJsonProcessor(string requestSlug, int customerId, UrlRoots roots) : StreamingProcessorImplBase { private const string IdPropertyName = "id"; + private string GeneratedId { get; } = new UriBuilder(roots.BaseUrl!) + { + Path = $"{customerId}/{requestSlug}" + }.Uri.ToString(); + #region Overrides of StreamingProcessorImplBase public override object GetInitialState() => new S3ProcessorCustomState(); @@ -31,7 +36,7 @@ protected override void OnEndObject(ref Utf8JsonReader reader, Utf8JsonWriter wr if (reader.CurrentDepth == 0 && !currentState.IdSet) { writer.WritePropertyName(IdPropertyName); - writer.WriteStringValue($"managed:{requestSlug}"); + writer.WriteStringValue(GeneratedId); } base.OnEndObject(ref reader, writer, ref currentState); @@ -56,7 +61,7 @@ protected override void OnEndObject(ref Utf8JsonReader reader, Utf8JsonWriter wr currentState.IdSet = true; // Found id in the top-level object - return $"managed:{requestSlug}"; + return GeneratedId; } return v; diff --git a/src/IIIFPresentation/API/Features/Storage/Requests/GetHierarchicalCollection.cs b/src/IIIFPresentation/API/Features/Storage/Requests/GetHierarchicalCollection.cs index 9881f297..ddb4732d 100644 --- a/src/IIIFPresentation/API/Features/Storage/Requests/GetHierarchicalCollection.cs +++ b/src/IIIFPresentation/API/Features/Storage/Requests/GetHierarchicalCollection.cs @@ -1,4 +1,5 @@ -using API.Converters.Streaming; +using API.Converters; +using API.Converters.Streaming; using API.Features.Storage.Helpers; using API.Features.Storage.Models; using API.Helpers; @@ -9,18 +10,19 @@ using MediatR; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Options; -using Models.Database.Collections; using Models.Database.General; using Repository; using Repository.Helpers; namespace API.Features.Storage.Requests; -public class GetHierarchicalCollection(int customerId, string slug) : IRequest +public class GetHierarchicalCollection(int customerId, string slug, UrlRoots urlRoots) : IRequest { public int CustomerId { get; } = customerId; public string Slug { get; } = slug; + + public UrlRoots UrlRoots { get; } = urlRoots; } public class GetHierarchicalCollectionHandler(PresentationContext dbContext, IBucketReader bucketReader, @@ -49,7 +51,8 @@ public async Task Handle(GetHierarchicalCollection request, using var memoryStream = new MemoryStream(); using var reader = new StreamReader(memoryStream); StreamingJsonProcessor.ProcessJson(objectFromS3.Stream, memoryStream, - objectFromS3.Headers.ContentLength, new S3StoredJsonProcessor(request.Slug)); + objectFromS3.Headers.ContentLength, + new S3StoredJsonProcessor(request.Slug, request.CustomerId, request.UrlRoots)); memoryStream.Seek(0, SeekOrigin.Begin); collectionFromS3 = await reader.ReadToEndAsync(cancellationToken); } diff --git a/src/IIIFPresentation/API/Features/Storage/StorageController.cs b/src/IIIFPresentation/API/Features/Storage/StorageController.cs index 48b452f1..2e57253c 100644 --- a/src/IIIFPresentation/API/Features/Storage/StorageController.cs +++ b/src/IIIFPresentation/API/Features/Storage/StorageController.cs @@ -36,7 +36,7 @@ public class StorageController(IAuthenticator authenticator, IOptions GetHierarchicalCollection(int customerId, string slug = "") { - var storageRoot = await Mediator.Send(new GetHierarchicalCollection(customerId, slug)); + var storageRoot = await Mediator.Send(new GetHierarchicalCollection(customerId, slug, GetUrlRoots())); if (storageRoot.Collection is not { IsPublic: true }) return this.PresentationNotFound();