feat: add Album model, artist/search/upload controllers, requireArtist middleware
This commit is contained in:
@@ -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);
|
||||
}
|
||||
},
|
||||
};
|
||||
Reference in New Issue
Block a user