custom error handler can be removed as functionality is already provided by our existing middleware

This commit is contained in:
Iain Sproat
2025-03-05 14:30:13 +00:00
parent 6afad05430
commit 2d73a75cf8
2 changed files with 44 additions and 77 deletions
@@ -1,27 +0,0 @@
import type { Request, Response } from 'express'
import {
NotFoundError,
ResourceMismatch,
BadRequestError
} from '@/modules/shared/errors'
import { ensureError } from '@speckle/shared'
type ErrorHandler = (
req: Request,
res: Response,
callback: (req: Request, res: Response) => Promise<void>
) => Promise<void>
export const errorHandler: ErrorHandler = async (req, res, callback) => {
try {
await callback(req, res)
} catch (err) {
//TODO we can probably delegate to the default error handler, but need to verify where this is called and whether we can refactor the callbacks
if (err instanceof NotFoundError) {
res.status(404).send({ error: err.message })
} else if (err instanceof ResourceMismatch || err instanceof BadRequestError) {
res.status(400).send({ error: err.message })
} else {
res.status(500).send({ error: ensureError(err, 'Unknown error').message })
}
}
}
@@ -32,7 +32,6 @@ import {
import { getProjectDbClient } from '@/modules/multiregion/utils/dbSelector'
import { getStreamFactory } from '@/modules/core/repositories/streams'
import { ensureError } from '@speckle/shared'
import { errorHandler } from '@/modules/blobstorage/rest/errorHandler'
import { processNewFileStreamFactory } from '@/modules/blobstorage/services/streams'
export const blobStorageRouterFactory = (): Router => {
@@ -135,32 +134,30 @@ export const blobStorageRouterFactory = (): Router => {
allowAnonymousUsersOnPublicStreams
]),
async (req, res) => {
errorHandler(req, res, async (req, res) => {
const streamId = req.params.streamId
const [projectDb, projectStorage] = await Promise.all([
getProjectDbClient({ projectId: streamId }),
getProjectObjectStorage({ projectId: streamId })
])
const streamId = req.params.streamId
const [projectDb, projectStorage] = await Promise.all([
getProjectDbClient({ projectId: streamId }),
getProjectObjectStorage({ projectId: streamId })
])
const getBlobMetadata = getBlobMetadataFactory({ db: projectDb })
const getFileStream = getFileStreamFactory({ getBlobMetadata })
const getObjectStream = getObjectStreamFactory({ storage: projectStorage })
const getBlobMetadata = getBlobMetadataFactory({ db: projectDb })
const getFileStream = getFileStreamFactory({ getBlobMetadata })
const getObjectStream = getObjectStreamFactory({ storage: projectStorage })
const { fileName } = await getBlobMetadata({
streamId: req.params.streamId,
blobId: req.params.blobId
})
const fileStream = await getFileStream({
getObjectStream,
streamId: req.params.streamId,
blobId: req.params.blobId
})
res.writeHead(200, {
'Content-Type': 'application/octet-stream',
'Content-Disposition': `attachment; filename="${fileName}"`
})
fileStream.pipe(res)
const { fileName } = await getBlobMetadata({
streamId: req.params.streamId,
blobId: req.params.blobId
})
const fileStream = await getFileStream({
getObjectStream,
streamId: req.params.streamId,
blobId: req.params.blobId
})
res.writeHead(200, {
'Content-Type': 'application/octet-stream',
'Content-Disposition': `attachment; filename="${fileName}"`
})
fileStream.pipe(res)
}
)
@@ -168,27 +165,25 @@ export const blobStorageRouterFactory = (): Router => {
'/api/stream/:streamId/blob/:blobId',
authMiddlewareCreator(createStreamReadPermissions()),
async (req, res) => {
errorHandler(req, res, async (req, res) => {
const streamId = req.params.streamId
const [projectDb, projectStorage] = await Promise.all([
getProjectDbClient({ projectId: streamId }),
getProjectObjectStorage({ projectId: streamId })
])
const streamId = req.params.streamId
const [projectDb, projectStorage] = await Promise.all([
getProjectDbClient({ projectId: streamId }),
getProjectObjectStorage({ projectId: streamId })
])
const getBlobMetadata = getBlobMetadataFactory({ db: projectDb })
const deleteBlob = fullyDeleteBlobFactory({
getBlobMetadata,
deleteBlob: deleteBlobFactory({ db: projectDb })
})
const deleteObject = deleteObjectFactory({ storage: projectStorage })
await deleteBlob({
streamId: req.params.streamId,
blobId: req.params.blobId,
deleteObject
})
res.status(204).send()
const getBlobMetadata = getBlobMetadataFactory({ db: projectDb })
const deleteBlob = fullyDeleteBlobFactory({
getBlobMetadata,
deleteBlob: deleteBlobFactory({ db: projectDb })
})
const deleteObject = deleteObjectFactory({ storage: projectStorage })
await deleteBlob({
streamId: req.params.streamId,
blobId: req.params.blobId,
deleteObject
})
res.status(204).send()
}
)
@@ -205,19 +200,18 @@ export const blobStorageRouterFactory = (): Router => {
const getBlobMetadataCollection = getBlobMetadataCollectionFactory({
db: projectDb
})
errorHandler(req, res, async (req, res) => {
const blobMetadataCollection = await getBlobMetadataCollection({
streamId: req.params.streamId,
query: fileName as string
})
res.status(200).send(blobMetadataCollection)
const blobMetadataCollection = await getBlobMetadataCollection({
streamId: req.params.streamId,
query: fileName as string
})
return res.status(200).send(blobMetadataCollection)
}
)
app.delete('/api/stream/:streamId/blobs', async (_req, res) => {
res.status(501).send('This method is not implemented yet.')
return res.status(501).send('This method is not implemented yet.')
})
return app