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;