import fs from 'fs'; import Track from '../models/Track.js'; const removeFile = (file) => { if (!file?.path) { return; } fs.unlink(file.path, () => {}); }; export const uploadController = { async uploadTrack(req, res, next) { try { if (!req.userId) { removeFile(req.files?.cover?.[0]); removeFile(req.files?.audio?.[0]); return res.status(401).json({ success: false, message: 'Authentication required to upload' }); } const { title, artist, album, genre } = req.body; if (!title || !artist || !album || !genre) { removeFile(req.files?.cover?.[0]); removeFile(req.files?.audio?.[0]); return res.status(400).json({ success: false, message: 'All fields are required' }); } const coverFile = req.files?.cover?.[0]; const audioFile = req.files?.audio?.[0]; if (!coverFile || !audioFile) { removeFile(coverFile); removeFile(audioFile); return res.status(400).json({ success: false, message: 'Cover and audio files are required' }); } if (coverFile.size > 5 * 1024 * 1024) { removeFile(coverFile); removeFile(audioFile); return res.status(400).json({ success: false, message: 'Cover image must be 5MB or smaller' }); } const coverUrl = `/uploads/covers/${coverFile.filename}`; const audioUrl = `/uploads/audio/${audioFile.filename}`; const track = await Track.create({ title, artist, album, genre, coverUrl, audioUrl, createdBy: req.userId, }); return res.json({ success: true, data: track }); } catch (error) { return next(error); } }, };