refactor(db): migrate app pages and APIs from Prisma facade to Drizzle (3)
Co-authored-by: Cursor <[email protected]>
This commit is contained in:
1 parent
2cd0863cb8
commit
580972c0a0
40 files changed
+1089
-808
No files matched your search
@@ -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);
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user