flow

Ingest Revit Export

PUT-is-submit a contract-v1.1 gzip artifact, queue an ImportRun, process it into the definition graph, rematerialize the summary, and poll the import-run log (ADR-0103).

FlowStatus: Implemented in api-v1

Overview

This flow is the cloud half of the Revit export seam. The Revit Connector add-in produces the contract-v1 JSONL. Project Delivery Graph owns ImportRun and the definition graph the artifact becomes.

Plugin sequence (also on the OpenAPI operations):

  1. GET /api/v1/party-directory/projects — user selects a domain_id
  2. POST upload-url using that id (manifest.projectId must equal it)
  3. PUT gzip to uploadUrl (local-dev putLocalRevitImportArtifact). PUT is submit — 200 with uploaded: true + id means queued. Do not register. Do not POST process.
  4. Poll GET until ready / failed / deleted. ready includes rematerialize of the Airtable graph view.
  5. Fallback: POST register only when uploadUrl is a different-host storage URL that did not queue.
  6. Steward: POST …/actions/delete-graph (wipe imported nodes, mark deleted, keep gzip); POST …/actions/retry requeues the same run from failed | deleted.

ENABLE_CRON_JOBS=true is required for the minute cron in local. Production still uses the claimant (ADR-0079). Local PUT uses setImmediate when cron is off (ADR-0103).

HTTP

Do not invent other operation ids. Do not copy request/response schemas here; use generated OpenAPI.

StepMethod and pathOpenAPI operationId
List projectsGET /api/v1/party-directory/projectslistPartyDirectoryProjects
Upload URLPOST /api/v1/projects/{id}/revit-imports/upload-urlrequestRevitImportUploadUrl
Local PUT (submit)PUT /api/v1/projects/{id}/revit-imports/local-uploadputLocalRevitImportArtifact
Register (fallback)POST /api/v1/projects/{id}/revit-importsregisterRevitImport
List logGET /api/v1/projects/{id}/revit-importslistRevitImports
One runGET /api/v1/projects/{id}/revit-imports/{runId}getRevitImport
Process nowPOST /api/v1/projects/{id}/revit-imports/{runId}/processprocessRevitImport
Delete imported graphPOST /api/v1/projects/{id}/revit-imports/{runId}/actions/delete-graphdeleteRevitImportGraph
Retry same runPOST /api/v1/projects/{id}/revit-imports/{runId}/actions/retryretryRevitImport
SummaryGET /api/v1/projects/{id}/definition-graph/summarygetProjectDefinitionGraphSummary
RematerializePOST /api/v1/projects/{id}/definition-graph/summary/rematerializerematerializeProjectDefinitionGraphSummary

Code References

  • apps/api-v1/src/modules/project-delivery-graph/core/application/use-cases/RegisterSourceImportUseCase.ts
  • apps/api-v1/src/modules/project-delivery-graph/core/application/use-cases/ProcessSourceImportUseCase.ts
  • apps/api-v1/src/modules/project-delivery-graph/core/application/use-cases/DeleteImportedGraphUseCase.ts
  • apps/api-v1/src/modules/project-delivery-graph/core/application/use-cases/RetrySourceImportUseCase.ts
  • apps/api-v1/src/modules/project-delivery-graph/core/application/use-cases/ReadRevitImportsUseCase.ts
  • apps/api-v1/src/modules/project-delivery-graph/core/application/use-cases/RematerializeSummaryViewUseCase.ts
  • apps/api-v1/src/modules/project-delivery-graph/adapters/inbound/rest/revit-imports/revitImports.openapi.ts
  • ADR-0103