Dateien nach "backend/src/tools/dateien" hochladen

This commit is contained in:
2026-05-26 20:37:12 +02:00
parent 1cdc7613e6
commit 31f7adec35

View File

@@ -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 });
});