health-petal/packages/data-manager-sqlite/src/permissions.ts
2026-05-24 00:03:44 +05:30

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 }
}