feat(server): implement stats router

This commit is contained in:
2025-11-07 02:42:55 +07:00
parent ec665399e7
commit bf0f928841
5 changed files with 41 additions and 3 deletions

View File

@@ -7,6 +7,7 @@ import { appRouter } from "@/trpc";
import { createContext } from "@/trpc/context";
import { auth } from "./lib/auth";
import type { HonoEnv } from "./lib/types";
import { DashboardRouter } from "./routes/dashboard";
import { LibraryRouter } from "./routes/library";
import { MediaRouter } from "./routes/media";
import { OnboardRouter } from "./routes/onboard";
@@ -56,7 +57,7 @@ const app = factory
.route("/media", MediaRouter)
.route("/library", LibraryRouter)
.route("/playback", PlaybackRouter)
.route("/dashboard", DashboardRouter)
.get("/", (c) => {
return c.text("OK");
})

View File

@@ -1 +1,2 @@
export * from "./library";
export * from "./stats";

View File

@@ -0,0 +1,10 @@
import z from "zod";
export const StatsOverviewOutput = z.object({
totalUsers: z.number(),
totalMovies: z.number(),
totalSeries: z.number(),
totalEpisodes: z.number(),
totalLibraries: z.number(),
});
export type StatsOverviewOutput = z.infer<typeof StatsOverviewOutput>;

View File

@@ -1,4 +1,6 @@
import { Hono } from "hono";
import { LibraryRouter } from "./dashboard/library";
export const DashboardRouter = new Hono().route("/library ", LibraryRouter);
import { StatsRouter } from "./dashboard/stats";
export const DashboardRouter = new Hono()
.route("/library ", LibraryRouter)
.route("/stats", StatsRouter);

View File

@@ -0,0 +1,24 @@
import { count } from "drizzle-orm";
import { Hono } from "hono";
import { database } from "@/db";
import { episodes, libraryFolders, movies, series, user } from "@/db/schema";
import type { StatsOverviewOutput } from "@/models/api";
export const StatsRouter = new Hono().get("/overview", async (c) => {
const [usersCount, moviesCount, seriesCount, episodesCount, librariesCount] =
await Promise.all([
database.select({ count: count() }).from(user),
database.select({ count: count() }).from(movies),
database.select({ count: count() }).from(series),
database.select({ count: count() }).from(episodes),
database.select({ count: count() }).from(libraryFolders),
]);
return c.json<StatsOverviewOutput>({
totalUsers: usersCount[0].count,
totalMovies: moviesCount[0].count,
totalSeries: seriesCount[0].count,
totalEpisodes: episodesCount[0].count,
totalLibraries: librariesCount[0].count,
});
});