@@ -11,15 +11,9 @@ jobs:
|
||||
container: node:24 # Utilise l'image officielle Node.js 24
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
run: |
|
||||
git config --global advice.detachedHead false
|
||||
git checkout -- .
|
||||
git submodule update --init --recursive
|
||||
|
||||
- name: Setup Node.js
|
||||
run: |
|
||||
curl -fsSL https://deb.nodesource.com/setup_24.x | bash -
|
||||
apt-get install -y nodejs
|
||||
uses: actions/checkout@v4 # Action Gitea pour checkout
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import type { HttpContext } from '@adonisjs/core/http'
|
||||
import { DateTime } from 'luxon'
|
||||
import { storeComponentValidator } from '#validators/Components/store'
|
||||
import { updateComponentValidator } from '#validators/Components/update'
|
||||
import Component from '#models/component'
|
||||
@@ -26,6 +27,7 @@ export default class ComponentsController {
|
||||
for (let i = 0; i < quantity; i++) {
|
||||
await Component.create({
|
||||
...componentData,
|
||||
purchaseDate: DateTime.fromFormat(componentData.purchaseDate, 'yyyy-MM-dd'),
|
||||
userId: user.id,
|
||||
})
|
||||
}
|
||||
@@ -63,7 +65,10 @@ export default class ComponentsController {
|
||||
.where('userId', user.id)
|
||||
.andWhere('id', params.id)
|
||||
.firstOrFail()
|
||||
component.merge(componentData)
|
||||
component.merge({
|
||||
...componentData,
|
||||
purchaseDate: DateTime.fromFormat(componentData.purchaseDate, 'yyyy-MM-dd'),
|
||||
})
|
||||
await component.save()
|
||||
return response.redirect('/components')
|
||||
}
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import { BaseModel } from '@adonisjs/lucid/orm'
|
||||
import type User from '#models/user'
|
||||
|
||||
export default class UserTransformer {
|
||||
static exclude = ['password']
|
||||
|
||||
transform(user: BaseModel) {
|
||||
static transform(user: typeof User.prototype) {
|
||||
return {
|
||||
id: user.id,
|
||||
name: user.name,
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
import vine from '@vinejs/vine'
|
||||
|
||||
export const updateComponentValidator = vine.compile(
|
||||
vine.object({
|
||||
name: vine.string().trim().minLength(1),
|
||||
price: vine.number().decimal([0, 2]).min(0),
|
||||
typeId: vine.number().min(1),
|
||||
purchaseDate: vine.string().regex(/^\d{4}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$/),
|
||||
})
|
||||
)
|
||||
@@ -0,0 +1,14 @@
|
||||
import vine from '@vinejs/vine'
|
||||
|
||||
export const storeComputerValidator = vine.compile(
|
||||
vine.object({
|
||||
title: vine.string().trim().minLength(1),
|
||||
sellPrice: vine.number().decimal([0, 2]).min(0),
|
||||
gpuScore: vine.number().min(0),
|
||||
cpuScore: vine.number().min(0),
|
||||
globalScore: vine.number().min(0),
|
||||
stateId: vine.number().min(1),
|
||||
componentsId: vine.array(vine.number()),
|
||||
pictures: vine.array(vine.object({})),
|
||||
})
|
||||
)
|
||||
@@ -0,0 +1,14 @@
|
||||
import vine from '@vinejs/vine'
|
||||
|
||||
export const updateComputerValidator = vine.compile(
|
||||
vine.object({
|
||||
title: vine.string().trim().minLength(1),
|
||||
sellPrice: vine.number().decimal([0, 2]).min(0),
|
||||
gpuScore: vine.number().min(0),
|
||||
cpuScore: vine.number().min(0),
|
||||
globalScore: vine.number().min(0),
|
||||
stateId: vine.number().min(1),
|
||||
componentsId: vine.array(vine.number()),
|
||||
pictures: vine.array(vine.object({})),
|
||||
})
|
||||
)
|
||||
+2
-3
@@ -1,14 +1,13 @@
|
||||
import './css/app.css'
|
||||
import 'vue-sonner/style.css'
|
||||
import { client } from '~/client'
|
||||
import Layout from '~/layouts/default.vue'
|
||||
import { createInertiaApp } from '@inertiajs/vue3'
|
||||
import { TuyauProvider } from '@adonisjs/inertia/vue'
|
||||
import { createApp, type DefineComponent, h } from 'vue'
|
||||
import { resolvePageComponent } from '@adonisjs/inertia/helpers'
|
||||
|
||||
import DefaultLayout from '~/pages/layout/defaultLayout.vue'
|
||||
import EmptyLayout from '~/pages/layout/emptyLayout.vue'
|
||||
import DefaultLayout from './pages/layout/defaultLayout.vue'
|
||||
import EmptyLayout from './pages/layout/emptyLayout.vue'
|
||||
|
||||
// directives
|
||||
// @ts-ignore
|
||||
|
||||
@@ -1,70 +0,0 @@
|
||||
<script setup lang="ts">
|
||||
import { watch } from 'vue'
|
||||
import { usePage } from '@inertiajs/vue3'
|
||||
import { toast, Toaster } from 'vue-sonner'
|
||||
import type { Data } from '@generated/data'
|
||||
import { Link, Form } from '@adonisjs/inertia/vue'
|
||||
|
||||
const page = usePage<Data.SharedProps>()
|
||||
|
||||
watch(
|
||||
() => page.url,
|
||||
() => toast.dismiss()
|
||||
)
|
||||
|
||||
watch(
|
||||
() => page.props.flash,
|
||||
(flashMessages) => {
|
||||
if (flashMessages.error) {
|
||||
toast.error(flashMessages.error)
|
||||
}
|
||||
if (flashMessages.success) {
|
||||
toast.success(flashMessages.success)
|
||||
}
|
||||
},
|
||||
{ immediate: true }
|
||||
)
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<header>
|
||||
<div>
|
||||
<div>
|
||||
<Link route="home">
|
||||
<svg
|
||||
width="66"
|
||||
height="24"
|
||||
viewBox="0 0 105 38"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
d="M0 0h7.5v15H0ZM7.5 15h7.5v15H7.5ZM15 30h7.5v7.5H15ZM22.5 15h7.5v15H22.5ZM30 0h7.5v15H30ZM45 0h7.5v30h15v-30h7.5v37.5h-30v-37.5ZM82.5 37.5V0H105v7.5H90V15h15v7.5H90V30h15v7.5H82.5Z"
|
||||
fill="currentColor"
|
||||
/>
|
||||
</svg>
|
||||
</Link>
|
||||
</div>
|
||||
<div>
|
||||
<nav>
|
||||
<template v-if="page.props.user">
|
||||
<span>{{ page.props.user.initials }}</span>
|
||||
<Form route="session.destroy">
|
||||
<button type="submit">Logout</button>
|
||||
</Form>
|
||||
</template>
|
||||
<template v-else>
|
||||
<Link route="new_account.create">Signup</Link>
|
||||
<Link route="session.create">Login</Link>
|
||||
</template>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main>
|
||||
<slot />
|
||||
</main>
|
||||
|
||||
<Toaster position="top-center" rich-colors />
|
||||
</template>
|
||||
Generated
+21
@@ -20,6 +20,7 @@
|
||||
"@adonisjs/vite": "^5.1.1",
|
||||
"@inertiajs/vue3": "^2.3.24",
|
||||
"@tuyau/core": "^1.2.2",
|
||||
"@types/uuid": "^10.0.0",
|
||||
"@vinejs/vine": "^4.4.0",
|
||||
"@vue/server-renderer": "^3.5.35",
|
||||
"@vuepic/vue-datepicker": "^13.0.0",
|
||||
@@ -28,6 +29,7 @@
|
||||
"luxon": "^3.7.2",
|
||||
"mysql2": "^3.22.4",
|
||||
"reflect-metadata": "^0.2.2",
|
||||
"uuid": "^14.0.1",
|
||||
"vue": "^3.5.35",
|
||||
"vue-sonner": "^2.0.9",
|
||||
"vue3-carousel": "^0.17.0"
|
||||
@@ -3115,6 +3117,12 @@
|
||||
"integrity": "sha512-JOqsl+ZoCpP4e8TDke9W79FDcSgPAR0l6pixx2JHkhnRjvShyYiAYw2LVsnA7K08Y6DeOnaU6ujmENO4os/cYg==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@types/uuid": {
|
||||
"version": "10.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz",
|
||||
"integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@types/validator": {
|
||||
"version": "13.15.10",
|
||||
"resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.15.10.tgz",
|
||||
@@ -9679,6 +9687,19 @@
|
||||
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/uuid": {
|
||||
"version": "14.0.1",
|
||||
"resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.1.tgz",
|
||||
"integrity": "sha512-6ZxzVpzDXDa3bJWaHilVayA+BH/1zmxCJoVgvmqJnid/gPoKHxUrS/aC/T6LGQtNHT+XHG9fXPJB4d+IrU30Ew==",
|
||||
"funding": [
|
||||
"https://github.com/sponsors/broofa",
|
||||
"https://github.com/sponsors/ctavan"
|
||||
],
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
"uuid": "dist-node/bin/uuid"
|
||||
}
|
||||
},
|
||||
"node_modules/validate-npm-package-license": {
|
||||
"version": "3.0.4",
|
||||
"resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
"#generated/*": "./.adonisjs/server/*.js",
|
||||
"#middleware/*": "./app/middleware/*.js",
|
||||
"#transformers/*": "./app/transformers/*.js",
|
||||
"#types/*": "./types/*.js",
|
||||
"#validators/*": "./app/validators/*.js",
|
||||
"#providers/*": "./providers/*.js",
|
||||
"#policies/*": "./app/policies/*.js",
|
||||
@@ -74,6 +75,7 @@
|
||||
"@adonisjs/vite": "^5.1.1",
|
||||
"@inertiajs/vue3": "^2.3.24",
|
||||
"@tuyau/core": "^1.2.2",
|
||||
"@types/uuid": "^10.0.0",
|
||||
"@vinejs/vine": "^4.4.0",
|
||||
"@vue/server-renderer": "^3.5.35",
|
||||
"@vuepic/vue-datepicker": "^13.0.0",
|
||||
@@ -82,6 +84,7 @@
|
||||
"luxon": "^3.7.2",
|
||||
"mysql2": "^3.22.4",
|
||||
"reflect-metadata": "^0.2.2",
|
||||
"uuid": "^14.0.1",
|
||||
"vue": "^3.5.35",
|
||||
"vue-sonner": "^2.0.9",
|
||||
"vue3-carousel": "^0.17.0"
|
||||
|
||||
+2
-4
@@ -1,8 +1,6 @@
|
||||
{
|
||||
"extends": "@adonisjs/tsconfig/tsconfig.app.json",
|
||||
"compilerOptions": {
|
||||
"rootDir": "./",
|
||||
"outDir": "./build"
|
||||
},
|
||||
"references": [{ "path": "./tsconfig.inertia.json" }]
|
||||
"outDir": "build"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
interface ServerImage {
|
||||
id: number
|
||||
link: string
|
||||
order: number
|
||||
}
|
||||
|
||||
interface NewImage {
|
||||
file: File
|
||||
order: number
|
||||
}
|
||||
|
||||
export type Image = ServerImage | NewImage
|
||||
Reference in New Issue
Block a user