mirror of
https://github.com/System-End/spaces.git
synced 2026-04-19 16:38:24 +00:00
158 lines
4 KiB
JavaScript
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;
|