Browse Source

Add admin routes for user management

k4be 7 giờ trước cách đây
mục cha
commit
7087a7c7fa
1 tập tin đã thay đổi với 84 bổ sung0 xóa
  1. 84 0
      gpx-vis-backend/src/routes/admin.js

+ 84 - 0
gpx-vis-backend/src/routes/admin.js

@@ -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;