From 4d0756d864e0094e03e65e660369105e34059836 Mon Sep 17 00:00:00 2001 From: Michelle Date: Fri, 27 Feb 2026 16:51:17 +0100 Subject: [PATCH] keep original presentation name --- server/config/database.js | 3 +++ server/routes/rooms.js | 10 ++++++++-- src/pages/RoomDetail.jsx | 7 +++++-- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/server/config/database.js b/server/config/database.js index b030a6b..be448af 100644 --- a/server/config/database.js +++ b/server/config/database.js @@ -354,6 +354,9 @@ export async function initDatabase() { if (!(await db.columnExists('rooms', 'presentation_file'))) { await db.exec('ALTER TABLE rooms ADD COLUMN presentation_file TEXT DEFAULT NULL'); } + if (!(await db.columnExists('rooms', 'presentation_name'))) { + await db.exec('ALTER TABLE rooms ADD COLUMN presentation_name TEXT DEFAULT NULL'); + } // ── Default admin ─────────────────────────────────────────────────────── const adminEmail = process.env.ADMIN_EMAIL || 'admin@example.com'; diff --git a/server/routes/rooms.js b/server/routes/rooms.js index 455bc97..8992549 100644 --- a/server/routes/rooms.js +++ b/server/routes/rooms.js @@ -564,6 +564,12 @@ router.post('/:uid/presentation', authenticateToken, async (req, res) => { // Max 50MB if (buffer.length > 50 * 1024 * 1024) return res.status(400).json({ error: 'File must not exceed 50MB' }); + // Preserve original filename (sent as X-Filename header) + const rawName = req.headers['x-filename']; + const originalName = rawName + ? decodeURIComponent(rawName).replace(/[^a-zA-Z0-9._\- ]/g, '_').slice(0, 200) + : `presentation.${ext}`; + const filename = `${room.uid}_${Date.now()}.${ext}`; const filepath = path.join(presentationsDir, filename); @@ -574,7 +580,7 @@ router.post('/:uid/presentation', authenticateToken, async (req, res) => { } fs.writeFileSync(filepath, buffer); - await db.run('UPDATE rooms SET presentation_file = ?, updated_at = CURRENT_TIMESTAMP WHERE uid = ?', [filename, req.params.uid]); + await db.run('UPDATE rooms SET presentation_file = ?, presentation_name = ?, updated_at = CURRENT_TIMESTAMP WHERE uid = ?', [filename, originalName, req.params.uid]); const updated = await db.get('SELECT * FROM rooms WHERE uid = ?', [req.params.uid]); res.json({ room: updated }); } catch (err) { @@ -595,7 +601,7 @@ router.delete('/:uid/presentation', authenticateToken, async (req, res) => { if (fs.existsSync(filepath)) fs.unlinkSync(filepath); } - await db.run('UPDATE rooms SET presentation_file = NULL, updated_at = CURRENT_TIMESTAMP WHERE uid = ?', [req.params.uid]); + await db.run('UPDATE rooms SET presentation_file = NULL, presentation_name = NULL, updated_at = CURRENT_TIMESTAMP WHERE uid = ?', [req.params.uid]); const updated = await db.get('SELECT * FROM rooms WHERE uid = ?', [req.params.uid]); res.json({ room: updated }); } catch (err) { diff --git a/src/pages/RoomDetail.jsx b/src/pages/RoomDetail.jsx index 7ae7dc5..bdf2264 100644 --- a/src/pages/RoomDetail.jsx +++ b/src/pages/RoomDetail.jsx @@ -184,7 +184,10 @@ export default function RoomDetail() { try { const arrayBuffer = await file.arrayBuffer(); const res = await api.post(`/rooms/${uid}/presentation`, arrayBuffer, { - headers: { 'Content-Type': file.type }, + headers: { + 'Content-Type': file.type, + 'X-Filename': encodeURIComponent(file.name), + }, }); setRoom(res.data.room); setEditRoom(res.data.room); @@ -607,7 +610,7 @@ export default function RoomDetail() {

{t('room.presentationCurrent')}

- presentation.{room.presentation_file.split('.').pop()} + {room.presentation_name || `presentation.${room.presentation_file?.split('.').pop()}`}