97 lines
3.8 KiB
TypeScript
Executable File
97 lines
3.8 KiB
TypeScript
Executable File
import { HttpContext } from '@adonisjs/core/http'
|
|
import { createAdminValidator } from '#base_modules/Admin/validators/admin_create_validator'
|
|
import { updateAdminValidator } from '#base_modules/Admin/validators/admin_update_validator'
|
|
import { addSearchFilter, searchableColumns } from '#services/database_inspector'
|
|
import Admins from '#base_modules/Admin/model/admin'
|
|
import AdminsPolicy from '#base_modules/Admin/policy/admin_policy'
|
|
import { updateProfileAdminValidator } from '#base_modules/Admin/validators/admin_update_profile_validator'
|
|
import db from '@adonisjs/lucid/services/db'
|
|
|
|
export default class AdminsController {
|
|
public async index({ request, response, bouncer }: HttpContext) {
|
|
await bouncer.with(AdminsPolicy).authorize('viewList')
|
|
const {
|
|
page = 1,
|
|
perPage = 10,
|
|
search = null,
|
|
sortBy = 'id',
|
|
sortOrder = 'desc',
|
|
status = null,
|
|
} = request.all()
|
|
const query = Admins.query()
|
|
if (status) {
|
|
const statuses = Array.isArray(status) ? status : [status]
|
|
query.whereIn('status', statuses)
|
|
}
|
|
if (search) {
|
|
const columns = Admins.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(AdminsPolicy).authorize('create')
|
|
const data = await createAdminValidator.validate(request.all())
|
|
const record = await Admins.create(data)
|
|
if (record) {
|
|
await record.related('roles').sync(data.roles)
|
|
return response.created({ message: 'Successfully created.' })
|
|
}
|
|
return response.badRequest({ message: 'Cannot create.' })
|
|
}
|
|
|
|
public async show({ request, response, bouncer }: HttpContext) {
|
|
await bouncer.with(AdminsPolicy).authorize('view')
|
|
const { id } = request.params()
|
|
if (!id) return response.notFound({ message: 'Not found.' })
|
|
const record = await Admins.find(id)
|
|
if (!record) return response.notFound({ message: 'Not found.' })
|
|
await record.load('roles')
|
|
return response.ok(record)
|
|
}
|
|
|
|
public async update({ request, response, bouncer }: HttpContext) {
|
|
await bouncer.with(AdminsPolicy).authorize('update')
|
|
const { id } = request.params()
|
|
if (!id) return response.notFound({ message: 'Not found.' })
|
|
const data = await updateAdminValidator.validate(request.all())
|
|
const record = await Admins.find(id)
|
|
if (!record) return response.notFound({ message: 'Not found.' })
|
|
record.merge(data)
|
|
await record.save()
|
|
await record.related('roles').sync(data.roles)
|
|
return response.ok({ message: 'Updated.' })
|
|
}
|
|
|
|
public async destroy({ request, response, bouncer }: HttpContext) {
|
|
await bouncer.with(AdminsPolicy).authorize('delete')
|
|
const { id } = request.params()
|
|
if (!id) return response.notFound({ message: 'Not found.' })
|
|
const admins = await Admins.all()
|
|
if (admins.length === 1) {
|
|
return response.badRequest({ message: "Last Admin can't be deleted!" })
|
|
}
|
|
const record = await Admins.find(id)
|
|
if (!record) return response.notFound({ message: 'Not found.' })
|
|
await Admins.query().where('id', id).delete()
|
|
return response.ok({ message: 'Deleted.' })
|
|
}
|
|
|
|
public async updateProfile({ request, response, auth }: HttpContext) {
|
|
const user = auth.use('api').user
|
|
if (!user) return response.unauthorized()
|
|
const data = await updateProfileAdminValidator.validate(request.all())
|
|
user.merge(data)
|
|
user.save()
|
|
await user.load('roles')
|
|
const roles = user.roles.map((role) => role.id)
|
|
const permissions = await db
|
|
.from('role_permissions')
|
|
.whereIn('role_id', roles)
|
|
.select('permission_slug')
|
|
return response.ok({ user, permissions: permissions.map((perm) => perm.permission_slug) })
|
|
}
|
|
}
|