From ab324f192859204a3ea3c129530ccfe8f5a36968 Mon Sep 17 00:00:00 2001 From: paul Date: Sat, 6 Sep 2025 09:14:27 +0200 Subject: [PATCH] fix(frontend): add missing externalMedia service and mount admin external-media routes; verify Vite build --- backend/server.js | 4 +++- .../src/services/externalMedia.service.ts | 22 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 frontend/src/services/externalMedia.service.ts diff --git a/backend/server.js b/backend/server.js index e5f8a80..6d100ca 100644 --- a/backend/server.js +++ b/backend/server.js @@ -143,6 +143,7 @@ const secureStatic = require('./src/middleware/secureStatic'); // Get storage path from environment or use default const storagePath = process.env.STORAGE_PATH || path.join(__dirname, '../storage'); +process.env.EXTERNAL_MEDIA_ROOT = process.env.EXTERNAL_MEDIA_ROOT || '/external-media'; // Static file serving for photos (protected) app.use('/photos', require('./src/middleware/photoAuth'), setCorsHeaders, secureStatic(path.join(storagePath, 'events/active'))); @@ -199,7 +200,8 @@ app.get('/health', async (req, res) => { // Routes app.use('/api/auth', authRoutes); -app.use('/api/events', eventRoutes); + app.use('/api/events', eventRoutes); + app.use('/api/admin/external-media', require('./src/routes/adminExternalMedia')); // Gallery routes - main routes first, then feedback routes app.use('/api/gallery', galleryRoutes); app.use('/api/gallery', require('./src/routes/galleryFeedback')); diff --git a/frontend/src/services/externalMedia.service.ts b/frontend/src/services/externalMedia.service.ts new file mode 100644 index 0000000..734a157 --- /dev/null +++ b/frontend/src/services/externalMedia.service.ts @@ -0,0 +1,22 @@ +import { api } from '../config/api'; + +export interface ExternalEntry { name: string; type: 'dir' | 'file'; size?: number; mtime?: string } + +export const externalMediaService = { + async list(pathRel: string = ''): Promise<{ path: string; entries: ExternalEntry[]; canNavigateUp: boolean }> { + const params = new URLSearchParams(); + if (pathRel) params.set('path', pathRel); + const res = await api.get(`/admin/external-media/list?${params.toString()}`); + return res.data; + }, + + async importEvent(eventId: number, externalPath: string, options?: { recursive?: boolean; map?: { individual?: string; collages?: string } }): Promise<{ imported: number; skipped: number; thumbnailsQueued: number }> { + const res = await api.post(`/admin/external-media/events/${eventId}/import-external`, { + external_path: externalPath, + recursive: options?.recursive ?? true, + map: options?.map + }); + return res.data; + } +} +