48 lines
1.4 KiB
TypeScript
48 lines
1.4 KiB
TypeScript
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<Permission[]>
|
|
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 }
|
|
}
|