diff --git a/src/Speckle.Sdk/Api/Operations/Operations.Receive.cs b/src/Speckle.Sdk/Api/Operations/Operations.Receive.cs index b75db9fc..7cf92a2e 100644 --- a/src/Speckle.Sdk/Api/Operations/Operations.Receive.cs +++ b/src/Speckle.Sdk/Api/Operations/Operations.Receive.cs @@ -44,6 +44,11 @@ public partial class Operations receiveActivity?.SetStatus(SdkActivityStatusCode.Ok); return result; } + catch (OperationCanceledException) + { + //this is handled by the caller + throw; + } catch (Exception ex) { receiveActivity?.SetStatus(SdkActivityStatusCode.Error); diff --git a/src/Speckle.Sdk/Serialisation/V2/MemoryServerObjectManager.cs b/src/Speckle.Sdk/Serialisation/V2/MemoryServerObjectManager.cs index f4dda14a..0bf6cc16 100644 --- a/src/Speckle.Sdk/Serialisation/V2/MemoryServerObjectManager.cs +++ b/src/Speckle.Sdk/Serialisation/V2/MemoryServerObjectManager.cs @@ -9,6 +9,7 @@ public class MemoryServerObjectManager(ConcurrentDictionary obje { public virtual async IAsyncEnumerable<(string, string)> DownloadObjects( IReadOnlyCollection objectIds, + string? attributeMask, IProgress? progress, [EnumeratorCancellation] CancellationToken cancellationToken ) diff --git a/src/Speckle.Sdk/Serialisation/V2/Receive/DeserializeProcess.cs b/src/Speckle.Sdk/Serialisation/V2/Receive/DeserializeProcess.cs index b0e65a7c..3d3cefad 100644 --- a/src/Speckle.Sdk/Serialisation/V2/Receive/DeserializeProcess.cs +++ b/src/Speckle.Sdk/Serialisation/V2/Receive/DeserializeProcess.cs @@ -14,7 +14,8 @@ public record DeserializeProcessOptions( bool ThrowOnMissingReferences = true, bool SkipInvalidConverts = false, int? MaxParallelism = null, - bool SkipServer = false + bool SkipServer = false, + string? AttributeMask = null ); public partial interface IDeserializeProcess : IAsyncDisposable; @@ -44,6 +45,7 @@ public sealed class DeserializeProcess( new ObjectLoader( sqLiteJsonCacheManager, serverObjectManager, + options?.AttributeMask, progress, loggerFactory.CreateLogger(), cancellationToken diff --git a/src/Speckle.Sdk/Serialisation/V2/Receive/ObjectLoader.cs b/src/Speckle.Sdk/Serialisation/V2/Receive/ObjectLoader.cs index 8485ed77..c3e37fa2 100644 --- a/src/Speckle.Sdk/Serialisation/V2/Receive/ObjectLoader.cs +++ b/src/Speckle.Sdk/Serialisation/V2/Receive/ObjectLoader.cs @@ -16,6 +16,7 @@ public partial interface IObjectLoader : IDisposable; public sealed class ObjectLoader( ISqLiteJsonCacheManager sqLiteJsonCacheManager, IServerObjectManager serverObjectManager, + string? attributeMask, IProgress? progress, ILogger logger, CancellationToken cancellationToken @@ -111,6 +112,7 @@ public sealed class ObjectLoader( await foreach ( var (id, json) in serverObjectManager.DownloadObjects( ids.Select(x => x.NotNull()).ToList(), + attributeMask, progress, cancellationToken ) diff --git a/src/Speckle.Sdk/Serialisation/V2/ServerObjectManager.cs b/src/Speckle.Sdk/Serialisation/V2/ServerObjectManager.cs index e196c890..d5f3b9e9 100644 --- a/src/Speckle.Sdk/Serialisation/V2/ServerObjectManager.cs +++ b/src/Speckle.Sdk/Serialisation/V2/ServerObjectManager.cs @@ -51,6 +51,7 @@ public class ServerObjectManager : IServerObjectManager public async IAsyncEnumerable<(string, string)> DownloadObjects( IReadOnlyCollection objectIds, + string? attributeMask, IProgress? progress, [EnumeratorCancellation] CancellationToken cancellationToken ) @@ -59,10 +60,14 @@ public class ServerObjectManager : IServerObjectManager cancellationToken.ThrowIfCancellationRequested(); using var childrenHttpMessage = new HttpRequestMessage(); - childrenHttpMessage.RequestUri = new Uri($"/api/getobjects/{_streamId}", UriKind.Relative); + childrenHttpMessage.RequestUri = new Uri($"/api/v2/projects/{_streamId}/object-stream/", UriKind.Relative); childrenHttpMessage.Method = HttpMethod.Post; - Dictionary postParameters = new() { { "objects", JsonConvert.SerializeObject(objectIds) } }; + Dictionary postParameters = new() { { "objectIds", JsonConvert.SerializeObject(objectIds) } }; + if (!string.IsNullOrWhiteSpace(attributeMask)) + { + postParameters.Add("attributeMask", attributeMask.NotNull()); + } string serializedPayload = JsonConvert.SerializeObject(postParameters); childrenHttpMessage.Content = new StringContent(serializedPayload, Encoding.UTF8, "application/json"); childrenHttpMessage.Headers.Add("Accept", "text/plain"); diff --git a/tests/Speckle.Sdk.Serialization.Tests/DetachedTests.cs b/tests/Speckle.Sdk.Serialization.Tests/DetachedTests.cs index f41a5c10..bfd8b566 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/DetachedTests.cs +++ b/tests/Speckle.Sdk.Serialization.Tests/DetachedTests.cs @@ -338,6 +338,7 @@ public class DummyServerObjectManager : IServerObjectManager { public IAsyncEnumerable<(string, string)> DownloadObjects( IReadOnlyCollection objectIds, + string? attributeMask, IProgress? progress, CancellationToken cancellationToken ) => throw new NotImplementedException(); diff --git a/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.cs b/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.cs index 0d0d7332..7f73bf60 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.cs +++ b/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.cs @@ -112,6 +112,7 @@ public class ExceptionTests new DummySqLiteReceiveManager(new Dictionary()), new ExceptionServerObjectManager(), null, + null, new NullLogger(), default ); diff --git a/tests/Speckle.Sdk.Serialization.Tests/Framework/ExceptionServerObjectManager.cs b/tests/Speckle.Sdk.Serialization.Tests/Framework/ExceptionServerObjectManager.cs index e6afc2a8..9c3482d0 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/Framework/ExceptionServerObjectManager.cs +++ b/tests/Speckle.Sdk.Serialization.Tests/Framework/ExceptionServerObjectManager.cs @@ -8,6 +8,7 @@ public class ExceptionServerObjectManager : IServerObjectManager { public IAsyncEnumerable<(string, string)> DownloadObjects( IReadOnlyCollection objectIds, + string? attributeMask, IProgress? progress, CancellationToken cancellationToken ) => throw new NotImplementedException(); diff --git a/tests/Speckle.Sdk.Serialization.Tests/SerializationTests.cs b/tests/Speckle.Sdk.Serialization.Tests/SerializationTests.cs index f2b3bc6a..40953afc 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/SerializationTests.cs +++ b/tests/Speckle.Sdk.Serialization.Tests/SerializationTests.cs @@ -204,6 +204,7 @@ public class SerializationTests new DummySqLiteReceiveManager(closures), new DummyReceiveServerObjectManager(closures), null, + null, new NullLogger(), default ) diff --git a/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.cs b/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.cs index 5106d5b6..90e13dea 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.cs +++ b/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.cs @@ -33,12 +33,12 @@ public class ServerObjectManagerTests : MoqTest var mockHttp = new MockHttpMessageHandler(); Dictionary postParameters = new() { - { "objects", JsonConvert.SerializeObject(new List { id, id2 }) }, + { "objectIds", JsonConvert.SerializeObject(new List { id, id2 }) }, }; string serializedPayload = JsonConvert.SerializeObject(postParameters); mockHttp - .When(HttpMethod.Post, $"http://localhost/api/getobjects/{streamId}") + .When(HttpMethod.Post, $"http://localhost/api/v2/projects/{streamId}/object-stream/") .WithContent(serializedPayload) .Respond( "application/json", @@ -59,7 +59,7 @@ public class ServerObjectManagerTests : MoqTest token, new(timeout: TimeSpan.FromSeconds(timeout)) ); - var results = serverObjectManager.DownloadObjects(new List { id, id2 }, null, ct); + var results = serverObjectManager.DownloadObjects(new List { id, id2 }, null, null, ct); var objects = new JObject(); await foreach (var (x, json) in results) { diff --git a/tests/Speckle.Sdk.Testing/Framework/DummyReceiveServerObjectManager.cs b/tests/Speckle.Sdk.Testing/Framework/DummyReceiveServerObjectManager.cs index e038f33c..fad30ac2 100644 --- a/tests/Speckle.Sdk.Testing/Framework/DummyReceiveServerObjectManager.cs +++ b/tests/Speckle.Sdk.Testing/Framework/DummyReceiveServerObjectManager.cs @@ -10,6 +10,7 @@ public class DummyReceiveServerObjectManager(IReadOnlyDictionary { public async IAsyncEnumerable<(string, string)> DownloadObjects( IReadOnlyCollection objectIds, + string? attributeMask, IProgress? progress, [EnumeratorCancellation] CancellationToken cancellationToken ) diff --git a/tests/Speckle.Sdk.Testing/Framework/DummySendServerObjectManager.cs b/tests/Speckle.Sdk.Testing/Framework/DummySendServerObjectManager.cs index ca46a915..bd2a4653 100644 --- a/tests/Speckle.Sdk.Testing/Framework/DummySendServerObjectManager.cs +++ b/tests/Speckle.Sdk.Testing/Framework/DummySendServerObjectManager.cs @@ -9,6 +9,7 @@ public class DummySendServerObjectManager(ConcurrentDictionary s { public IAsyncEnumerable<(string, string)> DownloadObjects( IReadOnlyCollection objectIds, + string? attributeMask, IProgress? progress, CancellationToken cancellationToken ) => throw new NotImplementedException();