diff --git a/backend/src/index.js b/backend/src/index.js index afd64a0..e624a37 100644 --- a/backend/src/index.js +++ b/backend/src/index.js @@ -12,6 +12,7 @@ const trashRoutes = require('./routes/trash'); const statsRoutes = require('./routes/stats'); const recentRoutes = require('./routes/recent'); const renameRoutes = require('./routes/rename'); +const copyRoutes = require('./routes/copy'); const errorHandler = require('./middleware/errorHandler'); const logger = require('./middleware/logger'); @@ -35,6 +36,7 @@ app.use('/api/trash', trashRoutes); app.use('/api/stats', statsRoutes); app.use('/api/recent', recentRoutes); app.use('/api/rename', renameRoutes); +app.use('/api/copy', copyRoutes); app.use(errorHandler); diff --git a/backend/src/routes/copy.js b/backend/src/routes/copy.js new file mode 100644 index 0000000..2330bdc --- /dev/null +++ b/backend/src/routes/copy.js @@ -0,0 +1,46 @@ +const express = require('express'); +const db = require('../db'); + +const router = express.Router(); + +// Copy file/folder +router.post('/', (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 { sourceId, targetFolderId } = req.body; + + // Get source file + db.query( + 'SELECT * FROM files WHERE id = ? AND user_id = ?', + [sourceId, decoded.userId] + ).then(sources => { + if (sources.length === 0) { + throw new Error('Source not found'); + } + const source = sources[0]; + + // Create copy + const newName = source.is_folder + ? source.name + : source.name.replace(/(\.[^.]+)$/, ' (copy)$1'); + + return db.run( + 'INSERT INTO files (user_id, parent_id, name, type, size, path, hash, is_folder) VALUES (?, ?, ?, ?, ?, ?, ?, ?)', + [decoded.userId, targetFolderId || source.parent_id, newName, source.type, source.size, source.path, source.hash, source.is_folder] + ); + }).then(() => { + res.json({ success: true }); + }).catch(err => { + res.status(500).json({ error: err.message }); + }); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + +module.exports = router;