--- import AdminLayout from "@/layouts/AdminLayout.astro"; import { getDatabase, schema } from "@/db"; import { sql, desc, gte } from "drizzle-orm"; import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { BarChart3, Users, GitBranch, HardDrive, Activity, TrendingUp, Server, Database } from "lucide-react"; const user = Astro.locals.user; // Only admins can access if (!user?.isAdmin) { return Astro.redirect('/'); } const db = getDatabase(); const thirtyDaysAgo = new Date(); thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30); // Gather metrics const [ totalUsers, totalRepos, totalIssues, totalPRs, totalCommits, recentActivities, reposByLanguage, recentUsers ] = await Promise.all([ db.select({ count: sql`count(*)` }).from(schema.users).get(), db.select({ count: sql`count(*)` }).from(schema.repositories).get(), db.select({ count: sql`count(*)` }).from(schema.issues).get(), db.select({ count: sql`count(*)` }).from(schema.pullRequests).get(), db.select({ count: sql`count(*)` }).from(schema.commits).get(), db.query.activities.findMany({ orderBy: [desc(schema.activities.createdAt)], limit: 10, with: { user: { columns: { username: true } } } }), db.select({ language: schema.repositories.language, count: sql`count(*)` }) .from(schema.repositories) .groupBy(schema.repositories.language) .limit(10) .all(), db.query.users.findMany({ where: gte(schema.users.createdAt, thirtyDaysAgo), columns: { createdAt: true }, }) ]); const userGrowthMap = new Map(); for (let i = 0; i < 30; i++) { const d = new Date(); d.setDate(d.getDate() - i); const key = d.toISOString().split("T")[0]; userGrowthMap.set(key, 0); } for (const u of recentUsers) { const key = u.createdAt.toISOString().split("T")[0]; userGrowthMap.set(key, (userGrowthMap.get(key) || 0) + 1); } const userGrowth = Array.from(userGrowthMap.entries()) .map(([date, count]) => ({ date, count })) .sort((a, b) => a.date.localeCompare(b.date)); // Storage estimate (count repos * average size) const storageKB = await db.select({ total: sql`sum(size)` }) .from(schema.repositories) .get(); const storageMB = Math.round((storageKB?.total || 0) / 1024); const storageGB = (storageMB / 1024).toFixed(2); // Calculate some rates const today = new Date().toISOString().split('T')[0]; const todayUsers = userGrowth.find(u => u.date === today)?.count || 0; ---

System Metrics

Real-time system statistics and insights

← Back to Dashboard

Total Users

{totalUsers?.count || 0}

{todayUsers > 0 && (

+{todayUsers} today

)}

Repositories

{totalRepos?.count || 0}

Total Commits

{totalCommits?.count || 0}

Storage

{storageGB} GB

User Growth (30 days)
{userGrowth.slice().reverse().map((day, i) => { const maxCount = Math.max(...userGrowth.map(d => d.count), 1); const height = (day.count / maxCount) * 100; return (
); })}
30 days ago Today
Languages
{reposByLanguage.filter(l => l.language).slice(0, 8).map((lang) => { const total = reposByLanguage.reduce((sum, l) => sum + l.count, 0); const percent = ((lang.count / total) * 100).toFixed(1); const colors: Record = { 'TypeScript': 'bg-blue-500', 'JavaScript': 'bg-yellow-500', 'Python': 'bg-green-500', 'Go': 'bg-cyan-500', 'Rust': 'bg-orange-500', 'Java': 'bg-red-500', }; const color = colors[lang.language || ''] || 'bg-muted-foreground'; return (
{lang.language || 'Unknown'} {lang.count}
); })}

Open Issues

{totalIssues?.count || 0}

Pull Requests

{totalPRs?.count || 0}

System Health
Healthy
Database
Online
Git Server
Recent Activity
{recentActivities.map((activity) => (
@{activity.user?.username} {activity.action} {activity.type} {activity.refName && ( {activity.refName} )}
))}