112 lines
4.1 KiB
TypeScript
112 lines
4.1 KiB
TypeScript
import type { HttpContext } from '@adonisjs/core/http'
|
|
import Computer from '#models/computer'
|
|
import ComputerState from '#models/computer_state'
|
|
import Component from '#models/component'
|
|
import { storeComputerValidator } from '#validators/Computers/store'
|
|
import { handleComponents } from '#services/component_service'
|
|
import { handlePictures } from '#services/picture_service'
|
|
import type { Image } from '#types/UItypes'
|
|
import { updateComputerValidator } from '#validators/Computers/update'
|
|
|
|
export default class ComputersController {
|
|
async index({ auth, inertia }: HttpContext) {
|
|
const user = await auth.authenticate()
|
|
const computers = await Computer.query()
|
|
.where('user_id', user.id)
|
|
.preload('state')
|
|
.preload('components')
|
|
.preload('pictures', (picturesQuery) => {
|
|
picturesQuery.where('order', 1)
|
|
})
|
|
|
|
return inertia.render('computers/index', { computers: computers.map((c) => c.serialize({ relations: true })) })
|
|
}
|
|
|
|
async create({ auth, inertia }: HttpContext) {
|
|
const user = await auth.authenticate()
|
|
const states = await ComputerState.all()
|
|
const components = await Component.query()
|
|
.where('userId', user.id)
|
|
.whereNull('computerId')
|
|
.preload('type')
|
|
return inertia.render('computers/create', { components: components.map((c) => c.serialize({ relations: true })), states: states.map((s) => s.serialize()) })
|
|
}
|
|
|
|
async store({ auth, request, response }: HttpContext) {
|
|
const data = request.all()
|
|
const user = await auth.authenticate()
|
|
const { pictures, componentsId, ...computerData } = await storeComputerValidator.validate(data)
|
|
await ComputerState.findOrFail(computerData.stateId)
|
|
const computer = await Computer.create({
|
|
...computerData,
|
|
userId: user.id,
|
|
})
|
|
await handleComponents(componentsId as number[], computer)
|
|
await handlePictures(pictures as Image[], request, computer)
|
|
return response.redirect('computers/')
|
|
}
|
|
|
|
async show({ auth, inertia, params }: HttpContext) {
|
|
const user = await auth.authenticate()
|
|
const computerId = params.id
|
|
const computer = await Computer.query()
|
|
.preload('state')
|
|
.preload('components', (componentsQuery) => {
|
|
componentsQuery.preload('type')
|
|
})
|
|
.preload('pictures', (picturesQuery) => {
|
|
picturesQuery.orderBy('order')
|
|
})
|
|
.where('user_id', user.id)
|
|
.andWhere('id', computerId)
|
|
.firstOrFail()
|
|
return inertia.render('computers/show', { computer: computer.serialize({ relations: true }) })
|
|
}
|
|
|
|
async edit({ params, inertia, auth }: HttpContext) {
|
|
const user = await auth.authenticate()
|
|
const states = await ComputerState.all()
|
|
const computerId = params.id
|
|
|
|
const computer = await Computer.query()
|
|
.preload('state')
|
|
.preload('components', (componentsQuery) => {
|
|
componentsQuery.preload('type')
|
|
})
|
|
.preload('pictures')
|
|
.where('user_id', user.id)
|
|
.andWhere('id', computerId)
|
|
.firstOrFail()
|
|
|
|
const availableComponents = await Component.query()
|
|
.preload('type')
|
|
.where('user_id', user.id)
|
|
.whereNull('computer_id')
|
|
.whereNotIn(
|
|
'id',
|
|
computer.components.map((c) => c.id)
|
|
)
|
|
return inertia.render('computers/edit', { computer: computer.serialize({ relations: true }), availableComponents: availableComponents.map((c) => c.serialize({ relations: true })), states: states.map((s) => s.serialize()) })
|
|
}
|
|
|
|
async update({ params, request, response }: HttpContext) {
|
|
const computerId = params.id
|
|
const { pictures, componentsId, ...computerData } = await updateComputerValidator.validate(
|
|
request.all()
|
|
)
|
|
const computer = await Computer.findOrFail(computerId)
|
|
computer.merge(computerData)
|
|
await computer.save()
|
|
await handleComponents(componentsId as number[], computer)
|
|
await handlePictures(pictures as Image[], request, computer)
|
|
return response.redirect(`${computer.id}`)
|
|
}
|
|
|
|
async destroy({ params, response }: HttpContext) {
|
|
const computerId = params.id
|
|
const computer = await Computer.findOrFail(computerId)
|
|
await computer.delete()
|
|
return response.redirect('/computers')
|
|
}
|
|
}
|