|
|
@@ -0,0 +1,84 @@
|
|
|
+const router = require('express').Router();
|
|
|
+const { requireAdmin } = require('../middleware/auth');
|
|
|
+const { User, Track, Directory, TrackPoint, ShareLink } = require('../models');
|
|
|
+const { Op } = require('sequelize');
|
|
|
+
|
|
|
+router.get('/users', requireAdmin, async (req, res) => {
|
|
|
+ try {
|
|
|
+ const users = await User.findAll({
|
|
|
+ attributes: ['id', 'login', 'email', 'isAdmin', 'isActive', 'createdAt'],
|
|
|
+ order: [['createdAt', 'ASC']],
|
|
|
+ });
|
|
|
+ // Add track counts
|
|
|
+ const result = await Promise.all(users.map(async u => {
|
|
|
+ const trackCount = await Track.count({ where: { userId: u.id } });
|
|
|
+ return { ...u.toJSON(), trackCount };
|
|
|
+ }));
|
|
|
+ res.json(result);
|
|
|
+ } catch (e) {
|
|
|
+ res.status(500).json({ error: 'Server error' });
|
|
|
+ }
|
|
|
+});
|
|
|
+
|
|
|
+router.put('/users/:id/activate', requireAdmin, async (req, res) => {
|
|
|
+ try {
|
|
|
+ const user = await User.findByPk(req.params.id);
|
|
|
+ if (!user) return res.status(404).json({ error: 'User not found' });
|
|
|
+ await user.update({ isActive: req.body.isActive });
|
|
|
+ res.json({ ok: true, isActive: user.isActive });
|
|
|
+ } catch (e) {
|
|
|
+ res.status(500).json({ error: 'Server error' });
|
|
|
+ }
|
|
|
+});
|
|
|
+
|
|
|
+router.put('/users/:id/admin', requireAdmin, async (req, res) => {
|
|
|
+ try {
|
|
|
+ const user = await User.findByPk(req.params.id);
|
|
|
+ if (!user) return res.status(404).json({ error: 'User not found' });
|
|
|
+ if (user.id === req.user.id) return res.status(400).json({ error: 'Cannot change own admin status' });
|
|
|
+ await user.update({ isAdmin: req.body.isAdmin });
|
|
|
+ res.json({ ok: true });
|
|
|
+ } catch (e) {
|
|
|
+ res.status(500).json({ error: 'Server error' });
|
|
|
+ }
|
|
|
+});
|
|
|
+
|
|
|
+router.delete('/users/:id', requireAdmin, async (req, res) => {
|
|
|
+ try {
|
|
|
+ if (parseInt(req.params.id) === req.user.id) {
|
|
|
+ return res.status(400).json({ error: 'Cannot delete own account' });
|
|
|
+ }
|
|
|
+ const user = await User.findByPk(req.params.id);
|
|
|
+ if (!user) return res.status(404).json({ error: 'User not found' });
|
|
|
+ await user.destroy();
|
|
|
+ res.json({ ok: true });
|
|
|
+ } catch (e) {
|
|
|
+ res.status(500).json({ error: 'Server error' });
|
|
|
+ }
|
|
|
+});
|
|
|
+
|
|
|
+router.get('/users/:id/tracks', requireAdmin, async (req, res) => {
|
|
|
+ try {
|
|
|
+ const tracks = await Track.findAll({
|
|
|
+ where: { userId: req.params.id },
|
|
|
+ order: [['trackDate', 'DESC'], ['uploadDate', 'DESC']],
|
|
|
+ });
|
|
|
+ res.json(tracks);
|
|
|
+ } catch (e) {
|
|
|
+ res.status(500).json({ error: 'Server error' });
|
|
|
+ }
|
|
|
+});
|
|
|
+
|
|
|
+router.get('/tracks', requireAdmin, async (req, res) => {
|
|
|
+ try {
|
|
|
+ const tracks = await Track.findAll({
|
|
|
+ include: [{ model: User, attributes: ['login'] }],
|
|
|
+ order: [['trackDate', 'DESC'], ['uploadDate', 'DESC']],
|
|
|
+ });
|
|
|
+ res.json(tracks);
|
|
|
+ } catch (e) {
|
|
|
+ res.status(500).json({ error: 'Server error' });
|
|
|
+ }
|
|
|
+});
|
|
|
+
|
|
|
+module.exports = router;
|