@shagital/adonisjs-crud-generator
Version:
Adonisjs Admin Panel Generator is a package that helps you quickly scaffold your typical CRUD admin interfaces. It generates the admin panel code based on the existing (migrated) table in the database
142 lines (117 loc) • 3.97 kB
Plain Text
import { ResponseContract, HttpContextContract } from '@ioc:Adonis/Core/HttpContext'
import { schema, rules, validator } from '@ioc:Adonis/Core/Validator'
import {{pascalName}} from 'App/Models/{{pascalName}}'
import moment from 'moment'
const tableColumns = {{tableColumns}}
const allowedRelationships = {{pascalName}}.allowedRelationships()
/**
* Resourceful controller for interacting with {{pluralName}}
*/
export default class {{pascalNamePlural}}Controller {
/**
* Show a list of all {{pluralName}}.
* GET {{prefix}}/{{pluralName}}
*
*/
public async index ({ request, response }: HttpContextContract): ResponseContract {
let qs = request.qs()
let query = {{pascalName}}.query()
{{filters}}
if (qs.with) {
let requestedRelationships = qs.with ? qs.with.split(',') : []
for(let relationship of requestedRelationships) {
if(allowedRelationships.includes(relationship)) {
query.preload(relationship)
}
}
}
let orderBy = {{pascalName}}.primaryKey
let order: 'desc' | 'asc' = 'desc'
if(qs.sort) {
let split = qs.sort.split('|')
if(tableColumns.includes(split[0]) && ['desc', 'asc'].includes(split[1].toLowerCase())) {
orderBy = split[0]
order = split[1].toLowerCase()
}
}
query.orderBy(orderBy, order)
let data = await query.paginate(qs.page || 1, qs.per_page || 25)
return response.send(data)
}
/**
* Create/save a new {{singularName}}.
* POST {{prefix}}/{{pluralName}}
*
*/
public async store ({ params, request, response }: HttpContextContract): ResponseContract {
const data = request.only({{filteredColumns}})
let validationErrors = {}
try {
await validator.validate({
schema: schema.create({
{{rulesArray}}
}),
data,
})
} catch (e) {
validationErrors = e.messages
}
if (Object.keys(validationErrors).length) {
return response.status(422).send({errors: validationErrors})
}
let {{singularName}} = await {{pascalName}}.create(data)
let message = "{{pascalName}} created successfully"
return response.status(201).send({ message, data: {{singularName}} })
}
/**
* Display a single {{singularName}}.
* GET {{prefix}}/{{pluralName}}/:id
*
*/
public async show ({ params, response }: HttpContextContract): ResponseContract {
let {{singularName}} = await {{pascalName}}.findOrFail(params[{{pascalName}}.primaryKey])
let data = {data: {{singularName}}}
return response.send(data)
}
/**
* Update {{singularName}} details.
* PATCH {{prefix}}/{{pluralName}}/:id
*
*/
public async update ({ params, request, response }: HttpContextContract): ResponseContract {
const data = request.only({{filteredColumns}})
let validationErrors = {}
try {
await validator.validate({
schema: schema.create({
{{rulesArray}}
}),
data,
})
} catch (e) {
validationErrors = e.messages
}
if (Object.keys(validationErrors).length) {
return response.status(422).send({errors: validationErrors})
}
let {{singularName}} = await {{pascalName}}.findOrFail(params[{{pascalName}}.primaryKey])
let filledData = {}
Object.keys(data).forEach(input => {
if(data[input]) filledData[input] = data[input]
})
{{singularName}}.merge(filledData)
await {{singularName}}.save()
let message = "{{pascalName}} updated successfully"
return response.status(200).send({ message, data: {{singularName}} })
}
/**
* Delete a {{singularName}} with id.
* DELETE {{prefix}}/{{pluralName}}/:id
*
*/
public async destroy ({ params, response }: HttpContextContract): ResponseContract {
let {{singularName}} = await {{pascalName}}.findOrFail(params[{{pascalName}}.primaryKey])
{{singularName}}.delete()
return response.status(204).send('')
}
}