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 }) } 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, states }) } 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 }) } 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, availableComponents, states }) } 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') } }