From 35880e7d090b909120fc6d3ab570904118b9ce30 Mon Sep 17 00:00:00 2001 From: Backend Developer Date: Tue, 10 Mar 2026 08:49:19 +0000 Subject: [PATCH] =?UTF-8?q?=E5=90=8E=E7=AB=AF:=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E6=90=9C=E7=B4=A2API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/index.js | 2 ++ backend/src/routes/search.js | 40 ++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 backend/src/routes/search.js diff --git a/backend/src/index.js b/backend/src/index.js index db0f294..eb89d90 100644 --- a/backend/src/index.js +++ b/backend/src/index.js @@ -6,6 +6,7 @@ const shareRoutes = require('./routes/share'); const syncRoutes = require('./routes/sync'); const previewRoutes = require('./routes/preview'); const userRoutes = require('./routes/user'); +const searchRoutes = require('./routes/search'); const errorHandler = require('./middleware/errorHandler'); const app = express(); @@ -21,6 +22,7 @@ app.use('/api/share', shareRoutes); app.use('/api/sync', syncRoutes); app.use('/api/preview', previewRoutes); app.use('/api/user', userRoutes); +app.use('/api/search', searchRoutes); // Error handler app.use(errorHandler); diff --git a/backend/src/routes/search.js b/backend/src/routes/search.js new file mode 100644 index 0000000..c146402 --- /dev/null +++ b/backend/src/routes/search.js @@ -0,0 +1,40 @@ +const express = require('express'); +const db = require('../db'); + +const router = express.Router(); + +// Search files +router.get('/', (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 { q, type } = req.query; + + if (!q || q.length < 2) { + return res.status(400).json({ error: 'Search query too short' }); + } + + let sql = 'SELECT * FROM files WHERE user_id = ? AND name LIKE ? AND deleted_at IS NULL'; + const params = [decoded.userId, `%${q}%`]; + + if (type === 'folder') { + sql += ' AND is_folder = 1'; + } else if (type === 'file') { + sql += ' AND is_folder = 0'; + } + + sql += ' ORDER BY name ASC LIMIT 50'; + + db.query(sql, params).then(files => { + res.json({ files, total: files.length }); + }); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + +module.exports = router;