Dateien nach "backend/src/tools/dateien" hochladen
This commit is contained in:
@@ -38,13 +38,9 @@ const hasFileAccess = (fileId, userId) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// ── Ordner ────────────────────────────────────────────────────────────────────
|
// ── Ordner ────────────────────────────────────────────────────────────────────
|
||||||
// GET /folders?parent_id=
|
// Helper: collect all ancestor folder IDs that are shared with user
|
||||||
router.get('/folders', authenticate, (req, res) => {
|
function getSharedRootFolders(uid) {
|
||||||
const uid = req.user.id;
|
return db.prepare(`
|
||||||
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(`
|
|
||||||
SELECT f.*, u.username as owner, s.shared_by
|
SELECT f.*, u.username as owner, s.shared_by
|
||||||
FROM folders f
|
FROM folders f
|
||||||
JOIN users u ON u.id=f.user_id
|
JOIN users u ON u.id=f.user_id
|
||||||
@@ -52,6 +48,41 @@ router.get('/folders', authenticate, (req, res) => {
|
|||||||
WHERE s.shared_with=?
|
WHERE s.shared_with=?
|
||||||
ORDER BY f.name
|
ORDER BY f.name
|
||||||
`).all(uid);
|
`).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 });
|
res.json({ own, shared });
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -114,8 +145,11 @@ router.get('/', authenticate, (req, res) => {
|
|||||||
const uid = req.user.id;
|
const uid = req.user.id;
|
||||||
const folderId = req.query.folder_id || null;
|
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);
|
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(`
|
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
|
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
|
FROM files f JOIN users u ON u.id=f.user_id
|
||||||
JOIN file_shares s ON s.file_id=f.id
|
JOIN file_shares s ON s.file_id=f.id
|
||||||
@@ -123,6 +157,13 @@ router.get('/', authenticate, (req, res) => {
|
|||||||
WHERE s.shared_with=?
|
WHERE s.shared_with=?
|
||||||
ORDER BY f.created_at DESC
|
ORDER BY f.created_at DESC
|
||||||
`).all(uid);
|
`).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 });
|
res.json({ own, shared });
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user