From 6fac45bfc8fc280b4f5a4407eb7ab3f1f991f457 Mon Sep 17 00:00:00 2001 From: Backend Developer Date: Tue, 10 Mar 2026 08:55:33 +0000 Subject: [PATCH] =?UTF-8?q?=E5=90=8E=E7=AB=AF:=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=89=B9=E9=87=8F=E6=93=8D=E4=BD=9CAPI=20(=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E5=88=A0=E9=99=A4/=E7=A7=BB=E5=8A=A8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/index.js | 5 ++-- backend/src/routes/batch.js | 56 +++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 3 deletions(-) create mode 100644 backend/src/routes/batch.js diff --git a/backend/src/index.js b/backend/src/index.js index eb89d90..11d9887 100644 --- a/backend/src/index.js +++ b/backend/src/index.js @@ -7,6 +7,7 @@ const syncRoutes = require('./routes/sync'); const previewRoutes = require('./routes/preview'); const userRoutes = require('./routes/user'); const searchRoutes = require('./routes/search'); +const batchRoutes = require('./routes/batch'); const errorHandler = require('./middleware/errorHandler'); const app = express(); @@ -15,7 +16,6 @@ const PORT = process.env.PORT || 3000; app.use(cors()); app.use(express.json()); -// Routes app.use('/api/auth', authRoutes); app.use('/api/files', fileRoutes); app.use('/api/share', shareRoutes); @@ -23,11 +23,10 @@ app.use('/api/sync', syncRoutes); app.use('/api/preview', previewRoutes); app.use('/api/user', userRoutes); app.use('/api/search', searchRoutes); +app.use('/api/batch', batchRoutes); -// Error handler app.use(errorHandler); -// Health check app.get('/api/health', (req, res) => { res.json({ status: 'ok' }); }); diff --git a/backend/src/routes/batch.js b/backend/src/routes/batch.js new file mode 100644 index 0000000..77c913d --- /dev/null +++ b/backend/src/routes/batch.js @@ -0,0 +1,56 @@ +const express = require('express'); +const db = require('../db'); + +const router = express.Router(); + +// Batch delete files +router.post('/delete', (req, res) => { + const token = req.headers.authorization?.replace('Bearer ', ''); + if (!token) return res.status(401).json({ error: 'No token' }); + + try { + const jwt = require('jsonwebtoken'); + const decoded = jwt.verify(token, process.env.JWT_SECRET || 'clouddisk-secret-key'); + + const { fileIds } = req.body; + + if (!Array.isArray(fileIds) || fileIds.length === 0) { + return res.status(400).json({ error: 'No files specified' }); + } + + const placeholders = fileIds.map(() => '?').join(','); + db.run( + `UPDATE files SET deleted_at = CURRENT_TIMESTAMP WHERE id IN (${placeholders}) AND user_id = ?`, + [...fileIds, decoded.userId] + ).then(() => { + res.json({ success: true, deleted: fileIds.length }); + }); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + +// Batch move files +router.post('/move', (req, res) => { + const token = req.headers.authorization?.replace('Bearer ', ''); + if (!token) return res.status(401).json({ error: 'No token' }); + + try { + const jwt = require('jsonwebtoken'); + const decoded = jwt.verify(token, process.env.JWT_SECRET || 'clouddisk-secret-key'); + + const { fileIds, targetFolderId } = req.body; + + const placeholders = fileIds.map(() => '?').join(','); + db.run( + `UPDATE files SET parent_id = ?, updated_at = CURRENT_TIMESTAMP WHERE id IN (${placeholders}) AND user_id = ?`, + [targetFolderId, ...fileIds, decoded.userId] + ).then(() => { + res.json({ success: true, moved: fileIds.length }); + }); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + +module.exports = router;