From 090a0d73acbad1a85db1603372d79b65e044392d Mon Sep 17 00:00:00 2001 From: Anso Date: Mon, 20 Jul 2026 20:29:17 -0400 Subject: [PATCH] feat: add configurable notification dispatch retries (#1655) * feat: add configurable notification dispatch retries Allow each node to set 0-3 extra in-process delivery attempts with a fixed one-second delay for routes, agents, and Test dispatch. * fix: harden notification retry settings load/save and channel tests Guard Delivery retries against failed and out-of-order same-node settings responses, and cover Slack/webhook retry classification alongside Discord. * fix: clear Delivery retries saving state and correct screenshot alt Separate save-request ownership from value-generation invalidation so a successful PATCH cannot leave Save retries stuck on Saving, reset saving on node switch, and align the Channels screenshot alt with the committed image. * fix: surface invalid notification retry settings instead of false saved clamp Align Channels GET handling with the backend strict 0-3 parser so stored values like 9 or 1.5 show as error needing repair, matching runtime fallback to 0 instead of displaying a clamped saved policy. --- .../__tests__/notification-apprise.test.ts | 3 + .../__tests__/notification-retries.test.ts | 337 ++++++++++++++++++ .../__tests__/notification-routing.test.ts | 7 +- .../notification-suppression.test.ts | 3 + backend/src/__tests__/settings-routes.test.ts | 58 +++ .../helpers/notificationDispatchRetries.ts | 16 + backend/src/routes/settings.ts | 11 + backend/src/services/DatabaseService.ts | 1 + backend/src/services/NotificationService.ts | 170 +++++++-- docs/features/alerts-notifications.mdx | 10 +- .../notifications-settings.png | Bin 105779 -> 101408 bytes docs/reference/settings.mdx | 2 + .../settings/NotificationsSection.tsx | 227 +++++++++++- .../settings/SettingsSectionContent.tsx | 2 +- .../__tests__/NotificationsSection.test.tsx | 325 ++++++++++++++++- frontend/src/components/settings/registry.ts | 2 +- frontend/src/components/settings/types.ts | 2 + .../lib/notificationDispatchRetries.test.ts | 21 ++ .../src/lib/notificationDispatchRetries.ts | 16 + 19 files changed, 1175 insertions(+), 38 deletions(-) create mode 100644 backend/src/__tests__/notification-retries.test.ts create mode 100644 backend/src/helpers/notificationDispatchRetries.ts create mode 100644 frontend/src/lib/notificationDispatchRetries.test.ts create mode 100644 frontend/src/lib/notificationDispatchRetries.ts diff --git a/backend/src/__tests__/notification-apprise.test.ts b/backend/src/__tests__/notification-apprise.test.ts index 503846dd..c6e27da1 100644 --- a/backend/src/__tests__/notification-apprise.test.ts +++ b/backend/src/__tests__/notification-apprise.test.ts @@ -11,6 +11,7 @@ const { mockGetStackLabelIds, mockAddNotificationHistory, mockUpdateNotificationDispatchError, + mockGetGlobalSettings, } = vi.hoisted(() => ({ mockGetEnabledNotificationRoutes: vi.fn().mockReturnValue([]), mockGetEnabledNotificationSuppressionRules: vi.fn().mockReturnValue([]), @@ -24,6 +25,7 @@ const { is_read: 0, }), mockUpdateNotificationDispatchError: vi.fn(), + mockGetGlobalSettings: vi.fn().mockReturnValue({ notification_dispatch_retries: '0' }), })); vi.mock('../services/DatabaseService', () => ({ @@ -35,6 +37,7 @@ vi.mock('../services/DatabaseService', () => ({ getStackLabelIds: mockGetStackLabelIds, addNotificationHistory: mockAddNotificationHistory, updateNotificationDispatchError: mockUpdateNotificationDispatchError, + getGlobalSettings: mockGetGlobalSettings, }), }, })); diff --git a/backend/src/__tests__/notification-retries.test.ts b/backend/src/__tests__/notification-retries.test.ts new file mode 100644 index 00000000..9eebbbaf --- /dev/null +++ b/backend/src/__tests__/notification-retries.test.ts @@ -0,0 +1,337 @@ +/** + * Configurable in-process notification dispatch retries. + */ +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; + +const { + mockGetEnabledNotificationRoutes, + mockGetEnabledNotificationSuppressionRules, + mockGetEnabledAgents, + mockGetStackLabelIds, + mockAddNotificationHistory, + mockUpdateNotificationDispatchError, + mockGetGlobalSettings, +} = vi.hoisted(() => ({ + mockGetEnabledNotificationRoutes: vi.fn().mockReturnValue([]), + mockGetEnabledNotificationSuppressionRules: vi.fn().mockReturnValue([]), + mockGetEnabledAgents: vi.fn().mockReturnValue([]), + mockGetStackLabelIds: vi.fn().mockReturnValue([]), + mockAddNotificationHistory: vi.fn().mockReturnValue({ + id: 42, + level: 'error', + message: 'test', + timestamp: Date.now(), + is_read: 0, + }), + mockUpdateNotificationDispatchError: vi.fn(), + mockGetGlobalSettings: vi.fn().mockReturnValue({ notification_dispatch_retries: '0' }), +})); + +vi.mock('../services/DatabaseService', () => ({ + DatabaseService: { + getInstance: () => ({ + getEnabledNotificationRoutes: mockGetEnabledNotificationRoutes, + getEnabledNotificationSuppressionRules: mockGetEnabledNotificationSuppressionRules, + getEnabledAgents: mockGetEnabledAgents, + getStackLabelIds: mockGetStackLabelIds, + addNotificationHistory: mockAddNotificationHistory, + updateNotificationDispatchError: mockUpdateNotificationDispatchError, + getGlobalSettings: mockGetGlobalSettings, + }), + }, +})); + +vi.mock('../services/NodeRegistry', () => ({ + NodeRegistry: { + getInstance: () => ({ + getDefaultNodeId: () => 1, + getComposeDir: () => '/app/compose', + }), + }, +})); + +vi.mock('../services/StackActivityMetricsService', () => ({ + StackActivityMetricsService: { + getInstance: () => ({ record: vi.fn() }), + }, +})); + +import { NotificationService } from '../services/NotificationService'; + +const DISCORD = 'https://discord.com/api/webhooks/1/token'; + +function makeRoute(overrides: Record = {}) { + return { + id: 1, + name: 'Prod Discord', + node_id: null as number | null, + stack_patterns: [] as string[], + label_ids: null as number[] | null, + categories: null as string[] | null, + levels: null as ('info' | 'warning' | 'error')[] | null, + channel_type: 'discord' as const, + channel_url: DISCORD, + priority: 0, + enabled: true, + created_at: Date.now(), + updated_at: Date.now(), + ...overrides, + }; +} + +describe('notification dispatch retries', () => { + let svc: NotificationService; + let mockFetch: ReturnType; + + beforeEach(() => { + (NotificationService as unknown as { instance?: NotificationService }).instance = undefined; + NotificationService.setRetryDelayMsForTests(0); + svc = NotificationService.getInstance(); + mockFetch = vi.fn().mockResolvedValue({ ok: true, status: 200 }); + vi.stubGlobal('fetch', mockFetch); + mockGetEnabledNotificationRoutes.mockReturnValue([]); + mockGetEnabledNotificationSuppressionRules.mockReturnValue([]); + mockGetEnabledAgents.mockReturnValue([]); + mockGetStackLabelIds.mockReturnValue([]); + mockUpdateNotificationDispatchError.mockClear(); + mockAddNotificationHistory.mockClear(); + mockGetGlobalSettings.mockReset(); + mockGetGlobalSettings.mockReturnValue({ notification_dispatch_retries: '0' }); + }); + + afterEach(() => { + NotificationService.setRetryDelayMsForTests(1000); + vi.unstubAllGlobals(); + }); + + it('retries=0 performs a single fetch', async () => { + mockGetGlobalSettings.mockReturnValue({ notification_dispatch_retries: '0' }); + mockGetEnabledNotificationRoutes.mockReturnValue([makeRoute()]); + mockFetch.mockResolvedValue({ ok: false, status: 500 }); + + await svc.dispatchAlert('error', 'monitor_alert', 'down'); + + expect(mockFetch).toHaveBeenCalledTimes(1); + expect(mockGetGlobalSettings).toHaveBeenCalledTimes(1); + }); + + it('retries=2 on persistent 5xx performs three attempts', async () => { + mockGetGlobalSettings.mockReturnValue({ notification_dispatch_retries: '2' }); + mockGetEnabledNotificationRoutes.mockReturnValue([makeRoute()]); + mockFetch.mockResolvedValue({ ok: false, status: 502 }); + + await svc.dispatchAlert('error', 'monitor_alert', 'down'); + + expect(mockFetch).toHaveBeenCalledTimes(3); + expect(mockUpdateNotificationDispatchError).toHaveBeenCalledWith( + 42, + expect.stringContaining('HTTP 502'), + ); + }); + + it('uses a fixed 1s delay between retryable attempts in production config', async () => { + NotificationService.setRetryDelayMsForTests(1000); + vi.useFakeTimers(); + mockGetGlobalSettings.mockReturnValue({ notification_dispatch_retries: '1' }); + mockGetEnabledNotificationRoutes.mockReturnValue([makeRoute()]); + mockFetch + .mockResolvedValueOnce({ ok: false, status: 503 }) + .mockResolvedValueOnce({ ok: true, status: 200 }); + + try { + const p = svc.dispatchAlert('error', 'monitor_alert', 'down'); + // First attempt runs immediately; do not advance AbortSignal.timeout (10s). + await vi.advanceTimersByTimeAsync(0); + await Promise.resolve(); + expect(mockFetch).toHaveBeenCalledTimes(1); + await vi.advanceTimersByTimeAsync(999); + expect(mockFetch).toHaveBeenCalledTimes(1); + await vi.advanceTimersByTimeAsync(1); + await p; + expect(mockFetch).toHaveBeenCalledTimes(2); + } finally { + vi.useRealTimers(); + } + }); + + it('stops after success on the second attempt', async () => { + mockGetGlobalSettings.mockReturnValue({ notification_dispatch_retries: '2' }); + mockGetEnabledNotificationRoutes.mockReturnValue([makeRoute()]); + mockFetch + .mockResolvedValueOnce({ ok: false, status: 503 }) + .mockResolvedValueOnce({ ok: true, status: 200 }); + + await svc.dispatchAlert('error', 'monitor_alert', 'down'); + + expect(mockFetch).toHaveBeenCalledTimes(2); + expect(mockUpdateNotificationDispatchError).not.toHaveBeenCalled(); + expect(mockAddNotificationHistory).toHaveBeenCalledTimes(1); + }); + + it('does not retry non-retryable 4xx', async () => { + mockGetGlobalSettings.mockReturnValue({ notification_dispatch_retries: '3' }); + mockGetEnabledNotificationRoutes.mockReturnValue([makeRoute()]); + mockFetch.mockResolvedValue({ ok: false, status: 404 }); + + await svc.dispatchAlert('error', 'monitor_alert', 'down'); + + expect(mockFetch).toHaveBeenCalledTimes(1); + }); + + it('reads settings once for multi-destination fanout', async () => { + mockGetGlobalSettings.mockReturnValue({ notification_dispatch_retries: '1' }); + mockGetEnabledNotificationRoutes.mockReturnValue([ + makeRoute({ id: 1, name: 'A', channel_url: `${DISCORD}-a` }), + makeRoute({ id: 2, name: 'B', channel_url: `${DISCORD}-b` }), + ]); + mockFetch.mockResolvedValue({ ok: true, status: 200 }); + + await svc.dispatchAlert('error', 'monitor_alert', 'down'); + + expect(mockGetGlobalSettings).toHaveBeenCalledTimes(1); + expect(mockFetch).toHaveBeenCalledTimes(2); + }); + + it('falls back to zero retries when settings throw and still sends once', async () => { + mockGetGlobalSettings.mockImplementation(() => { + throw new Error('db down'); + }); + mockGetEnabledNotificationRoutes.mockReturnValue([makeRoute()]); + mockFetch.mockResolvedValue({ ok: false, status: 500 }); + + await svc.dispatchAlert('error', 'monitor_alert', 'down'); + + expect(mockFetch).toHaveBeenCalledTimes(1); + }); + + it('falls back to zero retries for corrupt stored values', async () => { + mockGetGlobalSettings.mockReturnValue({ notification_dispatch_retries: '9' }); + mockGetEnabledNotificationRoutes.mockReturnValue([makeRoute()]); + mockFetch.mockResolvedValue({ ok: false, status: 500 }); + + await svc.dispatchAlert('error', 'monitor_alert', 'down'); + + expect(mockFetch).toHaveBeenCalledTimes(1); + }); + + it('does not retry unsupported channel types', async () => { + mockGetGlobalSettings.mockReturnValue({ notification_dispatch_retries: '2' }); + mockGetEnabledNotificationRoutes.mockReturnValue([ + makeRoute({ channel_type: 'sms' as 'discord', channel_url: 'https://example.com' }), + ]); + + await svc.dispatchAlert('error', 'monitor_alert', 'down'); + + expect(mockFetch).not.toHaveBeenCalled(); + expect(mockUpdateNotificationDispatchError).toHaveBeenCalledWith( + 42, + expect.stringContaining('Unsupported channel type'), + ); + }); + + it('aggregates final errors from multiple failed destinations', async () => { + mockGetGlobalSettings.mockReturnValue({ notification_dispatch_retries: '0' }); + mockGetEnabledNotificationRoutes.mockReturnValue([ + makeRoute({ id: 1, name: 'One', channel_url: `${DISCORD}-1` }), + makeRoute({ id: 2, name: 'Two', channel_url: `${DISCORD}-2` }), + ]); + mockFetch + .mockResolvedValueOnce({ ok: false, status: 500 }) + .mockResolvedValueOnce({ ok: false, status: 503 }); + + await svc.dispatchAlert('error', 'monitor_alert', 'down'); + + const joined = mockUpdateNotificationDispatchError.mock.calls[0][1] as string; + expect(joined).toContain('Route "One"'); + expect(joined).toContain('Route "Two"'); + }); + + it('records the last attempt message for a destination after retries', async () => { + mockGetGlobalSettings.mockReturnValue({ notification_dispatch_retries: '1' }); + mockGetEnabledNotificationRoutes.mockReturnValue([makeRoute({ name: 'Flaky' })]); + mockFetch + .mockResolvedValueOnce({ ok: false, status: 500 }) + .mockResolvedValueOnce({ ok: false, status: 503 }); + + await svc.dispatchAlert('error', 'monitor_alert', 'down'); + + const joined = mockUpdateNotificationDispatchError.mock.calls[0][1] as string; + expect(joined).toContain('HTTP 503'); + expect(joined).not.toContain('HTTP 500'); + }); + + describe('channel retry classification matrix', () => { + const channels: Array<{ type: 'discord' | 'slack' | 'webhook'; url: string }> = [ + { type: 'discord', url: DISCORD }, + { type: 'slack', url: 'https://hooks.slack.com/services/T/B/X' }, + { type: 'webhook', url: 'https://example.com/hooks/sencho' }, + ]; + + for (const channel of channels) { + it(`${channel.type}: does not retry non-retryable 4xx`, async () => { + mockGetGlobalSettings.mockReturnValue({ notification_dispatch_retries: '3' }); + mockGetEnabledNotificationRoutes.mockReturnValue([ + makeRoute({ channel_type: channel.type, channel_url: channel.url }), + ]); + mockFetch.mockResolvedValue({ ok: false, status: 404 }); + + await svc.dispatchAlert('error', 'monitor_alert', 'down'); + + expect(mockFetch).toHaveBeenCalledTimes(1); + }); + + it(`${channel.type}: retries persistent 5xx for configured extras`, async () => { + mockGetGlobalSettings.mockReturnValue({ notification_dispatch_retries: '2' }); + mockGetEnabledNotificationRoutes.mockReturnValue([ + makeRoute({ channel_type: channel.type, channel_url: channel.url }), + ]); + mockFetch.mockResolvedValue({ ok: false, status: 502 }); + + await svc.dispatchAlert('error', 'monitor_alert', 'down'); + + expect(mockFetch).toHaveBeenCalledTimes(3); + }); + + it(`${channel.type}: stops after a successful retry`, async () => { + mockGetGlobalSettings.mockReturnValue({ notification_dispatch_retries: '2' }); + mockGetEnabledNotificationRoutes.mockReturnValue([ + makeRoute({ channel_type: channel.type, channel_url: channel.url }), + ]); + mockFetch + .mockResolvedValueOnce({ ok: false, status: 503 }) + .mockResolvedValueOnce({ ok: true, status: 200 }); + + await svc.dispatchAlert('error', 'monitor_alert', 'down'); + + expect(mockFetch).toHaveBeenCalledTimes(2); + expect(mockUpdateNotificationDispatchError).not.toHaveBeenCalled(); + }); + } + }); + + + describe('testDispatch parity', () => { + it('retries a retryable failure then succeeds', async () => { + mockGetGlobalSettings.mockReturnValue({ notification_dispatch_retries: '1' }); + mockFetch + .mockResolvedValueOnce({ ok: false, status: 502 }) + .mockResolvedValueOnce({ ok: true, status: 200 }); + + await svc.testDispatch('discord', DISCORD); + + expect(mockGetGlobalSettings).toHaveBeenCalledTimes(1); + expect(mockFetch).toHaveBeenCalledTimes(2); + }); + + it('does not retry a non-retryable test failure', async () => { + mockGetGlobalSettings.mockReturnValue({ notification_dispatch_retries: '3' }); + mockFetch.mockResolvedValue({ ok: false, status: 401 }); + + await expect(svc.testDispatch('discord', DISCORD)).rejects.toMatchObject({ + status: 401, + retryable: false, + }); + expect(mockFetch).toHaveBeenCalledTimes(1); + }); + }); +}); diff --git a/backend/src/__tests__/notification-routing.test.ts b/backend/src/__tests__/notification-routing.test.ts index 275fbc6d..1bb7dc6a 100644 --- a/backend/src/__tests__/notification-routing.test.ts +++ b/backend/src/__tests__/notification-routing.test.ts @@ -13,6 +13,7 @@ const { mockGetStackLabelIds, mockAddNotificationHistory, mockUpdateNotificationDispatchError, + mockGetGlobalSettings, } = vi.hoisted(() => ({ mockGetEnabledNotificationRoutes: vi.fn().mockReturnValue([]), mockGetEnabledNotificationSuppressionRules: vi.fn().mockReturnValue([]), @@ -26,6 +27,7 @@ const { is_read: 0, }), mockUpdateNotificationDispatchError: vi.fn(), + mockGetGlobalSettings: vi.fn().mockReturnValue({ notification_dispatch_retries: '0' }), })); vi.mock('../services/DatabaseService', () => ({ @@ -37,6 +39,7 @@ vi.mock('../services/DatabaseService', () => ({ getStackLabelIds: mockGetStackLabelIds, addNotificationHistory: mockAddNotificationHistory, updateNotificationDispatchError: mockUpdateNotificationDispatchError, + getGlobalSettings: mockGetGlobalSettings, }), }, })); @@ -301,7 +304,7 @@ describe('NotificationService - routing logic', () => { expect(mockUpdateNotificationDispatchError).toHaveBeenCalledWith( 1, // notification id from mock - expect.stringContaining('Connection refused') + expect.stringContaining('Discord webhook request failed') ); }); @@ -314,7 +317,7 @@ describe('NotificationService - routing logic', () => { expect(mockUpdateNotificationDispatchError).toHaveBeenCalledWith( 1, - expect.stringContaining('Timeout') + expect.stringContaining('Slack webhook request failed') ); }); diff --git a/backend/src/__tests__/notification-suppression.test.ts b/backend/src/__tests__/notification-suppression.test.ts index fade91e1..5c03d0da 100644 --- a/backend/src/__tests__/notification-suppression.test.ts +++ b/backend/src/__tests__/notification-suppression.test.ts @@ -12,6 +12,7 @@ const { mockGetEnabledNotificationSuppressionRules, mockUpdateNotificationSuppressionMatch, mockBroadcast, + mockGetGlobalSettings, } = vi.hoisted(() => ({ mockGetEnabledNotificationRoutes: vi.fn().mockReturnValue([]), mockGetEnabledAgents: vi.fn().mockReturnValue([]), @@ -27,6 +28,7 @@ const { mockGetEnabledNotificationSuppressionRules: vi.fn().mockReturnValue([]), mockUpdateNotificationSuppressionMatch: vi.fn(), mockBroadcast: vi.fn(), + mockGetGlobalSettings: vi.fn().mockReturnValue({ notification_dispatch_retries: '0' }), })); vi.mock('../services/DatabaseService', () => ({ @@ -39,6 +41,7 @@ vi.mock('../services/DatabaseService', () => ({ updateNotificationDispatchError: mockUpdateNotificationDispatchError, getEnabledNotificationSuppressionRules: mockGetEnabledNotificationSuppressionRules, updateNotificationSuppressionMatch: mockUpdateNotificationSuppressionMatch, + getGlobalSettings: mockGetGlobalSettings, }), }, })); diff --git a/backend/src/__tests__/settings-routes.test.ts b/backend/src/__tests__/settings-routes.test.ts index 2afd30ac..83c11dc6 100644 --- a/backend/src/__tests__/settings-routes.test.ts +++ b/backend/src/__tests__/settings-routes.test.ts @@ -338,6 +338,64 @@ describe('health gate settings', () => { }); }); +describe('notification_dispatch_retries setting', () => { + it('seeds to "0" in a fresh database', () => { + expect(DatabaseService.getInstance().getGlobalSettings().notification_dispatch_retries).toBe('0'); + }); + + it('is exposed through the settings GET projection', async () => { + const res = await request(app).get('/api/settings').set('Cookie', adminCookie); + expect(res.status).toBe(200); + expect(res.body.notification_dispatch_retries).toBe('0'); + }); + + it('accepts integer number and digit-string writes via POST and PATCH', async () => { + const postNum = await request(app) + .post('/api/settings') + .set('Cookie', adminCookie) + .send({ key: 'notification_dispatch_retries', value: 2 }); + expect(postNum.status).toBe(200); + expect(DatabaseService.getInstance().getGlobalSettings().notification_dispatch_retries).toBe('2'); + + const patchStr = await request(app) + .patch('/api/settings') + .set('Cookie', adminCookie) + .send({ notification_dispatch_retries: '3' }); + expect(patchStr.status).toBe(200); + expect(DatabaseService.getInstance().getGlobalSettings().notification_dispatch_retries).toBe('3'); + + DatabaseService.getInstance().updateGlobalSetting('notification_dispatch_retries', '0'); + }); + + it('rejects malformed values on POST and PATCH without persisting', async () => { + const before = DatabaseService.getInstance().getGlobalSettings().notification_dispatch_retries; + + for (const value of [null, true, false, '', ' ', '1.5', '-1', 4, '4', 'abc']) { + const post = await request(app) + .post('/api/settings') + .set('Cookie', adminCookie) + .send({ key: 'notification_dispatch_retries', value }); + expect(post.status).toBe(400); + + const patch = await request(app) + .patch('/api/settings') + .set('Cookie', adminCookie) + .send({ notification_dispatch_retries: value }); + expect(patch.status).toBe(400); + } + + expect(DatabaseService.getInstance().getGlobalSettings().notification_dispatch_retries).toBe(before); + }); + + it('rejects a non-admin write with 403', async () => { + const res = await request(app) + .post('/api/settings') + .set('Cookie', viewerCookie) + .send({ key: 'notification_dispatch_retries', value: '1' }); + expect(res.status).toBe(403); + }); +}); + describe('env_block_deploy_on_missing_required setting', () => { it('seeds to "0" (opt-in) in a fresh database', () => { expect(DatabaseService.getInstance().getGlobalSettings().env_block_deploy_on_missing_required).toBe('0'); diff --git a/backend/src/helpers/notificationDispatchRetries.ts b/backend/src/helpers/notificationDispatchRetries.ts new file mode 100644 index 00000000..550fc5cd --- /dev/null +++ b/backend/src/helpers/notificationDispatchRetries.ts @@ -0,0 +1,16 @@ +/** + * Strict parser for notification_dispatch_retries (extra attempts, 0..3). + * Accepts JSON number integers or single-digit strings "0".."3" only. + * Rejects null, booleans, empty/whitespace, decimals, and out-of-range values. + */ +export function parseNotificationDispatchRetries(raw: unknown): number | null { + if (typeof raw === 'number') { + if (!Number.isInteger(raw) || raw < 0 || raw > 3) return null; + return raw; + } + if (typeof raw === 'string') { + if (!/^[0-3]$/.test(raw)) return null; + return Number(raw); + } + return null; +} diff --git a/backend/src/routes/settings.ts b/backend/src/routes/settings.ts index 7919ebfc..782b13c2 100644 --- a/backend/src/routes/settings.ts +++ b/backend/src/routes/settings.ts @@ -3,6 +3,7 @@ import { z } from 'zod'; import { DatabaseService } from '../services/DatabaseService'; import { authMiddleware } from '../middleware/auth'; import { requireAdmin, requirePaid } from '../middleware/tierGates'; +import { parseNotificationDispatchRetries } from '../helpers/notificationDispatchRetries'; // Strict allowlist of keys readable and writable via the generic settings // API. This is the single source of truth for what the endpoint exposes: @@ -34,6 +35,7 @@ const ALLOWED_SETTING_KEYS = new Set([ 'env_block_deploy_on_missing_required', 'auto_create_missing_external_networks', 'image_update_sidebar_indicators', + 'notification_dispatch_retries', ]); // Keys whose write requires a paid license, not just an admin role. @@ -66,6 +68,15 @@ const SettingsPatchSchema = z.object({ env_block_deploy_on_missing_required: z.enum(['0', '1']), auto_create_missing_external_networks: z.enum(['0', '1']), image_update_sidebar_indicators: z.enum(['0', '1']), + // Strict: do not use bare z.coerce.number() (null/false/'' become 0; true becomes 1). + notification_dispatch_retries: z.unknown().superRefine((v, ctx) => { + if (parseNotificationDispatchRetries(v) === null) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: 'Must be an integer from 0 to 3', + }); + } + }).transform((v) => String(parseNotificationDispatchRetries(v)!)), }).partial(); export const settingsRouter = Router(); diff --git a/backend/src/services/DatabaseService.ts b/backend/src/services/DatabaseService.ts index 973c032d..5f7cce45 100644 --- a/backend/src/services/DatabaseService.ts +++ b/backend/src/services/DatabaseService.ts @@ -1826,6 +1826,7 @@ export class DatabaseService { stmt.run('image_update_check_mode', 'interval'); stmt.run('image_update_check_cron', ''); stmt.run('image_update_sidebar_indicators', '1'); + stmt.run('notification_dispatch_retries', '0'); stmt.run('env_block_deploy_on_missing_required', '0'); stmt.run('auto_create_missing_external_networks', '0'); diff --git a/backend/src/services/NotificationService.ts b/backend/src/services/NotificationService.ts index d1ea2542..b1f139ac 100644 --- a/backend/src/services/NotificationService.ts +++ b/backend/src/services/NotificationService.ts @@ -19,6 +19,7 @@ import { parseStoredAppriseConfig, validateNotificationChannel, } from '../helpers/notificationChannels'; +import { parseNotificationDispatchRetries } from '../helpers/notificationDispatchRetries'; export type NotificationCategory = | 'deploy_success' @@ -71,6 +72,13 @@ export const ALL_SUPPRESSIBLE_CATEGORIES: readonly NotificationCategory[] = [ /** Webhook timeout: 10 seconds per external dispatch call. */ const WEBHOOK_TIMEOUT_MS = 10_000; +/** Fixed delay between retryable delivery attempts (extra attempts only). */ +const RETRY_DELAY_MS_DEFAULT = 1_000; + +function sleep(ms: number): Promise { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + /** Valid notification channel types for defense-in-depth validation. */ const ALLOWED_CHANNEL_TYPES = new Set(['discord', 'slack', 'webhook', 'apprise']); @@ -84,6 +92,8 @@ export class NotificationService { private static instance: NotificationService; private dbService: DatabaseService; private readonly subscribers = new Set(); + /** Overridable in tests so retry loops need not wait a real second. */ + private static retryDelayMs = RETRY_DELAY_MS_DEFAULT; private constructor() { this.dbService = DatabaseService.getInstance(); @@ -96,6 +106,11 @@ export class NotificationService { return NotificationService.instance; } + /** @internal Test-only: set the inter-attempt delay (production uses 1000). */ + public static setRetryDelayMsForTests(ms: number): void { + NotificationService.retryDelayMs = ms; + } + /** * Register a WebSocket as a live-notification subscriber. Returns an * unsubscribe function the caller should invoke on `'close'` / `'error'` @@ -256,6 +271,9 @@ export class NotificationService { return; } + // Resolve retry extras once for this dispatch (shared by all destinations). + const retries = this.resolveDispatchRetries(); + // 3. Check notification routing rules โ€” always evaluated, matchers compose AND const errors: string[] = []; @@ -264,7 +282,7 @@ export class NotificationService { if (isDebugEnabled()) console.log(`[Notify:diag] Matched ${matched.length} route(s) for stack "${sanitizeForLog(stackName ?? '(none)')}", category="${sanitizeForLog(category)}"`); await Promise.allSettled( matched.map(route => - this.sendToChannel(route.channel_type, route.channel_url, level, sanitized, route.config) + this.sendWithRetries(route.channel_type, route.channel_url, level, sanitized, route.config, retries) .then(() => { if (isDebugEnabled()) console.log(`[Notify:diag] Dispatched ${level} via route "${sanitizeForLog(route.name)}" (${route.channel_type})`); }) @@ -288,7 +306,7 @@ export class NotificationService { if (isDebugEnabled()) console.log(`[Notify:diag] Falling back to ${agents.length} global agent(s)`); await Promise.allSettled( agents.map(agent => - this.sendToChannel(agent.type, agent.url, level, sanitized, agent.config) + this.sendWithRetries(agent.type, agent.url, level, sanitized, agent.config, retries) .then(() => { if (isDebugEnabled()) console.log(`[Notify:diag] Dispatched ${level} via global agent (${agent.type})`); }) @@ -304,6 +322,25 @@ export class NotificationService { } } + /** + * Read notification_dispatch_retries once. Missing, malformed, out-of-range, + * or thrown settings reads fall back to 0 so the initial send still happens. + */ + private resolveDispatchRetries(): number { + try { + const raw = this.dbService.getGlobalSettings().notification_dispatch_retries; + const parsed = parseNotificationDispatchRetries(raw); + if (parsed === null) { + console.warn('[Notify] Invalid notification_dispatch_retries; using 0'); + return 0; + } + return parsed; + } catch (err) { + console.warn('[Notify] Failed to read notification_dispatch_retries; using 0:', err); + return 0; + } + } + /** Persist dispatch errors to the notification record for user visibility. */ private recordDispatchErrors(notificationId: number, errors: string[]) { if (errors.length > 0) { @@ -315,6 +352,43 @@ export class NotificationService { } } + /** + * Deliver with up to `retries` extra attempts after the first try. + * Waits a fixed 1s between attempts only when a retryable failure leaves attempts remaining. + */ + private async sendWithRetries( + type: string, + url: string, + level: 'info' | 'warning' | 'error', + message: string, + config: string | null | undefined, + retries: number, + ): Promise { + const totalAttempts = 1 + retries; + let lastError: NotificationDeliveryError | undefined; + for (let attempt = 0; attempt < totalAttempts; attempt++) { + try { + await this.sendToChannel(type, url, level, message, config); + return; + } catch (error) { + const deliveryError = error instanceof NotificationDeliveryError + ? error + : new NotificationDeliveryError( + getErrorMessage(error, 'Notification delivery failed'), + null, + false, + ); + lastError = deliveryError; + const attemptsRemain = attempt < totalAttempts - 1; + if (!deliveryError.retryable || !attemptsRemain) { + throw deliveryError; + } + await sleep(NotificationService.retryDelayMs); + } + } + throw lastError ?? new NotificationDeliveryError('Notification delivery failed', null, false); + } + private async sendToChannel(type: string, url: string, level: 'info' | 'warning' | 'error', message: string, config?: string | null): Promise { if (type === 'discord') { await this.sendDiscordWebhook(url, level, message); @@ -329,7 +403,7 @@ export class NotificationService { } await this.sendAppriseNotify(url, level, message, parsed); } else { - throw new Error(`Unsupported channel type: ${type}`); + throw new NotificationDeliveryError(`Unsupported channel type: ${type}`, null, false); } } @@ -338,7 +412,8 @@ export class NotificationService { const validation = validateNotificationChannel(type, url, config); if (validation) throw new Error(`URL ${validation}`); const stored = type === 'apprise' ? normalizeAppriseStoredJson(url, config) : (config == null ? null : JSON.stringify(config)); - await this.sendToChannel(type, url, 'info', '๐Ÿ”Œ Test Notification from Sencho!', stored); + const retries = this.resolveDispatchRetries(); + await this.sendWithRetries(type, url, 'info', '๐Ÿ”Œ Test Notification from Sencho!', stored, retries); } private async sendAppriseNotify( @@ -393,15 +468,28 @@ export class NotificationService { }] }; - const response = await fetch(url, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(payload), - signal: AbortSignal.timeout(WEBHOOK_TIMEOUT_MS), - }); + try { + const response = await fetch(url, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(payload), + signal: AbortSignal.timeout(WEBHOOK_TIMEOUT_MS), + }); - if (!response.ok) { - throw new Error(`Discord Webhook responded with ${response.status}`); + if (response.status >= 400 && response.status < 500) { + throw new NotificationDeliveryError(`Discord webhook responded with HTTP ${response.status}`, response.status, false); + } + if (!response.ok) { + throw new NotificationDeliveryError(`Discord webhook responded with HTTP ${response.status}`, response.status, true); + } + } catch (error) { + if (error instanceof NotificationDeliveryError) throw error; + const aborted = error instanceof Error && (error.name === 'AbortError' || error.name === 'TimeoutError'); + throw new NotificationDeliveryError( + aborted ? 'Discord webhook request timed out' : 'Discord webhook request failed', + null, + true, + ); } } @@ -416,15 +504,28 @@ export class NotificationService { text: `${emojiMap[level]} *Sencho Alert [${level.toUpperCase()}]*\n${message}` }; - const response = await fetch(url, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(payload), - signal: AbortSignal.timeout(WEBHOOK_TIMEOUT_MS), - }); + try { + const response = await fetch(url, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(payload), + signal: AbortSignal.timeout(WEBHOOK_TIMEOUT_MS), + }); - if (!response.ok) { - throw new Error(`Slack Webhook responded with ${response.status}`); + if (response.status >= 400 && response.status < 500) { + throw new NotificationDeliveryError(`Slack webhook responded with HTTP ${response.status}`, response.status, false); + } + if (!response.ok) { + throw new NotificationDeliveryError(`Slack webhook responded with HTTP ${response.status}`, response.status, true); + } + } catch (error) { + if (error instanceof NotificationDeliveryError) throw error; + const aborted = error instanceof Error && (error.name === 'AbortError' || error.name === 'TimeoutError'); + throw new NotificationDeliveryError( + aborted ? 'Slack webhook request timed out' : 'Slack webhook request failed', + null, + true, + ); } } @@ -436,15 +537,28 @@ export class NotificationService { source: 'sencho' }; - const response = await fetch(url, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(payload), - signal: AbortSignal.timeout(WEBHOOK_TIMEOUT_MS), - }); + try { + const response = await fetch(url, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(payload), + signal: AbortSignal.timeout(WEBHOOK_TIMEOUT_MS), + }); - if (!response.ok) { - throw new Error(`Custom Webhook responded with ${response.status}`); + if (response.status >= 400 && response.status < 500) { + throw new NotificationDeliveryError(`Custom webhook responded with HTTP ${response.status}`, response.status, false); + } + if (!response.ok) { + throw new NotificationDeliveryError(`Custom webhook responded with HTTP ${response.status}`, response.status, true); + } + } catch (error) { + if (error instanceof NotificationDeliveryError) throw error; + const aborted = error instanceof Error && (error.name === 'AbortError' || error.name === 'TimeoutError'); + throw new NotificationDeliveryError( + aborted ? 'Custom webhook request timed out' : 'Custom webhook request failed', + null, + true, + ); } } } diff --git a/docs/features/alerts-notifications.mdx b/docs/features/alerts-notifications.mdx index 4987b5a9..ff612474 100644 --- a/docs/features/alerts-notifications.mdx +++ b/docs/features/alerts-notifications.mdx @@ -7,13 +7,15 @@ description: Threshold and event alerts for your fleet, dispatched to Discord, S Sencho watches each node it manages for container crashes, host pressure, scheduled-task results, and update availability, then surfaces every signal in two places: the in-app notification bell at the top of the shell and an external channel you configure. This page covers everything from configuring channels to writing per-stack threshold rules, routing alerts to dedicated channels with routing rules, and tuning retention. - Settings ยท Notifications ยท Channels panel with Discord, Slack, Webhook, and Apprise tabs, CHANNELS 1/4 in the masthead, the Apprise tab active with Enabled on, a redacted Apprise endpoint, an empty Tags field, and Test disabled beside Save. + Settings ยท Notifications ยท Channels panel with NODE Local in the header, a Delivery retries row showing Extra attempts 0 and a Save retries button, Discord Slack Webhook and Apprise tabs with Apprise selected, Enabled off, an empty Apprise endpoint placeholder, and Test beside Save. ## Notification channels Open **Settings ยท Notifications ยท Channels** to configure Discord, Slack, custom webhook, and Apprise channels. Each channel is per-node, so switching the active node via the node picker reloads the panel against that node's stored settings. The masthead carries a `CHANNELS` stat showing how many of the four slots are enabled. +Above the channel tabs, **Delivery retries** sets how many extra in-process attempts (0 to 3) Sencho makes after a transient delivery failure on that node. The default is `0` (single-shot). Extra attempts wait a fixed one second between tries. Admin role is required to change the value. + Each Discord, Slack, and Webhook tab carries an **Enabled** toggle, a **Webhook URL** input (HTTPS only), and **Test** / **Save**. The Apprise tab uses an **Apprise endpoint** instead: keyed `/notify/{key}` shows optional **Tags**; stateless `/notify` shows **Destination URLs**. The kicker on each tab toggles between `enabled` and `off` so you can see at a glance which slots are wired up. @@ -51,9 +53,9 @@ Sencho sends the alert title, body, severity, and either tags or destination URL ### Test sends and delivery semantics -The **Test** button on each tab dispatches the literal message `๐Ÿ”Œ Test Notification from Sencho!` at level `info` through the same path a real alert would take. Test sends require the admin role; the server returns 403 if an operator or viewer submits one. +The **Test** button on each tab dispatches the literal message `๐Ÿ”Œ Test Notification from Sencho!` at level `info` through the same path a real alert would take, including the node's delivery-retries setting. Test sends require the admin role; the server returns 403 if an operator or viewer submits one. -Each dispatch is a single-shot HTTP POST with a 10-second `AbortSignal.timeout`. There is no retry queue. If your endpoint is down at the moment of the dispatch, the alert is recorded in the bell with an internal `dispatch_error` field set and is not redelivered. +Each delivery attempt is an HTTP POST with a 10-second `AbortSignal.timeout`. By default (`Delivery retries` = 0) Sencho makes one attempt. You can allow up to three extra in-process attempts with a fixed one-second delay between them. Retries apply only to classified transient failures (for example HTTP 5xx or network timeouts). Client errors such as HTTP 4xx and Apprise HTTP 204 are not retried. There is no durable retry queue: if the process exits mid-dispatch, remaining attempts are not persisted. Delivery is at-least-once under ambiguous timeouts or connection resets, so a receiver that accepted a request whose response was lost can receive a duplicate. If every attempt fails, the alert remains in the bell with `dispatch_error` set. ## Notification Routing @@ -421,7 +423,7 @@ The **Host Alerts** panel carries the **Host thresholds** rows (CPU limit, RAM l | Per-stack alert rule evaluation | 30 seconds | | Image update poll | Configurable (default every 2 hours), with a 2-minute startup delay and a 2-minute cooldown on manual refresh | | Sencho version check | Monitor evaluation every 30 seconds; shared version cache refreshes every 30 minutes when published or every 3 minutes while publish is pending | -| Notification fanout to channels | Single shot per dispatch, 10-second timeout, no retries | +| Notification fanout to channels | One attempt by default; optional 0-3 extra in-process attempts with a fixed 1s delay; 10-second timeout per attempt; no durable queue | | Bell live updates | Pushed live over the notifications WebSocket per node | | Bell safety-net reconcile | 60 seconds | | Crash dedup window per container | 60 minutes | diff --git a/docs/images/alerts-notifications/notifications-settings.png b/docs/images/alerts-notifications/notifications-settings.png index 85004f3a076e4068a4c7b11070389a9a0ead1de8..cc44884b132eeff619e407d423fb1d9e2cadea34 100644 GIT binary patch literal 101408 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
W*btYghg2+1ty*Yh9v7>MOKRh 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 EZybwRUH||9 diff --git a/docs/reference/settings.mdx b/docs/reference/settings.mdx index f95d1641..5e7e460e 100644 --- a/docs/reference/settings.mdx +++ b/docs/reference/settings.mdx @@ -380,6 +380,8 @@ Quick reference: Configure external destinations for alert notifications. Four agent types are available on separate tabs: **Discord**, **Slack**, **Webhook**, and **Apprise**. The masthead publishes a **CHANNELS** pill showing how many agents are enabled (for example, `2/4`). +**Delivery retries** (admin-only) sets how many extra in-process attempts (0 to 3, default 0) this node makes after a transient channel failure, with a fixed one-second delay between attempts. There is no durable queue; ambiguous network failures can produce duplicate notifications. + For each agent: | Field | Description | diff --git a/frontend/src/components/settings/NotificationsSection.tsx b/frontend/src/components/settings/NotificationsSection.tsx index 652ddbd2..edcc3c2f 100644 --- a/frontend/src/components/settings/NotificationsSection.tsx +++ b/frontend/src/components/settings/NotificationsSection.tsx @@ -7,13 +7,17 @@ import { TogglePill } from '@/components/ui/toggle-pill'; import { toast } from '@/components/ui/toast-store'; import { apiFetch } from '@/lib/api'; import { useNodes } from '@/context/NodeContext'; +import { useAuth } from '@/context/AuthContext'; import { RefreshCw } from 'lucide-react'; import type { Agent } from './types'; +import { DEFAULT_SETTINGS } from './types'; import { SettingsSection } from './SettingsSection'; import { SettingsField } from './SettingsField'; import { SettingsActions, SettingsPrimaryButton } from './SettingsActions'; import { useMastheadStats } from './MastheadStatsContext'; +import { NumberChip } from './SystemControls'; import { classifyAppriseEndpoint, isKeyedAppriseEndpoint, isStatelessAppriseEndpoint } from '@/lib/appriseEndpoint'; +import { parseNotificationDispatchRetries } from '@/lib/notificationDispatchRetries'; type ChannelType = 'discord' | 'slack' | 'webhook' | 'apprise'; @@ -38,8 +42,20 @@ function hasStoredAppriseAgent(agent: Agent): boolean { return Boolean(agent.config?.mode) || agent.url.includes(''); } -export function NotificationsSection() { +function clampRetryExtras(raw: string): string { + const n = Math.trunc(Number(raw)); + if (!Number.isFinite(n)) return DEFAULT_SETTINGS.notification_dispatch_retries!; + return String(Math.max(0, Math.min(3, n))); +} + +interface NotificationsSectionProps { + onDirtyChange?: (dirty: boolean) => void; +} + +export function NotificationsSection({ onDirtyChange }: NotificationsSectionProps) { const { activeNode } = useNodes(); + const { isAdmin } = useAuth(); + const readOnly = !isAdmin; const activeNodeIdRef = useRef(activeNode?.id); useEffect(() => { activeNodeIdRef.current = activeNode?.id; }, [activeNode?.id]); @@ -50,6 +66,22 @@ export function NotificationsSection() { const [appriseUrlDirty, setAppriseUrlDirty] = useState(false); const [appriseConfigDirty, setAppriseConfigDirty] = useState(false); + const [retries, setRetries] = useState(DEFAULT_SETTINGS.notification_dispatch_retries!); + const [savedRetries, setSavedRetries] = useState(DEFAULT_SETTINGS.notification_dispatch_retries!); + const [isSavingRetries, setIsSavingRetries] = useState(false); + // idle: node-switch reset before first successful load; ready: trusted saved value; error: GET failed. + const [retriesLoadState, setRetriesLoadState] = useState<'idle' | 'loading' | 'ready' | 'error'>('idle'); + const [hasLoadedRetries, setHasLoadedRetries] = useState(false); + const [retriesNeedsRepair, setRetriesNeedsRepair] = useState(false); + const retriesFetchGenRef = useRef(0); + const retriesMutationGenRef = useRef(0); + const retriesSaveGenRef = useRef(0); + const retriesDirty = hasLoadedRetries && (retries !== savedRetries || retriesNeedsRepair); + + useEffect(() => { + onDirtyChange?.(retriesDirty); + }, [retriesDirty, onDirtyChange]); + const fetchAgents = async () => { const requestNodeId = activeNode?.id; try { @@ -73,11 +105,98 @@ export function NotificationsSection() { } }; + const fetchRetries = async () => { + const requestNodeId = activeNode?.id; + const fetchGen = ++retriesFetchGenRef.current; + const mutationAtStart = retriesMutationGenRef.current; + setRetriesLoadState('loading'); + const isCurrent = () => ( + activeNodeIdRef.current === requestNodeId + && fetchGen === retriesFetchGenRef.current + && retriesMutationGenRef.current === mutationAtStart + ); + const restoreAfterStale = () => { + if (activeNodeIdRef.current !== requestNodeId) return; + // A newer fetch owns loading; do not fight it. + if (fetchGen !== retriesFetchGenRef.current) return; + // A newer edit/save owns the value; leave ready so edited UI stays interactive. + if (retriesMutationGenRef.current !== mutationAtStart) { + setRetriesLoadState('ready'); + } + }; + try { + const res = await apiFetch('/settings', { + nodeId: typeof requestNodeId === 'number' ? requestNodeId : undefined, + }); + if (!isCurrent()) { + restoreAfterStale(); + return; + } + if (!res.ok) { + setRetriesLoadState('error'); + return; + } + const data: Record = await res.json(); + if (!isCurrent()) { + restoreAfterStale(); + return; + } + // Missing key: same as seed/runtime default. Malformed stored values must NOT + // clamp into a false "saved" policy (backend falls back to 0 without accepting 1.5/9). + const raw = data.notification_dispatch_retries; + if (raw === undefined || raw === null || raw === '') { + const next = DEFAULT_SETTINGS.notification_dispatch_retries!; + setRetries(next); + setSavedRetries(next); + setRetriesNeedsRepair(false); + setRetriesLoadState('ready'); + setHasLoadedRetries(true); + return; + } + const parsed = parseNotificationDispatchRetries(raw); + if (parsed === null) { + const next = DEFAULT_SETTINGS.notification_dispatch_retries!; + setRetries(next); + setSavedRetries(next); + setRetriesNeedsRepair(true); + setRetriesLoadState('error'); + setHasLoadedRetries(true); + return; + } + const next = String(parsed); + setRetries(next); + setSavedRetries(next); + setRetriesNeedsRepair(false); + setRetriesLoadState('ready'); + setHasLoadedRetries(true); + } catch (e) { + console.error('Failed to fetch notification retry setting', e); + if (!isCurrent()) { + restoreAfterStale(); + return; + } + setRetriesLoadState('error'); + } + }; + useEffect(() => { + // Reset local channel/retry state when the active node changes so a prior + // node's values cannot flash while the replacement fetches settle. + retriesFetchGenRef.current += 1; + retriesMutationGenRef.current += 1; + retriesSaveGenRef.current += 1; + // eslint-disable-next-line react-hooks/set-state-in-effect -- intentional node-switch reset setAgents(emptyAgents()); setAppriseUrlDirty(false); setAppriseConfigDirty(false); + setRetries(DEFAULT_SETTINGS.notification_dispatch_retries!); + setSavedRetries(DEFAULT_SETTINGS.notification_dispatch_retries!); + setRetriesLoadState('idle'); + setHasLoadedRetries(false); + setRetriesNeedsRepair(false); + setIsSavingRetries(false); void fetchAgents(); + void fetchRetries(); }, [activeNode?.id]); // eslint-disable-line react-hooks/exhaustive-deps const enabledCount = Object.values(agents).filter(a => a.enabled).length; @@ -87,8 +206,63 @@ export function NotificationsSection() { value: `${enabledCount}/4`, tone: enabledCount > 0 ? 'value' : 'subtitle', }, + ...(retriesDirty + ? [{ label: 'EDITED', value: 'retries', tone: 'warn' as const }] + : []), ]); + const saveRetries = async () => { + const requestNodeId = activeNode?.id; + const submitted = clampRetryExtras(retries); + const mutationAtStart = retriesMutationGenRef.current; + const saveGen = ++retriesSaveGenRef.current; + setIsSavingRetries(true); + try { + const res = await apiFetch('/settings', { + method: 'PATCH', + nodeId: typeof requestNodeId === 'number' ? requestNodeId : undefined, + body: JSON.stringify({ notification_dispatch_retries: submitted }), + }); + if (activeNodeIdRef.current !== requestNodeId) return; + if (retriesMutationGenRef.current !== mutationAtStart) return; + if (!res.ok) { + const err = await res.json().catch(() => ({})); + toast.error(err?.error || err?.message || 'Something went wrong.'); + return; + } + // Invalidate in-flight GETs so a late load cannot overwrite this save. + retriesFetchGenRef.current += 1; + retriesMutationGenRef.current += 1; + setRetries(submitted); + setSavedRetries(submitted); + setRetriesLoadState('ready'); + setHasLoadedRetries(true); + setRetriesNeedsRepair(false); + toast.success('Delivery retries saved.'); + } catch (e: unknown) { + if (activeNodeIdRef.current !== requestNodeId) return; + if (retriesMutationGenRef.current !== mutationAtStart) return; + toast.error((e as Error)?.message || 'Network error.'); + } finally { + // Own the spinner by save generation, not value mutation (success bumps mutation). + if (activeNodeIdRef.current === requestNodeId && saveGen === retriesSaveGenRef.current) { + setIsSavingRetries(false); + } + } + }; + + const retriesKicker = + retriesNeedsRepair && retries === savedRetries + ? 'error' + : retriesDirty + ? 'edited' + : retriesLoadState === 'error' + ? 'error' + : retriesLoadState === 'loading' || retriesLoadState === 'idle' + ? 'loading' + : 'saved'; + const retriesControlsDisabled = readOnly || !hasLoadedRetries; + const handleAgentChange = (type: string, field: keyof Agent, value: Agent[keyof Agent]) => { setAgents(prev => ({ ...prev, @@ -283,6 +457,57 @@ export function NotificationsSection() { return (
+
+ + + { + retriesMutationGenRef.current += 1; + setRetries(clampRetryExtras(v)); + }} + suffix="extra" + min={0} + max={3} + step={1} + disabled={retriesControlsDisabled} + /> + + + {(hasLoadedRetries || retriesLoadState === 'error') && ( + + )} + void saveRetries()} + disabled={retriesControlsDisabled || !retriesDirty || isSavingRetries} + > + {isSavingRetries ? ( + <> + + Saving + + ) : ( + 'Save retries' + )} + + + +
setNotifTab(v as ChannelType)} className="w-full"> diff --git a/frontend/src/components/settings/SettingsSectionContent.tsx b/frontend/src/components/settings/SettingsSectionContent.tsx index fc769562..5f8f22a3 100644 --- a/frontend/src/components/settings/SettingsSectionContent.tsx +++ b/frontend/src/components/settings/SettingsSectionContent.tsx @@ -96,7 +96,7 @@ function renderSection( case 'docker-storage': return onDirtyChange('docker-storage', d)} />; case 'image-updates': return ; case 'fleet-mesh': return onDirtyChange('fleet-mesh', d)} />; - case 'notifications': return ; + case 'notifications': return onDirtyChange('notifications', d)} />; case 'notification-routing': return ; case 'notification-suppression': return ( ({ vi.mock('@/context/NodeContext', () => ({ useNodes: () => ({ activeNode: nodeState.activeNode }), })); +const authState = { isAdmin: true }; +vi.mock('@/context/AuthContext', () => ({ + useAuth: () => authState, +})); vi.mock('../MastheadStatsContext', () => ({ useMastheadStats: (stats: MastheadMetadataItem[] | null) => { masthead.last = stats; @@ -64,11 +68,18 @@ describe('NotificationsSection', () => { mockedFetch.mockReset(); masthead.last = null; nodeState.activeNode = { id: 1 }; - mockedFetch.mockImplementation(async (url: string, opts?: { method?: string }) => { + authState.isAdmin = true; + mockedFetch.mockImplementation(async (url: string, opts?: { method?: string; nodeId?: number }) => { if (url === '/agents' && !opts?.method) return agentsResponse(); if (url === '/agents' && opts?.method === 'POST') { return { ok: true, json: async () => ({}) }; } + if (url === '/settings' && !opts?.method) { + return { ok: true, json: async () => ({ notification_dispatch_retries: '0' }) }; + } + if (url === '/settings' && opts?.method === 'PATCH') { + return { ok: true, json: async () => ({ success: true }) }; + } return { ok: true, json: async () => ([]) }; }); }); @@ -321,6 +332,9 @@ describe('NotificationsSection', () => { if (nodeState.activeNode.id === 1) return agentsResponse([REDACTED_APPRISE]); return agentsResponse([]); } + if (url === '/settings' && !opts?.method) { + return { ok: true, json: async () => ({ notification_dispatch_retries: '0' }) }; + } return { ok: true, json: async () => ({}) }; }); @@ -355,6 +369,9 @@ describe('NotificationsSection', () => { } return agentsResponse([]); } + if (url === '/settings' && !opts?.method) { + return { ok: true, json: async () => ({ notification_dispatch_retries: '0' }) }; + } return { ok: true, json: async () => ({}) }; }); @@ -376,4 +393,310 @@ describe('NotificationsSection', () => { expect(screen.getByLabelText(/Apprise endpoint/i)).toHaveValue(''); }); + it('preserves CHANNELS masthead and loads retries with explicit nodeId', async () => { + render(); + await waitFor(() => expect(masthead.last?.[0]).toMatchObject({ label: 'CHANNELS', value: '1/4' })); + await waitFor(() => + expect(mockedFetch.mock.calls.some( + ([url, opts]) => url === '/settings' && (opts as { nodeId?: number })?.nodeId === 1, + )).toBe(true), + ); + expect(screen.getByText('Delivery retries')).toBeInTheDocument(); + expect(screen.getByText('0')).toBeInTheDocument(); + }); + + it('PATCHes only notification_dispatch_retries when saving retries', async () => { + render(); + await waitFor(() => expect(screen.getByText('saved')).toBeInTheDocument()); + const chipButton = screen.getByRole('button', { name: /0\s*extra/i }); + await userEvent.click(chipButton); + const input = screen.getByRole('spinbutton'); + await userEvent.clear(input); + await userEvent.type(input, '2'); + await userEvent.keyboard('{Enter}'); + await userEvent.click(screen.getByRole('button', { name: 'Save retries' })); + await waitFor(() => { + const patch = mockedFetch.mock.calls.find( + ([url, opts]) => url === '/settings' && (opts as { method?: string })?.method === 'PATCH', + ); + expect(patch).toBeTruthy(); + expect(JSON.parse((patch![1] as { body: string }).body)).toEqual({ notification_dispatch_retries: '2' }); + expect((patch![1] as { nodeId?: number }).nodeId).toBe(1); + }); + await waitFor(() => expect(screen.getByRole('button', { name: 'Save retries' })).toBeInTheDocument()); + expect(screen.queryByRole('button', { name: /Saving/i })).toBeNull(); + expect(findAgentsPost()).toBeUndefined(); + }); + + it('disables delivery retries controls for non-admins', async () => { + authState.isAdmin = false; + render(); + await waitFor(() => expect(screen.getByText('Delivery retries')).toBeInTheDocument()); + expect(screen.getByRole('button', { name: 'Save retries' })).toBeDisabled(); + }); + + it('ignores a stale settings body after a node switch', async () => { + let releaseNode1Settings: (() => void) | undefined; + const gate = new Promise((resolve) => { releaseNode1Settings = resolve; }); + + mockedFetch.mockImplementation(async (url: string, opts?: { method?: string; nodeId?: number | null }) => { + if (url === '/agents' && !opts?.method) return agentsResponse([]); + if (url === '/settings' && !opts?.method) { + const targetId = opts?.nodeId ?? nodeState.activeNode.id; + if (targetId === 1) { + return { + ok: true, + json: async () => { + await gate; + return { notification_dispatch_retries: '3' }; + }, + }; + } + return { ok: true, json: async () => ({ notification_dispatch_retries: '0' }) }; + } + return { ok: true, json: async () => ({}) }; + }); + + const { rerender } = render(); + nodeState.activeNode = { id: 2 }; + rerender(); + await waitFor(() => + expect(mockedFetch.mock.calls.some( + ([url, opts]) => url === '/settings' && (opts as { nodeId?: number })?.nodeId === 2, + )).toBe(true), + ); + releaseNode1Settings?.(); + await new Promise((r) => setTimeout(r, 40)); + expect(screen.getByRole('button', { name: /0\s*extra/i })).toBeInTheDocument(); + expect(screen.queryByRole('button', { name: /3\s*extra/i })).toBeNull(); + }); + + it('does not present default 0 as saved when settings GET fails', async () => { + mockedFetch.mockImplementation(async (url: string, opts?: { method?: string }) => { + if (url === '/agents' && !opts?.method) return agentsResponse([]); + if (url === '/settings' && !opts?.method) { + return { ok: false, status: 500, json: async () => ({ error: 'boom' }) }; + } + return { ok: true, json: async () => ({}) }; + }); + + render(); + await waitFor(() => expect(screen.getByText('error')).toBeInTheDocument()); + expect(screen.queryByText('saved')).toBeNull(); + expect(screen.getByRole('button', { name: 'Save retries' })).toBeDisabled(); + expect(screen.getByRole('button', { name: /0\s*extra/i })).toBeDisabled(); + expect(screen.getByRole('button', { name: 'Retry load' })).toBeInTheDocument(); + }); + + it('disables retry controls until the settings GET succeeds', async () => { + let releaseGet: (() => void) | undefined; + const gate = new Promise((resolve) => { releaseGet = resolve; }); + + mockedFetch.mockImplementation(async (url: string, opts?: { method?: string }) => { + if (url === '/agents' && !opts?.method) return agentsResponse([]); + if (url === '/settings' && !opts?.method) { + return { + ok: true, + json: async () => { + await gate; + return { notification_dispatch_retries: '3' }; + }, + }; + } + return { ok: true, json: async () => ({}) }; + }); + + render(); + await waitFor(() => expect(screen.getByText('loading')).toBeInTheDocument()); + expect(screen.queryByText('saved')).toBeNull(); + expect(screen.getByRole('button', { name: /0\s*extra/i })).toBeDisabled(); + expect(screen.getByRole('button', { name: 'Save retries' })).toBeDisabled(); + + releaseGet?.(); + await waitFor(() => expect(screen.getByText('saved')).toBeInTheDocument()); + expect(screen.getByRole('button', { name: /3\s*extra/i })).not.toBeDisabled(); + }); + + it('keeps PATCH result when a deferred Reload GET returns stale data', async () => { + let releaseStale: (() => void) | undefined; + const staleGate = new Promise((resolve) => { releaseStale = resolve; }); + let settingsGetCount = 0; + + mockedFetch.mockImplementation(async (url: string, opts?: { method?: string }) => { + if (url === '/agents' && !opts?.method) return agentsResponse([]); + if (url === '/settings' && !opts?.method) { + settingsGetCount += 1; + if (settingsGetCount === 1) { + return { ok: true, json: async () => ({ notification_dispatch_retries: '0' }) }; + } + return { + ok: true, + json: async () => { + await staleGate; + return { notification_dispatch_retries: '0' }; + }, + }; + } + if (url === '/settings' && opts?.method === 'PATCH') { + return { ok: true, json: async () => ({ success: true }) }; + } + return { ok: true, json: async () => ({}) }; + }); + + render(); + await waitFor(() => expect(screen.getByText('saved')).toBeInTheDocument()); + + // Start a soft reload, then edit+save while that GET is still in flight. + await userEvent.click(screen.getByRole('button', { name: 'Reload' })); + await waitFor(() => expect(mockedFetch.mock.calls.filter( + ([url, opts]) => url === '/settings' && !(opts as { method?: string })?.method, + ).length).toBeGreaterThan(1)); + + await userEvent.click(screen.getByRole('button', { name: /0\s*extra/i })); + const input = screen.getByRole('spinbutton'); + await userEvent.clear(input); + await userEvent.type(input, '2'); + await userEvent.keyboard('{Enter}'); + await userEvent.click(screen.getByRole('button', { name: 'Save retries' })); + await waitFor(() => expect(screen.getByRole('button', { name: /2\s*extra/i })).toBeInTheDocument()); + await waitFor(() => expect(screen.getByText('saved')).toBeInTheDocument()); + + releaseStale?.(); + await new Promise((r) => setTimeout(r, 40)); + expect(screen.getByRole('button', { name: /2\s*extra/i })).toBeInTheDocument(); + expect(screen.getByText('saved')).toBeInTheDocument(); + }); + + + it('clears Saving after edit-during-save supersedes the PATCH apply', async () => { + let releasePatch: (() => void) | undefined; + const patchGate = new Promise((resolve) => { releasePatch = resolve; }); + + mockedFetch.mockImplementation(async (url: string, opts?: { method?: string }) => { + if (url === '/agents' && !opts?.method) return agentsResponse([]); + if (url === '/settings' && !opts?.method) { + return { ok: true, json: async () => ({ notification_dispatch_retries: '0' }) }; + } + if (url === '/settings' && opts?.method === 'PATCH') { + await patchGate; + return { ok: true, json: async () => ({ success: true }) }; + } + return { ok: true, json: async () => ({}) }; + }); + + render(); + await waitFor(() => expect(screen.getByText('saved')).toBeInTheDocument()); + + await userEvent.click(screen.getByRole('button', { name: /0\s*extra/i })); + let input = screen.getByRole('spinbutton'); + await userEvent.clear(input); + await userEvent.type(input, '2'); + await userEvent.keyboard('{Enter}'); + await userEvent.click(screen.getByRole('button', { name: 'Save retries' })); + await waitFor(() => expect(screen.getByRole('button', { name: /Saving/i })).toBeInTheDocument()); + + // Edit while the PATCH is in flight (bumps mutation gen). + await userEvent.click(screen.getByRole('button', { name: /2\s*extra/i })); + input = screen.getByRole('spinbutton'); + await userEvent.clear(input); + await userEvent.type(input, '3'); + await userEvent.keyboard('{Enter}'); + + releasePatch?.(); + await waitFor(() => expect(screen.getByRole('button', { name: 'Save retries' })).toBeInTheDocument()); + expect(screen.queryByRole('button', { name: /Saving/i })).toBeNull(); + expect(screen.getByRole('button', { name: /3\s*extra/i })).toBeInTheDocument(); + expect(screen.getByText('edited')).toBeInTheDocument(); + }); + + it('clears Saving when the active node changes during an in-flight PATCH', async () => { + let releasePatch: (() => void) | undefined; + const patchGate = new Promise((resolve) => { releasePatch = resolve; }); + + mockedFetch.mockImplementation(async (url: string, opts?: { method?: string; nodeId?: number }) => { + if (url === '/agents' && !opts?.method) return agentsResponse([]); + if (url === '/settings' && !opts?.method) { + const id = opts?.nodeId ?? nodeState.activeNode.id; + return { ok: true, json: async () => ({ notification_dispatch_retries: id === 1 ? '0' : '1' }) }; + } + if (url === '/settings' && opts?.method === 'PATCH') { + await patchGate; + return { ok: true, json: async () => ({ success: true }) }; + } + return { ok: true, json: async () => ({}) }; + }); + + const { rerender } = render(); + await waitFor(() => expect(screen.getByText('saved')).toBeInTheDocument()); + + await userEvent.click(screen.getByRole('button', { name: /0\s*extra/i })); + const input = screen.getByRole('spinbutton'); + await userEvent.clear(input); + await userEvent.type(input, '2'); + await userEvent.keyboard('{Enter}'); + await userEvent.click(screen.getByRole('button', { name: 'Save retries' })); + await waitFor(() => expect(screen.getByRole('button', { name: /Saving/i })).toBeInTheDocument()); + + nodeState.activeNode = { id: 2 }; + rerender(); + await waitFor(() => expect(screen.queryByRole('button', { name: /Saving/i })).toBeNull()); + await waitFor(() => expect(screen.getByText('saved')).toBeInTheDocument()); + expect(screen.getByRole('button', { name: 'Save retries' })).toBeInTheDocument(); + + releasePatch?.(); + await new Promise((r) => setTimeout(r, 40)); + expect(screen.queryByRole('button', { name: /Saving/i })).toBeNull(); + expect(screen.getByRole('button', { name: /1\s*extra/i })).toBeInTheDocument(); + }); + + + + it('treats invalid stored notification_dispatch_retries as error, not clamped saved', async () => { + mockedFetch.mockImplementation(async (url: string, opts?: { method?: string }) => { + if (url === '/agents' && !opts?.method) return agentsResponse([]); + if (url === '/settings' && !opts?.method) { + return { ok: true, json: async () => ({ notification_dispatch_retries: '9' }) }; + } + if (url === '/settings' && opts?.method === 'PATCH') { + return { ok: true, json: async () => ({ success: true }) }; + } + return { ok: true, json: async () => ({}) }; + }); + + render(); + await waitFor(() => expect(screen.getByText('error')).toBeInTheDocument()); + expect(screen.queryByText('saved')).toBeNull(); + expect(screen.getByText(/Stored delivery retries value is invalid/i)).toBeInTheDocument(); + // Chip may show 0 as a draft, but Save must be enabled so the operator can repair. + expect(screen.getByRole('button', { name: 'Save retries' })).not.toBeDisabled(); + + await userEvent.click(screen.getByRole('button', { name: 'Save retries' })); + await waitFor(() => { + const patch = mockedFetch.mock.calls.find( + ([url, opts]) => url === '/settings' && (opts as { method?: string })?.method === 'PATCH', + ); + expect(patch).toBeTruthy(); + expect(JSON.parse((patch![1] as { body: string }).body)).toEqual({ notification_dispatch_retries: '0' }); + }); + await waitFor(() => expect(screen.getByText('saved')).toBeInTheDocument()); + expect(screen.getByRole('button', { name: /0\s*extra/i })).toBeInTheDocument(); + }); + + it('treats decimal stored notification_dispatch_retries as invalid, not truncated saved', async () => { + mockedFetch.mockImplementation(async (url: string, opts?: { method?: string }) => { + if (url === '/agents' && !opts?.method) return agentsResponse([]); + if (url === '/settings' && !opts?.method) { + return { ok: true, json: async () => ({ notification_dispatch_retries: '1.5' }) }; + } + return { ok: true, json: async () => ({}) }; + }); + + render(); + await waitFor(() => expect(screen.getByText('error')).toBeInTheDocument()); + expect(screen.queryByText('saved')).toBeNull(); + expect(screen.queryByRole('button', { name: /1\s*extra/i })).toBeNull(); + expect(screen.getByText(/Stored delivery retries value is invalid/i)).toBeInTheDocument(); + }); + + }); diff --git a/frontend/src/components/settings/registry.ts b/frontend/src/components/settings/registry.ts index 557a9b3c..96fa7cb6 100644 --- a/frontend/src/components/settings/registry.ts +++ b/frontend/src/components/settings/registry.ts @@ -205,7 +205,7 @@ export const SETTINGS_ITEMS: readonly SettingsItemMeta[] = [ group: 'notifications', label: 'Channels', description: 'Discord, Slack, Apprise, and custom webhook destinations for Sencho alerts.', - keywords: ['discord', 'slack', 'apprise', 'webhook', 'channels', 'destinations', 'alerts'], + keywords: ['discord', 'slack', 'apprise', 'webhook', 'channels', 'destinations', 'alerts', 'retry', 'retries'], tier: null, scope: 'node', }, diff --git a/frontend/src/components/settings/types.ts b/frontend/src/components/settings/types.ts index d03eb8f9..891facb3 100644 --- a/frontend/src/components/settings/types.ts +++ b/frontend/src/components/settings/types.ts @@ -22,6 +22,7 @@ export interface PatchableSettings { env_block_deploy_on_missing_required?: '0' | '1'; auto_create_missing_external_networks?: '0' | '1'; image_update_sidebar_indicators?: '0' | '1'; + notification_dispatch_retries?: string; } export const DEFAULT_SETTINGS: PatchableSettings = { @@ -48,6 +49,7 @@ export const DEFAULT_SETTINGS: PatchableSettings = { env_block_deploy_on_missing_required: '0', auto_create_missing_external_networks: '0', image_update_sidebar_indicators: '1', + notification_dispatch_retries: '0', }; export type SectionId = diff --git a/frontend/src/lib/notificationDispatchRetries.test.ts b/frontend/src/lib/notificationDispatchRetries.test.ts new file mode 100644 index 00000000..c6506703 --- /dev/null +++ b/frontend/src/lib/notificationDispatchRetries.test.ts @@ -0,0 +1,21 @@ + +import { describe, it, expect } from 'vitest'; +import { parseNotificationDispatchRetries } from './notificationDispatchRetries'; + +describe('parseNotificationDispatchRetries', () => { + it('accepts integers and digit strings 0-3', () => { + expect(parseNotificationDispatchRetries(0)).toBe(0); + expect(parseNotificationDispatchRetries(3)).toBe(3); + expect(parseNotificationDispatchRetries('2')).toBe(2); + }); + + it('rejects out-of-range, decimals, and non-canonical strings', () => { + expect(parseNotificationDispatchRetries(9)).toBeNull(); + expect(parseNotificationDispatchRetries('9')).toBeNull(); + expect(parseNotificationDispatchRetries(1.5)).toBeNull(); + expect(parseNotificationDispatchRetries('1.5')).toBeNull(); + expect(parseNotificationDispatchRetries(' 1')).toBeNull(); + expect(parseNotificationDispatchRetries(null)).toBeNull(); + expect(parseNotificationDispatchRetries(true)).toBeNull(); + }); +}); diff --git a/frontend/src/lib/notificationDispatchRetries.ts b/frontend/src/lib/notificationDispatchRetries.ts new file mode 100644 index 00000000..32097fa0 --- /dev/null +++ b/frontend/src/lib/notificationDispatchRetries.ts @@ -0,0 +1,16 @@ +/** + * Strict parser for notification_dispatch_retries (extra attempts, 0..3). + * Must stay aligned with backend/src/helpers/notificationDispatchRetries.ts: + * accepts JSON number integers or single-digit strings "0".."3" only. + */ +export function parseNotificationDispatchRetries(raw: unknown): number | null { + if (typeof raw === 'number') { + if (!Number.isInteger(raw) || raw < 0 || raw > 3) return null; + return raw; + } + if (typeof raw === 'string') { + if (!/^[0-3]$/.test(raw)) return null; + return Number(raw); + } + return null; +}