diff --git a/server/routes/ombi.js b/server/routes/ombi.js index 80fc07b..2772d9d 100644 --- a/server/routes/ombi.js +++ b/server/routes/ombi.js @@ -225,9 +225,27 @@ router.post('/webhook/enable', requireAuth, async (req, res) => { // Call Ombi API to register webhook const axios = require('axios'); + + // Get existing settings to retrieve the database ID + const currentRes = await axios.get( + `${ombiInst.url}/api/v1/Settings/notifications/webhook`, + { + headers: { + 'ApiKey': ombiInst.apiKey + } + } + ).catch(err => { + logToFile(`[Ombi] Warning fetching existing webhook settings: ${err.message}`); + return { data: {} }; + }); + + const currentConfig = currentRes.data || {}; + const settingsId = currentConfig.id || 0; + const response = await axios.post( `${ombiInst.url}/api/v1/Settings/notifications/webhook`, { + id: settingsId, enabled: true, webhookUrl: webhookUrl, applicationToken: ombiInst.apiKey diff --git a/tests/integration/ombi.test.js b/tests/integration/ombi.test.js index ef1584d..bb9dcb8 100644 --- a/tests/integration/ombi.test.js +++ b/tests/integration/ombi.test.js @@ -850,7 +850,15 @@ describe('POST /api/ombi/webhook/enable', () => { it('enables webhook successfully', async () => { nock(OMBI_BASE) - .post('/api/v1/Settings/notifications/webhook') + .get('/api/v1/Settings/notifications/webhook') + .reply(200, { id: 42, enabled: false, webhookUrl: null, applicationToken: null }); + nock(OMBI_BASE) + .post('/api/v1/Settings/notifications/webhook', { + id: 42, + enabled: true, + webhookUrl: `${SOFARR_BASE}/api/webhook/ombi`, + applicationToken: 'test-ombi-key' + }) .reply(200, { success: true }); const { cookies, csrfToken } = await authenticateUser(app, 'TestUser', false); @@ -866,7 +874,34 @@ describe('POST /api/ombi/webhook/enable', () => { expect(res.body.applicationToken).toBe('test-ombi-key'); }); + it('enables webhook successfully even if GET settings fails', async () => { + nock(OMBI_BASE) + .get('/api/v1/Settings/notifications/webhook') + .reply(500, { error: 'Failed to fetch settings' }); + nock(OMBI_BASE) + .post('/api/v1/Settings/notifications/webhook', { + id: 0, + enabled: true, + webhookUrl: `${SOFARR_BASE}/api/webhook/ombi`, + applicationToken: 'test-ombi-key' + }) + .reply(200, { success: true }); + + const { cookies, csrfToken } = await authenticateUser(app, 'TestUser', false); + + const res = await request(app) + .post('/api/ombi/webhook/enable') + .set('Cookie', cookies) + .set('X-CSRF-Token', csrfToken) + .expect(200); + + expect(res.body.success).toBe(true); + }); + it('handles Ombi API errors gracefully', async () => { + nock(OMBI_BASE) + .get('/api/v1/Settings/notifications/webhook') + .reply(200, { id: 42 }); nock(OMBI_BASE) .post('/api/v1/Settings/notifications/webhook') .reply(500, { error: 'Internal server error' });