import Router from 'koa-router'; import multer from '@koa/multer'; import path from 'path'; import fs from 'fs'; const router = new Router({ prefix: '/api/files' }); const uploadDir = path.join(process.cwd(), 'uploads'); if (!fs.existsSync(uploadDir)) { fs.mkdirSync(uploadDir, { recursive: true }); } const storage = multer.diskStorage({ destination: (req, file, cb) => { cb(null, uploadDir); }, filename: (req, file, cb) => { const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9); cb(null, uniqueSuffix + '-' + file.originalname); } }); const upload = multer({ storage }); const fileTransfers = new Map(); router.get('/info', async (ctx) => { ctx.body = { message: 'File API endpoint' }; }); router.post('/metadata', async (ctx) => { const { fileId, name, size, type, senderId, receiverId } = ctx.request.body; fileTransfers.set(fileId, { fileId, name, size, type, senderId, receiverId, progress: 0, status: 'pending', createdAt: new Date() }); ctx.body = { success: true, fileId, message: 'File metadata registered' }; }); router.get('/metadata/:fileId', async (ctx) => { const { fileId } = ctx.params; const fileData = fileTransfers.get(fileId); if (!fileData) { ctx.status = 404; ctx.body = { error: 'File not found' }; return; } ctx.body = fileData; }); router.put('/progress/:fileId', async (ctx) => { const { fileId } = ctx.params; const { progress, status } = ctx.request.body; const fileData = fileTransfers.get(fileId); if (fileData) { fileData.progress = progress; if (status) { fileData.status = status; } ctx.io?.to(fileData.senderId).emit('file-progress', { fileId, progress, status }); ctx.io?.to(fileData.receiverId).emit('file-progress', { fileId, progress, status }); } ctx.body = { success: true, fileId, progress }; }); router.delete('/:fileId', async (ctx) => { const { fileId } = ctx.params; fileTransfers.delete(fileId); ctx.body = { success: true, message: 'File transfer cancelled' }; }); router.get('/transfers', async (ctx) => { const { userId } = ctx.query; const transfers = Array.from(fileTransfers.values()).filter( transfer => transfer.senderId === userId || transfer.receiverId === userId ); ctx.body = transfers; }); export default router;