Initial commit: PC Builder AdonisJS project

This commit is contained in:
Kevin
2026-06-28 10:41:51 +02:00
commit 648d0af538
144 changed files with 18570 additions and 0 deletions
+77
View File
@@ -0,0 +1,77 @@
import type { HttpContext } from '@adonisjs/core/http'
import { storeComponentValidator } from '#validators/Components/store'
import { updateComponentValidator } from '#validators/Components/update'
import Component from '#models/component'
import ComponentType from '#models/component_type'
export default class ComponentsController {
async index({ inertia, auth }: HttpContext) {
const user = await auth.authenticate()
const components = await Component.query()
.preload('type')
.where('userId', user.id)
return inertia.render('components/index', { components })
}
async create({ inertia }: HttpContext) {
const types = await ComponentType.all()
return inertia.render('components/create', { types })
}
async store({ request, response, auth }: HttpContext) {
const data = request.all()
const user = await auth.authenticate()
const { quantity, ...componentData } = await storeComponentValidator.validate(data)
await ComponentType.findOrFail(componentData.typeId)
for (let i = 0; i < quantity; i++) {
await Component.create({
...componentData,
userId: user.id,
})
}
response.redirect('/components')
}
async show({ params, auth, inertia }: HttpContext) {
const user = await auth.authenticate()
const componentId = params.id
const component = await Component.query()
.preload('type')
.where('userId', user.id)
.andWhere('id', componentId)
.firstOrFail()
return inertia.render('components/show', { component })
}
async edit({ params, auth, inertia }: HttpContext) {
const user = await auth.authenticate()
const types = await ComponentType.all()
const componentId = params.id
const component = await Component.query()
.preload('type')
.where('userId', user.id)
.andWhere('id', componentId)
.firstOrFail()
return inertia.render('components/edit', { component, types })
}
async update({ params, auth, request, response }: HttpContext) {
const data = request.all()
const componentData = await updateComponentValidator.validate(data)
const user = await auth.authenticate()
const component = await Component.query()
.where('userId', user.id)
.andWhere('id', params.id)
.firstOrFail()
component.merge(componentData)
await component.save()
return response.redirect('/components')
}
async destroy({ params, response }: HttpContext) {
const componentId = params.id
const component = await Component.findOrFail(componentId)
await component.delete()
return response.redirect('/components')
}
}
+111
View File
@@ -0,0 +1,111 @@
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')
}
}
+17
View File
@@ -0,0 +1,17 @@
import User from '#models/user'
import { signupValidator } from '#validators/user'
import type { HttpContext } from '@adonisjs/core/http'
export default class NewAccountController {
async create({ inertia }: HttpContext) {
return inertia.render('auth/signup', {})
}
async store({ request, response, auth }: HttpContext) {
const payload = await request.validateUsing(signupValidator)
const user = await User.create({ ...payload })
await auth.use('web').login(user)
response.redirect().toRoute('home')
}
}
+21
View File
@@ -0,0 +1,21 @@
import type { HttpContext } from '@adonisjs/core/http'
import { loginValidator } from '#validators/Auth/login'
import User from '#models/user'
export default class SessionController {
async create({ inertia }: HttpContext) {
return inertia.render('auth/login', {})
}
async store({ request, auth, response }: HttpContext) {
const payload = await request.validateUsing(loginValidator)
const user = await User.verifyCredentials(payload.email, payload.password)
await auth.use('web').login(user)
response.redirect('/computers')
}
async destroy({ auth, response }: HttpContext) {
await auth.use('web').logout()
response.redirect('/auth/login')
}
}