From 31f7adec354d1528b0ae7da40d945bc9f77e4246 Mon Sep 17 00:00:00 2001 From: Dicken Date: Tue, 26 May 2026 20:37:12 +0200 Subject: [PATCH] Dateien nach "backend/src/tools/dateien" hochladen --- backend/src/tools/dateien/routes.js | 73 ++++++++++++++++++++++------- 1 file changed, 57 insertions(+), 16 deletions(-) diff --git a/backend/src/tools/dateien/routes.js b/backend/src/tools/dateien/routes.js index 8d879e5..1fee4da 100644 --- a/backend/src/tools/dateien/routes.js +++ b/backend/src/tools/dateien/routes.js @@ -38,13 +38,9 @@ const hasFileAccess = (fileId, userId) => { }; // ── Ordner ──────────────────────────────────────────────────────────────────── -// GET /folders?parent_id= -router.get('/folders', authenticate, (req, res) => { - const uid = req.user.id; - const parentId = req.query.parent_id || null; - const own = db.prepare('SELECT * FROM folders WHERE user_id=? AND parent_id IS ? ORDER BY name').all(uid, parentId); - // Shared folders at root level - const shared = parentId ? [] : db.prepare(` +// Helper: collect all ancestor folder IDs that are shared with user +function getSharedRootFolders(uid) { + return db.prepare(` SELECT f.*, u.username as owner, s.shared_by FROM folders f JOIN users u ON u.id=f.user_id @@ -52,6 +48,41 @@ router.get('/folders', authenticate, (req, res) => { WHERE s.shared_with=? ORDER BY f.name `).all(uid); +} + +function isInSharedFolder(folderId, uid) { + // Walk up the folder tree to check if any ancestor is shared with uid + let current = folderId; + while (current) { + if (db.prepare('SELECT id FROM folder_shares WHERE folder_id=? AND shared_with=?').get(current, uid)) return true; + const parent = db.prepare('SELECT parent_id FROM folders WHERE id=?').get(current); + current = parent?.parent_id || null; + } + return false; +} + +// GET /folders?parent_id= +router.get('/folders', authenticate, (req, res) => { + const uid = req.user.id; + const parentId = req.query.parent_id || null; + const own = db.prepare('SELECT * FROM folders WHERE user_id=? AND parent_id IS ? ORDER BY name').all(uid, parentId); + + let shared = []; + if (!parentId) { + // Root: directly shared folders + shared = getSharedRootFolders(uid); + } else { + // Inside a folder: show subfolders if parent is accessible + const parentOwned = db.prepare('SELECT * FROM folders WHERE id=? AND user_id=?').get(parentId, uid); + if (!parentOwned && isInSharedFolder(parentId, uid)) { + // Show subfolders of shared folder + const parentFolder = db.prepare('SELECT * FROM folders WHERE id=?').get(parentId); + if (parentFolder) { + const subfolders = db.prepare('SELECT f.*, u.username as owner FROM folders f JOIN users u ON u.id=f.user_id WHERE f.parent_id=? AND f.user_id!=?').all(parentId, uid); + shared = subfolders; + } + } + } res.json({ own, shared }); }); @@ -114,15 +145,25 @@ router.get('/', authenticate, (req, res) => { const uid = req.user.id; const folderId = req.query.folder_id || null; const own = db.prepare('SELECT f.*, u.username as owner FROM files f JOIN users u ON u.id=f.user_id WHERE f.user_id=? AND f.folder_id IS ? ORDER BY f.created_at DESC').all(uid, folderId); - // Shared files (root only, folders handled separately) - const shared = folderId ? [] : db.prepare(` - SELECT f.*, u.username as owner, s.shared_by, sb.username as shared_by_name - FROM files f JOIN users u ON u.id=f.user_id - JOIN file_shares s ON s.file_id=f.id - JOIN users sb ON sb.id=s.shared_by - WHERE s.shared_with=? - ORDER BY f.created_at DESC - `).all(uid); + + let shared = []; + if (!folderId) { + // Root: directly shared files + shared = db.prepare(` + SELECT f.*, u.username as owner, s.shared_by, sb.username as shared_by_name + FROM files f JOIN users u ON u.id=f.user_id + JOIN file_shares s ON s.file_id=f.id + JOIN users sb ON sb.id=s.shared_by + WHERE s.shared_with=? + ORDER BY f.created_at DESC + `).all(uid); + } else if (isInSharedFolder(folderId, uid)) { + // Inside a shared folder: show files belonging to folder owner + const folder = db.prepare('SELECT * FROM folders WHERE id=?').get(folderId); + if (folder) { + shared = db.prepare('SELECT f.*, u.username as owner FROM files f JOIN users u ON u.id=f.user_id WHERE f.folder_id=? AND f.user_id=? ORDER BY f.created_at DESC').all(folderId, folder.user_id); + } + } res.json({ own, shared }); });