90 lines
3.6 KiB
TypeScript
Executable File
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)
|
|
}
|
|
}
|