From d058c9cd5f546df9bb2f9667e05e3df29ce4d5e8 Mon Sep 17 00:00:00 2001 From: Ricky Stretch Date: Sat, 14 Mar 2026 18:15:32 -0400 Subject: [PATCH] v0.9.21 added a cleanup routibe for deleted images. --- .env.example | 2 +- backend/package.json | 2 +- backend/src/routes/groups.js | 18 ++++++++++++++++++ backend/src/routes/messages.js | 14 ++++++++++++++ build.sh | 2 +- frontend/package.json | 2 +- 6 files changed, 36 insertions(+), 4 deletions(-) diff --git a/.env.example b/.env.example index 0a2e628..e0e6cdb 100644 --- a/.env.example +++ b/.env.example @@ -10,7 +10,7 @@ PROJECT_NAME=jama # Image version to run (set by build.sh, or use 'latest') -JAMA_VERSION=0.9.20 +JAMA_VERSION=0.9.21 # App port — the host port Docker maps to the container PORT=3000 diff --git a/backend/package.json b/backend/package.json index 7c85339..6eb9e95 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "jama-backend", - "version": "0.9.20", + "version": "0.9.21", "description": "TeamChat backend server", "main": "src/index.js", "scripts": { diff --git a/backend/src/routes/groups.js b/backend/src/routes/groups.js index 219396c..f564051 100644 --- a/backend/src/routes/groups.js +++ b/backend/src/routes/groups.js @@ -1,4 +1,5 @@ const express = require('express'); +const fs = require('fs'); const router = express.Router(); const { getDb } = require('../models/db'); const { authMiddleware, adminMiddleware } = require('../middleware/auth'); @@ -18,6 +19,17 @@ function emitGroupNew(io, groupId) { } } +// Delete an uploaded image file from disk +function deleteImageFile(imageUrl) { + if (!imageUrl) return; + try { + const filePath = '/app' + imageUrl; + if (fs.existsSync(filePath)) fs.unlinkSync(filePath); + } catch (e) { + console.warn('[Groups] Could not delete image file:', e.message); + } +} + // Helper: emit group:deleted to all members function emitGroupDeleted(io, groupId, members) { for (const uid of members) { @@ -369,8 +381,14 @@ router.delete('/:id', authMiddleware, (req, res) => { all.forEach(u => { if (!members.includes(u.id)) members.push(u.id); }); } + // Collect all image files for this group before deleting + const imageMessages = db.prepare("SELECT image_url FROM messages WHERE group_id = ? AND image_url IS NOT NULL").all(group.id); + db.prepare('DELETE FROM groups WHERE id = ?').run(group.id); + // Delete image files from disk after DB delete + for (const msg of imageMessages) deleteImageFile(msg.image_url); + // Notify all affected users emitGroupDeleted(io, group.id, members); diff --git a/backend/src/routes/messages.js b/backend/src/routes/messages.js index 60fadfa..4b7fb96 100644 --- a/backend/src/routes/messages.js +++ b/backend/src/routes/messages.js @@ -1,8 +1,20 @@ const express = require('express'); const multer = require('multer'); const path = require('path'); +const fs = require('fs'); const { getDb } = require('../models/db'); +// Delete an uploaded image file from disk if it lives under /app/uploads/images +function deleteImageFile(imageUrl) { + if (!imageUrl) return; + try { + const filePath = '/app' + imageUrl; // imageUrl is like /uploads/images/img_xxx.jpg + if (fs.existsSync(filePath)) fs.unlinkSync(filePath); + } catch (e) { + console.warn('[Messages] Could not delete image file:', e.message); + } +} + module.exports = function(io) { const router = express.Router(); const { authMiddleware } = require('../middleware/auth'); @@ -150,7 +162,9 @@ router.delete('/:id', authMiddleware, (req, res) => { if (!canDelete) return res.status(403).json({ error: 'Cannot delete this message' }); + const imageUrl = message.image_url; db.prepare("UPDATE messages SET is_deleted = 1, content = null, image_url = null WHERE id = ?").run(message.id); + deleteImageFile(imageUrl); io.to(`group:${message.group_id}`).emit('message:deleted', { messageId: message.id, groupId: message.group_id }); res.json({ success: true, messageId: message.id }); }); diff --git a/build.sh b/build.sh index b7bbb41..a26a9ba 100644 --- a/build.sh +++ b/build.sh @@ -13,7 +13,7 @@ # ───────────────────────────────────────────────────────────── set -euo pipefail -VERSION="${1:-0.9.20}" +VERSION="${1:-0.9.21}" ACTION="${2:-}" REGISTRY="${REGISTRY:-}" IMAGE_NAME="jama" diff --git a/frontend/package.json b/frontend/package.json index 77e1078..0f473e6 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "jama-frontend", - "version": "0.9.20", + "version": "0.9.21", "private": true, "scripts": { "dev": "vite",