Files
speckle-server/packages/server/modules/fileuploads/rest/nextGenRouter.ts
T
Daniel Gak Anagrov 6d33b4989c feat(file_upload): update observability metrics (#5079)
* feat: added count of background jobs
* feat: added repository function to count background jobs
* feat: addapted metrics to new queueing system
* feat: added duration to fileuploads
2025-07-21 10:51:14 +02:00

74 lines
2.3 KiB
TypeScript

import { Router } from 'express'
import { authMiddlewareCreator } from '@/modules/shared/middleware'
import { db } from '@/db/knex'
import { streamWritePermissionsPipelineFactory } from '@/modules/shared/authz'
import { getStreamFactory } from '@/modules/core/repositories/streams'
import { getProjectDbClient } from '@/modules/multiregion/utils/dbSelector'
import { fileImportResultPayload } from '@speckle/shared/workers/fileimport'
import { onFileImportResultFactory } from '@/modules/fileuploads/services/resultHandler'
import {
getFileInfoFactoryV2,
updateFileUploadFactory
} from '@/modules/fileuploads/repositories/fileUploads'
import { validateRequest } from 'zod-express'
import { z } from 'zod'
import { getEventBus } from '@/modules/shared/services/eventBus'
import type { FileImportQueue } from '@/modules/fileuploads/domain/types'
import type { ObserveResult } from '@/modules/fileuploads/observability/metrics'
export const nextGenFileImporterRouterFactory = (params: {
queues: FileImportQueue[]
observeResult: ObserveResult | undefined
}): Router => {
const app = Router()
app.post(
'/api/projects/:streamId/fileimporter/jobs/:jobId/results',
authMiddlewareCreator(
streamWritePermissionsPipelineFactory({
getStream: getStreamFactory({ db })
})
),
validateRequest({
params: z.object({
streamId: z.string(),
jobId: z.string()
}),
body: fileImportResultPayload
}),
async (req, res) => {
const userId = req.context.userId
const projectId = req.params.streamId
const jobId = req.params.jobId
const logger = req.log.child({
projectId,
streamId: projectId, //legacy
userId,
jobId
})
const jobResult = req.body
const projectDb = await getProjectDbClient({ projectId })
const onFileImportResult = onFileImportResultFactory({
logger: logger.child({ fileUploadStatus: jobResult.status }),
updateFileUpload: updateFileUploadFactory({ db: projectDb }),
getFileInfo: getFileInfoFactoryV2({ db: projectDb }),
observeResult: params.observeResult,
eventEmit: getEventBus().emit
})
await onFileImportResult({
jobId,
jobResult
})
res.status(200).send({
message: 'Job result processed successfully'
})
return
}
)
return app
}