Files
portabase/app/(customer)/dashboard/(organization)/statistics/page.tsx
T

99 lines
3.8 KiB
TypeScript
Raw Normal View History

2025-05-16 15:54:17 +02:00
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";
2025-07-16 12:36:11 +02:00
import * as drizzleDb from "@/db";
2025-07-16 18:15:28 +02:00
import {getOrganization} from "@/lib/auth/auth";
2024-12-15 16:32:21 +01:00
2025-07-16 18:15:28 +02:00
export default async function RoutePage(props: PageParams<{ }>) {
const organization = await getOrganization({});
2024-12-15 16:32:21 +01:00
2025-07-16 18:15:28 +02:00
if (!organization) {
2025-05-16 15:54:17 +02:00
notFound();
}
const org = await db.query.organization.findFirst({
2025-07-16 18:15:28 +02:00
where: eq(drizzleDb.schemas.organization.slug, organization.slug),
2024-12-15 16:32:21 +01:00
});
2025-05-16 15:54:17 +02:00
if (!org) notFound();
const projects = await db.query.project.findMany({
2025-07-16 12:36:11 +02:00
where: eq(drizzleDb.schemas.project.organizationId, org.id),
2025-05-16 15:54:17 +02:00
});
const projectsCount = projects.length;
const backupsEvolution = await db.query.backup.findMany({
columns: {
id: true,
2024-12-15 16:32:21 +01:00
createdAt: true,
},
2025-07-16 12:36:11 +02:00
orderBy: [asc(drizzleDb.schemas.backup.id)],
2024-12-15 16:32:21 +01:00
});
2025-05-16 15:54:17 +02:00
const backupsRate = await db
.select({
2025-07-16 12:36:11 +02:00
createdAt: drizzleDb.schemas.backup.createdAt,
status: drizzleDb.schemas.backup.status,
2025-05-16 15:54:17 +02:00
_count: count(),
})
2025-07-16 12:36:11 +02:00
.from(drizzleDb.schemas.backup)
.where(inArray(drizzleDb.schemas.backup.status, ["success", "failed"]))
.groupBy(drizzleDb.schemas.backup.createdAt, drizzleDb.schemas.backup.status)
.orderBy(drizzleDb.schemas.backup.createdAt);
2024-12-15 16:32:21 +01:00
return (
<Page>
<PageHeader>
2025-05-16 15:54:17 +02:00
<PageTitle>Statistics</PageTitle>
2024-12-15 16:32:21 +01:00
</PageHeader>
<PageContent className="flex flex-col gap-y-4">
<div className="flex flex-col md:flex-row gap-4">
<Card className="w-full">
<CardHeader>
<CardTitle>Projects</CardTitle>
</CardHeader>
2025-05-16 15:54:17 +02:00
<CardContent>{projectsCount}</CardContent>
2024-12-15 16:32:21 +01:00
</Card>
<Card className="w-full">
<CardHeader>
<CardTitle>KPI 2</CardTitle>
</CardHeader>
2025-05-16 15:54:17 +02:00
<CardContent></CardContent>
2024-12-15 16:32:21 +01:00
</Card>
<Card className="w-full">
<CardHeader>
<CardTitle>KPI 3</CardTitle>
</CardHeader>
2025-05-16 15:54:17 +02:00
<CardContent></CardContent>
2024-12-15 16:32:21 +01:00
</Card>
</div>
<div className="flex flex-col md:flex-row gap-4">
<Card className="w-full">
<CardHeader>
<CardTitle>Evolution of the number of backups</CardTitle>
</CardHeader>
<CardContent>
2025-05-16 15:54:17 +02:00
<EvolutionLineChart data={backupsEvolution} />
2024-12-15 16:32:21 +01:00
</CardContent>
</Card>
<Card className="w-full">
<CardHeader>
<CardTitle>Success rate of backups</CardTitle>
</CardHeader>
<CardContent>
2025-05-16 15:54:17 +02:00
<PercentageLineChart data={backupsRate} />
2024-12-15 16:32:21 +01:00
</CardContent>
</Card>
</div>
</PageContent>
</Page>
2025-05-16 15:54:17 +02:00
);
}