diff --git a/src/powerbi-data-connector/speckle/GetByUrl.pqm b/src/powerbi-data-connector/speckle/GetByUrl.pqm index d5b3411..1676ea9 100644 --- a/src/powerbi-data-connector/speckle/GetByUrl.pqm +++ b/src/powerbi-data-connector/speckle/GetByUrl.pqm @@ -14,6 +14,7 @@ GetUser = Extension.LoadFunction("GetUser.pqm"), GetVersion = Extension.LoadFunction("GetVersion.pqm"), GetWorkspace = Extension.LoadFunction("GetWorkspace.pqm"), + MarkReceived = Extension.LoadFunction("MarkReceived.pqm"), // the logic for importing functions from other files Extension.LoadFunction = (fileName as text) => @@ -146,6 +147,9 @@ sourceApplication = modelInfo[sourceApplication], versionId = modelInfo[versionId], + // mark version as received + markReceivedResult = MarkReceived(powerfulToken, versionId, parsedUrl[projectId], parsedUrl[baseUrl]), + // get structured data structuredData = GetStructuredData(url), @@ -178,7 +182,7 @@ structuredData, { {"Version Object ID", each rootObjectId}, - {"Model Info", each if desktopServiceSent or not desktopServiceSent then encodedUserInfo else encodedUserInfo} + {"Model Info", each if (desktopServiceSent or not desktopServiceSent) and (markReceivedResult or not markReceivedResult) then encodedUserInfo else encodedUserInfo} } ), @@ -240,6 +244,10 @@ rootObjectId = modelInfo[rootObjectId], modelName = modelInfo[modelName], sourceApplication = modelInfo[sourceApplication], + federatedVersionId = if versionId <> null then versionId else modelInfo[versionId], + + // mark version as received (non-blocking, best-effort) + markReceivedResult = MarkReceived(powerfulToken, federatedVersionId, projectId, baseUrl), // get structured data structuredData = GetStructuredData(singleModelUrl), @@ -269,13 +277,13 @@ encodedUserInfo = EncodeUserInfo(userInfoData), // add the model name as context - with version id if exists - // reference desktopServiceSent to force evaluation + // reference desktopServiceSent and markReceivedResult to force evaluation result = Table.AddColumn( structuredData, "Source Model", each if versionId <> null then - Text.Combine({modelName, "-", versionId}) - else if desktopServiceSent or not desktopServiceSent then + if (markReceivedResult or not markReceivedResult) then Text.Combine({modelName, "-", versionId}) else Text.Combine({modelName, "-", versionId}) + else if (desktopServiceSent or not desktopServiceSent) and (markReceivedResult or not markReceivedResult) then modelName else modelName, diff --git a/src/powerbi-data-connector/speckle/api/MarkReceived.pqm b/src/powerbi-data-connector/speckle/api/MarkReceived.pqm new file mode 100644 index 0000000..4986cb9 --- /dev/null +++ b/src/powerbi-data-connector/speckle/api/MarkReceived.pqm @@ -0,0 +1,44 @@ +// Function to mark a version as received via GraphQL mutation +// Uses the powerful token +(powerfulToken as text, versionId as text, projectId as text, serverUrl as text) as logical => + try + let + NormalizedServerUrl = if Text.End(serverUrl, 1) = "/" then + serverUrl + else + serverUrl & "/", + + // Build GraphQL + GraphQLMutation = "mutation MarkVersionReceived($input: MarkReceivedVersionInput!) { versionMutations { markReceived(input: $input) } }", + + Variables = [ + input = [ + versionId = versionId, + projectId = projectId, + sourceApplication = "powerbi-data" + ] + ], + + // Make GraphQL request + Response = Web.Contents( + NormalizedServerUrl & "graphql", + [ + Headers = [ + #"Method" = "POST", + #"Content-Type" = "application/json", + #"Authorization" = "Bearer " & powerfulToken + ], + Content = Json.FromValue([ + query = GraphQLMutation, + variables = Variables + ]), + ManualStatusHandling = {400, 401, 403, 404, 500, 502, 503, 504}, + Timeout = #duration(0, 0, 0, 5) + ] + ), + + StatusCode = Value.Metadata(Response)[Response.Status] + in + StatusCode >= 200 and StatusCode < 300 + otherwise + false