spaces/src/api/admin/admin.route.js
2025-11-06 21:09:14 -05:00

158 lines
4 KiB
JavaScript

import express from 'express';
import pg from '../../utils/db.js';
import { requireAdmin } from '../../middlewares/admin.middleware.js';
import { deleteSpace } from '../../utils/spaces.js';
const router = express.Router();
router.post('/analytics', requireAdmin, async (req, res) => {
try {
const [userCount] = await pg('users').count('id as count');
const [spaceCount] = await pg('spaces').count('id as count');
const [activeSpaces] = await pg('spaces')
.where('running', true)
.count('id as count');
res.status(200).json({
success: true,
data: {
totalUsers: parseInt(userCount.count),
totalSpaces: parseInt(spaceCount.count),
activeSpaces: parseInt(activeSpaces.count)
}
});
} catch (error) {
console.error('Error fetching analytics:', error);
res.status(500).json({
success: false,
message: 'Failed to fetch analytics'
});
}
});
router.post('/users', requireAdmin, async (req, res) => {
try {
const users = await pg('users')
.select('id', 'email', 'username', 'max_spaces', 'is_admin')
.orderBy('id', 'desc');
const usersWithSpaces = await Promise.all(
users.map(async (user) => {
const [spaceCount] = await pg('spaces')
.where('user_id', user.id)
.count('id as count');
return {
...user,
spaceCount: parseInt(spaceCount.count)
};
})
);
res.status(200).json({
success: true,
data: usersWithSpaces
});
} catch (error) {
console.error('Error fetching users:', error);
res.status(500).json({
success: false,
message: 'Failed to fetch users'
});
}
});
router.post('/spaces', requireAdmin, async (req, res) => {
try {
const spaces = await pg('spaces')
.select('spaces.*', 'users.username', 'users.email')
.join('users', 'spaces.user_id', 'users.id')
.orderBy('spaces.id', 'desc');
res.status(200).json({
success: true,
data: spaces
});
} catch (error) {
console.error('Error fetching spaces:', error);
res.status(500).json({
success: false,
message: 'Failed to fetch spaces'
});
}
});
router.post('/users/:userId/update', requireAdmin, async (req, res) => {
try {
const { userId } = req.params;
const { max_spaces, is_admin } = req.body;
const updates = {};
if (max_spaces !== undefined) updates.max_spaces = max_spaces;
if (is_admin !== undefined) updates.is_admin = is_admin;
const [updatedUser] = await pg('users')
.where('id', userId)
.update(updates)
.returning(['id', 'email', 'username', 'max_spaces', 'is_admin']);
res.status(200).json({
success: true,
data: updatedUser
});
} catch (error) {
console.error('Error updating user:', error);
res.status(500).json({
success: false,
message: 'Failed to update user'
});
}
});
router.post('/users/:userId/delete', requireAdmin, async (req, res) => {
try {
const { userId } = req.params;
const userSpaces = await pg('spaces').where('user_id', userId);
for (const space of userSpaces) {
try {
await deleteSpace(space.id);
} catch (error) {
console.error(`Error deleting space ${space.id}:`, error);
}
}
await pg('users').where('id', userId).delete();
res.status(200).json({
success: true,
message: 'User and associated spaces deleted'
});
} catch (error) {
console.error('Error deleting user:', error);
res.status(500).json({
success: false,
message: 'Failed to delete user'
});
}
});
router.post('/spaces/:spaceId/delete', requireAdmin, async (req, res) => {
try {
const { spaceId } = req.params;
await deleteSpace(spaceId);
res.status(200).json({
success: true,
message: 'Space deleted successfully'
});
} catch (error) {
console.error('Error deleting space:', error);
res.status(500).json({
success: false,
message: 'Failed to delete space'
});
}
});
export default router;