Files
speckle-server/packages/server/modules/fileuploads/services/resultHandler.ts
T
Iain Sproat 8a74d9cbe3 feat(file importer): server has REST API to receive results about a file import (#4688)
* fix(server): remove redundant code from bad merge

* wrong router

* WIP: http api for receiving file import results

* Lints

* fix

* WIP: tests

* test fix

* auth middleware has implicit requirement for param named streamId

* complete tests and fixes

* can run the old way alongside the existing, no conflicts

* tidying

* correct error thrown

* incorporate review comments
2025-05-08 19:12:15 +02:00

75 lines
2.0 KiB
TypeScript

import { Logger } from '@/observability/logging'
import {
ProcessFileImportResult,
UpdateFileStatus
} from '@/modules/fileuploads/domain/operations'
import {
FileImportSubscriptions,
PublishSubscription
} from '@/modules/shared/utils/subscriptions'
import {
ProjectFileImportUpdatedMessageType,
ProjectPendingVersionsUpdatedMessageType
} from '@/test/graphql/generated/graphql'
import {
jobResultStatusToFileUploadStatus,
jobResultToConvertedMessage
} from '@/modules/fileuploads/helpers/convert'
import { ensureError } from '@speckle/shared'
type OnFileImportResultDeps = {
updateFileStatus: UpdateFileStatus
publish: PublishSubscription
logger: Logger
}
export const onFileImportResultFactory =
(deps: OnFileImportResultDeps): ProcessFileImportResult =>
async (params) => {
const { logger } = deps
const { jobId, jobResult } = params
logger.info('Processing result for file upload')
const status = jobResultStatusToFileUploadStatus(jobResult.status)
const convertedMessage = jobResultToConvertedMessage(jobResult)
let updatedFile
try {
updatedFile = await deps.updateFileStatus({
fileId: jobId,
status,
convertedMessage
})
} catch (e) {
const err = ensureError(e)
logger.error(
{ err },
'Error updating imported file status in database. File ID: %s',
jobId
)
throw err
}
await deps.publish(FileImportSubscriptions.ProjectPendingVersionsUpdated, {
projectPendingVersionsUpdated: {
id: updatedFile.id,
type: ProjectPendingVersionsUpdatedMessageType.Updated,
version: updatedFile
},
projectId: updatedFile.streamId,
branchName: updatedFile.branchName
})
await deps.publish(FileImportSubscriptions.ProjectFileImportUpdated, {
projectFileImportUpdated: {
id: updatedFile.id,
type: ProjectFileImportUpdatedMessageType.Updated,
upload: updatedFile
},
projectId: updatedFile.streamId
})
logger.info('File upload status updated')
}