Files
speckle-server/packages/server/modules/fileuploads/services/management.ts
T
Gergő Jedlicska 2e86a723c6 feat(fileimport-service): add next gen file importer (#4697)
* feat(fileimport-service): add next gen file importer

* feat(fileimports): integrate server and fileimporter

* chore(dui3): remove leftover artifacts

* fix(server): test typing fixes

* fix(fileimports): test and pr comment fixes

* feat(fileimports: moare test fixes

* fix(fileimports): tests and yarn dedupe
2025-05-23 10:27:00 +02:00

134 lines
3.9 KiB
TypeScript

import { GetStreamBranchByName } from '@/modules/core/domain/branches/operations'
import {
ProjectFileImportUpdatedMessageType,
ProjectPendingModelsUpdatedMessageType,
ProjectPendingVersionsUpdatedMessageType
} from '@/modules/core/graph/generated/graphql'
import {
SaveUploadFile,
NotifyChangeInFileStatus,
SaveUploadFileV2,
SaveUploadFileInput,
PushJobToFileImporter,
InsertNewUploadAndNotify
} from '@/modules/fileuploads/domain/operations'
import {
FileImportSubscriptions,
PublishSubscription
} from '@/modules/shared/utils/subscriptions'
export const insertNewUploadAndNotifyFactory =
(deps: {
getStreamBranchByName: GetStreamBranchByName
saveUploadFile: SaveUploadFile
publish: PublishSubscription
}) =>
async (upload: SaveUploadFileInput) => {
const branch = await deps.getStreamBranchByName(upload.streamId, upload.branchName)
const file = await deps.saveUploadFile(upload)
if (!branch) {
await deps.publish(FileImportSubscriptions.ProjectPendingModelsUpdated, {
projectPendingModelsUpdated: {
id: file.id,
type: ProjectPendingModelsUpdatedMessageType.Created,
model: file
},
projectId: file.streamId
})
} else {
await deps.publish(FileImportSubscriptions.ProjectPendingVersionsUpdated, {
projectPendingVersionsUpdated: {
id: file.id,
type: ProjectPendingVersionsUpdatedMessageType.Created,
version: file
},
projectId: file.streamId,
branchName: file.branchName
})
}
await deps.publish(FileImportSubscriptions.ProjectFileImportUpdated, {
projectFileImportUpdated: {
id: file.id,
type: ProjectFileImportUpdatedMessageType.Created,
upload: file
},
projectId: file.streamId
})
}
export const insertNewUploadAndNotifyFactoryV2 =
(deps: {
pushJobToFileImporter: PushJobToFileImporter
saveUploadFile: SaveUploadFileV2
publish: PublishSubscription
}): InsertNewUploadAndNotify =>
async (upload) => {
const file = await deps.saveUploadFile(upload)
await deps.publish(FileImportSubscriptions.ProjectFileImportUpdated, {
projectFileImportUpdated: {
id: file.id,
type: ProjectFileImportUpdatedMessageType.Created,
upload: {
...file,
streamId: upload.projectId,
branchName: upload.modelName
}
},
projectId: file.projectId
})
await deps.pushJobToFileImporter({
fileName: file.fileName,
fileType: file.fileType,
projectId: file.projectId,
modelId: upload.modelId,
blobId: file.id,
jobId: file.id,
userId: upload.userId
})
}
export const notifyChangeInFileStatus =
(deps: {
getStreamBranchByName: GetStreamBranchByName
publish: PublishSubscription
}): NotifyChangeInFileStatus =>
async (params) => {
const { file } = params
const { id: fileId, streamId, branchName } = file
const branch = await deps.getStreamBranchByName(streamId, branchName)
if (!branch) {
await deps.publish(FileImportSubscriptions.ProjectPendingModelsUpdated, {
projectPendingModelsUpdated: {
id: fileId,
type: ProjectPendingModelsUpdatedMessageType.Updated,
model: file
},
projectId: streamId
})
} else {
await deps.publish(FileImportSubscriptions.ProjectPendingVersionsUpdated, {
projectPendingVersionsUpdated: {
id: fileId,
type: ProjectPendingVersionsUpdatedMessageType.Updated,
version: file
},
projectId: streamId,
branchName
})
}
await deps.publish(FileImportSubscriptions.ProjectFileImportUpdated, {
projectFileImportUpdated: {
id: fileId,
type: ProjectFileImportUpdatedMessageType.Created,
upload: file
},
projectId: streamId
})
}