import { PageParams } from "@/types/next"; import { Page, PageContent, PageHeader, PageTitle } from "@/features/layout/page"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { EvolutionLineChart } from "@/components/wrappers/dashboard/statistics/charts/evolution-line-chart"; import { PercentageLineChart } from "@/components/wrappers/dashboard/statistics/charts/percentage-line-chart"; import { getCurrentOrganizationSlug } from "@/features/dashboard/organization-cookie"; import { notFound } from "next/navigation"; import { db } from "@/db"; import { asc, count, eq, inArray } from "drizzle-orm"; import { organization as drizzleOrganization, project as drizzleProject, backup as drizzleBackup } from "@/db/schema"; export default async function RoutePage(props: PageParams<{ slug: string }>) { const { slug: organizationSlug } = await props.params; const currentOrganizationSlug = await getCurrentOrganizationSlug(); if (currentOrganizationSlug !== organizationSlug) { notFound(); } const org = await db.query.organization.findFirst({ where: eq(drizzleOrganization.slug, currentOrganizationSlug), }); if (!org) notFound(); const projects = await db.query.project.findMany({ where: eq(drizzleProject.organizationId, org.id), }); const projectsCount = projects.length; const backupsEvolution = await db.query.backup.findMany({ columns: { id: true, createdAt: true, }, orderBy: [asc(drizzleBackup.id)], }); const backupsRate = await db .select({ createdAt: drizzleBackup.createdAt, status: drizzleBackup.status, _count: count(), }) .from(drizzleBackup) .where(inArray(drizzleBackup.status, ["success", "failed"])) .groupBy(drizzleBackup.createdAt, drizzleBackup.status) .orderBy(drizzleBackup.createdAt); return ( Statistics
Projects {projectsCount} KPI 2 KPI 3
Evolution of the number of backups Success rate of backups
); }