feat(server): implement stats router
This commit is contained in:
@@ -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");
|
||||
})
|
||||
|
||||
@@ -1 +1,2 @@
|
||||
export * from "./library";
|
||||
export * from "./stats";
|
||||
|
||||
10
apps/server/src/models/api/dashboard/stats.ts
Normal file
10
apps/server/src/models/api/dashboard/stats.ts
Normal 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>;
|
||||
@@ -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);
|
||||
|
||||
24
apps/server/src/routes/dashboard/stats.ts
Normal file
24
apps/server/src/routes/dashboard/stats.ts
Normal 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,
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user