import { redirect } from 'next/navigation'; import { db } from '@/db'; import { groups, permissions, rolePermissions, roles, users } from '@/db/schema/auth'; import { aclRules, resources } from '@/db/schema/resource'; import { requireAdmin } from '@/lib/auth/admin'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Dialog } from '@/components/ui/dialog'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Select } from '@/components/ui/select'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'; import { Tabs } from '@/components/ui/tabs'; import { assignPermissionToRoleAction, createAclRuleAction, createPermissionAction, createResourceAction, deleteAclRuleAction, removePermissionFromRoleAction, } from './actions'; export default async function PermissionsAdminPage() { try { await requireAdmin(); } catch { redirect('/login'); } const [roleRows, permissionRows, rolePermissionRows, resourceRows, aclRows, userRows, groupRows] = await Promise.all([ db.select().from(roles).orderBy(roles.name), db.select().from(permissions).orderBy(permissions.resourceType, permissions.action), db.select().from(rolePermissions), db.select().from(resources).orderBy(resources.path), db.select().from(aclRules).orderBy(aclRules.createdAt), db.select().from(users).orderBy(users.email), db.select().from(groups).orderBy(groups.name), ]); const permissionById = new Map(permissionRows.map((permission) => [permission.id, permission])); const resourceById = new Map(resourceRows.map((resource) => [resource.id, resource])); const userById = new Map(userRows.map((user) => [user.id, user.email])); const groupById = new Map(groupRows.map((group) => [group.id, group.name])); const actions = (
); const rolePermissionsContent = ( 角色权限 角色权限 {roleRows.map((role) => ( {role.name}
{rolePermissionRows.filter((row) => row.roleId === role.id).map((row) => { const permission = row.permissionId ? permissionById.get(row.permissionId) : null; if (!permission) return null; return (
); })}
))}
); const aclContent = ( ACL 规则 资源主体规则操作 {aclRows.map((rule) => ( {resourceById.get(rule.resourceId)?.path || rule.resourceId} {rule.subjectType}:{rule.subjectType === 'user' ? userById.get(rule.subjectId) : groupById.get(rule.subjectId)} {rule.permissionType}:{rule.action}
))}
); return (

EKB Admin

权限管理

{actions}
); }