Files
speckle-server/packages/server/modules/fileuploads/services/management.ts
T
Kristaps Fabians Geikins ed507c265b fix(server): not firing upload created/processed subs in next gen uploads (#4991)
* fix(server): not firing upload created subs in next gen uploads

* lint fixes

* upload finished fixes

* test fixes

* fixed file_import_started
2025-06-26 15:33:11 +03:00

116 lines
3.0 KiB
TypeScript

import type {
SaveUploadFile,
NotifyChangeInFileStatus,
SaveUploadFileV2,
PushJobToFileImporter,
GetModelUploads,
GetModelUploadsItems,
GetModelUploadsTotalCount,
InsertNewUploadAndNotifyV2,
InsertNewUploadAndNotify
} from '@/modules/fileuploads/domain/operations'
import type { EventBusEmit } from '@/modules/shared/services/eventBus'
import { FileuploadEvents } from '@/modules/fileuploads/domain/events'
import type { FileImportQueue } from '@/modules/fileuploads/domain/types'
import { UnsupportedFileTypeError } from '@/modules/fileuploads/helpers/errors'
export const insertNewUploadAndNotifyFactory =
(deps: {
saveUploadFile: SaveUploadFile
emit: EventBusEmit
}): InsertNewUploadAndNotify =>
async (upload) => {
const file = await deps.saveUploadFile(upload)
await deps.emit({
eventName: FileuploadEvents.Started,
payload: {
upload: {
...file,
projectId: upload.streamId
}
}
})
return file
}
export const insertNewUploadAndNotifyFactoryV2 =
(deps: {
queues: Pick<FileImportQueue, 'scheduleJob' | 'supportedFileTypes'>[]
pushJobToFileImporter: PushJobToFileImporter
saveUploadFile: SaveUploadFileV2
emit: EventBusEmit
}): InsertNewUploadAndNotifyV2 =>
async (upload) => {
const file = await deps.saveUploadFile(upload)
const queue = deps.queues.find((q) =>
q.supportedFileTypes.includes(file.fileType.toLocaleLowerCase())
)
if (!queue) {
throw new UnsupportedFileTypeError()
}
await deps.pushJobToFileImporter({
scheduleJob: queue.scheduleJob,
fileName: file.fileName,
fileType: file.fileType,
projectId: file.projectId,
modelId: upload.modelId,
blobId: file.id,
jobId: file.id,
userId: upload.userId
})
await deps.emit({
eventName: FileuploadEvents.Started,
payload: {
upload: {
...file,
streamId: upload.projectId,
projectId: upload.projectId,
branchName: upload.modelName
}
}
})
return file
}
export const notifyChangeInFileStatus =
(deps: { eventEmit: EventBusEmit }): NotifyChangeInFileStatus =>
async (params) => {
const { file } = params
await deps.eventEmit({
eventName: FileuploadEvents.Updated,
payload: {
upload: {
...file,
projectId: file.streamId
},
isNewModel: false // next gen file uploads dont support this
}
})
}
export const getModelUploadsFactory =
(deps: {
getModelUploadsItems: GetModelUploadsItems
getModelUploadsTotalCount: GetModelUploadsTotalCount
}): GetModelUploads =>
async (params) => {
const [{ items, cursor }, totalCount] = await Promise.all([
params.limit === 0
? { items: [], cursor: null }
: deps.getModelUploadsItems(params),
deps.getModelUploadsTotalCount(params)
])
return {
items,
totalCount,
cursor
}
}