feat: add Album model, artist/search/upload controllers, requireArtist middleware

This commit is contained in:
2026-05-26 07:01:11 +07:00
parent 59e4d86a3b
commit b0c29765a9
14 changed files with 278 additions and 7 deletions
+62
View File
@@ -0,0 +1,62 @@
import Track from '../models/Track.js';
export const artistController = {
async getProfile(req, res, next) {
try {
const artistName = req.params.artistName;
if (!artistName) {
return res.status(400).json({ success: false, message: 'Artist name is required' });
}
const decodedName = decodeURIComponent(artistName);
const tracks = await Track.find({ artist: decodedName })
.select('-__v')
.sort({ createdAt: -1 })
.lean();
if (!tracks.length) {
return res.status(404).json({ success: false, message: 'Artist not found' });
}
const totalTracks = tracks.length;
const genres = [...new Set(tracks.map(t => t.genre).filter(Boolean))];
const albums = [...new Set(tracks.map(t => t.album).filter(Boolean))];
const data = {
name: decodedName,
trackCount: totalTracks,
genres,
albums,
imageUrl: tracks.find(t => t.coverUrl)?.coverUrl || null,
topTracks: tracks.slice(0, 10),
};
return res.json({ success: true, data });
} catch (error) {
return next(error);
}
},
async getTracks(req, res, next) {
try {
const artistName = req.params.artistName;
if (!artistName) {
return res.status(400).json({ success: false, message: 'Artist name is required' });
}
const decodedName = decodeURIComponent(artistName);
const tracks = await Track.find({ artist: decodedName })
.select('-__v')
.sort({ createdAt: -1 })
.lean();
return res.json({ success: true, data: tracks });
} catch (error) {
return next(error);
}
},
};