diff --git a/apps/backend/src/factory/service.ts b/apps/backend/src/factory/service.ts index 9d43884d14..9162352401 100644 --- a/apps/backend/src/factory/service.ts +++ b/apps/backend/src/factory/service.ts @@ -38,6 +38,27 @@ export type XLSXMetaBase = MetaBase & { columns: string[] }; const ENDPOINT = process.env.USER_OFFICE_FACTORY_ENDPOINT; +async function throwFactoryError( + factoryResp: globalThis.Response, + downloadType: DownloadType, + type: PDFType | XLSXType | ZIPType +) { + const body = await factoryResp.text(); + + let parsed: { message?: string } | undefined; + try { + parsed = JSON.parse(body); + } catch { + parsed = undefined; + } + + const detail = typeof parsed?.message === 'string' ? parsed.message : body; + + throw new Error( + `Factory service failed to generate ${downloadType}/${type}: ${detail}` + ); +} + export default async function callFactoryService( downloadType: DownloadType, type: PDFType | XLSXType | ZIPType, @@ -90,7 +111,7 @@ export default async function callFactoryService( ); if (!factoryResp.ok) { - throw new Error(await factoryResp.text()); + await throwFactoryError(factoryResp, downloadType, type); } factoryRespBody = factoryResp.body; @@ -110,6 +131,7 @@ export default async function callFactoryService( }); span.setStatus({ code: 2, message: String(err) }); } + throw err; } finally { span.end(); } @@ -124,7 +146,7 @@ export default async function callFactoryService( }); if (!factoryResp.ok) { - throw new Error(await factoryResp.text()); + await throwFactoryError(factoryResp, downloadType, type); } factoryRespBody = factoryResp.body; @@ -141,7 +163,7 @@ export default async function callFactoryService( readableStream.on('error', (err) => { next({ - error: err.toString(), + error: err, message: `Could not download generated ${downloadType}/${type}`, }); }); diff --git a/apps/backend/src/middlewares/factory.ts b/apps/backend/src/middlewares/factory.ts index 34236d0687..426c9bc873 100644 --- a/apps/backend/src/middlewares/factory.ts +++ b/apps/backend/src/middlewares/factory.ts @@ -83,17 +83,26 @@ factoryDownloadRouter.use( next: NextFunction ) => { let message: string; + let underlyingError: Error | undefined; if (err instanceof Error) { message = err.message; + underlyingError = err; } else if (typeof err === 'string') { message = err; + } else if (err.error instanceof Error) { + message = err.error.message; + underlyingError = err.error; } else { message = err.message; } - err instanceof Error - ? logger.logException(err.message, err, getLogContextFromRequest(req)) + underlyingError + ? logger.logException( + message, + underlyingError, + getLogContextFromRequest(req) + ) : logger.logError(defaultErrorMessage, { err, ...getLogContextFromRequest(req),