* fix: restrict parts of manage navigation to admins * fix: restrict stats cards on manage home page * fix: restrict access to amount of certain stats for manage home * fix: restrict visibility of board create button * fix: restrict access to integration pages * fix: restrict access to tools pages for admins * fix: restrict access to user and group pages * test: adjust tests to match permission changes for routes * fix: remove certain pages from spotlight without admin * fix: app management not restricted
33 lines
1.3 KiB
TypeScript
33 lines
1.3 KiB
TypeScript
import type { AnySQLiteTable } from "drizzle-orm/sqlite-core";
|
|
|
|
import { isProviderEnabled } from "@homarr/auth/server";
|
|
import type { Database } from "@homarr/db";
|
|
import { count } from "@homarr/db";
|
|
import { apps, boards, groups, integrations, invites, users } from "@homarr/db/schema/sqlite";
|
|
|
|
import { createTRPCRouter, publicProcedure } from "../trpc";
|
|
|
|
export const homeRouter = createTRPCRouter({
|
|
getStats: publicProcedure.query(async ({ ctx }) => {
|
|
const isAdmin = ctx.session?.user.permissions.includes("admin") ?? false;
|
|
const isCredentialsEnabled = isProviderEnabled("credentials");
|
|
|
|
return {
|
|
countBoards: await getCountForTableAsync(ctx.db, boards, true),
|
|
countUsers: await getCountForTableAsync(ctx.db, users, isAdmin),
|
|
countGroups: await getCountForTableAsync(ctx.db, groups, true),
|
|
countInvites: await getCountForTableAsync(ctx.db, invites, isAdmin),
|
|
countIntegrations: await getCountForTableAsync(ctx.db, integrations, isCredentialsEnabled && isAdmin),
|
|
countApps: await getCountForTableAsync(ctx.db, apps, true),
|
|
};
|
|
}),
|
|
});
|
|
|
|
const getCountForTableAsync = async (db: Database, table: AnySQLiteTable, canView: boolean) => {
|
|
if (!canView) {
|
|
return 0;
|
|
}
|
|
|
|
return (await db.select({ count: count() }).from(table))[0]?.count ?? 0;
|
|
};
|