feat: dashboard

This commit is contained in:
2026-06-05 01:25:16 +02:00
parent 147858de2f
commit 2f6c52e73c
73 changed files with 3490 additions and 1061 deletions

View File

@@ -3,6 +3,8 @@ import { v4 as uuidv4 } from 'uuid';
import { ServerChannelPayload, ServerPayload } from '../cqrs/types';
import {
getAllPublicServers,
getFeaturedServers,
getTrendingServers,
getServerById,
getUserById,
upsertServer,
@@ -155,6 +157,34 @@ router.get('/', async (req, res) => {
res.json({ servers: enrichedResults, total, limit: Number(limit), offset: Number(offset) });
});
function parseDiscoveryLimit(value: unknown, fallback: number): number {
const parsed = Number(value);
if (!Number.isFinite(parsed) || parsed <= 0) {
return fallback;
}
return Math.min(Math.floor(parsed), 50);
}
// NOTE: `/featured` and `/trending` must be registered before `/:id`,
// otherwise Express resolves them as a server id.
router.get('/featured', async (req, res) => {
const limit = parseDiscoveryLimit(req.query.limit, 12);
const servers = await getFeaturedServers(limit);
const enrichedResults = await Promise.all(servers.map((server) => enrichServer(server)));
res.json({ servers: enrichedResults, total: enrichedResults.length, limit });
});
router.get('/trending', async (req, res) => {
const limit = parseDiscoveryLimit(req.query.limit, 12);
const servers = await getTrendingServers(limit);
const enrichedResults = await Promise.all(servers.map((server) => enrichServer(server)));
res.json({ servers: enrichedResults, total: enrichedResults.length, limit });
});
router.post('/', async (req, res) => {
const {
id: clientId,