@@ -11,15 +11,9 @@ jobs:
|
|||||||
container: node:24 # Utilise l'image officielle Node.js 24
|
container: node:24 # Utilise l'image officielle Node.js 24
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
run: |
|
uses: actions/checkout@v4 # Action Gitea pour checkout
|
||||||
git config --global advice.detachedHead false
|
with:
|
||||||
git checkout -- .
|
fetch-depth: 0
|
||||||
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
|
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: npm ci
|
run: npm ci
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import type { HttpContext } from '@adonisjs/core/http'
|
import type { HttpContext } from '@adonisjs/core/http'
|
||||||
|
import { DateTime } from 'luxon'
|
||||||
import { storeComponentValidator } from '#validators/Components/store'
|
import { storeComponentValidator } from '#validators/Components/store'
|
||||||
import { updateComponentValidator } from '#validators/Components/update'
|
import { updateComponentValidator } from '#validators/Components/update'
|
||||||
import Component from '#models/component'
|
import Component from '#models/component'
|
||||||
@@ -26,6 +27,7 @@ export default class ComponentsController {
|
|||||||
for (let i = 0; i < quantity; i++) {
|
for (let i = 0; i < quantity; i++) {
|
||||||
await Component.create({
|
await Component.create({
|
||||||
...componentData,
|
...componentData,
|
||||||
|
purchaseDate: DateTime.fromFormat(componentData.purchaseDate, 'yyyy-MM-dd'),
|
||||||
userId: user.id,
|
userId: user.id,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -63,7 +65,10 @@ export default class ComponentsController {
|
|||||||
.where('userId', user.id)
|
.where('userId', user.id)
|
||||||
.andWhere('id', params.id)
|
.andWhere('id', params.id)
|
||||||
.firstOrFail()
|
.firstOrFail()
|
||||||
component.merge(componentData)
|
component.merge({
|
||||||
|
...componentData,
|
||||||
|
purchaseDate: DateTime.fromFormat(componentData.purchaseDate, 'yyyy-MM-dd'),
|
||||||
|
})
|
||||||
await component.save()
|
await component.save()
|
||||||
return response.redirect('/components')
|
return response.redirect('/components')
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import { BaseModel } from '@adonisjs/lucid/orm'
|
import type User from '#models/user'
|
||||||
|
|
||||||
export default class UserTransformer {
|
export default class UserTransformer {
|
||||||
static exclude = ['password']
|
static exclude = ['password']
|
||||||
|
|
||||||
transform(user: BaseModel) {
|
static transform(user: typeof User.prototype) {
|
||||||
return {
|
return {
|
||||||
id: user.id,
|
id: user.id,
|
||||||
name: user.name,
|
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 './css/app.css'
|
||||||
import 'vue-sonner/style.css'
|
import 'vue-sonner/style.css'
|
||||||
import { client } from '~/client'
|
import { client } from '~/client'
|
||||||
import Layout from '~/layouts/default.vue'
|
|
||||||
import { createInertiaApp } from '@inertiajs/vue3'
|
import { createInertiaApp } from '@inertiajs/vue3'
|
||||||
import { TuyauProvider } from '@adonisjs/inertia/vue'
|
import { TuyauProvider } from '@adonisjs/inertia/vue'
|
||||||
import { createApp, type DefineComponent, h } from 'vue'
|
import { createApp, type DefineComponent, h } from 'vue'
|
||||||
import { resolvePageComponent } from '@adonisjs/inertia/helpers'
|
import { resolvePageComponent } from '@adonisjs/inertia/helpers'
|
||||||
|
|
||||||
import DefaultLayout from '~/pages/layout/defaultLayout.vue'
|
import DefaultLayout from './pages/layout/defaultLayout.vue'
|
||||||
import EmptyLayout from '~/pages/layout/emptyLayout.vue'
|
import EmptyLayout from './pages/layout/emptyLayout.vue'
|
||||||
|
|
||||||
// directives
|
// directives
|
||||||
// @ts-ignore
|
// @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",
|
"@adonisjs/vite": "^5.1.1",
|
||||||
"@inertiajs/vue3": "^2.3.24",
|
"@inertiajs/vue3": "^2.3.24",
|
||||||
"@tuyau/core": "^1.2.2",
|
"@tuyau/core": "^1.2.2",
|
||||||
|
"@types/uuid": "^10.0.0",
|
||||||
"@vinejs/vine": "^4.4.0",
|
"@vinejs/vine": "^4.4.0",
|
||||||
"@vue/server-renderer": "^3.5.35",
|
"@vue/server-renderer": "^3.5.35",
|
||||||
"@vuepic/vue-datepicker": "^13.0.0",
|
"@vuepic/vue-datepicker": "^13.0.0",
|
||||||
@@ -28,6 +29,7 @@
|
|||||||
"luxon": "^3.7.2",
|
"luxon": "^3.7.2",
|
||||||
"mysql2": "^3.22.4",
|
"mysql2": "^3.22.4",
|
||||||
"reflect-metadata": "^0.2.2",
|
"reflect-metadata": "^0.2.2",
|
||||||
|
"uuid": "^14.0.1",
|
||||||
"vue": "^3.5.35",
|
"vue": "^3.5.35",
|
||||||
"vue-sonner": "^2.0.9",
|
"vue-sonner": "^2.0.9",
|
||||||
"vue3-carousel": "^0.17.0"
|
"vue3-carousel": "^0.17.0"
|
||||||
@@ -3115,6 +3117,12 @@
|
|||||||
"integrity": "sha512-JOqsl+ZoCpP4e8TDke9W79FDcSgPAR0l6pixx2JHkhnRjvShyYiAYw2LVsnA7K08Y6DeOnaU6ujmENO4os/cYg==",
|
"integrity": "sha512-JOqsl+ZoCpP4e8TDke9W79FDcSgPAR0l6pixx2JHkhnRjvShyYiAYw2LVsnA7K08Y6DeOnaU6ujmENO4os/cYg==",
|
||||||
"license": "MIT"
|
"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": {
|
"node_modules/@types/validator": {
|
||||||
"version": "13.15.10",
|
"version": "13.15.10",
|
||||||
"resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.15.10.tgz",
|
"resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.15.10.tgz",
|
||||||
@@ -9679,6 +9687,19 @@
|
|||||||
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
|
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
|
||||||
"license": "MIT"
|
"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": {
|
"node_modules/validate-npm-package-license": {
|
||||||
"version": "3.0.4",
|
"version": "3.0.4",
|
||||||
"resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
|
"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",
|
"#generated/*": "./.adonisjs/server/*.js",
|
||||||
"#middleware/*": "./app/middleware/*.js",
|
"#middleware/*": "./app/middleware/*.js",
|
||||||
"#transformers/*": "./app/transformers/*.js",
|
"#transformers/*": "./app/transformers/*.js",
|
||||||
|
"#types/*": "./types/*.js",
|
||||||
"#validators/*": "./app/validators/*.js",
|
"#validators/*": "./app/validators/*.js",
|
||||||
"#providers/*": "./providers/*.js",
|
"#providers/*": "./providers/*.js",
|
||||||
"#policies/*": "./app/policies/*.js",
|
"#policies/*": "./app/policies/*.js",
|
||||||
@@ -74,6 +75,7 @@
|
|||||||
"@adonisjs/vite": "^5.1.1",
|
"@adonisjs/vite": "^5.1.1",
|
||||||
"@inertiajs/vue3": "^2.3.24",
|
"@inertiajs/vue3": "^2.3.24",
|
||||||
"@tuyau/core": "^1.2.2",
|
"@tuyau/core": "^1.2.2",
|
||||||
|
"@types/uuid": "^10.0.0",
|
||||||
"@vinejs/vine": "^4.4.0",
|
"@vinejs/vine": "^4.4.0",
|
||||||
"@vue/server-renderer": "^3.5.35",
|
"@vue/server-renderer": "^3.5.35",
|
||||||
"@vuepic/vue-datepicker": "^13.0.0",
|
"@vuepic/vue-datepicker": "^13.0.0",
|
||||||
@@ -82,6 +84,7 @@
|
|||||||
"luxon": "^3.7.2",
|
"luxon": "^3.7.2",
|
||||||
"mysql2": "^3.22.4",
|
"mysql2": "^3.22.4",
|
||||||
"reflect-metadata": "^0.2.2",
|
"reflect-metadata": "^0.2.2",
|
||||||
|
"uuid": "^14.0.1",
|
||||||
"vue": "^3.5.35",
|
"vue": "^3.5.35",
|
||||||
"vue-sonner": "^2.0.9",
|
"vue-sonner": "^2.0.9",
|
||||||
"vue3-carousel": "^0.17.0"
|
"vue3-carousel": "^0.17.0"
|
||||||
|
|||||||
+2
-4
@@ -1,8 +1,6 @@
|
|||||||
{
|
{
|
||||||
"extends": "@adonisjs/tsconfig/tsconfig.app.json",
|
"extends": "@adonisjs/tsconfig/tsconfig.app.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"rootDir": "./",
|
"outDir": "build"
|
||||||
"outDir": "./build"
|
}
|
||||||
},
|
|
||||||
"references": [{ "path": "./tsconfig.inertia.json" }]
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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