Files
zero-fucks-given/apps/backend/app/base_modules/Role/controller/role_controller.ts
T

90 lines
3.6 KiB
TypeScript
Executable File

import { HttpContext } from '@adonisjs/core/http'
import { addSearchFilter, searchableColumns } from '#services/database_inspector'
import Role from '#base_modules/Role/model/role'
import RolePolicy from '#base_modules/Role/policy/role_policy'
import { createRoleValidator } from '#base_modules/Role/validator/role_create_validator'
import { updateRoleValidator } from '#base_modules/Role/validator/role_update_validator'
import db from '@adonisjs/lucid/services/db'
export default class RoleController {
public async index({ request, response, bouncer }: HttpContext) {
await bouncer.with(RolePolicy).authorize('roleList')
const {
page = 1,
perPage = 10,
search = null,
sortBy = 'id',
sortOrder = 'desc',
} = request.all()
const query = Role.query()
if (search) {
const columns = Role.searchable || (await searchableColumns('admins'))
addSearchFilter(query, columns, search)
}
const result = await query.orderBy(sortBy, sortOrder).paginate(page, perPage)
return response.ok(result)
}
public async store({ request, response, bouncer }: HttpContext) {
await bouncer.with(RolePolicy).authorize('createRole')
const { permissions, ...data } = await createRoleValidator.validate(request.all())
const record = await Role.create(data)
if (record) {
// await record.related('permissions').sync(data.permissions)
await this.updatePermissions(record, permissions)
return response.created({ message: 'Successfully created.' })
}
return response.badRequest({ message: 'Cannot create.' })
}
public async show({ request, response, bouncer }: HttpContext) {
await bouncer.with(RolePolicy).authorize('viewRole')
const { id } = request.params()
if (!id) return response.notFound({ message: 'Not found.' })
const record = await Role.find(id)
if (!record) return response.notFound({ message: 'Not found.' })
const permissions = await db
.from('role_permissions')
.where('role_id', id)
.select(['permission_slug as slug', 'role_id'])
return response.ok({ ...record.serialize(), permissions })
}
public async update({ request, response, bouncer }: HttpContext) {
await bouncer.with(RolePolicy).authorize('updateRole')
const { id } = request.params()
if (!id) return response.notFound({ message: 'Not found.' })
const data = await updateRoleValidator.validate(request.all())
const record = await Role.find(id)
if (!record) return response.notFound({ message: 'Not found.' })
record.name = data.name
await record.save()
await this.updatePermissions(record, data.permissions)
return response.ok({ message: 'Updated.' })
}
public async destroy({ request, response, bouncer }: HttpContext) {
await bouncer.with(RolePolicy).authorize('deleteRole')
const { id } = request.params()
if (!id) return response.notFound({ message: 'Not found.' })
const record = await Role.find(id)
if (!record) return response.notFound({ message: 'Not found.' })
await Role.query().where('id', id).delete()
return response.ok({ message: 'Deleted.' })
}
private async updatePermissions(record: Role, permissions?: string[]) {
await db.from('role_permissions').where('role_id', record.id).delete()
if (!permissions || permissions.length === 0) {
console.log('no permissions to insert')
return
}
const newPermissions = permissions.map((perm) => ({
role_id: record.id,
permission_slug: perm,
}))
await db.table('role_permissions').insert(newPermissions)
console.log('inserted permissions:', newPermissions.length)
}
}