From 21f87d9b91ed5f7c40f6b12188e2236e941a4cf6 Mon Sep 17 00:00:00 2001 From: Marek Maslowski Date: Fri, 3 Apr 2026 16:56:41 +0200 Subject: [PATCH] fixes after merge --- server/src/app.ts | 59 ++++++++++++++++++++++++++++++++++- server/src/routes/synology.ts | 8 +++-- 2 files changed, 64 insertions(+), 3 deletions(-) diff --git a/server/src/app.ts b/server/src/app.ts index c1c5ebc4..13b7668d 100644 --- a/server/src/app.ts +++ b/server/src/app.ts @@ -34,6 +34,8 @@ import oidcRoutes from './routes/oidc'; import vacayRoutes from './routes/vacay'; import atlasRoutes from './routes/atlas'; import immichRoutes from './routes/immich'; +import synologyRoutes from './routes/synology'; +import memoriesRoutes from './routes/memories'; import notificationRoutes from './routes/notifications'; import shareRoutes from './routes/share'; import { mcpHandler } from './mcp'; @@ -193,13 +195,68 @@ export function createApp(): express.Application { // Addons list endpoint app.get('/api/addons', authenticate, (_req: Request, res: Response) => { const addons = db.prepare('SELECT id, name, type, icon, enabled FROM addons WHERE enabled = 1 ORDER BY sort_order').all() as Pick[]; - res.json({ addons: addons.map(a => ({ ...a, enabled: !!a.enabled })) }); + const providers = db.prepare(` + SELECT id, name, icon, enabled, config, sort_order + FROM photo_providers + WHERE enabled = 1 + ORDER BY sort_order, id + `).all() as Array<{ id: string; name: string; icon: string; enabled: number; config: string; sort_order: number }>; + const fields = db.prepare(` + SELECT provider_id, field_key, label, input_type, placeholder, required, secret, settings_key, payload_key, sort_order + FROM photo_provider_fields + ORDER BY sort_order, id + `).all() as Array<{ + provider_id: string; + field_key: string; + label: string; + input_type: string; + placeholder?: string | null; + required: number; + secret: number; + settings_key?: string | null; + payload_key?: string | null; + sort_order: number; + }>; + + const fieldsByProvider = new Map(); + for (const field of fields) { + const arr = fieldsByProvider.get(field.provider_id) || []; + arr.push(field); + fieldsByProvider.set(field.provider_id, arr); + } + + res.json({ + addons: [ + ...addons.map(a => ({ ...a, enabled: !!a.enabled })), + ...providers.map(p => ({ + id: p.id, + name: p.name, + type: 'photo_provider', + icon: p.icon, + enabled: !!p.enabled, + config: JSON.parse(p.config || '{}'), + fields: (fieldsByProvider.get(p.id) || []).map(f => ({ + key: f.field_key, + label: f.label, + input_type: f.input_type, + placeholder: f.placeholder || '', + required: !!f.required, + secret: !!f.secret, + settings_key: f.settings_key || null, + payload_key: f.payload_key || null, + sort_order: f.sort_order, + })), + })), + ], + }); }); // Addon routes app.use('/api/addons/vacay', vacayRoutes); app.use('/api/addons/atlas', atlasRoutes); + app.use('/api/integrations/memories', memoriesRoutes); app.use('/api/integrations/immich', immichRoutes); + app.use('/api/integrations/synologyphotos', synologyRoutes); app.use('/api/maps', mapsRoutes); app.use('/api/weather', weatherRoutes); app.use('/api/settings', settingsRoutes); diff --git a/server/src/routes/synology.ts b/server/src/routes/synology.ts index 65f4dfbd..9b26acc0 100644 --- a/server/src/routes/synology.ts +++ b/server/src/routes/synology.ts @@ -31,9 +31,13 @@ function parseNumberBodyField(value: unknown, fallback: number): number { return Number.isFinite(parsed) ? parsed : fallback; } -router.get('/settings', authenticate, (req: Request, res: Response) => { +router.get('/settings', authenticate, async (req: Request, res: Response) => { const authReq = req as AuthRequest; - res.json(getSynologySettings(authReq.user.id)); + try { + res.json(await getSynologySettings(authReq.user.id)); + } catch (err: unknown) { + handleSynologyError(res, err, 'Failed to load settings'); + } }); router.put('/settings', authenticate, async (req: Request, res: Response) => {