From a9c4a281f2524c54f783bc4b08c8e3c4c9b9d5aa Mon Sep 17 00:00:00 2001 From: Jordan Dubrick Date: Thu, 7 May 2026 13:43:53 -0400 Subject: [PATCH 1/3] fix(lightspeed): add return statement after error catch to prevent unhandled error Signed-off-by: Jordan Dubrick --- .../src/service/router.test.ts | 34 +++++++++++++++++++ .../lightspeed-backend/src/service/router.ts | 2 ++ 2 files changed, 36 insertions(+) diff --git a/workspaces/lightspeed/plugins/lightspeed-backend/src/service/router.test.ts b/workspaces/lightspeed/plugins/lightspeed-backend/src/service/router.test.ts index 53bd5118db..6f5b71e3d2 100644 --- a/workspaces/lightspeed/plugins/lightspeed-backend/src/service/router.test.ts +++ b/workspaces/lightspeed/plugins/lightspeed-backend/src/service/router.test.ts @@ -399,6 +399,40 @@ describe('lightspeed router tests', () => { }); expect(feedbackResponse.statusCode).toEqual(403); }); + + it('should handle upstream server errors properly', async () => { + const backendServer = await startBackendServer(); + rcs.use( + http.post(`${LOCAL_LCS_ADDR}/v1/feedback`, () => { + return new HttpResponse( + JSON.stringify({ + error: { + message: 'Internal server error', + }, + }), + { + status: 500, + headers: { 'Content-Type': 'application/json' }, + }, + ); + }), + ); + + const response = await request(backendServer) + .post('/api/lightspeed/v1/feedback') + .send({ + conversation_id: '12345678-abcd-0000-0123-456789abcdef', + llm_response: 'bar', + sentiment: 1, + user_feedback: 'Great service!', + user_question: 'foo', + }); + + expect(response.statusCode).toEqual(500); + expect(response.body.error).toContain( + 'Error from lightspeed-core server', + ); + }); }); describe('GET /v1/feedback/status', () => { diff --git a/workspaces/lightspeed/plugins/lightspeed-backend/src/service/router.ts b/workspaces/lightspeed/plugins/lightspeed-backend/src/service/router.ts index f102570df3..38931d72f7 100644 --- a/workspaces/lightspeed/plugins/lightspeed-backend/src/service/router.ts +++ b/workspaces/lightspeed/plugins/lightspeed-backend/src/service/router.ts @@ -529,6 +529,8 @@ export async function createRouter( response.status(500).json({ error: errormsg, }); + + return; } const data = await fetchResponse.json(); From 8a3eeb4896790d72ca6ba273538c418c9150a5ab Mon Sep 17 00:00:00 2001 From: Jordan Dubrick Date: Thu, 7 May 2026 13:44:47 -0400 Subject: [PATCH 2/3] add changeset Signed-off-by: Jordan Dubrick --- workspaces/lightspeed/.changeset/shiny-foxes-film.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 workspaces/lightspeed/.changeset/shiny-foxes-film.md diff --git a/workspaces/lightspeed/.changeset/shiny-foxes-film.md b/workspaces/lightspeed/.changeset/shiny-foxes-film.md new file mode 100644 index 0000000000..fd895ca363 --- /dev/null +++ b/workspaces/lightspeed/.changeset/shiny-foxes-film.md @@ -0,0 +1,5 @@ +--- +'@red-hat-developer-hub/backstage-plugin-lightspeed-backend': patch +--- + +add return statement to /v1/feedback error handler to prevent unhandled error fallthrough From 2d573c9f8c39db4a2cc1f55cffab03b40cb481c2 Mon Sep 17 00:00:00 2001 From: Jordan Dubrick Date: Thu, 7 May 2026 16:04:47 -0400 Subject: [PATCH 3/3] use fetchResponse.status instead of hardcoded 500 Signed-off-by: Jordan Dubrick --- .../lightspeed-backend/src/service/router.test.ts | 11 +++++++---- .../plugins/lightspeed-backend/src/service/router.ts | 11 ++++------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/workspaces/lightspeed/plugins/lightspeed-backend/src/service/router.test.ts b/workspaces/lightspeed/plugins/lightspeed-backend/src/service/router.test.ts index 6f5b71e3d2..c181b733f8 100644 --- a/workspaces/lightspeed/plugins/lightspeed-backend/src/service/router.test.ts +++ b/workspaces/lightspeed/plugins/lightspeed-backend/src/service/router.test.ts @@ -238,7 +238,7 @@ describe('lightspeed router tests', () => { expect(response.body.error).toBeDefined(); }); - it('should return 500 error when conversation does not exist', async () => { + it('should return upstream status code when conversation does not exist', async () => { const backendServer = await startBackendServer(); const response = await request(backendServer) .put(`/api/lightspeed/v2/conversations/${mockAnotherConversationId}`) @@ -246,7 +246,7 @@ describe('lightspeed router tests', () => { topic_summary: 'new topic', }); - expect(response.statusCode).toEqual(500); + expect(response.statusCode).toEqual(404); expect(response.body.error).toContain('not found'); }); @@ -717,7 +717,7 @@ describe('lightspeed router tests', () => { ); }); - it('returns 500 if unexpected error', async () => { + it('returns upstream status code on error', async () => { const backendServer = await startBackendServer(); const nonExistentModel = 'nonexistent-model'; rcs.use( @@ -741,7 +741,10 @@ describe('lightspeed router tests', () => { provider: 'test-server', query: 'Hello', }); - expect(response.statusCode).toEqual(500); + expect(response.statusCode).toEqual(404); + expect(response.body.error).toContain( + 'Error from lightspeed-core server', + ); }); }); diff --git a/workspaces/lightspeed/plugins/lightspeed-backend/src/service/router.ts b/workspaces/lightspeed/plugins/lightspeed-backend/src/service/router.ts index 38931d72f7..b415143dff 100644 --- a/workspaces/lightspeed/plugins/lightspeed-backend/src/service/router.ts +++ b/workspaces/lightspeed/plugins/lightspeed-backend/src/service/router.ts @@ -525,8 +525,7 @@ export async function createRouter( const errormsg = `Error from lightspeed-core server: ${errorBody.error?.message || errorBody?.detail?.cause || 'Unknown error'}`; logger.error(errormsg); - // Return a 500 status for any upstream error - response.status(500).json({ + response.status(fetchResponse.status).json({ error: errormsg, }); @@ -572,7 +571,7 @@ export async function createRouter( const errorBody = await fetchResponse.json(); const errormsg = `Error from lightspeed-core server: ${errorBody.error?.message || errorBody?.detail?.cause || 'Unknown error'}`; logger.error(errormsg); - response.status(500).json({ error: errormsg }); + response.status(fetchResponse.status).json({ error: errormsg }); return; } response.status(fetchResponse.status).json(await fetchResponse.json()); @@ -652,8 +651,7 @@ export async function createRouter( const errormsg = `Error from lightspeed-core server: ${errorBody.error?.message || errorBody?.detail?.cause || 'Unknown error'}`; logger.error(errormsg); - // Return a 500 status for any upstream error - response.status(500).json({ + response.status(fetchResponse.status).json({ error: errormsg, }); @@ -709,8 +707,7 @@ export async function createRouter( const errormsg = `Error from lightspeed-core server: ${errorBody.error?.message || errorBody?.detail?.cause || 'Unknown error'}`; logger.error(errormsg); - // Return a 500 status for any upstream error - response.status(500).json({ + response.status(fetchResponse.status).json({ error: errormsg, }); return;