63 lines
1.6 KiB
JavaScript
63 lines
1.6 KiB
JavaScript
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);
|
|
}
|
|
},
|
|
};
|