Compare commits

...

22 Commits
prod ... devel

Author SHA1 Message Date
a3f49f2a2f
FIX: prisma generate
Some checks failed
/ deploy (push) Failing after 4s
2024-10-25 19:36:26 +07:00
529885d9d4
FIX: back-end db connection
Some checks failed
/ deploy (push) Failing after 4s
2024-10-22 22:47:43 +07:00
dorian melenotte
8f6d6d68a8 ADD: good set up docker
Some checks failed
/ deploy (push) Failing after 4s
2024-10-10 17:28:29 +02:00
dorian melenotte
5f71dcd028 ADD: register and login on the site filling the db
Some checks failed
/ deploy (push) Failing after 5s
2024-10-03 17:00:45 +02:00
dorian melenotte
40e53df3e8 ADD: login and register working with the api
Some checks failed
/ deploy (push) Failing after 5s
2024-09-19 12:38:16 +02:00
dorian melenotte
9e06e92c57 add: folder of the backend
Some checks failed
/ deploy (push) Failing after 5s
2024-09-10 18:08:10 +02:00
b819ce74d5
fix: remove unused instructions from Dockerfile
All checks were successful
/ deploy (push) Successful in 27s
2024-09-10 18:29:49 +07:00
54759386cd
fix: rm unused .dockerignore
All checks were successful
/ deploy (push) Successful in 28s
2024-09-10 18:03:05 +07:00
173c60c3b4
feat: k8s manifests
All checks were successful
/ deploy (push) Successful in 37s
2024-09-10 17:35:52 +07:00
40cfd1fdf7
feat: Dockerfile and compose.yaml 2024-09-10 17:32:20 +07:00
dorian melenotte
36784c7af2 ADD: db + better register 2024-09-03 17:54:37 +02:00
dorian melenotte
7730fbdf61 ADD: sign in page and put real text in the acceuil 2024-08-12 13:35:34 +02:00
dorian melenotte
928d35f48c ADD: page of registration 2024-08-08 10:59:50 +02:00
dorian melenotte
ca8e643503 UPDATE: keep the navbar in all the web site 2024-08-07 15:47:57 +02:00
dorian melenotte
ef227551c7 ADD: initialisation of all the routes for the button 2024-08-07 14:51:03 +02:00
dorian melenotte
ab6fb8f96f ADD: routing of the pages 2024-08-07 14:39:33 +02:00
dorian melenotte
50cd8ea5a5 ADD: CharkraProvider for the style and added some css style 2024-08-06 15:17:51 +02:00
dorian melenotte
76ec198868 update: buttons creations and put a background 2024-08-04 16:58:07 +02:00
dorian melenotte
7a1c302d5a UPDATE: starting the real website 2024-08-03 15:58:00 +02:00
dorian melenotte
4140a77ce3 add: script start and dokerfile 2024-07-31 20:14:18 +02:00
dorian melenotte
efda7eaf33 refont: nouveau site avec nouvelle version de react 2024-07-23 18:00:16 +02:00
dorian melenotte
11b51ce234 ADD: Premier jet avec decouverte d'une super artiste 2024-07-19 16:26:28 +02:00
53 changed files with 1280 additions and 1 deletions

3
.env Normal file
View File

@ -0,0 +1,3 @@
POSTGRES_DB=db
POSTGRES_USER=db
POSTGRES_PASSWORD=db

View File

@ -0,0 +1,31 @@
on: push
jobs:
deploy:
runs-on: debian
steps:
- uses: actions/checkout@v1
- name: setup env
run: |
. ./.env || true
if [ "${{ gitea.ref_name }}" == prod ] && [ -n "$PROD_URL" ]; then
BASE_URL="$PROD_URL"
else
BASE_URL="${{ gitea.ref_name }}.$(tr / '\n' <<< "${{ gitea.repository }}" | tac | tr '\n' .)k8s.gmoker.com"
fi
REGISTRY="$(sed 's .*:// ' <<< ${{ gitea.server_url }})"
cat <<EOF >> .env
BASE_URL="$BASE_URL"
REGISTRY="$REGISTRY"
IMAGEAPP="$REGISTRY/${{ gitea.repository }}:${{ gitea.ref_name }}"
EOF
cat .env
- uses: actions/kaniko@v1
with:
password: "${{ secrets.PKGRW }}"
- uses: actions/k8sdeploy@v1
with:
kubeconfig: "${{ secrets.K8S }}"
registry_password: "${{ secrets.PKGRW }}"

View File

@ -1 +0,0 @@
# gmoker.com

175
back-end/.gitignore vendored Normal file
View File

@ -0,0 +1,175 @@
# Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore
# Logs
logs
_.log
npm-debug.log_
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
.pnpm-debug.log*
# Caches
.cache
# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json
# Runtime data
pids
_.pid
_.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
*.lcov
# nyc test coverage
.nyc_output
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# Snowpack dependency directory (https://snowpack.dev/)
web_modules/
# TypeScript cache
*.tsbuildinfo
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional stylelint cache
.stylelintcache
# Microbundle cache
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variable files
.env
.env.development.local
.env.test.local
.env.production.local
.env.local
# parcel-bundler cache (https://parceljs.org/)
.parcel-cache
# Next.js build output
.next
out
# Nuxt.js build / generate output
.nuxt
dist
# Gatsby files
# Comment in the public line in if your project uses Gatsby and not Next.js
# https://nextjs.org/blog/next-9-1#public-directory-support
# public
# vuepress build output
.vuepress/dist
# vuepress v2.x temp and cache directory
.temp
# Docusaurus cache and generated files
.docusaurus
# Serverless directories
.serverless/
# FuseBox cache
.fusebox/
# DynamoDB Local files
.dynamodb/
# TernJS port file
.tern-port
# Stores VSCode versions used for testing VSCode extensions
.vscode-test
# yarn v2
.yarn/cache
.yarn/unplugged
.yarn/build-state.yml
.yarn/install-state.gz
.pnp.*
# IntelliJ based IDEs
.idea
# Finder (MacOS) folder config
.DS_Store

9
back-end/Dockerfile Normal file
View File

@ -0,0 +1,9 @@
FROM docker.io/oven/bun:1.1-slim
WORKDIR /app/
COPY package.json bun.lockb .
COPY prisma/ prisma/
RUN bun install && bunx prisma generate
COPY api/ api/
COPY index.ts .
EXPOSE 3000
CMD ["bun", "index.ts"]

15
back-end/README.md Normal file
View File

@ -0,0 +1,15 @@
# back-end
To install dependencies:
```bash
bun install
```
To run:
```bash
bun run index.ts
```
This project was created using `bun init` in bun v1.1.32. [Bun](https://bun.sh) is a fast all-in-one JavaScript runtime.

24
back-end/api/login.ts Normal file
View File

@ -0,0 +1,24 @@
import { PrismaClient } from "@prisma/client";
import jwt from "jsonwebtoken";
const prisma = new PrismaClient();
export default async function login(req, res) {
const { email, pswd } = req.body;
const user = await prisma.user.findUnique({
where: { email },
});
if (user && pswd == user.pswd) {
const token = jwt.sign(
{ id: user.id, email: user.email },
process.env.JWT_SECRET,
{ expiresIn: "1h" }
);
res.status(200).json(token);
console.log("sign up valid");
} else {
res.status(401).json({ message: "Invalid email or password" });
console.log("invalid credential");
}
}

22
back-end/api/register.ts Normal file
View File

@ -0,0 +1,22 @@
import { PrismaClient } from "@prisma/client";
const prisma = new PrismaClient();
export default async function register(req, res) {
const { email, username, pswd } = req.body;
try {
const newUser = await prisma.user.create({
data: {
username,
email,
pswd,
},
});
res.status(201).json(newUser);
} catch (error) {
res
.status(500)
.json({ message: "User creation failed", error: error.message });
}
}

BIN
back-end/bun.lockb Executable file

Binary file not shown.

52
back-end/index.ts Normal file
View File

@ -0,0 +1,52 @@
import { PrismaClient } from "@prisma/client";
import cors from "cors";
import login from "./api/login";
import register from "./api/register";
const client = new PrismaClient();
const express = require("express");
const app = express();
app.use(express.json());
app.use(cors());
client.$connect();
app.post("/api/register", register);
app.post("/api/login", login);
app.listen(3000, () => {
console.log(`Server is running on port 3000`);
});
client.$disconnect();
/* function verify_token(req, res, next) {
const token = req.headers["token"];
if (token) {
jwt.verify(token, process.env.JWT_SECRET, (err, user) => {
if (err) {
res.send("ERROR")
return
}
next();
})
return;
}
res.status(404);
res.send("ERROR")
} */
/* app.use('/profile', function (req, res, next) {
const token = req.headers["authorization"];
if (token) {
jwt.verify(token, secret, (err, user) => {
if (err) {
res.send("ERROR")
return
}
req.user = user;
next();
})
return;
}
res.status(404);
res.send("ERROR")
}); */

23
back-end/package.json Normal file
View File

@ -0,0 +1,23 @@
{
"name": "back-end",
"module": "index.ts",
"type": "module",
"devDependencies": {
"@types/bun": "latest",
"jest": "^29.7.0",
"prisma": "^5.21.1"
},
"peerDependencies": {
"typescript": "^5.6.3"
},
"dependencies": {
"@prisma/client": "^5.21.1",
"@types/express": "^5.0.0",
"cors": "^2.8.5",
"express": "^4.21.1",
"jsonwebtoken": "^9.0.2"
},
"scripts": {
"test": "jest"
}
}

View File

@ -0,0 +1,13 @@
-- CreateTable
CREATE TABLE "User" (
"id" SERIAL NOT NULL,
"username" TEXT NOT NULL,
"pswd" TEXT NOT NULL,
"email" TEXT NOT NULL
);
-- CreateIndex
CREATE UNIQUE INDEX "User_id_key" ON "User"("id");
-- CreateIndex
CREATE UNIQUE INDEX "User_email_key" ON "User"("email");

View File

@ -0,0 +1,21 @@
// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?
// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model User {
id Int @unique @default(autoincrement())
username String
pswd String
email String @unique
}

27
back-end/tsconfig.json Normal file
View File

@ -0,0 +1,27 @@
{
"compilerOptions": {
// Enable latest features
"lib": ["ESNext", "DOM"],
"target": "ESNext",
"module": "ESNext",
"moduleDetection": "force",
"jsx": "react-jsx",
"allowJs": true,
// Bundler mode
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"verbatimModuleSyntax": true,
"noEmit": true,
// Best practices
"strict": true,
"skipLibCheck": true,
"noFallthroughCasesInSwitch": true,
// Some stricter flags (disabled by default)
"noUnusedLocals": false,
"noUnusedParameters": false,
"noPropertyAccessFromIndexSignature": false
}
}

43
compose.yaml Normal file
View File

@ -0,0 +1,43 @@
---
services:
front-end:
build: ./front_end
restart: unless-stopped
ports:
- "8000:5173"
environment:
- PROD_URL
depends_on:
- back-end
back-end:
build: ./back-end
restart: unless-stopped
ports:
- "3000:3000"
command:
- sh
- -c
- "bunx prisma migrate deploy && bun index.ts"
environment:
- DATABASE_URL=postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@db/$POSTGRES_DB
depends_on:
- redis
- db
redis:
image: "valkey/valkey:7"
restart: unless-stopped
db:
image: "postgres:17"
restart: unless-stopped
environment:
- POSTGRES_DB
- POSTGRES_USER
- POSTGRES_PASSWORD
volumes:
- db:/var/lib/postgresql/data
volumes:
db:

1
front_end/.env Normal file
View File

@ -0,0 +1 @@
PROD_URL=gmoker.com

20
front_end/.gitignore vendored Normal file
View File

@ -0,0 +1,20 @@
# Created by https://www.toptal.com/developers/gitignore/api/react
# Edit at https://www.toptal.com/developers/gitignore?templates=react
### react ###
.DS_*
*.log
logs
**/*.backup.*
**/*.back.*
node_modules
bower_components
*.sublime*
psd
thumb
sketch
# End of https://www.toptal.com/developers/gitignore/api/react

9
front_end/Dockerfile Normal file
View File

@ -0,0 +1,9 @@
FROM docker.io/oven/bun:1.1-slim
WORKDIR /app/
COPY package.json bun.lockb .
RUN bun install
COPY src/ src/
COPY index.html vite.config.js .
RUN bun run build
EXPOSE 5173
CMD ["start", "--host", "0"]

4
front_end/README.md Normal file
View File

@ -0,0 +1,4 @@
installer bun pour lancer plus vitte que npm
installer vite pour la convestion react->html
lancer: bun dev
enjoy

BIN
front_end/bun.lockb Executable file

Binary file not shown.

13
front_end/index.html Normal file
View File

@ -0,0 +1,13 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/jpg" href="src/assets/chat_sex.jpg"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Gmoker</title>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.jsx"></script>
</body>
</html>

View File

@ -0,0 +1,36 @@
#!/bin/bash -e
set -o pipefail
function kapply() {
for f in "$@"; do
kubectl apply -f \
<(envsubst "$(env | xargs printf '$%s ')" < "manifests/$f")
done
}
function kcreatesec() {
kubectl create secret generic --save-config --dry-run=client -oyaml "$@" | kubectl apply -f-
}
function kcreatecm() {
kubectl create configmap --dry-run=client -oyaml "$@" | kubectl apply -f-
}
function kgseckey() {
local sec="$1"; shift
local key="$1"; shift
kubectl get secret "$sec" -o jsonpath="{.data.$key}" | base64 -d
}
function kgcmkey() {
local cm="$1"; shift
local key="$1"; shift
kubectl get configmap "$cm" -o jsonpath="{.data.$key}"
}
kapply common/app.yaml
kubectl rollout restart deployment app

View File

@ -0,0 +1,5 @@
#!/bin/bash -e
export NB_REPLICAS=1
. ./manifests/bin/deploy.sh

View File

@ -0,0 +1,5 @@
#!/bin/bash -e
export NB_REPLICAS=3
. ./manifests/bin/deploy.sh

View File

@ -0,0 +1,64 @@
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
ingressClassName: nginx
tls:
- secretName: tls-app
hosts:
- "$BASE_URL"
rules:
- host: "$BASE_URL"
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: app
port:
name: http
---
apiVersion: v1
kind: Service
metadata:
name: app
labels:
app: app
spec:
selector:
app: app
ports:
- name: http
port: 80
targetPort: http
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: app
labels:
app: app
spec:
replicas: $NB_REPLICAS
selector:
matchLabels:
app: app
template:
metadata:
labels:
app: app
spec:
imagePullSecrets:
- name: regcred
containers:
- name: app
image: "$IMAGEAPP"
imagePullPolicy: Always
ports:
- name: http
containerPort: 5173

View File

View File

34
front_end/package.json Normal file
View File

@ -0,0 +1,34 @@
{
"name": "gmoker",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"start": "bun run vite",
"build": "vite build",
"lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0",
"preview": "vite preview"
},
"dependencies": {
"@chakra-ui/react": "^2.8.2",
"@emotion/react": "^11.13.3",
"@emotion/styled": "^11.13.0",
"axios": "^1.7.7",
"framer-motion": "^11.5.4",
"mysql2": "^3.11.1",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-router-dom": "^6.26.2"
},
"devDependencies": {
"@types/react": "^18.3.5",
"@types/react-dom": "^18.3.0",
"@vitejs/plugin-react": "^4.3.1",
"eslint": "^8.57.0",
"eslint-plugin-react": "^7.35.2",
"eslint-plugin-react-hooks": "^4.6.2",
"eslint-plugin-react-refresh": "^0.4.11",
"vite": "^5.4.3"
}
}

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 882 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="35.93" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 228"><path fill="#00D8FF" d="M210.483 73.824a171.49 171.49 0 0 0-8.24-2.597c.465-1.9.893-3.777 1.273-5.621c6.238-30.281 2.16-54.676-11.769-62.708c-13.355-7.7-35.196.329-57.254 19.526a171.23 171.23 0 0 0-6.375 5.848a155.866 155.866 0 0 0-4.241-3.917C100.759 3.829 77.587-4.822 63.673 3.233C50.33 10.957 46.379 33.89 51.995 62.588a170.974 170.974 0 0 0 1.892 8.48c-3.28.932-6.445 1.924-9.474 2.98C17.309 83.498 0 98.307 0 113.668c0 15.865 18.582 31.778 46.812 41.427a145.52 145.52 0 0 0 6.921 2.165a167.467 167.467 0 0 0-2.01 9.138c-5.354 28.2-1.173 50.591 12.134 58.266c13.744 7.926 36.812-.22 59.273-19.855a145.567 145.567 0 0 0 5.342-4.923a168.064 168.064 0 0 0 6.92 6.314c21.758 18.722 43.246 26.282 56.54 18.586c13.731-7.949 18.194-32.003 12.4-61.268a145.016 145.016 0 0 0-1.535-6.842c1.62-.48 3.21-.974 4.76-1.488c29.348-9.723 48.443-25.443 48.443-41.52c0-15.417-17.868-30.326-45.517-39.844Zm-6.365 70.984c-1.4.463-2.836.91-4.3 1.345c-3.24-10.257-7.612-21.163-12.963-32.432c5.106-11 9.31-21.767 12.459-31.957c2.619.758 5.16 1.557 7.61 2.4c23.69 8.156 38.14 20.213 38.14 29.504c0 9.896-15.606 22.743-40.946 31.14Zm-10.514 20.834c2.562 12.94 2.927 24.64 1.23 33.787c-1.524 8.219-4.59 13.698-8.382 15.893c-8.067 4.67-25.32-1.4-43.927-17.412a156.726 156.726 0 0 1-6.437-5.87c7.214-7.889 14.423-17.06 21.459-27.246c12.376-1.098 24.068-2.894 34.671-5.345a134.17 134.17 0 0 1 1.386 6.193ZM87.276 214.515c-7.882 2.783-14.16 2.863-17.955.675c-8.075-4.657-11.432-22.636-6.853-46.752a156.923 156.923 0 0 1 1.869-8.499c10.486 2.32 22.093 3.988 34.498 4.994c7.084 9.967 14.501 19.128 21.976 27.15a134.668 134.668 0 0 1-4.877 4.492c-9.933 8.682-19.886 14.842-28.658 17.94ZM50.35 144.747c-12.483-4.267-22.792-9.812-29.858-15.863c-6.35-5.437-9.555-10.836-9.555-15.216c0-9.322 13.897-21.212 37.076-29.293c2.813-.98 5.757-1.905 8.812-2.773c3.204 10.42 7.406 21.315 12.477 32.332c-5.137 11.18-9.399 22.249-12.634 32.792a134.718 134.718 0 0 1-6.318-1.979Zm12.378-84.26c-4.811-24.587-1.616-43.134 6.425-47.789c8.564-4.958 27.502 2.111 47.463 19.835a144.318 144.318 0 0 1 3.841 3.545c-7.438 7.987-14.787 17.08-21.808 26.988c-12.04 1.116-23.565 2.908-34.161 5.309a160.342 160.342 0 0 1-1.76-7.887Zm110.427 27.268a347.8 347.8 0 0 0-7.785-12.803c8.168 1.033 15.994 2.404 23.343 4.08c-2.206 7.072-4.956 14.465-8.193 22.045a381.151 381.151 0 0 0-7.365-13.322Zm-45.032-43.861c5.044 5.465 10.096 11.566 15.065 18.186a322.04 322.04 0 0 0-30.257-.006c4.974-6.559 10.069-12.652 15.192-18.18ZM82.802 87.83a323.167 323.167 0 0 0-7.227 13.238c-3.184-7.553-5.909-14.98-8.134-22.152c7.304-1.634 15.093-2.97 23.209-3.984a321.524 321.524 0 0 0-7.848 12.897Zm8.081 65.352c-8.385-.936-16.291-2.203-23.593-3.793c2.26-7.3 5.045-14.885 8.298-22.6a321.187 321.187 0 0 0 7.257 13.246c2.594 4.48 5.28 8.868 8.038 13.147Zm37.542 31.03c-5.184-5.592-10.354-11.779-15.403-18.433c4.902.192 9.899.29 14.978.29c5.218 0 10.376-.117 15.453-.343c-4.985 6.774-10.018 12.97-15.028 18.486Zm52.198-57.817c3.422 7.8 6.306 15.345 8.596 22.52c-7.422 1.694-15.436 3.058-23.88 4.071a382.417 382.417 0 0 0 7.859-13.026a347.403 347.403 0 0 0 7.425-13.565Zm-16.898 8.101a358.557 358.557 0 0 1-12.281 19.815a329.4 329.4 0 0 1-23.444.823c-7.967 0-15.716-.248-23.178-.732a310.202 310.202 0 0 1-12.513-19.846h.001a307.41 307.41 0 0 1-10.923-20.627a310.278 310.278 0 0 1 10.89-20.637l-.001.001a307.318 307.318 0 0 1 12.413-19.761c7.613-.576 15.42-.876 23.31-.876H128c7.926 0 15.743.303 23.354.883a329.357 329.357 0 0 1 12.335 19.695a358.489 358.489 0 0 1 11.036 20.54a329.472 329.472 0 0 1-11 20.722Zm22.56-122.124c8.572 4.944 11.906 24.881 6.52 51.026c-.344 1.668-.73 3.367-1.15 5.09c-10.622-2.452-22.155-4.275-34.23-5.408c-7.034-10.017-14.323-19.124-21.64-27.008a160.789 160.789 0 0 1 5.888-5.4c18.9-16.447 36.564-22.941 44.612-18.3ZM128 90.808c12.625 0 22.86 10.235 22.86 22.86s-10.235 22.86-22.86 22.86s-22.86-10.235-22.86-22.86s10.235-22.86 22.86-22.86Z"></path></svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@ -0,0 +1,7 @@
export function App() {
return (
<h1 style={{ textAlign: "center", fontSize: "50px", color: "white" }}>
Bienvenue sur GMoker.com
</h1>
);
}

View File

@ -0,0 +1,14 @@
export function Body() {
return (
<>
<h2 style={{ fontSize: "20px", textAlign: "center" }}>
GMoker un service de cloud transparent avec ses clients
</h2>
<br></br>
<p style={{ textAlign: "center" }}>
GMoker propose un service d'hébergement open source oû l'entrée est
aussi simple que la sortie
</p>
</>
);
}

View File

@ -0,0 +1,23 @@
export function Footer() {
return (
<footer>
<br></br>
<br></br>
<br></br>
<br></br>
<br></br>
<br></br>
<br></br>
<br></br>
<br></br>
<br></br>
<br></br>
<br></br>
<br></br>
<br></br>
<a href="https://google.com" style={{ color: "white" }}>
google.com
</a>
</footer>
);
}

View File

@ -0,0 +1,44 @@
import { Button, Flex } from "@chakra-ui/react";
import { Link } from "react-router-dom";
const button_style = {
colorScheme: "cyan",
variant: "solid",
};
export function Header() {
return (
<Flex justify={"space-between"}>
<Flex justifyContent={"left"} gap={1} marginTop={1} width={"500px"}>
<Link to="/accueil">
<Button {...button_style}>Accueil</Button>
</Link>
<Link to="/about">
<Button {...button_style}>About</Button>
</Link>
<Link to="/product">
<Button {...button_style}>Product</Button>
</Link>
<Link to="/blog">
<Button {...button_style}>Blog</Button>
</Link>
<Link to="/serveurs">
<Button {...button_style}>Serveurs</Button>
</Link>
<Link to="/downloads">
<Button {...button_style}>Downloads</Button>
</Link>
<Link to="/help">
<Button {...button_style}>Help</Button>
</Link>
</Flex>
<Flex justify={"right"} gap={1} marginTop={1} width={"500px"}>
<Link to="/sign-in">
<Button {...button_style}>Sign in</Button>
</Link>
<Link to="/register">
<Button {...button_style}>Register</Button>
</Link>
</Flex>
</Flex>
);
}

View File

@ -0,0 +1,7 @@
export function Navbar() {
return (
<p style={{ textAlign: "center", color: "red", background: "green" }}>
Welcome to gmoker, the the website is under construction
</p>
);
}

View File

@ -0,0 +1,3 @@
export function About() {
return <h1>Ici vous pouvez lire en quoi est constitué le projet</h1>;
}

View File

@ -0,0 +1,13 @@
import { App } from "../component/App.jsx";
import { Body } from "../component/Body.jsx";
import { Footer } from "../component/Footer.jsx";
export function Accueil() {
return (
<>
<App />
<Body />
<Footer />
</>
);
}

View File

@ -0,0 +1,3 @@
export function Blog() {
return <h1>Ici vous pouvez lire le blog des dernieres maj</h1>;
}

View File

@ -0,0 +1,3 @@
export function Downloads() {
return <h1>Voici la page des downloads</h1>;
}

View File

@ -0,0 +1,3 @@
export function Help() {
return <h1>Ici vous pouvez demander de l'aide</h1>;
}

View File

@ -0,0 +1,3 @@
export function Product() {
return <h1>Voici les produits</h1>;
}

View File

@ -0,0 +1,3 @@
export function Profil() {
return <h1>profil page</h1>;
}

View File

@ -0,0 +1,81 @@
import { Button, Input, Stack } from "@chakra-ui/react";
import { useState } from "react";
export function Register() {
const [isLoading, setIsLoading] = useState(false);
const [email, setEmail] = useState("");
const [username, setUsername] = useState("");
const [password, setPassword] = useState("");
const [confirmPassword, setConfirmPassword] = useState("");
const handleSubmit = async (e) => {
e.preventDefault();
if (password !== confirmPassword) {
alert("Les mots de passe ne correspondent pas");
return;
}
setIsLoading(true);
try {
const response = await fetch("http://localhost:3000/api/register", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({ email, username, pswd: password }),
});
if (!response.ok) {
const errorData = await response.json();
throw new Error(`Network response was not ok: ${errorData.message}`);
}
alert("Inscription réussie");
} catch (error) {
console.error("Error during registration:", error);
alert(`Erreur lors de l'inscription: ${error.message}`);
} finally {
setIsLoading(false);
}
};
return (
<Stack spacing={4} align="center" as="form" onSubmit={handleSubmit}>
<Input
placeholder="Email"
size="md"
value={email}
onChange={(e) => setEmail(e.target.value)}
/>
<Input
placeholder="Username"
size="md"
value={username}
onChange={(e) => setUsername(e.target.value)}
/>
<Input
placeholder="Password"
size="md"
type="password"
value={password}
onChange={(e) => setPassword(e.target.value)}
/>
<Input
placeholder="Confirm Password"
size="md"
type="password"
value={confirmPassword}
onChange={(e) => setConfirmPassword(e.target.value)}
/>
<Button
isLoading={isLoading}
loadingText="Chargement"
variant="outline"
type="submit"
>
Register
</Button>
</Stack>
);
}

View File

@ -0,0 +1,15 @@
import { Outlet, useLocation } from "react-router-dom";
import { Header } from "../component/Head";
import { Navbar } from "../component/Navbar";
export function Root() {
const location = useLocation();
console.log(location);
return (
<>
{location.pathname == "/accueil" && <Navbar />}
<Header />;
<Outlet />
</>
);
}

View File

@ -0,0 +1,3 @@
export function Serveurs() {
return <h1>Voici les serveurs</h1>;
}

View File

@ -0,0 +1,62 @@
import { Button, Input, Stack } from "@chakra-ui/react";
import { useState } from "react";
export function SignIn() {
const [isLoading, setIsLoading] = useState(false);
const [email, setEmail] = useState("");
const [password, setPassword] = useState("");
const handleSubmit = async () => {
setIsLoading(true);
alert(email);
alert(password);
try {
const response = await fetch("http://localhost:3000/api/login", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({ email, pswd: password }),
});
/* if (!response.ok) {
throw new Error("Network response was not ok");
} */
const data = await response.json();
alert("Login successful:", data);
//login();
} catch (error) {
console.error("Error during login:", error);
alert("Error during login: " + error.message);
} finally {
setIsLoading(false);
}
};
return (
<Stack spacing={4} align="center">
<Input
placeholder="Email"
size="md"
value={email}
onChange={(e) => setEmail(e.target.value)}
/>
<Input
placeholder="Password"
size="md"
type="password"
value={password}
onChange={(e) => setPassword(e.target.value)}
/>
<Button
isLoading={isLoading}
loadingText="Chargement"
variant="outline"
onClick={handleSubmit}
>
Connection
</Button>
</Stack>
);
}

23
front_end/src/main.jsx Normal file
View File

@ -0,0 +1,23 @@
import { ChakraProvider } from "@chakra-ui/react";
import React from "react";
import ReactDOM from "react-dom/client";
import { RouterProvider } from "react-router-dom";
import back_img from "./assets/img_site.jpg";
import { router } from "./services/Router.jsx";
ReactDOM.createRoot(document.getElementById("root")).render(
<>
<ChakraProvider>
<div
style={{
backgroundImage: `url(${back_img})`,
minHeight: "100vh",
backgroundSize: "cover",
backgroundPosition: "center",
}}
>
<RouterProvider router={router} />
</div>
</ChakraProvider>
</>
);

View File

@ -0,0 +1,25 @@
import { createContext, useContext, useState } from "react";
const AuthContext = createContext();
export function AuthProvider({ children }) {
const [isAuthenticated, setIsAuthenticated] = useState(false);
const login = () => {
setIsAuthenticated(true);
};
const logout = () => {
setIsAuthenticated(false);
};
return (
<AuthContext.Provider value={{ isAuthenticated, login, logout }}>
{children}
</AuthContext.Provider>
);
}
export function useAuth() {
return useContext(AuthContext);
}

View File

@ -0,0 +1,57 @@
import { createBrowserRouter } from "react-router-dom";
import { About } from "../files/About";
import { Accueil } from "../files/Accueil";
import { Blog } from "../files/Blog";
import { Help } from "../files/Help";
import { Product } from "../files/Product";
import { Register } from "../files/Register";
import { Root } from "../files/Root";
import { Serveurs } from "../files/Serveurs";
import { SignIn } from "../files/Sign_in";
export const router = createBrowserRouter([
{
path: "/",
element: <Root />,
children: [
{
path: "/accueil",
element: <Accueil />,
},
{
path: "/sign-in",
element: <SignIn />,
children: [
{
path: "profil",
/* element: <ProtectedRoute element={<Profil />} />, */
},
],
},
{
path: "/register",
element: <Register />,
},
{
path: "/about",
element: <About />,
},
{
path: "/blog",
element: <Blog />,
},
{
path: "/help",
element: <Help />,
},
{
path: "/product",
element: <Product />,
},
{
path: "/serveurs",
element: <Serveurs />,
},
],
},
]);

230
front_end/vite Normal file
View File

@ -0,0 +1,230 @@
mysql Ver 15.1 Distrib 10.11.8-MariaDB, for Linux (x86_64) using EditLine wrapper
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Usage: mysql [OPTIONS] [database]
Default options are read from the following files in the given order:
/etc/my.cnf ~/.my.cnf
The following groups are read: mysql mariadb-client client client-server client-mariadb
The following options may be given as the first argument:
--print-defaults Print the program argument list and exit.
--no-defaults Don't read default options from any option file.
The following specify which files/extra groups are read (specified before remaining options):
--defaults-file=# Only read default options from the given file #.
--defaults-extra-file=# Read this file after the global files are read.
--defaults-group-suffix=# Additionally read default groups with # appended as a suffix.
-?, --help Display this help and exit.
-I, --help Synonym for -?
--abort-source-on-error
Abort 'source filename' operations in case of errors
--auto-rehash Enable automatic rehashing. One doesn't need to use
'rehash' to get table and field completion, but startup
and reconnecting may take a longer time.
(Defaults to on; use --skip-auto-rehash to disable.)
-A, --no-auto-rehash
No automatic rehashing. One has to use 'rehash' to get
table and field completion. This gives a quicker start of
mysql and disables rehashing on reconnect.
--auto-vertical-output
Automatically switch to vertical output mode if the
result is wider than the terminal width.
-B, --batch Don't use history file. Disable interactive behavior.
(Enables --silent.)
--binary-as-hex Print binary data as hex
--binary-mode Binary mode allows certain character sequences to be
processed as data that would otherwise be treated with a
special meaning by the parser. Specifically, this switch
turns off parsing of all client commands except \C and
DELIMITER in non-interactive mode (i.e., when binary mode
is combined with either 1) piped input, 2) the --batch
mysql option, or 3) the 'source' command). Also, in
binary mode, occurrences of '\r\n' and ASCII '\0' are
preserved within strings, whereas by default, '\r\n' is
translated to '\n' and '\0' is disallowed in user input.
--character-sets-dir=name
Directory for character set files.
--column-names Write column names in results.
(Defaults to on; use --skip-column-names to disable.)
-N, --skip-column-names
Don't write column names in results.
--column-type-info Display column type information.
-c, --comments Preserve comments. Send comments to the server. The
default is --skip-comments (discard comments), enable
with --comments.
-C, --compress Use compression in server/client protocol.
--connect-expired-password
Notify the server that this client is prepared to handle
expired password sandbox mode even if --batch was
specified.
--connect-timeout=# Number of seconds before connection timeout.
-D, --database=name Database to use.
-#, --debug[=#] This is a non-debug version. Catch this and exit.
--debug-check Check memory and open file usage at exit.
-T, --debug-info Print some debug info at exit.
--default-auth=name Default authentication client-side plugin to use.
--default-character-set=name
Set the default character set.
--delimiter=name Delimiter to be used.
--enable-cleartext-plugin
Obsolete option. Exists only for MySQL compatibility.
-e, --execute=name Execute command and quit. (Disables --force and history
file.)
-f, --force Continue even if we get an SQL error. Sets
abort-source-on-error to 0
-h, --host=name Connect to host.
-H, --html Produce HTML output.
-i, --ignore-spaces Ignore space after function names.
--init-command=name SQL Command to execute when connecting to MariaDB server.
Will automatically be re-executed when reconnecting.
--line-numbers Write line numbers for errors.
(Defaults to on; use --skip-line-numbers to disable.)
-L, --skip-line-numbers
Don't write line number for errors.
--local-infile Enable LOAD DATA LOCAL INFILE.
--max-allowed-packet=#
The maximum packet length to send to or receive from
server.
--max-join-size=# Automatic limit for rows in a join when using
--safe-updates.
-G, --named-commands
Enable named commands. Named commands mean this program's
internal commands; see mysql> help . When enabled, the
named commands can be used from any line of the query,
otherwise only from the first line, before an enter.
Disable with --disable-named-commands. This option is
disabled by default.
--net-buffer-length=#
The buffer size for TCP/IP and socket communication.
-b, --no-beep Turn off beep on error.
-o, --one-database Ignore statements except those that occur while the
default database is the one named at the command line.
--pager[=name] Pager to use to display results. If you don't supply an
option, the default pager is taken from your ENV variable
PAGER. Valid pagers are less, more, cat [> filename],
etc. See interactive help (\h) also. This option does not
work in batch mode. Disable with --disable-pager. This
option is disabled by default.
-p, --password[=name]
Password to use when connecting to server. If password is
not given it's asked from the tty.
--plugin-dir=name Directory for client-side plugins.
-P, --port=# Port number to use for connection or 0 for default to, in
order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/services, built-in default (3306).
--progress-reports Get progress reports for long running commands (like
ALTER TABLE)
(Defaults to on; use --skip-progress-reports to disable.)
--prompt=name Set the command line prompt to this value.
--protocol=name The protocol to use for connection (tcp, socket, pipe).
-q, --quick Don't cache result, print it row by row. This may slow
down the server if the output is suspended. Doesn't use
history file.
-r, --raw Write fields without conversion. Used with --batch.
--reconnect Reconnect if the connection is lost.
(Defaults to on; use --skip-reconnect to disable.)
-U, --safe-updates Only allow UPDATE and DELETE that uses keys.
-U, --i-am-a-dummy Synonym for option --safe-updates, -U.
--sandbox Disallow commands that access the file system (except \P
without an argument and \e).
--secure-auth Refuse client connecting to server if it uses old
(pre-4.1.1) protocol.
--select-limit=# Automatic limit for SELECT when using --safe-updates.
--server-arg=name Send embedded server this as a parameter.
--show-warnings Show warnings after every statement.
--sigint-ignore Ignore SIGINT (CTRL-C).
-s, --silent Be more silent. Print results with a tab as separator,
each row on new line.
-S, --socket=name The socket file to use for connection.
--ssl Enable SSL for connection (automatically enabled with
other flags).
(Defaults to on; use --skip-ssl to disable.)
--ssl-ca=name CA file in PEM format (check OpenSSL docs, implies
--ssl).
--ssl-capath=name CA directory (check OpenSSL docs, implies --ssl).
--ssl-cert=name X509 cert in PEM format (implies --ssl).
--ssl-cipher=name SSL cipher to use (implies --ssl).
--ssl-key=name X509 key in PEM format (implies --ssl).
--ssl-crl=name Certificate revocation list (implies --ssl).
--ssl-crlpath=name Certificate revocation list path (implies --ssl).
--tls-version=name TLS protocol version for secure connection.
--ssl-verify-server-cert
Verify server's "Common Name" in its cert against
hostname used when connecting. This option is disabled by
default.
-t, --table Output in table format.
--tee=name Append everything into outfile. See interactive help (\h)
also. Does not work in batch mode. Disable with
--disable-tee. This option is disabled by default.
-n, --unbuffered Flush buffer after each query.
-u, --user=name User for login if not current user.
-v, --verbose Write more. (-v -v -v gives the table output format).
-V, --version Output version information and exit.
-E, --vertical Print the output of a query (rows) vertically.
-w, --wait Wait and retry if connection is down.
-X, --xml Produce XML output.
Variables (--variable-name=value)
and boolean options {FALSE|TRUE} Value (after reading options)
--------------------------------- ----------------------------------------
abort-source-on-error FALSE
auto-rehash TRUE
auto-vertical-output FALSE
binary-as-hex FALSE
binary-mode FALSE
character-sets-dir (No default value)
column-names TRUE
column-type-info FALSE
comments FALSE
compress FALSE
connect-expired-password FALSE
connect-timeout 0
database (No default value)
debug-check FALSE
debug-info FALSE
default-auth (No default value)
default-character-set auto
delimiter ;
force FALSE
host (No default value)
html FALSE
ignore-spaces FALSE
init-command (No default value)
line-numbers TRUE
local-infile FALSE
max-allowed-packet 16777216
max-join-size 1000000
named-commands FALSE
net-buffer-length 16384
no-beep FALSE
plugin-dir (No default value)
port 0
progress-reports FALSE
prompt \N [\d]>
protocol
quick FALSE
raw FALSE
reconnect FALSE
safe-updates FALSE
i-am-a-dummy FALSE
sandbox FALSE
secure-auth FALSE
select-limit 1000
show-warnings FALSE
sigint-ignore FALSE
socket (No default value)
ssl TRUE
ssl-ca (No default value)
ssl-capath (No default value)
ssl-cert (No default value)
ssl-cipher (No default value)
ssl-key (No default value)
ssl-crl (No default value)
ssl-crlpath (No default value)
tls-version (No default value)
ssl-verify-server-cert FALSE
table FALSE
unbuffered FALSE
user lazlor
vertical FALSE
xml FALSE

7
front_end/vite.config.js Normal file
View File

@ -0,0 +1,7 @@
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
// https://vitejs.dev/config/
export default defineConfig({
plugins: [react()],
})