import { eq } from 'drizzle-orm' import { db } from './db-instance' import { permissions } from './schema/permissions' import { rolePermissions } from './schema/rolePermissions' export type Permission = { id: number name: string } export type PermissionsRepo = { listPermissions: () => Promise getRolePermissions: (roleId: number) => Permission[] setRolePermissions: (roleId: number, permIds: number[]) => void } function toPermission(row: typeof permissions.$inferSelect): Permission { return { id: row.id, name: row.name } } export function createPermissionsRepo(): { repo: PermissionsRepo } { const repo: PermissionsRepo = { listPermissions() { const rows = db.select().from(permissions).all() return Promise.resolve(rows.map(toPermission)) }, getRolePermissions(roleId) { const rows = db .select({ id: permissions.id, name: permissions.name, }) .from(rolePermissions) .innerJoin(permissions, eq(rolePermissions.permissionId, permissions.id)) .where(eq(rolePermissions.roleId, roleId)) .all() return rows.map((r) => ({ id: r.id, name: r.name })) }, setRolePermissions(roleId, permIds) { db.delete(rolePermissions).where(eq(rolePermissions.roleId, roleId)).run() for (const permId of permIds) { db.insert(rolePermissions).values({ roleId, permissionId: permId }).run() } }, } return { repo } }