refactor(db): migrate app pages and APIs from Prisma facade to Drizzle (3)

Co-authored-by: Cursor <[email protected]>
This commit is contained in:
SimoandCursor committed 2026-08-01 14:15:32 +02:00
1 parent 2cd0863cb8
commit 580972c0a0
40 files changed
+1089 -808

No files matched your search

+40 -22
View File
@@ -1,8 +1,15 @@
import { asc, eq } from "drizzle-orm";
import Link from "next/link";
import { redirect } from "next/navigation";
import { getTranslations } from "next-intl/server";
import {
AclModelPermission,
AclPermission,
AclRole,
db,
WebsiteHousekeepingPermissions,
} from "@/lib/db";
import { canAccess, getAdminContext, PERMS } from "@/lib/permissions";
import { prisma } from "@/lib/prisma";
import { getAuditLogs } from "@/lib/services/audit";
import { AuditSection, ExportSection } from "./client";
@@ -31,12 +38,14 @@ export default async function AdminHousekeeping({
const sp = await searchParams;
const tab = sp.tab ?? "overview";
type HKPerm = Awaited<
ReturnType<typeof prisma.websiteHousekeepingPermissions.findMany>
>[0];
const allPermissions: HKPerm[] = await prisma.websiteHousekeepingPermissions
.findMany({ orderBy: [{ groupName: "asc" }, { permission: "asc" }] })
.catch(() => []);
const allPermissions = await db
.select()
.from(WebsiteHousekeepingPermissions)
.orderBy(
asc(WebsiteHousekeepingPermissions.groupName),
asc(WebsiteHousekeepingPermissions.permission),
)
.catch((): (typeof WebsiteHousekeepingPermissions.$inferSelect)[] => []);
const ranks = allPermissions.map((p) => p.minRank);
const maxRank = ranks.length ? Math.max(...ranks) : 0;
@@ -48,34 +57,43 @@ export default async function AdminHousekeeping({
groupCounts[g] = (groupCounts[g] || 0) + 1;
}
const rankGroups: Record<string, typeof allPermissions> = {};
const rankGroups: Record<
string,
(typeof WebsiteHousekeepingPermissions.$inferSelect)[]
> = {};
for (const p of allPermissions) {
if (!rankGroups[p.minRank]) rankGroups[p.minRank] = [];
rankGroups[p.minRank].push(p);
const rk = String(p.minRank);
if (!rankGroups[rk]) rankGroups[rk] = [];
rankGroups[rk].push(p);
}
const aclSlugs = await prisma.aclPermission
.findMany({ select: { slug: true } })
const aclSlugs = await db
.select({ slug: AclPermission.slug })
.from(AclPermission)
.catch(() => [] as { slug: string }[]);
const aclSlugSet = new Set(aclSlugs.map((p) => p.slug));
const aclRolePerms = await prisma.aclModelPermission
.findMany({
where: { modelType: "Role" },
include: {
permission: { select: { slug: true } },
role: { select: { slug: true } },
},
const aclRolePerms = await db
.select({
roleSlug: AclRole.slug,
permissionSlug: AclPermission.slug,
})
.catch(() => []);
.from(AclModelPermission)
.innerJoin(
AclPermission,
eq(AclModelPermission.permissionId, AclPermission.id),
)
.innerJoin(AclRole, eq(AclModelPermission.modelId, AclRole.id))
.where(eq(AclModelPermission.modelType, "Role"))
.catch((): { roleSlug: string; permissionSlug: string }[] => []);
const aclMinRankBySlug = new Map<string, number>();
for (const row of aclRolePerms) {
const roleSlug = row.role.slug;
const roleSlug = row.roleSlug;
if (!roleSlug.startsWith("rank_")) continue;
const rank = Number(roleSlug.slice(5));
if (!Number.isFinite(rank)) continue;
const slug = row.permission.slug;
const slug = row.permissionSlug;
const prev = aclMinRankBySlug.get(slug);
if (prev === undefined || rank < prev) aclMinRankBySlug.set(slug, rank);
}