Files
speckle-sharp-connectors/Sdk/Speckle.Connectors.Common/Operations/ReceiveOperation.cs
T
Adam Hathcock eb8db87d9f feat (Grasshopper) dev enable account auth by dev token (#937)
* adds url by token component

* Add gubbins for passing Account objects and AccountResource objects to include token usage

* format

* add bits to make things work?

* revert usage of SpeckleApplication

* review fixes

* more reverts

* Fix tests

* token is correct now

* fix build

* fixes url resource exception and adds new icon

* Made model cards dumb and moved conversions

* can build NW

* actually, remove dead code

---------

Co-authored-by: Claire Kuang <kuang.claire@gmail.com>
2025-06-25 08:42:37 +00:00

120 lines
4.2 KiB
C#

using Speckle.Connectors.Common.Builders;
using Speckle.Connectors.Common.Threading;
using Speckle.Connectors.Logging;
using Speckle.InterfaceGenerator;
using Speckle.Sdk;
using Speckle.Sdk.Api;
using Speckle.Sdk.Credentials;
using Speckle.Sdk.Logging;
using Speckle.Sdk.Models;
using Speckle.Sdk.Models.Extensions;
namespace Speckle.Connectors.Common.Operations;
[GenerateAutoInterface]
public sealed class ReceiveOperation(
IHostObjectBuilder hostObjectBuilder,
IReceiveProgress receiveProgress,
ISdkActivityFactory activityFactory,
IOperations operations,
IReceiveVersionRetriever receiveVersionRetriever,
IThreadContext threadContext
) : IReceiveOperation
{
public async Task<HostObjectBuilderResult> Execute(
ReceiveInfo receiveInfo,
IProgress<CardProgress> onOperationProgressed,
CancellationToken cancellationToken
)
{
using var execute = activityFactory.Start("Receive Operation");
cancellationToken.ThrowIfCancellationRequested();
execute?.SetTag("receiveInfo", receiveInfo);
// 2 - Check account exist
Account account = receiveInfo.Account;
using var userScope = ActivityScope.SetTag(Consts.USER_ID, account.GetHashedEmail());
var version = await receiveVersionRetriever.GetVersion(account, receiveInfo, cancellationToken);
cancellationToken.ThrowIfCancellationRequested();
var commitObject = await threadContext.RunOnWorkerAsync(
() => ReceiveData(account, version, receiveInfo, onOperationProgressed, cancellationToken)
);
// 4 - Convert objects
HostObjectBuilderResult res = await ConvertObjects(
commitObject,
receiveInfo,
onOperationProgressed,
cancellationToken
)
.ConfigureAwait(false);
cancellationToken.ThrowIfCancellationRequested();
await receiveVersionRetriever.VersionReceived(account, version, receiveInfo, cancellationToken);
return res;
}
public async Task<Base> ReceiveData(
Account account,
Speckle.Sdk.Api.GraphQL.Models.Version version,
ReceiveInfo receiveInfo,
IProgress<CardProgress> onOperationProgressed,
CancellationToken cancellationToken
)
{
if (version.referencedObject is null)
{
throw new SpeckleException("Version referenced object is null and cannot do a receive operation.");
}
receiveProgress.Begin();
Base commitObject = await operations.Receive2(
new Uri(account.serverInfo.url),
receiveInfo.ProjectId,
version.referencedObject!,
account.token,
onProgressAction: new PassthroughProgress(args => receiveProgress.Report(onOperationProgressed, args)),
cancellationToken: cancellationToken
);
cancellationToken.ThrowIfCancellationRequested();
return commitObject;
}
private async Task<HostObjectBuilderResult> ConvertObjects(
Base commitObject,
ReceiveInfo receiveInfo,
IProgress<CardProgress> onOperationProgressed,
CancellationToken cancellationToken
)
{
using var conversionActivity = activityFactory.Start("ReceiveOperation.ConvertObjects");
conversionActivity?.SetTag("smellsLikeV2Data", commitObject.SmellsLikeV2Data());
conversionActivity?.SetTag("receiveInfo.serverUrl", receiveInfo.Account.serverInfo.url);
conversionActivity?.SetTag("receiveInfo.projectId", receiveInfo.ProjectId);
conversionActivity?.SetTag("receiveInfo.modelId", receiveInfo.ModelId);
conversionActivity?.SetTag("receiveInfo.selectedVersionId", receiveInfo.SelectedVersionId);
conversionActivity?.SetTag("receiveInfo.sourceApplication", receiveInfo.SourceApplication);
try
{
HostObjectBuilderResult res = await hostObjectBuilder
.Build(commitObject, receiveInfo.ProjectName, receiveInfo.ModelName, onOperationProgressed, cancellationToken)
.ConfigureAwait(false);
conversionActivity?.SetStatus(SdkActivityStatusCode.Ok);
return res;
}
catch (OperationCanceledException)
{
//handle conversions but don't log to seq and also throw
conversionActivity?.SetStatus(SdkActivityStatusCode.Error);
throw;
}
catch (Exception ex)
{
conversionActivity?.RecordException(ex);
conversionActivity?.SetStatus(SdkActivityStatusCode.Error);
throw;
}
}
}