From 822cec184c724c9cfa57393c1be016d43574bb1a Mon Sep 17 00:00:00 2001 From: IlP4rAd0xlI Date: Mon, 8 Sep 2025 13:45:25 +0200 Subject: [PATCH 01/77] feature/router Add : react router => Home + Signup pages --- React/package.json | 3 ++- React/src/App.tsx | 44 ++++++++++++---------------------------- React/src/main.tsx | 12 ++++++----- React/src/pages/Home.tsx | 10 +++++++++ 4 files changed, 32 insertions(+), 37 deletions(-) create mode 100644 React/src/pages/Home.tsx diff --git a/React/package.json b/React/package.json index b47be2a..f676f35 100644 --- a/React/package.json +++ b/React/package.json @@ -11,7 +11,8 @@ }, "dependencies": { "react": "^19.1.1", - "react-dom": "^19.1.1" + "react-dom": "^19.1.1", + "react-router-dom": "^7.8.2" }, "devDependencies": { "@eslint/js": "^9.33.0", diff --git a/React/src/App.tsx b/React/src/App.tsx index 3d7ded3..027cc68 100644 --- a/React/src/App.tsx +++ b/React/src/App.tsx @@ -1,35 +1,17 @@ -import { useState } from 'react' -import reactLogo from './assets/react.svg' -import viteLogo from '/vite.svg' -import './App.css' +import { Routes, Route } from 'react-router-dom' +import Signup from './pages/Signup.tsx' +import Home from './pages/Home.tsx' function App() { - const [count, setCount] = useState(0) - - return ( - <> -
- - Vite logo - - - React logo - -
-

Vite + React

-
- -

- Edit src/App.tsx and save to test HMR -

-
-

- Click on the Vite and React logos to learn more -

- - ) + return ( + <> + + } /> + } /> + } /> + + + ) } -export default App +export default App \ No newline at end of file diff --git a/React/src/main.tsx b/React/src/main.tsx index bef5202..35c9054 100644 --- a/React/src/main.tsx +++ b/React/src/main.tsx @@ -1,10 +1,12 @@ import { StrictMode } from 'react' import { createRoot } from 'react-dom/client' -import './index.css' +import { BrowserRouter } from 'react-router-dom' import App from './App.tsx' createRoot(document.getElementById('root')!).render( - - - , -) + + + + + , +) \ No newline at end of file diff --git a/React/src/pages/Home.tsx b/React/src/pages/Home.tsx new file mode 100644 index 0000000..e2d2ac8 --- /dev/null +++ b/React/src/pages/Home.tsx @@ -0,0 +1,10 @@ +import { Link } from 'react-router-dom' + +export default function Home() { + return ( + <> +

Home

+ Link to Signup Page + + ); +} From e43d5bcbb7664726afc330a5bff182151f77f177 Mon Sep 17 00:00:00 2001 From: IlP4rAd0xlI Date: Mon, 8 Sep 2025 13:46:35 +0200 Subject: [PATCH 02/77] feature/router Remove : default css / img / Title (= clean project) --- React/index.html | 3 +-- React/public/vite.svg | 1 - React/src/App.css | 42 -------------------------------------- React/src/assets/react.svg | 1 - 4 files changed, 1 insertion(+), 46 deletions(-) delete mode 100644 React/public/vite.svg delete mode 100644 React/src/assets/react.svg diff --git a/React/index.html b/React/index.html index 5c4dbc2..69473b6 100644 --- a/React/index.html +++ b/React/index.html @@ -2,9 +2,8 @@ - - Vite + React + TS + Same
diff --git a/React/public/vite.svg b/React/public/vite.svg deleted file mode 100644 index e7b8dfb..0000000 --- a/React/public/vite.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/React/src/App.css b/React/src/App.css index b9d355d..e69de29 100644 --- a/React/src/App.css +++ b/React/src/App.css @@ -1,42 +0,0 @@ -#root { - max-width: 1280px; - margin: 0 auto; - padding: 2rem; - text-align: center; -} - -.logo { - height: 6em; - padding: 1.5em; - will-change: filter; - transition: filter 300ms; -} -.logo:hover { - filter: drop-shadow(0 0 2em #646cffaa); -} -.logo.react:hover { - filter: drop-shadow(0 0 2em #61dafbaa); -} - -@keyframes logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} - -@media (prefers-reduced-motion: no-preference) { - a:nth-of-type(2) .logo { - animation: logo-spin infinite 20s linear; - } -} - -.card { - padding: 2em; -} - -.read-the-docs { - color: #888; -} diff --git a/React/src/assets/react.svg b/React/src/assets/react.svg deleted file mode 100644 index 6c87de9..0000000 --- a/React/src/assets/react.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file From 2a1d39242d68dee8bf984b4e6023e3bb221eb22d Mon Sep 17 00:00:00 2001 From: IlP4rAd0xlI Date: Mon, 8 Sep 2025 16:13:39 +0200 Subject: [PATCH 03/77] feature/signup Bugfix : "npm run dev" not automatically refreshing --- React/vite.config.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/React/vite.config.ts b/React/vite.config.ts index 8b0f57b..24b3f5d 100644 --- a/React/vite.config.ts +++ b/React/vite.config.ts @@ -3,5 +3,12 @@ import react from '@vitejs/plugin-react' // https://vite.dev/config/ export default defineConfig({ - plugins: [react()], + plugins: [ + react() + ], + server: { + watch: { + usePolling: true, + }, + }, }) From c456c8a2b4d680f145d14df5331a5cce826758d6 Mon Sep 17 00:00:00 2001 From: IlP4rAd0xlI Date: Mon, 8 Sep 2025 16:16:47 +0200 Subject: [PATCH 04/77] feature/signup-frontend Create : form + sign up field --- React/src/components/forms/signup/PseudoField.tsx | 10 ++++++++++ React/src/components/forms/signup/SignupForm.tsx | 10 ++++++++++ React/src/pages/Signup.tsx | 10 ++++++++++ 3 files changed, 30 insertions(+) create mode 100644 React/src/components/forms/signup/PseudoField.tsx create mode 100644 React/src/components/forms/signup/SignupForm.tsx create mode 100644 React/src/pages/Signup.tsx diff --git a/React/src/components/forms/signup/PseudoField.tsx b/React/src/components/forms/signup/PseudoField.tsx new file mode 100644 index 0000000..3848f60 --- /dev/null +++ b/React/src/components/forms/signup/PseudoField.tsx @@ -0,0 +1,10 @@ +export default function PseudoField() { + return ( + <> + + + ); +} \ No newline at end of file diff --git a/React/src/components/forms/signup/SignupForm.tsx b/React/src/components/forms/signup/SignupForm.tsx new file mode 100644 index 0000000..3ac9990 --- /dev/null +++ b/React/src/components/forms/signup/SignupForm.tsx @@ -0,0 +1,10 @@ +import PseudoField from "./PseudoField.tsx"; + +export default function SignupForm() { + return ( + <> +

SignupForm

+ + + ); +} \ No newline at end of file diff --git a/React/src/pages/Signup.tsx b/React/src/pages/Signup.tsx new file mode 100644 index 0000000..2292c14 --- /dev/null +++ b/React/src/pages/Signup.tsx @@ -0,0 +1,10 @@ +import SignupForm from '../components/forms/signup/SignupForm' + +export default function Signup() { + return ( + <> +

Signup

+ + + ); +} \ No newline at end of file From 2b94c4545869025faf57adc131d9a97b2bc14ff7 Mon Sep 17 00:00:00 2001 From: IlP4rAd0xlI Date: Wed, 10 Sep 2025 07:42:18 +0200 Subject: [PATCH 05/77] feature/signup-frontend Bugfix : tailwind not working --- React/package.json | 2 ++ React/postcss.config.js | 6 ++++++ React/src/main.tsx | 1 + React/tailwind.config.js | 1 + 4 files changed, 10 insertions(+) create mode 100644 React/postcss.config.js diff --git a/React/package.json b/React/package.json index f676f35..270c1dd 100644 --- a/React/package.json +++ b/React/package.json @@ -19,10 +19,12 @@ "@types/react": "^19.1.10", "@types/react-dom": "^19.1.7", "@vitejs/plugin-react": "^5.0.0", + "autoprefixer": "^10.4.21", "eslint": "^9.33.0", "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.20", "globals": "^16.3.0", + "postcss": "^8.5.6", "tailwindcss": "^3.4.17", "typescript": "~5.8.3", "typescript-eslint": "^8.39.1", diff --git a/React/postcss.config.js b/React/postcss.config.js new file mode 100644 index 0000000..2e7af2b --- /dev/null +++ b/React/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/React/src/main.tsx b/React/src/main.tsx index 35c9054..81f3735 100644 --- a/React/src/main.tsx +++ b/React/src/main.tsx @@ -2,6 +2,7 @@ import { StrictMode } from 'react' import { createRoot } from 'react-dom/client' import { BrowserRouter } from 'react-router-dom' import App from './App.tsx' +import './index.css' createRoot(document.getElementById('root')!).render( diff --git a/React/tailwind.config.js b/React/tailwind.config.js index d7cf4f8..29f9502 100644 --- a/React/tailwind.config.js +++ b/React/tailwind.config.js @@ -1,6 +1,7 @@ /** @type {import('tailwindcss').Config} */ export default { content: [ + "./index.html", "./src/**/*.{js,jsx,ts,tsx}", ], theme: { From b11a7c18f762f6e7ddff3e26c551f6d40be9d5a8 Mon Sep 17 00:00:00 2001 From: IlP4rAd0xlI Date: Wed, 10 Sep 2025 08:46:43 +0200 Subject: [PATCH 06/77] feature/signup-frontend Create : pseudo field & Add : min 3 characters specification --- .../components/forms/signup/PseudoField.tsx | 40 +++++++++++++++---- .../components/forms/signup/SignupForm.tsx | 4 +- 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/React/src/components/forms/signup/PseudoField.tsx b/React/src/components/forms/signup/PseudoField.tsx index 3848f60..31401f2 100644 --- a/React/src/components/forms/signup/PseudoField.tsx +++ b/React/src/components/forms/signup/PseudoField.tsx @@ -1,10 +1,36 @@ -export default function PseudoField() { +import React, { useState } from 'react'; + +interface PseudoFieldProps { + value: string; + onChange: (value: string) => void; +} + +export default function PseudoField({ value, onChange }: PseudoFieldProps) { + const [error, setError] = useState(''); + + const handleBlur = () => { + if (value.trim().length > 0 && value.trim().length < 3) { + setError('Username must have at least 3 characters'); + } else { + setError(''); + } + }; + + const handleChange = (e: React.ChangeEvent) => { + onChange(e.target.value); + setError(''); // Clear error when user types + }; + return ( - <> - - +
+ + + {error &&

{error}

} +
); } \ No newline at end of file diff --git a/React/src/components/forms/signup/SignupForm.tsx b/React/src/components/forms/signup/SignupForm.tsx index 3ac9990..ad36b9f 100644 --- a/React/src/components/forms/signup/SignupForm.tsx +++ b/React/src/components/forms/signup/SignupForm.tsx @@ -1,10 +1,12 @@ +import { useState } from 'react'; import PseudoField from "./PseudoField.tsx"; export default function SignupForm() { + const [pseudo, setPseudo] = useState(''); return ( <>

SignupForm

- + ); } \ No newline at end of file From e23083a99792b06bcba34a8609b219dc4c51afca Mon Sep 17 00:00:00 2001 From: Tisa_48 <130873934+Tisa40486@users.noreply.github.com> Date: Wed, 10 Sep 2025 12:42:02 +0200 Subject: [PATCH 07/77] Add ReadMe and change emplacement gitignore --- SameApi/.gitignore | 54 ++++++++++++++++++++++ SameApi/README.md | 113 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 167 insertions(+) create mode 100644 SameApi/.gitignore create mode 100644 SameApi/README.md diff --git a/SameApi/.gitignore b/SameApi/.gitignore new file mode 100644 index 0000000..97dbebf --- /dev/null +++ b/SameApi/.gitignore @@ -0,0 +1,54 @@ +# Build +bin/ +obj/ +out/ + +# User-specific files +*.user +*.userosscache +*.suo +*.sln.docstates + +# Visual Studio cache +.vs/ + +# Rider cache +.idea/ +*.iml + +# Logs +*.log + +# Environment +.env +*.env + +# Packages (restaurables depuis nuget) +packages/ +*.nupkg +*.snupkg + +# Publish +*.PublishSettings +publish/ + +# Azure +*.azurePubxml + +# macOS +.DS_Store + +# Windows +Thumbs.db +desktop.ini + +# JetBrains Rider +.idea/ + +# VS Code +.vscode/ + +# Coverage / Test +TestResult*/ +*.coverage +*.coveragexml \ No newline at end of file diff --git a/SameApi/README.md b/SameApi/README.md new file mode 100644 index 0000000..956907e --- /dev/null +++ b/SameApi/README.md @@ -0,0 +1,113 @@ +# 🗣️ SameApiUnitOfWork API + +A RESTful Web API for a Same, built with **ASP.NET Core** and **Entity Framework Core**. +This API allows clients to perform full CRUD operations on forum entities such as **Users**, **Threads**, **Posts**, and **Comments**. + +--- + +## 🚀 Features + +- Full CRUD for: + - 🧑 Users + - 📌 Threads + - 💬 Posts + - 🗨️ Comments +- Entity Framework Core with database migrations +- Swagger UI for interactive API documentation +- DTOs and AutoMapper for clean data handling +- CORS support for frontend integration +- Basic error handling and validation + +--- + +## 🧱 Entities Overview + +### User +- `Id`, `Username`, `Email`, `PasswordHash`, `CreatedAt` + +### Thread +- `Id`, `Title`, `AuthorId`, `CreatedAt` + +### Post +- `Id`, `ThreadId`, `AuthorId`, `Content`, `CreatedAt` + +### Comment +- `Id`, `PostId`, `AuthorId`, `Content`, `CreatedAt` + +--- + +## 🛠️ Technologies Used + +- ASP.NET Core 6 / 7 +- C# +- Entity Framework Core +- SQL Server / SQLite +- Swagger (Swashbuckle) +- AutoMapper + +--- + +## 📁 Project Structure + +SameApi: + - 🗂️ SameApi.App: + - Program.cs + + - 🗂️ SameApi.Business: + - 📄 SameApiProfile.cs + + - 🗂️ SameApi.Data: + - 📁 DbContexts: + - 📄 BaseDbContext + - 📄 IBaseDbContext + - 📁 Model: + - 📄 IModelDao.cs + - 📁 Repository: + - 📄 BaseRepository + - 📄 IBaseRepository + + - 🗂️ SameApi.Db: + - 📁 DbContexts: + - 📄 SameApiDbContext.cs + - 📄 ISameApiDbContext.cs + - 📁 UnitOfWork: + - 📄 SameApiUnitOfWork.cs + - 📄 ISameApiUnitOfWork.cs + + - 🗂️ SameApi.Dto: + + - 🗂️ SameApi.Model: + +--- + +## ⚙️ Getting Started + +### Prerequisites + +- [.NET 9}(https://dotnet.microsoft.com/) +- DB Server +- Visual Studio or VS Code + +### Setup Instructions + +1. **Clone the repository:** + ```bash + git clone https://github.com/Tisa40486/Same.git + +2. **API Endpoints** + +| Method | Endpoint | Description | +| ------ | -------------------- | ------------------- | +| GET | `/api/threads` | Get all threads | +| POST | `/api/threads` | Create a new thread | +| GET | `/api/posts/{id}` | Get a single post | +| PUT | `/api/posts/{id}` | Update a post | +| DELETE | `/api/comments/{id}` | Delete a comment | + + +-- + +- 📬 Contact + - 📧Same - same@sames.school + - 🧑‍💻GitHub - https://github.com/Tisa40486 + From c9c5a219f9f9c3bd82a02caec9416576458550a0 Mon Sep 17 00:00:00 2001 From: Tisa_48 <130873934+Tisa40486@users.noreply.github.com> Date: Wed, 10 Sep 2025 13:58:41 +0200 Subject: [PATCH 08/77] Update ReadMe Add MLD --- SameApi/MLD.md | 82 +++++++++++++++++++++++++++++++++++++++++++++++ SameApi/README.md | 32 ++++++++++++------ 2 files changed, 105 insertions(+), 9 deletions(-) create mode 100644 SameApi/MLD.md diff --git a/SameApi/MLD.md b/SameApi/MLD.md new file mode 100644 index 0000000..320c90c --- /dev/null +++ b/SameApi/MLD.md @@ -0,0 +1,82 @@ +## Database Model + +```mermaid +erDiagram + USER || --o{ POST : "Make some" + + USER ||--o{ LKP_SCHOOL : "Be At" + POST ||--o{ TAGS : "Had" + POST ||--o{ COMMENT : "Comment" + LKP_SCHOOL ||--o{ LKP_PROFESSION : "Have Professions" + USER ||--o{ LKP_Gender : "Be" + TAGS ||--o{ LKP_TAG_REQUIRED : "Contain" + TAGS ||--o{ TAG_OPTIONAL : "Contain" + TAGS ||--o{ POST : "On" + + USER { + int id_user + bool isadmin + int age + string pseudo + string email + string password + int number_follow + datetime createAt + int id_gender_fk + int id_school_fk + int id_post_fk + } + + LKP_Gender { + int id_gender + string gender + } + + POST { + int id_post + string post + int id_comment + int like + string img + datetime createAt + int id_user + int id_tag_fk + } + + TAGS { + int id_tag + datetime createAt + int id_post_fk + int id_tag_required_fk + int id_tag_optional_fk + } + + LKP_TAG_REQUIRED{ + int id_tag_required + string tag_required + } + + TAG_OPTIONAL{ + int id_tag_optional + string tag_optional + } + + LKP_SCHOOL { + int id_school + string name + int id_profession_fk + } + + LKP_PROFESSION { + int id_profession + string name_profession + } + + COMMENT { + int id + int postId + int id_user + string title + string content + datetime createdAt + } \ No newline at end of file diff --git a/SameApi/README.md b/SameApi/README.md index 956907e..519429b 100644 --- a/SameApi/README.md +++ b/SameApi/README.md @@ -4,7 +4,6 @@ A RESTful Web API for a Same, built with **ASP.NET Core** and **Entity Framework This API allows clients to perform full CRUD operations on forum entities such as **Users**, **Threads**, **Posts**, and **Comments**. --- - ## 🚀 Features - Full CRUD for: @@ -19,23 +18,40 @@ This API allows clients to perform full CRUD operations on forum entities such a - Basic error handling and validation --- +## Database Model + +You can find the detailed MLD diagram [here](./MLD.md). ## 🧱 Entities Overview ### User -- `Id`, `Username`, `Email`, `PasswordHash`, `CreatedAt` +- `id`, `isadmin`, `age`, `pseudo`, `email`, `password`, `number_follow`, `createAt`, `id_gender_fk`, `id_school_fk`, `id_post_fk` + +### Gender +- `id`, `gender` + +### Tags +- `Id`, `createAt`, `tag_required`, `tag_optional` +### TAG_REQUIRED +- `Id`, `tag_required` + +### TAG_OPTIONAL +- `Id`, `tag_optional` + +### SCHOOL +- `Id`, `name`, `profession` + +### PROFESSION +- `Id`, `name` -### Thread -- `Id`, `Title`, `AuthorId`, `CreatedAt` ### Post -- `Id`, `ThreadId`, `AuthorId`, `Content`, `CreatedAt` +- `Id`, `ThreadId`, `id_user`, `Content`, `CreatedAt` ### Comment -- `Id`, `PostId`, `AuthorId`, `Content`, `CreatedAt` +- `Id`, `PostId`, `id_user`, `title`, `Content`, `CreatedAt` --- - ## 🛠️ Technologies Used - ASP.NET Core 6 / 7 @@ -45,8 +61,6 @@ This API allows clients to perform full CRUD operations on forum entities such a - Swagger (Swashbuckle) - AutoMapper ---- - ## 📁 Project Structure SameApi: From dbf2067051b660de973b9b62d9530ae0e8e21382 Mon Sep 17 00:00:00 2001 From: IlP4rAd0xlI Date: Fri, 12 Sep 2025 08:31:11 +0200 Subject: [PATCH 09/77] feature/signup Update : pseudo field --- React/src/App.css | 0 .../components/forms/signup/PseudoField.tsx | 59 +++++++++++++++---- 2 files changed, 46 insertions(+), 13 deletions(-) delete mode 100644 React/src/App.css diff --git a/React/src/App.css b/React/src/App.css deleted file mode 100644 index e69de29..0000000 diff --git a/React/src/components/forms/signup/PseudoField.tsx b/React/src/components/forms/signup/PseudoField.tsx index 31401f2..89cb838 100644 --- a/React/src/components/forms/signup/PseudoField.tsx +++ b/React/src/components/forms/signup/PseudoField.tsx @@ -1,24 +1,56 @@ -import React, { useState } from 'react'; +// import React, { useState } from 'react'; + +const reservedWords = [ + 'admin', + 'root', + 'user', + 'guest', + 'anonymous', + 'moderator', + 'administrator', + 'system', + 'null', + 'undefined' + // Add more +]; + +const specialCharsRegex = /[^a-zA-Z0-9_-]/; interface PseudoFieldProps { value: string; onChange: (value: string) => void; } -export default function PseudoField({ value, onChange }: PseudoFieldProps) { - const [error, setError] = useState(''); - - const handleBlur = () => { - if (value.trim().length > 0 && value.trim().length < 3) { - setError('Username must have at least 3 characters'); - } else { - setError(''); +export default function PseudoField({ value, onChange }: PseudoFieldProps) +{ + // const [error, setError] = useState(''); + const handleBlur = () => + { + if (value.trim().length > 0 && value.trim().length < 3 || value.trim().length > 20) { + // setError('Username must habe between 3 and 20 characters'); + console.log('Username must habe between 3 and 20 characters') } - }; + if (reservedWords.includes(value.trim().toLowerCase())) { + // setError("Username can not be reserved words (like admin, root,...)"); + console.log("Username can not be reserved words (like admin, root,...)") + } + if (/\s/.test(value)) { + // setError("Username can not contains spaces"); + console.log("Username can not contains spaces") + } + if (!/[a-zA-Z]/.test(value)) { + console.log("Username must contain at least one letter") + } + if (specialCharsRegex.test(value)) { + console.log("Username can only contain letters, numbers, underscores (_), and hyphens (-)"); + } + } - const handleChange = (e: React.ChangeEvent) => { + const handleChange = (e: React.ChangeEvent) => + { onChange(e.target.value); - setError(''); // Clear error when user types + console.clear(); + // setError(''); // Clear error when user types }; return ( @@ -29,8 +61,9 @@ export default function PseudoField({ value, onChange }: PseudoFieldProps) { value={value} onChange={handleChange} onBlur={handleBlur} + className={"border-2"} /> - {error &&

{error}

} + {/*{error &&

{error}

}*/} ); } \ No newline at end of file From e35d3bf00b382ad866190c7995c1cf8c395203f8 Mon Sep 17 00:00:00 2001 From: Mattis Date: Fri, 12 Sep 2025 09:05:13 +0200 Subject: [PATCH 10/77] Update gitignore --- SameApi/.gitignore | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/SameApi/.gitignore b/SameApi/.gitignore index 97dbebf..9d9d402 100644 --- a/SameApi/.gitignore +++ b/SameApi/.gitignore @@ -1,7 +1,9 @@ # Build bin/ obj/ -out/ +[Bb]uild/ +[Ll]og/ + # User-specific files *.user @@ -9,9 +11,6 @@ out/ *.suo *.sln.docstates -# Visual Studio cache -.vs/ - # Rider cache .idea/ *.iml @@ -51,4 +50,24 @@ desktop.ini # Coverage / Test TestResult*/ *.coverage -*.coveragexml \ No newline at end of file +*.coveragexml + +# Visual Studio +.vs/ +*.suo +*.user +*.userosscache +*.sln.docstates + +# NuGet +*.nupkg +*.snupkg +*.nuspec +*.ncrunchsolution* +project.lock.json +project.fragment.lock.json +artifacts/ + +# Others +*.cache +*.db \ No newline at end of file From 5bb40ec1ab947a541fd4224e807a6da20b8153b2 Mon Sep 17 00:00:00 2001 From: IlP4rAd0xlI Date: Fri, 12 Sep 2025 09:38:12 +0200 Subject: [PATCH 11/77] feature/signup Update : first name field + last name field --- .../forms/signup/FirstNameField.tsx | 43 +++++++++++++++++++ .../components/forms/signup/LastNameField.tsx | 43 +++++++++++++++++++ .../components/forms/signup/PseudoField.tsx | 31 ++++++++----- .../components/forms/signup/SignupForm.tsx | 6 +++ 4 files changed, 113 insertions(+), 10 deletions(-) create mode 100644 React/src/components/forms/signup/FirstNameField.tsx create mode 100644 React/src/components/forms/signup/LastNameField.tsx diff --git a/React/src/components/forms/signup/FirstNameField.tsx b/React/src/components/forms/signup/FirstNameField.tsx new file mode 100644 index 0000000..1e397ab --- /dev/null +++ b/React/src/components/forms/signup/FirstNameField.tsx @@ -0,0 +1,43 @@ +interface FirstNameFieldProps { + value: string; + onChange: (value: string) => void; +} + +export default function FirstNameField({ value, onChange }: FirstNameFieldProps) +{ + // const [error, setError] = useState(''); + const handleBlur = () => + { + if (value.trim() == null || value.trim() == "") { + console.log("First name is required") + } + if (value.trim().length == 50) { + console.log("You cannot input more chars (max name length = 50)") + } + if (!/^[a-zA-Z]+$/.test(value) && !(value.trim() == null || value.trim() == "")) { + console.log("First Name can only contain letters") + } + } + + const handleChange = (e: React.ChangeEvent) => + { + onChange(e.target.value); + console.clear(); + // setError(''); // Clear error when user types + }; + + return ( +
+ + + {/*{error &&

{error}

}*/} +
+ ); +} \ No newline at end of file diff --git a/React/src/components/forms/signup/LastNameField.tsx b/React/src/components/forms/signup/LastNameField.tsx new file mode 100644 index 0000000..17c6a0c --- /dev/null +++ b/React/src/components/forms/signup/LastNameField.tsx @@ -0,0 +1,43 @@ +interface LastNameFieldProps { + value: string; + onChange: (value: string) => void; +} + +export default function LastNameField({ value, onChange }: LastNameFieldProps) +{ + // const [error, setError] = useState(''); + const handleBlur = () => + { + if (value.trim() == null || value.trim() == "") { + console.log("Last name is required") + } + if (value.trim().length == 50) { + console.log("You cannot input more chars (max name length = 50)") + } + if (!/^[a-zA-Z]+$/.test(value) && !(value.trim() == null || value.trim() == "")) { + console.log("Last Name can only contain letters") + } + } + + const handleChange = (e: React.ChangeEvent) => + { + onChange(e.target.value); + console.clear(); + // setError(''); // Clear error when user types + }; + + return ( +
+ + + {/*{error &&

{error}

}*/} +
+ ); +} \ No newline at end of file diff --git a/React/src/components/forms/signup/PseudoField.tsx b/React/src/components/forms/signup/PseudoField.tsx index 89cb838..74b5133 100644 --- a/React/src/components/forms/signup/PseudoField.tsx +++ b/React/src/components/forms/signup/PseudoField.tsx @@ -1,5 +1,3 @@ -// import React, { useState } from 'react'; - const reservedWords = [ 'admin', 'root', @@ -26,24 +24,36 @@ export default function PseudoField({ value, onChange }: PseudoFieldProps) // const [error, setError] = useState(''); const handleBlur = () => { - if (value.trim().length > 0 && value.trim().length < 3 || value.trim().length > 20) { - // setError('Username must habe between 3 and 20 characters'); - console.log('Username must habe between 3 and 20 characters') + if (value.trim() == null || value.trim() == "") { + console.log("Username is required") + } + if (value.trim().length > 0 && value.trim().length < 3 || value.trim().length > 19) { + if (value.trim().length == 20) { + console.log("You can't input more char for you username (20 is the max)") + } else { + // setError('Username must habe between 3 and 20 characters'); + console.log('Username must habe between 3 and 20 characters') + } } if (reservedWords.includes(value.trim().toLowerCase())) { // setError("Username can not be reserved words (like admin, root,...)"); console.log("Username can not be reserved words (like admin, root,...)") } - if (/\s/.test(value)) { - // setError("Username can not contains spaces"); - console.log("Username can not contains spaces") - } if (!/[a-zA-Z]/.test(value)) { console.log("Username must contain at least one letter") } if (specialCharsRegex.test(value)) { - console.log("Username can only contain letters, numbers, underscores (_), and hyphens (-)"); + if (/\s/.test(value)) { + // setError("Username can not contains spaces"); + console.log("Username cannot contain spaces") + } else { + console.log("Username cannot contains others special char then - and _"); + } } + if (/[-_]{2,}/.test(value.trim())) { + console.log("Username cannot contain successive hyphens or underscores"); + } + } const handleChange = (e: React.ChangeEvent) => @@ -62,6 +72,7 @@ export default function PseudoField({ value, onChange }: PseudoFieldProps) onChange={handleChange} onBlur={handleBlur} className={"border-2"} + maxLength={20} /> {/*{error &&

{error}

}*/} diff --git a/React/src/components/forms/signup/SignupForm.tsx b/React/src/components/forms/signup/SignupForm.tsx index ad36b9f..b0dc7e8 100644 --- a/React/src/components/forms/signup/SignupForm.tsx +++ b/React/src/components/forms/signup/SignupForm.tsx @@ -1,12 +1,18 @@ import { useState } from 'react'; import PseudoField from "./PseudoField.tsx"; +import FirstNameField from "./FirstNameField.tsx"; +import LastNameField from "./LastNameField.tsx"; export default function SignupForm() { const [pseudo, setPseudo] = useState(''); + const [firstName, setFirstName] = useState(''); + const [lastName, setLastName] = useState(''); return ( <>

SignupForm

+ + ); } \ No newline at end of file From 04c766fe9c85ddb47a10b816ed61c8be9ea6a13a Mon Sep 17 00:00:00 2001 From: Mattis Date: Fri, 12 Sep 2025 10:11:14 +0200 Subject: [PATCH 12/77] uow user and lkp + repo --- .../UnitOfWork/ISameApiUnitOfWork.cs | 4 +- .../UnitOfWork/SameApiUnitOfWork.cs | 8 +- SameApi/SameApi.Model/LKP/LKP_GenderDao.cs | 13 +++ SameApi/SameApi.Model/LKP/LKP_Profession.cs | 13 +++ SameApi/SameApi.Model/LKP/LKP_School.cs | 19 ++++ SameApi/SameApi.Model/SameApi.Model.csproj | 4 + SameApi/SameApi.Model/UserDao.cs | 26 +++++ .../net9.0/SameApi.Model.AssemblyInfo.cs | 2 +- .../SameApi.Model.AssemblyInfoInputs.cache | 2 +- ....GeneratedMSBuildEditorConfig.editorconfig | 2 +- .../Debug/net9.0/SameApi.Model.assets.cache | Bin 7712 -> 7960 bytes ...meApi.Model.csproj.AssemblyReference.cache | Bin 6615 -> 6757 bytes .../SameApi.Model.csproj.nuget.dgspec.json | 93 ++++++++++++++++-- .../obj/SameApi.Model.csproj.nuget.g.props | 4 +- SameApi/SameApi.Model/obj/project.assets.json | 40 ++++++-- SameApi/SameApi.Model/obj/project.nuget.cache | 26 ++--- 16 files changed, 218 insertions(+), 38 deletions(-) create mode 100644 SameApi/SameApi.Model/LKP/LKP_GenderDao.cs create mode 100644 SameApi/SameApi.Model/LKP/LKP_Profession.cs create mode 100644 SameApi/SameApi.Model/LKP/LKP_School.cs create mode 100644 SameApi/SameApi.Model/UserDao.cs diff --git a/SameApi/SameApi.Db/UnitOfWork/ISameApiUnitOfWork.cs b/SameApi/SameApi.Db/UnitOfWork/ISameApiUnitOfWork.cs index 5fae8f4..3e1d171 100644 --- a/SameApi/SameApi.Db/UnitOfWork/ISameApiUnitOfWork.cs +++ b/SameApi/SameApi.Db/UnitOfWork/ISameApiUnitOfWork.cs @@ -1,11 +1,13 @@ using SameApi.Db.DbContexts; +using SameApi.Db.Repository; namespace SameApi.Db.UnitOfWork { public interface ISameApiUnitOfWork { ISameApitDbContext Context { get; } - //repository + IUserRepository UserRepository { get; } Task SaveChangesAsync(); + } } \ No newline at end of file diff --git a/SameApi/SameApi.Db/UnitOfWork/SameApiUnitOfWork.cs b/SameApi/SameApi.Db/UnitOfWork/SameApiUnitOfWork.cs index f065c3c..34a4d92 100644 --- a/SameApi/SameApi.Db/UnitOfWork/SameApiUnitOfWork.cs +++ b/SameApi/SameApi.Db/UnitOfWork/SameApiUnitOfWork.cs @@ -1,16 +1,18 @@ using SameApi.Db.DbContexts; +using SameApi.Db.Repository; +using SameApi.Db.Repository.Implementation; namespace SameApi.Db.UnitOfWork { public class SameApiUnitOfWork : ISameApiUnitOfWork { public ISameApitDbContext Context { get; } - //public IRepository repository { get; } + public IUserRepository UserRepository { get; } - public SameApiUnitOfWork(ISameApitDbContext context/* IRepository repository*/) + public SameApiUnitOfWork(ISameApitDbContext context , IUserRepository repository) { this.Context = context; - //this.repository = personRepository; + this.UserRepository = repository; } public async Task SaveChangesAsync() diff --git a/SameApi/SameApi.Model/LKP/LKP_GenderDao.cs b/SameApi/SameApi.Model/LKP/LKP_GenderDao.cs new file mode 100644 index 0000000..6b47f22 --- /dev/null +++ b/SameApi/SameApi.Model/LKP/LKP_GenderDao.cs @@ -0,0 +1,13 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace SameApi.Model.LKP +{ + [Table("LKP_SameApi_Gender")] + public class LKP_GenderDao + { + [Key] + public int Id { get; set; } + public string Name { get; set; } + } +} diff --git a/SameApi/SameApi.Model/LKP/LKP_Profession.cs b/SameApi/SameApi.Model/LKP/LKP_Profession.cs new file mode 100644 index 0000000..7b9b7c4 --- /dev/null +++ b/SameApi/SameApi.Model/LKP/LKP_Profession.cs @@ -0,0 +1,13 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace SameApi.Model.LKP +{ + [Table("LKP_SameApi_Gender")] + public class LKP_Profession + { + [Key] + public int Id { get; set; } + public required string Name { get; set; } + } +} diff --git a/SameApi/SameApi.Model/LKP/LKP_School.cs b/SameApi/SameApi.Model/LKP/LKP_School.cs new file mode 100644 index 0000000..865a8f6 --- /dev/null +++ b/SameApi/SameApi.Model/LKP/LKP_School.cs @@ -0,0 +1,19 @@ +using SameApi.Data.Model; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace SameApi.Model.LKP +{ + [Table("LKP_SameApi_Gender")] + public class LKP_School : IModelDao + { + [Key] + public int Id { get; set; } + public required string Name { get; set; } + + [ForeignKey("Same_Api_School_Profession")] + public int IdProfession { get; set; } + public LKP_Profession? Profession { get; set; } + + } +} diff --git a/SameApi/SameApi.Model/SameApi.Model.csproj b/SameApi/SameApi.Model/SameApi.Model.csproj index face20a..38fe818 100644 --- a/SameApi/SameApi.Model/SameApi.Model.csproj +++ b/SameApi/SameApi.Model/SameApi.Model.csproj @@ -10,4 +10,8 @@ + + + + diff --git a/SameApi/SameApi.Model/UserDao.cs b/SameApi/SameApi.Model/UserDao.cs new file mode 100644 index 0000000..b970009 --- /dev/null +++ b/SameApi/SameApi.Model/UserDao.cs @@ -0,0 +1,26 @@ +using SameApi.Data.Model; +using SameApi.Model.LKP; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace SameApi.Model +{ + [Table("SameApi_User")] + public class UserDao : IModelDao + { + [Key] + public int Id { get; set; } + public bool IsAdmin { get; set; } + public int Age { get ; set; } + public required string Pseudo { get; set; } + public required string Email { get; set; } + public required string Password { get; set; } + public int NumberFollowers { get; set; } + public DateTime CreateAt { get; set; } + + + [ForeignKey("Same_Api_User_Gender")] + public int GenderId { get; set; } + public LKP_GenderDao? GenderDao { get; set; } + } +} \ No newline at end of file diff --git a/SameApi/SameApi.Model/obj/Debug/net9.0/SameApi.Model.AssemblyInfo.cs b/SameApi/SameApi.Model/obj/Debug/net9.0/SameApi.Model.AssemblyInfo.cs index 13fe6af..0cac3d8 100644 --- a/SameApi/SameApi.Model/obj/Debug/net9.0/SameApi.Model.AssemblyInfo.cs +++ b/SameApi/SameApi.Model/obj/Debug/net9.0/SameApi.Model.AssemblyInfo.cs @@ -14,7 +14,7 @@ [assembly: System.Reflection.AssemblyCompanyAttribute("SameApi.Model")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+a64b4febef28275ab85e1ae40dc85ca20fbbfb22")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+4bae564f642c7550a68c6f28b12fbcf029e72aec")] [assembly: System.Reflection.AssemblyProductAttribute("SameApi.Model")] [assembly: System.Reflection.AssemblyTitleAttribute("SameApi.Model")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/SameApi/SameApi.Model/obj/Debug/net9.0/SameApi.Model.AssemblyInfoInputs.cache b/SameApi/SameApi.Model/obj/Debug/net9.0/SameApi.Model.AssemblyInfoInputs.cache index 0ba4aa8..4294219 100644 --- a/SameApi/SameApi.Model/obj/Debug/net9.0/SameApi.Model.AssemblyInfoInputs.cache +++ b/SameApi/SameApi.Model/obj/Debug/net9.0/SameApi.Model.AssemblyInfoInputs.cache @@ -1 +1 @@ -346854b9fe904ebf3b3a7c64542bd47a651a20ee5df08ca66fa09b1bf5efdaad +280a847c2623346eac62b478448a228706e8931c4637240aa2097f5184b0df9d diff --git a/SameApi/SameApi.Model/obj/Debug/net9.0/SameApi.Model.GeneratedMSBuildEditorConfig.editorconfig b/SameApi/SameApi.Model/obj/Debug/net9.0/SameApi.Model.GeneratedMSBuildEditorConfig.editorconfig index 417ebd1..18f16d5 100644 --- a/SameApi/SameApi.Model/obj/Debug/net9.0/SameApi.Model.GeneratedMSBuildEditorConfig.editorconfig +++ b/SameApi/SameApi.Model/obj/Debug/net9.0/SameApi.Model.GeneratedMSBuildEditorConfig.editorconfig @@ -8,7 +8,7 @@ build_property.PlatformNeutralAssembly = build_property.EnforceExtendedAnalyzerRules = build_property._SupportedPlatformList = Linux,macOS,Windows build_property.RootNamespace = SameApi.Model -build_property.ProjectDir = C:\Users\lefra\Documents\GitHub\Same\SameApi\SameApi.Model\ +build_property.ProjectDir = C:\Users\Mattis.lfrnc\Documents\GitHub\Same\SameApi\SameApi.Model\ build_property.EnableComHosting = build_property.EnableGeneratedComInterfaceComImportInterop = build_property.EffectiveAnalysisLevelStyle = 9.0 diff --git a/SameApi/SameApi.Model/obj/Debug/net9.0/SameApi.Model.assets.cache b/SameApi/SameApi.Model/obj/Debug/net9.0/SameApi.Model.assets.cache index 2901babab614e70177fd463083ca281abe288ca0..b882473bc2000b25369f7d68cc8614345046b918 100644 GIT binary patch literal 7960 zcmdT}&2Q936klLNNK5z%(3a1IG=z`fL{ZvqkczZQNVMW>)lj(j;@FeTfIVK>vmwi& zhn{+0%)eV-OWRKpw`MsGp@5`0DtEI!a zT<-XjV^as;-yRpw|9(CB=G`wpE=<2I{WtcZ^zq-{if4|N{`oqWI{-P;Qxv$w9o-lPy)T>PDHN$*nRGF_k-1J=E-H;j+lFP=1XE^M+>pe4Fk7S+>0&fZ?+b2;ULtoBn}rOD25o3ed@| zR=KEZ#=0*(!<0DK4JxQju5o)n)?E1YXBw@?5@q%bvXZ`HkWYzaO!x<_#6ZZPkj{L4*~tz|3<3J zwDb5=11yobxPc+su^3w1z(4v&8(EiWn44W}H2@2DjP7PMbt#zI4eOUNtmr6y9RyZ~ zIj+~(dFF{I?>8sWy&R9>I|ARoXTfK&8WR>1W`m2Tta3UboGo zULKv)sf?Sq)7dAX3q3p8JnG01&}pC-8BVk2afeI31+l*s(~~e&+7swS`3hiAXAWtH z@hzGsSn)2{dA(CA?y`*Z?(m~$ZSHNqR&w92C*_he7*mS;o0t4cn_Ek)+<(lU1_ zdQLeruwfLf)=p*Q$gLI^7#%WPRIV3U0P6>jD78>q1Kp6JV0AXM~3v>?X zJkSN8i$Db+w4^KPj2bv|tH4_E+$v<6g%xfyzc4jl+%A4UHNO}I(86Qx*A2U{ChHb= z^|ejIW0wA)zRF}J$bM1Quo9zfr=1Sd#AuHtLWA?F9~u|Jg834RUj~{4`W9#k=nBvtiyK4>8aGf247e&SreQqOr5SWwAv(~wf;wP< ztG z#X74U85}-6L zB2X;&RX{ZuA6DEXaB18`xY!6#!JUP1`pm({5n7Fvt+ZwR1fBL6{!T#ed!$)&rZ0zk zmcqRo7ULB|Zk9z*M9x6}WVY1`pC#3EXH|^dlRo+!i>c+(?g%cT-UL<0qZq6Kdq=VN zZj;~=wEpkpZna6~(+ZFJ#i_e0KP1UkbYc+q?m98cyIC!MDr$oZob8RI6^K(#JhYHE zjv#Rn(tS*71Zhctqn;7&d;S6ZRU8ej>O|QuJ2jh|T-uFgw!sCnMpg{lXNP`bzH4tW zEC0x=vwZWOrRxeg?Vpf}-o)D z2L7E}tFPngmlAKZ)|(@K1~&)9 PLppK92-RL@r)7NtBx4ua delta 1044 zcmbPXx4_0Bz}wxChk=1%-DYF^!=7`mTvph5U()PW@ae)MoTu1>YnIQnoiLqCujYX` z0|PTqT@RzPRZM7cYEf}aPHI|F;^c?CGL!qcg(jA!2+Y8gQ=9ybUwZOQM&rrDkJsc_cJ9fA%pwBq=!y;s>rK`c_MV); z&M{e*MTEZ^&4z=*xs$iD$OyEeYkbICGC77-USK|^gyrNte4&#S*yQPkLMIwWAUI8aDQJ!_AiO587c$3m2_!J;u_T*?*gRe``K^dK?j*Bbho1J8@ GF#-U^Zg&a* diff --git a/SameApi/SameApi.Model/obj/Debug/net9.0/SameApi.Model.csproj.AssemblyReference.cache b/SameApi/SameApi.Model/obj/Debug/net9.0/SameApi.Model.csproj.AssemblyReference.cache index 41d3c95ec3d644fce59ab4e7287724a35d154f12..eb01b24775810f1b20bda946bb8d9eb033823148 100644 GIT binary patch delta 764 zcmca^{M1C2jggCifq}8i*(xTqIJKxa#y7E~B(qpAC#@(id9op^%;XtNLK9s&t^ua3iQB)Q(>unZfjAj&{z=+SNgYq*N@fx(bka+{6cppwfZplx>Z@}b- zqH3Ex+1eS!n{XPUH<_1XmV6fx20i5{WfbqhX^`6F30xcHrw}#>s7`qEBt+-y!4>9ell299@r1isEz7<{GgqM*dNuGet $(MSBuildThisFileDirectory)project.assets.json $(UserProfile)\.nuget\packages\ - C:\Users\lefra\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages + C:\Users\Mattis.lfrnc\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages PackageReference 6.14.1 - + diff --git a/SameApi/SameApi.Model/obj/project.assets.json b/SameApi/SameApi.Model/obj/project.assets.json index 20577ef..862cabc 100644 --- a/SameApi/SameApi.Model/obj/project.assets.json +++ b/SameApi/SameApi.Model/obj/project.assets.json @@ -192,6 +192,19 @@ "build": { "buildTransitive/net8.0/_._": {} } + }, + "SameApi.Data/1.0.0": { + "type": "project", + "framework": ".NETCoreApp,Version=v9.0", + "dependencies": { + "Microsoft.EntityFrameworkCore": "9.0.8" + }, + "compile": { + "bin/placeholder/SameApi.Data.dll": {} + }, + "runtime": { + "bin/placeholder/SameApi.Data.dll": {} + } } } }, @@ -530,31 +543,37 @@ "microsoft.extensions.primitives.nuspec", "useSharedDesignerContext.txt" ] + }, + "SameApi.Data/1.0.0": { + "type": "project", + "path": "../SameApi.Data/SameApi.Data.csproj", + "msbuildProject": "../SameApi.Data/SameApi.Data.csproj" } }, "projectFileDependencyGroups": { "net9.0": [ - "Microsoft.EntityFrameworkCore >= 9.0.8" + "Microsoft.EntityFrameworkCore >= 9.0.8", + "SameApi.Data >= 1.0.0" ] }, "packageFolders": { - "C:\\Users\\lefra\\.nuget\\packages\\": {}, + "C:\\Users\\Mattis.lfrnc\\.nuget\\packages\\": {}, "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages": {} }, "project": { "version": "1.0.0", "restore": { - "projectUniqueName": "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi.Model\\SameApi.Model.csproj", + "projectUniqueName": "C:\\Users\\Mattis.lfrnc\\Documents\\GitHub\\Same\\SameApi\\SameApi.Model\\SameApi.Model.csproj", "projectName": "SameApi.Model", - "projectPath": "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi.Model\\SameApi.Model.csproj", - "packagesPath": "C:\\Users\\lefra\\.nuget\\packages\\", - "outputPath": "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi.Model\\obj\\", + "projectPath": "C:\\Users\\Mattis.lfrnc\\Documents\\GitHub\\Same\\SameApi\\SameApi.Model\\SameApi.Model.csproj", + "packagesPath": "C:\\Users\\Mattis.lfrnc\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Mattis.lfrnc\\Documents\\GitHub\\Same\\SameApi\\SameApi.Model\\obj\\", "projectStyle": "PackageReference", "fallbackFolders": [ "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" ], "configFilePaths": [ - "C:\\Users\\lefra\\AppData\\Roaming\\NuGet\\NuGet.Config", + "C:\\Users\\Mattis.lfrnc\\AppData\\Roaming\\NuGet\\NuGet.Config", "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" ], @@ -563,12 +582,17 @@ ], "sources": { "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, + "C:\\Program Files\\dotnet\\library-packs": {}, "https://api.nuget.org/v3/index.json": {} }, "frameworks": { "net9.0": { "targetAlias": "net9.0", - "projectReferences": {} + "projectReferences": { + "C:\\Users\\Mattis.lfrnc\\Documents\\GitHub\\Same\\SameApi\\SameApi.Data\\SameApi.Data.csproj": { + "projectPath": "C:\\Users\\Mattis.lfrnc\\Documents\\GitHub\\Same\\SameApi\\SameApi.Data\\SameApi.Data.csproj" + } + } } }, "warningProperties": { diff --git a/SameApi/SameApi.Model/obj/project.nuget.cache b/SameApi/SameApi.Model/obj/project.nuget.cache index d03a97a..747fc5c 100644 --- a/SameApi/SameApi.Model/obj/project.nuget.cache +++ b/SameApi/SameApi.Model/obj/project.nuget.cache @@ -1,20 +1,20 @@ { "version": 2, - "dgSpecHash": "V2geESGeWJk=", + "dgSpecHash": "GS0lUNtbifU=", "success": true, - "projectFilePath": "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi.Model\\SameApi.Model.csproj", + "projectFilePath": "C:\\Users\\Mattis.lfrnc\\Documents\\GitHub\\Same\\SameApi\\SameApi.Model\\SameApi.Model.csproj", "expectedPackageFiles": [ - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.entityframeworkcore\\9.0.8\\microsoft.entityframeworkcore.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.entityframeworkcore.abstractions\\9.0.8\\microsoft.entityframeworkcore.abstractions.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.entityframeworkcore.analyzers\\9.0.8\\microsoft.entityframeworkcore.analyzers.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.extensions.caching.abstractions\\9.0.8\\microsoft.extensions.caching.abstractions.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.extensions.caching.memory\\9.0.8\\microsoft.extensions.caching.memory.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.extensions.dependencyinjection\\9.0.8\\microsoft.extensions.dependencyinjection.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.extensions.dependencyinjection.abstractions\\9.0.8\\microsoft.extensions.dependencyinjection.abstractions.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.extensions.logging\\9.0.8\\microsoft.extensions.logging.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.extensions.logging.abstractions\\9.0.8\\microsoft.extensions.logging.abstractions.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.extensions.options\\9.0.8\\microsoft.extensions.options.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.extensions.primitives\\9.0.8\\microsoft.extensions.primitives.9.0.8.nupkg.sha512" + "C:\\Users\\Mattis.lfrnc\\.nuget\\packages\\microsoft.entityframeworkcore\\9.0.8\\microsoft.entityframeworkcore.9.0.8.nupkg.sha512", + "C:\\Users\\Mattis.lfrnc\\.nuget\\packages\\microsoft.entityframeworkcore.abstractions\\9.0.8\\microsoft.entityframeworkcore.abstractions.9.0.8.nupkg.sha512", + "C:\\Users\\Mattis.lfrnc\\.nuget\\packages\\microsoft.entityframeworkcore.analyzers\\9.0.8\\microsoft.entityframeworkcore.analyzers.9.0.8.nupkg.sha512", + "C:\\Users\\Mattis.lfrnc\\.nuget\\packages\\microsoft.extensions.caching.abstractions\\9.0.8\\microsoft.extensions.caching.abstractions.9.0.8.nupkg.sha512", + "C:\\Users\\Mattis.lfrnc\\.nuget\\packages\\microsoft.extensions.caching.memory\\9.0.8\\microsoft.extensions.caching.memory.9.0.8.nupkg.sha512", + "C:\\Users\\Mattis.lfrnc\\.nuget\\packages\\microsoft.extensions.dependencyinjection\\9.0.8\\microsoft.extensions.dependencyinjection.9.0.8.nupkg.sha512", + "C:\\Users\\Mattis.lfrnc\\.nuget\\packages\\microsoft.extensions.dependencyinjection.abstractions\\9.0.8\\microsoft.extensions.dependencyinjection.abstractions.9.0.8.nupkg.sha512", + "C:\\Users\\Mattis.lfrnc\\.nuget\\packages\\microsoft.extensions.logging\\9.0.8\\microsoft.extensions.logging.9.0.8.nupkg.sha512", + "C:\\Users\\Mattis.lfrnc\\.nuget\\packages\\microsoft.extensions.logging.abstractions\\9.0.8\\microsoft.extensions.logging.abstractions.9.0.8.nupkg.sha512", + "C:\\Users\\Mattis.lfrnc\\.nuget\\packages\\microsoft.extensions.options\\9.0.8\\microsoft.extensions.options.9.0.8.nupkg.sha512", + "C:\\Users\\Mattis.lfrnc\\.nuget\\packages\\microsoft.extensions.primitives\\9.0.8\\microsoft.extensions.primitives.9.0.8.nupkg.sha512" ], "logs": [] } \ No newline at end of file From aecd3e13bc4fcc456cdb98be56d1bf8f43f80a58 Mon Sep 17 00:00:00 2001 From: Mattis Date: Fri, 12 Sep 2025 10:25:34 +0200 Subject: [PATCH 13/77] clean project --- .../ProjectEvaluation/sameapi.metadata.v9.bin | Bin 1662 -> 0 bytes .../ProjectEvaluation/sameapi.projects.v9.bin | Bin 35389 -> 0 bytes .../ProjectEvaluation/sameapi.strings.v9.bin | Bin 169256 -> 0 bytes .../17.14.1091.29919/CodeChunks.db | Bin 90112 -> 0 bytes .../17.14.1091.29919/SemanticSymbols.db | Bin 69632 -> 0 bytes .../.vs/SameApi/DesignTimeBuild/.dtbcache.v2 | Bin 145671 -> 0 bytes ...0221c740-b371-45b2-84ed-5a6470870352.vsidx | Bin 15500 -> 0 bytes ...023a84c7-f9be-49f2-b552-85aa93b5e24f.vsidx | Bin 9236 -> 0 bytes ...43f74c00-2bbb-45dc-b52f-9a89f799c3ea.vsidx | Bin 8376 -> 0 bytes ...60e88bd5-9c7d-40fe-9c99-a11db0413425.vsidx | Bin 5119 -> 0 bytes ...77c7dcbb-1f0a-4272-97d3-cffa78e083d8.vsidx | Bin 5528 -> 0 bytes ...91f45323-41d5-4415-a951-addd646e1546.vsidx | Bin 7650 -> 0 bytes SameApi/.vs/SameApi/v17/.futdcache.v2 | Bin 130 -> 0 bytes SameApi/.vs/SameApi/v17/.suo | Bin 35840 -> 0 bytes .../SameApi/v17/DocumentLayout.backup.json | 12 - SameApi/.vs/SameApi/v17/DocumentLayout.json | 54 -- ...CoreApp,Version=v9.0.AssemblyAttributes.cs | 4 - .../net9.0/SameApi.Business.AssemblyInfo.cs | 23 - .../SameApi.Business.AssemblyInfoInputs.cache | 1 - ....GeneratedMSBuildEditorConfig.editorconfig | 15 - .../net9.0/SameApi.Business.GlobalUsings.g.cs | 8 - .../net9.0/SameApi.Business.assets.cache | Bin 7712 -> 0 bytes ...pi.Business.csproj.AssemblyReference.cache | Bin 6615 -> 0 bytes .../SameApi.Business.csproj.nuget.dgspec.json | 79 -- .../obj/SameApi.Business.csproj.nuget.g.props | 19 - .../SameApi.Business.csproj.nuget.g.targets | 7 - .../SameApi.Business/obj/project.assets.json | 615 ---------------- .../SameApi.Business/obj/project.nuget.cache | 20 - SameApi/SameApi.Db/SameApi.Db.csproj | 5 +- ...CoreApp,Version=v9.0.AssemblyAttributes.cs | 4 - .../Debug/net9.0/SameApi.Db.AssemblyInfo.cs | 23 - .../SameApi.Db.AssemblyInfoInputs.cache | 1 - ....GeneratedMSBuildEditorConfig.editorconfig | 15 - .../Debug/net9.0/SameApi.Db.GlobalUsings.g.cs | 8 - .../obj/Debug/net9.0/SameApi.Db.assets.cache | Bin 7712 -> 0 bytes .../SameApi.Db.csproj.AssemblyReference.cache | Bin 6615 -> 0 bytes .../obj/SameApi.Db.csproj.nuget.dgspec.json | 154 ---- .../obj/SameApi.Db.csproj.nuget.g.props | 19 - .../obj/SameApi.Db.csproj.nuget.g.targets | 7 - SameApi/SameApi.Db/obj/project.assets.json | 638 ---------------- SameApi/SameApi.Db/obj/project.nuget.cache | 20 - ...CoreApp,Version=v9.0.AssemblyAttributes.cs | 4 - .../Debug/net9.0/SameApi.Dto.AssemblyInfo.cs | 23 - .../SameApi.Dto.AssemblyInfoInputs.cache | 1 - ....GeneratedMSBuildEditorConfig.editorconfig | 15 - .../net9.0/SameApi.Dto.GlobalUsings.g.cs | 8 - .../obj/Debug/net9.0/SameApi.Dto.assets.cache | Bin 7712 -> 0 bytes ...SameApi.Dto.csproj.AssemblyReference.cache | Bin 6615 -> 0 bytes .../obj/SameApi.Dto.csproj.nuget.dgspec.json | 79 -- .../obj/SameApi.Dto.csproj.nuget.g.props | 19 - .../obj/SameApi.Dto.csproj.nuget.g.targets | 7 - SameApi/SameApi.Dto/obj/project.assets.json | 615 ---------------- SameApi/SameApi.Dto/obj/project.nuget.cache | 20 - ...CoreApp,Version=v9.0.AssemblyAttributes.cs | 4 - .../net9.0/SameApi.Model.AssemblyInfo.cs | 23 - .../SameApi.Model.AssemblyInfoInputs.cache | 1 - ....GeneratedMSBuildEditorConfig.editorconfig | 15 - .../net9.0/SameApi.Model.GlobalUsings.g.cs | 8 - .../Debug/net9.0/SameApi.Model.assets.cache | Bin 7960 -> 0 bytes ...meApi.Model.csproj.AssemblyReference.cache | Bin 6757 -> 0 bytes .../SameApi.Model.csproj.nuget.dgspec.json | 156 ---- .../obj/SameApi.Model.csproj.nuget.g.props | 19 - .../obj/SameApi.Model.csproj.nuget.g.targets | 7 - SameApi/SameApi.Model/obj/project.assets.json | 639 ---------------- SameApi/SameApi.Model/obj/project.nuget.cache | 20 - ...CoreApp,Version=v9.0.AssemblyAttributes.cs | 4 - .../Debug/net9.0/SameApi.App.AssemblyInfo.cs | 23 - .../SameApi.App.AssemblyInfoInputs.cache | 1 - ....GeneratedMSBuildEditorConfig.editorconfig | 21 - .../net9.0/SameApi.App.GlobalUsings.g.cs | 17 - .../obj/Debug/net9.0/SameApi.App.assets.cache | Bin 9073 -> 0 bytes ...SameApi.App.csproj.AssemblyReference.cache | Bin 2479 -> 0 bytes .../obj/Debug/net9.0/SameApi.AssemblyInfo.cs | 23 - .../net9.0/SameApi.AssemblyInfoInputs.cache | 1 - ....GeneratedMSBuildEditorConfig.editorconfig | 21 - .../Debug/net9.0/SameApi.GlobalUsings.g.cs | 17 - .../obj/Debug/net9.0/SameApi.assets.cache | Bin 1754 -> 0 bytes .../SameApi.csproj.AssemblyReference.cache | Bin 1173 -> 0 bytes .../obj/Debug/net9.0/rpswa.dswa.cache.json | 1 - .../Debug/net9.0/staticwebassets.removed.txt | 0 .../obj/SameApi.App.csproj.nuget.dgspec.json | 86 --- .../obj/SameApi.App.csproj.nuget.g.props | 19 - .../obj/SameApi.App.csproj.nuget.g.targets | 7 - .../obj/SameApi.csproj.nuget.dgspec.json | 82 --- .../SameApi/obj/SameApi.csproj.nuget.g.props | 16 - .../obj/SameApi.csproj.nuget.g.targets | 2 - SameApi/SameApi/obj/project.assets.json | 686 ------------------ SameApi/SameApi/obj/project.nuget.cache | 22 - 88 files changed, 1 insertion(+), 4482 deletions(-) delete mode 100644 SameApi/.vs/ProjectEvaluation/sameapi.metadata.v9.bin delete mode 100644 SameApi/.vs/ProjectEvaluation/sameapi.projects.v9.bin delete mode 100644 SameApi/.vs/ProjectEvaluation/sameapi.strings.v9.bin delete mode 100644 SameApi/.vs/SameApi/CopilotIndices/17.14.1091.29919/CodeChunks.db delete mode 100644 SameApi/.vs/SameApi/CopilotIndices/17.14.1091.29919/SemanticSymbols.db delete mode 100644 SameApi/.vs/SameApi/DesignTimeBuild/.dtbcache.v2 delete mode 100644 SameApi/.vs/SameApi/FileContentIndex/0221c740-b371-45b2-84ed-5a6470870352.vsidx delete mode 100644 SameApi/.vs/SameApi/FileContentIndex/023a84c7-f9be-49f2-b552-85aa93b5e24f.vsidx delete mode 100644 SameApi/.vs/SameApi/FileContentIndex/43f74c00-2bbb-45dc-b52f-9a89f799c3ea.vsidx delete mode 100644 SameApi/.vs/SameApi/FileContentIndex/60e88bd5-9c7d-40fe-9c99-a11db0413425.vsidx delete mode 100644 SameApi/.vs/SameApi/FileContentIndex/77c7dcbb-1f0a-4272-97d3-cffa78e083d8.vsidx delete mode 100644 SameApi/.vs/SameApi/FileContentIndex/91f45323-41d5-4415-a951-addd646e1546.vsidx delete mode 100644 SameApi/.vs/SameApi/v17/.futdcache.v2 delete mode 100644 SameApi/.vs/SameApi/v17/.suo delete mode 100644 SameApi/.vs/SameApi/v17/DocumentLayout.backup.json delete mode 100644 SameApi/.vs/SameApi/v17/DocumentLayout.json delete mode 100644 SameApi/SameApi.Business/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs delete mode 100644 SameApi/SameApi.Business/obj/Debug/net9.0/SameApi.Business.AssemblyInfo.cs delete mode 100644 SameApi/SameApi.Business/obj/Debug/net9.0/SameApi.Business.AssemblyInfoInputs.cache delete mode 100644 SameApi/SameApi.Business/obj/Debug/net9.0/SameApi.Business.GeneratedMSBuildEditorConfig.editorconfig delete mode 100644 SameApi/SameApi.Business/obj/Debug/net9.0/SameApi.Business.GlobalUsings.g.cs delete mode 100644 SameApi/SameApi.Business/obj/Debug/net9.0/SameApi.Business.assets.cache delete mode 100644 SameApi/SameApi.Business/obj/Debug/net9.0/SameApi.Business.csproj.AssemblyReference.cache delete mode 100644 SameApi/SameApi.Business/obj/SameApi.Business.csproj.nuget.dgspec.json delete mode 100644 SameApi/SameApi.Business/obj/SameApi.Business.csproj.nuget.g.props delete mode 100644 SameApi/SameApi.Business/obj/SameApi.Business.csproj.nuget.g.targets delete mode 100644 SameApi/SameApi.Business/obj/project.assets.json delete mode 100644 SameApi/SameApi.Business/obj/project.nuget.cache delete mode 100644 SameApi/SameApi.Db/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs delete mode 100644 SameApi/SameApi.Db/obj/Debug/net9.0/SameApi.Db.AssemblyInfo.cs delete mode 100644 SameApi/SameApi.Db/obj/Debug/net9.0/SameApi.Db.AssemblyInfoInputs.cache delete mode 100644 SameApi/SameApi.Db/obj/Debug/net9.0/SameApi.Db.GeneratedMSBuildEditorConfig.editorconfig delete mode 100644 SameApi/SameApi.Db/obj/Debug/net9.0/SameApi.Db.GlobalUsings.g.cs delete mode 100644 SameApi/SameApi.Db/obj/Debug/net9.0/SameApi.Db.assets.cache delete mode 100644 SameApi/SameApi.Db/obj/Debug/net9.0/SameApi.Db.csproj.AssemblyReference.cache delete mode 100644 SameApi/SameApi.Db/obj/SameApi.Db.csproj.nuget.dgspec.json delete mode 100644 SameApi/SameApi.Db/obj/SameApi.Db.csproj.nuget.g.props delete mode 100644 SameApi/SameApi.Db/obj/SameApi.Db.csproj.nuget.g.targets delete mode 100644 SameApi/SameApi.Db/obj/project.assets.json delete mode 100644 SameApi/SameApi.Db/obj/project.nuget.cache delete mode 100644 SameApi/SameApi.Dto/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs delete mode 100644 SameApi/SameApi.Dto/obj/Debug/net9.0/SameApi.Dto.AssemblyInfo.cs delete mode 100644 SameApi/SameApi.Dto/obj/Debug/net9.0/SameApi.Dto.AssemblyInfoInputs.cache delete mode 100644 SameApi/SameApi.Dto/obj/Debug/net9.0/SameApi.Dto.GeneratedMSBuildEditorConfig.editorconfig delete mode 100644 SameApi/SameApi.Dto/obj/Debug/net9.0/SameApi.Dto.GlobalUsings.g.cs delete mode 100644 SameApi/SameApi.Dto/obj/Debug/net9.0/SameApi.Dto.assets.cache delete mode 100644 SameApi/SameApi.Dto/obj/Debug/net9.0/SameApi.Dto.csproj.AssemblyReference.cache delete mode 100644 SameApi/SameApi.Dto/obj/SameApi.Dto.csproj.nuget.dgspec.json delete mode 100644 SameApi/SameApi.Dto/obj/SameApi.Dto.csproj.nuget.g.props delete mode 100644 SameApi/SameApi.Dto/obj/SameApi.Dto.csproj.nuget.g.targets delete mode 100644 SameApi/SameApi.Dto/obj/project.assets.json delete mode 100644 SameApi/SameApi.Dto/obj/project.nuget.cache delete mode 100644 SameApi/SameApi.Model/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs delete mode 100644 SameApi/SameApi.Model/obj/Debug/net9.0/SameApi.Model.AssemblyInfo.cs delete mode 100644 SameApi/SameApi.Model/obj/Debug/net9.0/SameApi.Model.AssemblyInfoInputs.cache delete mode 100644 SameApi/SameApi.Model/obj/Debug/net9.0/SameApi.Model.GeneratedMSBuildEditorConfig.editorconfig delete mode 100644 SameApi/SameApi.Model/obj/Debug/net9.0/SameApi.Model.GlobalUsings.g.cs delete mode 100644 SameApi/SameApi.Model/obj/Debug/net9.0/SameApi.Model.assets.cache delete mode 100644 SameApi/SameApi.Model/obj/Debug/net9.0/SameApi.Model.csproj.AssemblyReference.cache delete mode 100644 SameApi/SameApi.Model/obj/SameApi.Model.csproj.nuget.dgspec.json delete mode 100644 SameApi/SameApi.Model/obj/SameApi.Model.csproj.nuget.g.props delete mode 100644 SameApi/SameApi.Model/obj/SameApi.Model.csproj.nuget.g.targets delete mode 100644 SameApi/SameApi.Model/obj/project.assets.json delete mode 100644 SameApi/SameApi.Model/obj/project.nuget.cache delete mode 100644 SameApi/SameApi/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs delete mode 100644 SameApi/SameApi/obj/Debug/net9.0/SameApi.App.AssemblyInfo.cs delete mode 100644 SameApi/SameApi/obj/Debug/net9.0/SameApi.App.AssemblyInfoInputs.cache delete mode 100644 SameApi/SameApi/obj/Debug/net9.0/SameApi.App.GeneratedMSBuildEditorConfig.editorconfig delete mode 100644 SameApi/SameApi/obj/Debug/net9.0/SameApi.App.GlobalUsings.g.cs delete mode 100644 SameApi/SameApi/obj/Debug/net9.0/SameApi.App.assets.cache delete mode 100644 SameApi/SameApi/obj/Debug/net9.0/SameApi.App.csproj.AssemblyReference.cache delete mode 100644 SameApi/SameApi/obj/Debug/net9.0/SameApi.AssemblyInfo.cs delete mode 100644 SameApi/SameApi/obj/Debug/net9.0/SameApi.AssemblyInfoInputs.cache delete mode 100644 SameApi/SameApi/obj/Debug/net9.0/SameApi.GeneratedMSBuildEditorConfig.editorconfig delete mode 100644 SameApi/SameApi/obj/Debug/net9.0/SameApi.GlobalUsings.g.cs delete mode 100644 SameApi/SameApi/obj/Debug/net9.0/SameApi.assets.cache delete mode 100644 SameApi/SameApi/obj/Debug/net9.0/SameApi.csproj.AssemblyReference.cache delete mode 100644 SameApi/SameApi/obj/Debug/net9.0/rpswa.dswa.cache.json delete mode 100644 SameApi/SameApi/obj/Debug/net9.0/staticwebassets.removed.txt delete mode 100644 SameApi/SameApi/obj/SameApi.App.csproj.nuget.dgspec.json delete mode 100644 SameApi/SameApi/obj/SameApi.App.csproj.nuget.g.props delete mode 100644 SameApi/SameApi/obj/SameApi.App.csproj.nuget.g.targets delete mode 100644 SameApi/SameApi/obj/SameApi.csproj.nuget.dgspec.json delete mode 100644 SameApi/SameApi/obj/SameApi.csproj.nuget.g.props delete mode 100644 SameApi/SameApi/obj/SameApi.csproj.nuget.g.targets delete mode 100644 SameApi/SameApi/obj/project.assets.json delete mode 100644 SameApi/SameApi/obj/project.nuget.cache diff --git a/SameApi/.vs/ProjectEvaluation/sameapi.metadata.v9.bin b/SameApi/.vs/ProjectEvaluation/sameapi.metadata.v9.bin deleted file mode 100644 index 74387aa3ab4ab977fe2d0e034534e689a97c2135..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1662 zcmYjR3ry8j7(ai0Ub*4D&Ydbs7YzHB+Y5lfGd!ISG*$Jc;?(MRfBX(6v^|Q1Pei zpJ=a}=owxYP?np)>>OtV>1>H#RnA=wop^LNq3VF;@Dp`Uh8jBqgv56{drZs zxQM{qRK3$fmbVGLgg%aqd;F?1@;-_b=2-ZKuTs_b5AAmYBL$U*)w-Y71B5AH;xt~$ zIjh4B(VY!avLGIKvh^L+*pJAf8Rc;=s4mJOavCPQ;zG#p^!^U5?{dsqQ*&7b7aUV6 z<}@kJEPUEfqU+8Bdwl-1IiqyJkAgitv}5^cy2J{wiu|35o`TOOYa@PQwlT;Bn_ZRr zL;<-~fvvu@DkDtvez4-29#&4akAc-+spwrwbiSd}joSf};u>PsWu8(guA^?MKBSmw z+zx@gw!UrCc?y;dRvqth-=S=cX6Ukvc9wB_$kh9YG3Z9HK@Ys};)|je)vSscrn19e z>Cp``Hs_*|ikxBx-_=LAmK~ElSoq+77(A z)p>?Xz&;D7sirP6^&T~G`>>((WBri`BWZY>rVC7ef5w{CdPv1FbNC0%fqtX6yG_s8 zez2^(&&NeZ<6+b4g(h(iN(!B9nI=U)4xMp6Ec1-pTthjm>~lKBEprz?VA=5jJ+$p; z$#q`&0QT&4uKVCvcjSo}Cch=r5^4z5gyS*H67;v2^W!9E<}V(Ie0A}*cXB8~qU3H% zmRhpRk_Rl8IFEycZM~5VF^m}-_w_5v#>_<=8hu(TJ1q1c`AS(#l9JwP5@r3DWIV|c zlA{D>GwG$ZMKX#2!af(138WiG+(np3+$M}C9!D~oq?>RLA%-x4kVtw?(zcl`J+?ey o$yj?-#t|kGyo7i{f-MtmnM5p^kYdYJTi#1-5@8@(4n|x50U+EA(*OVf diff --git a/SameApi/.vs/ProjectEvaluation/sameapi.projects.v9.bin b/SameApi/.vs/ProjectEvaluation/sameapi.projects.v9.bin deleted file mode 100644 index d148c33df81092495682793da93ce389b3415fa4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35389 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%0D~s>R;yNmtSkE2akGT^}e88_*Ch$)fXeZ-; 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%0A(rr+ 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%0D*=(H1B2B`P(3Xg#i(}rm`;SrV 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 diff --git a/SameApi/.vs/SameApi/CopilotIndices/17.14.1091.29919/CodeChunks.db b/SameApi/.vs/SameApi/CopilotIndices/17.14.1091.29919/CodeChunks.db deleted file mode 100644 index 374ddde4857a1ad1bb014872d7252c7ff0c09c4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90112 zcmeHw37j28wf^nf-BrE!OhPhQnPEaq0$J|9Bm|h11d)L_)*`Ps_N6# z=Tv?7p1R$A7Mw6=O;1H+Y-B-v70Cg*(+-=zPXL)B2v3u--4*<#*5}{uf&y zwm@uw*aEQy{;?J~u2$5IAFnOz>0Gg{Ys;o}_!L~erKhte-CrKwa$;N4!nTHmP0e%K z8v3_P>{+pH@|soKCetyKA}^G6b#+>FHmh5>VQp787d5*mn80-t8YcQq1O82zy=p?k z?0E~@j%howVcziz8|IxfXHLWX6KBtDI&n$EacxT)noe4H{OozqF}H2r!pS?1Qrf$= z^-O43*tQr)^&WZByxAw5)aE;rCe?_#nRQxXP4}vDjmG-2 zZrnJnqVdRQ(-B>(+Sjb>>L&)fUPZr_{k;}C(frPy)o*$!`9Rdo9`|OK(r+Zo)BXMk zqZ&`v&CY63dJSFC?8VDlR&VWI%h%k#xogwbuI`oRsJhv!_R{3IKTH6-GQEz$t zgofkiHB8ux7Fb7B!_ku}^ITb%&1x64u%-9XeJ@qsu9n|RkDVUi#=T9cT_(=o?9gYP zJ?G{QMeWC**f#r^c{D>O?l|eBh7;S`+fHno*V4A2f$QdWZrr%0`;3XRS4|@Gw6@J@ z!$N9lTF}ze+O`)(>>BFaPZ8JcT?1zMCP&tl$7@mTE-v12-sL=nm1}oYxqJ8Nt_Sq< z<&Fk&qEZGQj2=A#diKo#$Jg-YLs&L)PWT zYEfP9Qfu9?a_f4SikBG?cyEQdWBlr~2$QUrKYKg$9idiQZ*}h~;}3&L^L0VBNcoRBF=B59*fV=ggt674wbrggKpCdKPWQ_mG8a z)_0xMvvSWlyTiH4wiA2LG6`OtmK1d@W8ciHy_d5*-7D$%a%IsMEZ@2{F%9_ObF=>xF;p7qeJqSu(zSU@$GWc5H+OdQesXTw-Q2mQtMBirE4OIR9vuDqLu3DQg@Kb4|7T9Jw{!fl>(Z4S!*Gtn z2X>C;ty|V~cWv3ydu8)CZ#W&_YSa~Mf98yyS62iBzk=PhPwlOM{*9YAoCzykbk(7C zhJ9b6J(^(+%oQs-PU>FMbNuOxRvn6w&KQ^-TKlwY*u1va7(4W$hV9WXW4>IrX5~RR z%Rr~iivE*^W)>#ZZqufE?FX;8$(ft5qQkA0IUY{t4(O6P;L0;Lcdl2iJpa-2zV)&8 zARpAHz0j(}uAUxj6K$D# zCL(;$eI}Z@FPb}sVk`rsIA!)7i)||Z)&EKlz5G304z$l4ko~6aN*uFyoMt!XIJkQI z%U2IyW#cph=chiNz{kyAsiR?r@%f`BFAZ^)2?M+snx?&$qR+Vgh8lOFwMy>C6_D-| zyEbmvvIbi{=ctd&oqwyaGWCo#J!{VB#?G39H8-&1$HLRXVeX&3quh@=BM!*7viPL2 z1!4=t7KkknTOhW;|7{C&7|{%EKQ{&5ESx`dp%EQEFy+0Q7`@+=ckY=CTV_P%fhk2C z(eDfXUcTQSH1Gkxc?2}H-H5^g4Y>E>c|%~xd?Ok+AT@6i%h%2`qWS?U+)D^wbD|MV z7@)d035mj`MpPV_%H8MB?z>{a93vV%Ak}?N*%{6Itw!VyOxey2ByX`1We2R}Ep`Ij zQ;cZlfE52dfw!|?1k!Ig?k(Q7PcWkK0~|WdDYYp3?*>`>G2Gq4Ufz%1CGM5`K~1E* zzcqH>h!*>)d*?tq_K4Tbfv>aOH|cjDwsEWx)eXpld+Y${CmYeU{a3a720(I_5e>5k z_6bN%+Zq4+;o}J-d>|4226q5F7k>Ny_7{uz>SGJU7KkknTOhVTY=PJUu?1oa#1@Dx z5L+O&z(0`%!lXV<>-Qv1J;oMj{It|&h>oGxCHXJ?h#FnTW)wa9w&MY$dQa2GYQ1+e z9vc7t|4-!Ccqp+2Vhh9;h%FFXAhy7pTVOwa5Br<9^T)scZ^Q!_@$diLczWk=KIyZU zTcYFN|9fMLx3nKUg%bb%uO9U2yE}t_n2vw{=cjCTyKy1@{lEVM0RMx(|I?>z&6|JJ z#x1c0Vhh9;h%FFXAhtkkf!G4E1!4=t7KkknTOhW;|9%V5@BeZ9|G(dl@fE}th%FFX zAhtkkf!G4E1!4=t7KkknTOhVTY=O73fQd#ee4V-s4PUn&7H^p2^;z2GZ*@%E_K&eZ zwQL!Qi_Si`kss|?hzw7S)6Z?(k(8uydiU0K>n1n0qogD-jnfV7Y& z?!9-7?=9-+y~C(aP_KdPt>(XWywY=es&R5-YuA>Qo7ZgYS+k)V=Rw7S4O=&_>}tV_ zYSrJpxhMWnqrfTW;QiAJdOA152&u`9Evq{>@AymEftuU8S2a#gXH_fzL2c(xRtD@d zTw_N!^vy=!f0)V6uP&8F;^Oik`mW#0QTFoA)C1tgw;s?wcr=q4RFA&(xM9fitBVAj zn>|3z-Q(7`1MJ&9#kmXVvYUyS(lD0Qhq+qu2*84z3gT zGFG)HjX_?N{a$soXJUr~;Ka8a&pxi^mQxPQ7o#`~7{F86otN8Hog;ogz|n3y-#8e1T?Kx~2700P~{>YkHq0&@n%D1Gm#X`A|YlWs%xjofX z%rzHVF)|FVwTNM*GWq7_Yz95bt;ObI3ccH#+w<8%uG~H`oE0cd<kZWnmrLyHrOUoEiE;JQ#%}uaZ78liC%(fIu zg?uTMX~~w-ut6$Uf;TeF@L#rklsn5&n%Y{+#dJ$KgClX;e7U_T)tt^Xm)q01_EI@t z$fug&r?$4XRIxo>%4JHKLR+z%%Vx6e%}uT4mPyVmTWNxdV!pktt-Y%Q*4Yg-kN>gi7J_k>iTJvq$RBNt1 zmnk-7;d_`jpDv|xEiEnS5(eFrZfR}KXH)pUxv2yL;No%^#zbqD++im;w6&?NDV51) zn=p3^8C+(u)SM|d;E@#RxXr?XG4!0HZP0hvTe6Ca~ESIwdX-aCv z=9U8bmfKr!N%>S;Td_Ia)K^gw`K3WfxfYBD?k+-8xtxQ7 za=O@FZfZx*rWDq3j_&`jb(bZ)H-b8Ei+@?T)m`TPJUGRh61?btGyF_&r{Ct@?mZMv zJMgR=k07={Y=PJUu?1oa#1@Dx5L+O&z(27C+6-(V?C%ajEo<4|-Gds|vcEeAA#2&+ zU4wwN?C*|2J!{$D-2zXIWj}WcT-LI`y95qv+20)ko3-rk?trE2vY$HxlC|vbu7F@I z`@11vvX=eb3@}*B{%!>5tYv>U0g_1I>F@Uj0LTB~&57_Y;UB{P3SSCe2!9-YKm1ns zwea!q^Wnqc$HEVVcZ4^G_x}?!Z9KHt0p<7L`&`DFl_KNu^;>sq0iGle&)H zu#Xo0nXEJ{{B!uz@P~-~pA5f<$p4e!J>i|-U$8>yb`<+JQF+}JQ;i;_;hez@WJ5L;JV<7;DX@1U`wzzSP?7< z<_EKaqk=*(B^V!!4Tc4NVEC{5zwux6|HJ>j{|*0f|FixB{=NQP{>}ci{^kA!{(1fu z|4hHrU*gaAXZc6@MSrS4-XH4^^F3epUiW_Mz3e^jJ%gtep7g%pJ>-4D`>^+Z?*{K` z?_J(Iy=~q`Z?$)tx7eHS9pfG8<-N(?IB&E!#IwDG`~^FH$f=FR3c=A~w2o@K5#SD1^< zWkH)WzpBc{@Pa97dpEK?^K5X1(yw|wgs2FD(>x~u0B4eJ> zYD_m$#&~12QEN#3FZyrwm-OfK@9JOIAJZS!Kd#@c-=bfmU!rfrSwbV$os zG9WEw$<}3M2}{zDmBlQXP_hV;9XPUbGFMqR;3SrkXk19w6rgH>p(SlUakZ$NNd5hp zvT_3T@|U4;K1)l{|9Ea(A}aG(SZr11;y}&U=Ahdg?$&{E9H+G1AS=gm-KL~fnXNj` zM#ovI`6XF7hMTieR@znFi=xuTsvE3It2*L1!>Y6>@mL((%!kyQR;5W*PQv9L&6V4s z=O~uO7@~3{>lrO8Gg-AZ&Z-=tj+l-i&ftDyEm@h)QX_^~R?Uau;1VA^O;(C@u$OpQ zR0>q(Z5Ne13!6kG$HEe;lBEN^#7h`n26dX3g{{)ux=d73EG!n4X)JVz%2XDXT9qk$ zpf(8yPDY*PjlqG3b1MdZ7*~zet;!^If)~*`ky{(B$^>=nVW@i>*G&_Z@hsGf%AqXG z6_s%$xT9pH5#4Q9tCy8Sl+++94cs_VRO(sSE-ME^&|DhDSgxv-l`*ROI9VCZjbky` zQ7lb{G?FEn`XgAPsb2@lb}{vbbCrk2VJy`_I*28j`$JixxjzJw?PBiNa#f9xl^T|Y zz*8YhH2DLTX!83k(d747qRH>FB;iqqC7S#;B-_R0x44QXzhsFfzo5zQ>Y`#&FK3ag z7<8$Qh6$y!lz3TIl1h42Rx~=&$>UTBmNH2ZZRbNr%jg}d+egf zCYGi_=|=80SwtI1u*)*)rZL!wS4Fg*t8y}0r>b6-(ONpt&O!yq4HEnwF}vBgBCs1B zi7R4yv*Gs$^hR~KBBnRHQASK}Hl3X5&8`;_(VK106%nzUZDTl0Zq_If5xLpcNEs2g zX%^;9#N=jS-b6%hwuS3vZnHp{5pkPs)yasd&BC;anA$8%n~15+8ZINIHVc#)5w+RY z5E+5lpdYg)0<}THtci%)Gz+sPVs5iAYa-@03zQiVw`mq;O~mA8IWhvdp$fAmVs5iA zYa(!)tx*-IEosZdS7b!g2I)yFB4*QM;tn)}+Nkmg8G+jHO=<*=Wona4Wkl45#w%n* z%m(R788NZRQ!pkXHq_lJBjzl zAtNF-P3F)@%%;i3LPSh$5)+)LO_STv2yTNk1=^U}EDX7Pu-<8(PVRptdA# znT8FC+cYr=<6v?VrJ*tcxl!xQA_BYNP#75GM(S>WI$}2)Us56>H(OwCfZM45T~-8c zqi)y1AjEFASS}+bH!(t55y*{NZ^QtY-9!e4Aa>KlcBo-`6J%JvK{f8Eo>1Hz1adrBzDsTc?tAJeff=SI>BAC<6BLpZ7^-}~Bnpqa$GyFY95S!WNXhB?Nn==G6nK@R1$Pm4NbBV`n zbFKi30VfOQFyj=-6lSc@1v8kjToQq4#!6i>LkjjSM^vW=VoO97_|kQA_9fTDnNB?t;9 zo17G&Csa(5Oil*ak+?}SMkXb=2?AIW)C6IK5X4NjF;Rk-P%$PcnU)MYDZxsp!6yTA zlF_IOP?BcrM+hP$Tc0UFN5JWV$jH`bNTwpaWJ+QpO)m?{Or#f0K}2Nh1<5p|<8zi- zNY5CONl2d}1apu+S~3OcU?pN8ThB@2A5DkNh<|K-nq>CT>vhTGqvML1d-O??sYk~Z zGxO-UVj><*#}yOtX!;0UF!AUUCG(DsD`wi!am8RAbiox9=V&^vm^jBy9wNXvzy?8l zV<+ncv5lQPSb}R1D&q*E8ZC*>SWpdGMw_DyTeC-*BMC;DBM3&Abp&Mk9HI-4aA?wWf%ZYdp+7}Z*o1mg zScFDWNJ3i|f>0tvBQ%qy0kj>V)1OvSBngvA3j7a>&T!;O+GmYU`u+d4@HgQr;V;7H zaRt2=5I)i2DF;32(rDz?I=8;RWIL@Eq(3tPjr!JHutz z6*xYe9kzrs!y@(t4iCp;XJBMFH1tCmYQgKl?}J|jF9y#CKMKAVd^7lJ@TK6<;Gy8( zf{$XC;P&7q>=RrSToP1+^MkX4P1q~w3YKHHU_mf9I3{QcW(4_QS}-XXhdqP3pf+#= z(|^PNlmA=)760ehIe5nZ4)zYd;y;Gng9rUj`1kl9@Ne_q=U?Mr;a}`W{<;2Ee}liq zU+JIXFY-_DkMrBGlTh}v{uF)zwuqu!^n zqwo>$PVZ*#I`2yFV(clL<8AiVdaJxsypz4-y;)w9H{Hu(Utzp=uvh2RU}quezK%C1 zyyE`M{fYa1>@Ga%KIT5+KHz@L{UCN2-sir@z0AG9J>NYGy9}${PIsxhz@6i^xktK1 zH-){1Mt8J(kn6j`dBgdm^K0iN=XvK@=R3~-bH40+-gyYS4)-{BIk!0Pb*^&Wg`J1D zJ6o{#(B+)!EW+-?Y^T|o;pCht&fA=NXM|JhIM{>ui~W21Rr}}mbM_Cg5Ajv|-|f%Z zpR(_>KZL!A8|`cC%k2y8ci3m!8|^jr3VWHo(4LDuiKFb2owg6N$Jt}BFA>-hI}?Ah zeq+6Cyj~=%*2C7nS@&8Wzz)Ur*45S}R>eBk>ao^ar(4Ud#n`7f)@rei zu=3VaYl78)Z;_&W1d`8@l z{fN88ZQ=&;ZgHuoVozeL=oV*))5H>SqBu^pikYGyriqE-5HU&&6`nB7znZU^|7E^t z{?vTN{I>aZ^KtW0^V8-h%#WCNVwd7N^Gfq#^PT27=4NxPxyn4nJQ;fxv&<&!R%Fe| z=6Lg9v(BtBZ8K@SZv4)81$!1hF}`nn(|FQ&%y`6j!1$Q)LF4_#`;7M(ml+or=No4k z8;sRPr!~ZKEd#qSe~`bDzmWeSe<+`pUz1;wpOX*DkIN6sJLFCBT6u-MNN$(gKC0ke1@|cUh=LC*_>h7RD!5z02Nc{zP@~l9q8;2H(*QSfdBS1Y(m!IcWGP;j||%M@Iy z;1UJzQgE??ixga_-~t6z1r-I6f_D;x+I9u+P;kD2^Awz`;Oz>|QLs(H*$U25uvI~i zf-MR*E7+u9qk;_zx)rQfuuj2R1!ocj+8PC`6`Y~qbOl`sRw-DiV1H1xpkxRfT6iibvRlyVmlNB7U;4lS~6iiewLBZP;j8||dfvb&E(5T=L1q}-7 z6&$Q!tb#ELMk^SlV5EW(3hERLS1?S$K?;T{7^0w7L5+e?L7>1_;3;qwI0|e9mIA3j z5ICBtz)+woNGi}2Bp4EJDEO;_|5or91+Odkvw}Y<_@jc?6#PNK?-l$`!EY7(M!~NY z{1<_p_?3cJ6}+P0mkM51@REWT75qZM&lUVk!G9`vLBaD1eyZR<2&}|&3Vx#C#|nO= z;8_K{j;sW)BP+q{$V%`!vJ$+GtOTzkE5Yl?O7J?e61aq%ohJ z*O8Urbz~)Y9a#xpN7xXeF4!Sb!0SjRcpb?EuOpe@btDtKj%0$@kxcM9k_lc%GQsOe zCLUE3t2-lO2%3a(agm4Yi3T%q7{1(zwfRKX<*-lgDT1s5r}P{9QXstPI!A_ecH zpGw7cF5kiB`COjI<+)tGoy&8$+{WeET%N_{RxW$E+(IS3bW*vA%Z*%a;If;`^<1vw zaxIr^!!U0kl>awV55xa{QeG%lBOc`BEuaM{7-GA@^LxrEEbTrT4B zWG+wQav_%sxIB@|6S$nu%M6!kE>m1i<8msOQ@EVW<>6c& z#^od~CvrJ~%eQekp36hI9LHrNmB~Z6Y~YfAtWO@y@>nj%a5>u0ZEX}4BdHicMI9Bx zsTfAZK~xN-Vh9zrRMb!rQV~$$Q{hqJQsGcxQ(;jdsSs3{R2Wp~RPgWr{Qf`Z=tTH| za6V%6_XWrJFZ);eGrS*r6))?4$DQDO%elfi+THfA5|_l+5nCX(Kx~270KFTk$b46 z2Flz4DZ~5S&)D3#9*P!(P;&S{luT8bCTOrt8`r46c8u)!07}OVNNH=&hTcn_3VDaZ zW%W=vV_*tbbez<^rsw$67j4+QwpaDe8l0fRgYudG1IlObu*ELg=ep2dKTz$x)@@y} z!xBp!s4EXtU0;%cExnfLtAYMy_WoG8Pt%r;UPJU%LHP;D))h?{*uXn`I(x_4Kl#=& zB#|2EtRR*BQW?$OBj3$ZBrzJOp?6chhwk}EqZ5rExGmJmo6XSLNsDADvb*fhX!|?` z=k1L^qVj;%^$W#zXzr^)5b5lfmHRa9 zJ^r^(G@=Ou9Qd2W|JHttcefCI&-fpYHw@U&yD8rz{ud`0(fIwa#h&rMxu2u$@4VfE zblh+o758Jb{dDiHS|2$3>>jG`jQ^8MFkX8gB-{{IT@`Ttb-QS1oZ99|n<9#+C_;fAmaPyR2!9sWn-{{AW9q2cIoNNDp@ z|G>{XYzz3cehCF1SCqC%7ZHKDaWtFnBxe<6n)t_!kHBg0^5L?%i^Dv3HR-P4|nZ<$$tb-{NLl>j{Ehm@-Onw_c!~i{nK!t{#?JspYEspxA|lIA-;vX z^MB|40y`7m^}gzT5%=YP40q+%M*Sd!HtkaFo_ zMpkR6u9So7km`yhv<6g{&f{`?IvB&iC_Pk`GMTbfby1m36^l5v12LB`Q@f4!0`iqv zRjCe2V~{54L>@m`H6Ug3Sr|iyRL+!e#w4{O2cK2dNF|!nqA~{qM?yQRavZ5aa|!Pf zLdP_cu!+iSv?6gF-ra+$Y`UDnyK<;8UoObXBuM#ODrHs34OwI+ELjy;ysnrp;>;B? zIr6(@@VXZ|x=<>Ls2d84#f%lLMZZ!iol1-7Ogc#}hc}`?$P^29gaM4iNZ=W~^MlS; z&X!~}i?kra9o|g=sQ^342xlIKBz2JB|6#duE`xVdK%(4ycq0X*Y#A34!RbSh=?*WX zpl+Eo8sT!9C0V?N0*(1X#*E`lOKoPb{aSN(Jjw zswow-dAySZzDi|_RtHsOkxI^51_>T5XRM`Mm(G{O5*kT4Z7rr6G^NEN8d9-n&83=j zI-8L*p^Angj-aM|Szz@H&0_wOCv!B|GWzDqsdUaPVThO@MYI&lg^VoFvDs2t<{=>G zV&2Y?LrO?anU`7AWic~lh8lC3tUZkyDLZCSPN6y^kHi~9==8;$g-KFZ%4VT{BC2vo z?I_7p$h}yw;3%x#OfD~Zonj71@>rVI0vuMCE0iz;$YU^E&Z0G%E9FaRi6x4)Q!Yw) zZdeKKk+eLK=&~f?LJT>bv9LBV$ID;=tj%E=B=D5v)=asWw|J2vgJfCK8ck!#NLr%l zaw%=q(sB7BCK9dHOe$ZruvF_Z!tcelX zI68;)l9q)QBs$C&C06P%N;N43gibV?PlB|c-sEuV2yiMaD#VB zxG;FeALQC^V^MCK2hqnYYxqm=@ z!PngHdFKX4db7i+cuN0X?|tFv?tR`vZhLT%`&f9LyV-fePkTqX5BaVBJG?`}r^7FJ z-wWD3EqKNKdgve%LBiV{93R-hqyAXrCA`tU+Pf;a%3bC!4mOA5{iocETpQ2$+u^hR zr#vql6W-#^_dDIO-d*8;dXM?@+=;G0t zCy5;XYj;pb3jej+Nuuyydp}DE|Fzp#4Z?rzRz8Hnf9)0$IsDgdcJZPz75-~CabJZ0 z+KnVp_^-W>yHfbC-9VKT{%hCMh^Y0w)XL$%b}b)_@L#)zBntnv_i!D;f9-0nL-?;< z#dQdIv@7{w3jeh$sFK2e?Q*K*@L#)(L=OM8OR1g0f9;YT2c=Wm#jF#-qIMxk6#i=$ zkVN6Xh8+VMMY^C>SS5x3T0{d!_^-`jH5C49$5BTL|FvVO72&@&o2n@M*QRqL!hh{B zk|_MwCb2#W|Fv->a`>+`P&&4(pZE%ELHM6|f+Pz66L)bd!vDmbBvJUEVE0q_pJ4Y>_@B6qR3rRP+{)b$ z{wHoBiNgQH&D4nSA8+^6Ym*op`<24~#C2>H3jY&V^Dr~T#FZo<{7=9~bsES2+oe7f zQf3p?aQwfDB#!@A3cXe<6joUJFpc8>PVPhT|7mc{I#K+83RhA5-$4?` z|I1Vz;{T;|AmaZeTto5yVyZ#>zldun{+~;#XecweDPKN<5b-}2&oGVRe|WMES`h!2 zX^5q4iCQTBFY>X7{|h8g{GWI9k(!GCb5uw1f0i2&|7W<78(6?%z?{M8DE>c~swn;+%T*NrkD)4x|3{NR@&70i zDE=Qw0>%F$s5i&|byP+1|8N!%{}1C6Q~ZArRZ;vulm*29L-;s~|7*EB;{O_|;`l#g ziQ@l&&05I%Y}QiVqZW?;U9x5-=g`p<|J&5U@jrF~P(|@S2^9YeRg+4aBw$LH3_7}4 z(AlOO|0gZI&gS@^e*d?$%M-z5Z>@8!^{{xu9IwwpMf`8jEl@4viK2_nKDTjp_o}XK z3%j=UG)_Oav1LPd51yrKoZh{4-MYz*?I`Er3AM)QjkqCX$76Rpp1bSV`QTmelXraI zM@R47AAJHpbhPVVJ8lS>o@$)j*xI#a<>oaTd)92|#(7Y&V8hnUE4x}YtfKSc@Aft8 zy5@KGto}!h0;ia>rn_rFPv>S_d1`WF%j(X}JN{C3pysyjRgKfrS=GvaP}}*Fl>z$< z*VxeweY4T`A7--it4s0d*2U#P^j*Jaz0?yUaSB zxtCGwgBJ(aiF+BVT9kM~bWj&%zuP|de5UjOIPopVvk&eZw@ z7$iTw#b|k5o`C1jFP?B<9N2d!`+%rUz?P{>?#?PbvPl6O$6bq2961 zjn>2F1iedpIx$K7Xt(gUIstEbxoE*)IKOYv_IowVV6NJ|o&TTE!FwAfFVhgO(Ya{c z;CO21b9aO5p`GX52hU^%X{(^4W9RVLBS+z#L>KFW;gKEBF!pZv?D7($!Sv8ujbk4? zHfUc>cLW)|Pbc!9J3nd8uV(QAsEgJPiU;X|(LVp}d}Gw0dhbof@XzSEHyJ9gyQO%` z)?jVQt-xmN&ewAFI&f#zpl{0k9Ru12e-7TJ+}|;7cJ3*7%h|<84bGC>ZA^Q8E_!em z=-)G)$hQ_U{zDXYQiqgXZ5}>hF6o-Jtt(j}h#H|1yK=zdZ)Z{#t|= z`3=^7941l!?S>r#>Z>{sT-$f@Eq$NfeN`CGKKL@78^pEPH^#jWn?1V(uTi|XIA|-e z|B!l_wy*9$yLN8_+6Uj350Gp3Hf-`O#s5E-&n3b?g})A841XH_5N`l@GW=rraQMma zp774_Cgl6OEUbp-BG=#Aa3$UXa8fugJO=LpC?n6`L}dA^3&T+In*d%3UI?BEo(`T2 zz7TvmxDT2AZbe?dD}oDx^MWnN>9+#+-OmqZ1xE#iU`j9^x%`F&eqi{o`@ivD#M=PA zkGBClj%NcN@bC5S@^AL9^)L4?@XzzN_-Fc^{t|z_KMPs=ivCo8yg$|-hKzl>_qz96 z?`7|KyE_oVj)?;&LC`>^+ZycghV?_J2%x6Rw=t@cjy7JKu(WAJW(Jo5C7^G16^ zkfkr-zUIE_zTiHC41HgAKkMG_egxV1-s@iOR@`mK%y+um;hyNua%Z|(HO6Bf%BB}CFc=j;`@+ut8=Y$DYEdLg&cecZ@UB$vTHQ4bE`KL+-sl z*}t-XWLC(GF?JMl6eU81sUS%(}=OfqN5q8F&WY;6lo`WoVf3RM$ zp0|ErJ!L&^Jz{;*`Vg|~U29!tMb&+GBV&v3oLq@%{Ink^)hnt?M8Gkf>gJRH5*YDPE z(XY`j(YNbc^|gAZzF429x9KzVv_4TkSRbalNIvt&=0Fq23jIqeshaSe6NvgGRkg|LPo;6D(CQ`q#7NmnoY9!SMar0qxFfyFl{xn%ZcG@JC`OBih z>1n;~qC)v;ZEusPP<~q5TVhp^pEjv^iI-qo%22C$S=g3x)Y{%MQQ;i5-eOUqB(=8J zAu61t)>~>-kfjy}YLjpv=c)CO9k#-WYQ52Trjd1x)vXFr)zS%GL@On$wY^5Gf@HOH z>|vQHQ`q5cRyeun8CA}&u8Xf5% zFL5QoQU8`)bU;x^5~yos3HEXsg=rHpwOPYu#MEYiG9#ik+ZrMxFdOt^)tpv>ramN09gd5~-idC=!_6=qE|hb7FK=s21+RCO%b0@>a0EU=QEw4zy% zG?};q&Bv(9CuG!4$I1~nwv80ar7~(&jaSI1MM=oq-pt)7cYTwpL+<*cxo#5D(;tO8 zXub~3M{?zIoMWcyc%zJt;5tejKSR|a?fZ1D>%Svnp`YI#MCA+!HL>5xgCw* zHb_&Tjj2si4tu6HiOI#(hG%GH1ZqRKMp%cLO->ULmUx6dRZAfO1s{*y5m23!Vqg?c`A#s}~CSe>*ZlW|4k6WwOn?(e6!=W%R z$c@z90CmJ}Hol}pL~gdg+yJ+cw!5qd+(zB5gF%ShY_S~AWkb-!2x&ziH)_2R17LO& z85n}t4GG|&hUpEDWy^@^O-u=`2=qpW+<|81H$hHheiP+TM$B)5Y)AZN3tL1)Z?=FD ziQP0oUIM+*_%Mq=ZzSC!BhVX3meff=SI>BAC<6BLpZ7^-}~Bnpqa$ zGyFY95S!WNXhB?Nn==G6nK@R1$dD`#oJ%}rn{x$N3^-XZhZ(0xrZ8iLE||fL<&p?Y zGgj(?3C!pe%wNW-g6YdB2x2eW=n%wRws9H~Fw+66bi5#sghffg#AO^Ih_`HGiDcF? z%BCdJ(v0azL8N6HGbB-#W-LnzqAc53ESazjSdaM1HkL|eE2AVOla*1_C3BTA#S~0c z#%MuIWgA&RJY^d>0hR(z6Cf#Iy#Pf4=SmP1PBu9yKu@TcB$=EHup@DkW{gZqa1#Wu zB&Z3(2qB1>Y-6GXFQH;gQZg+Wc2a_sP=ikf<|Lz07oa4~){hWGNVYyxfR2FE1(A`h z&yY+-ddZZ;M4Da}l9@;^nu3VP)(etpNXO?avyh%KB$JRnMF{2~eY9i>(!ol^K(?Nf z#6Ox2n-Txm`ZUSxqu1+_$w$W(Gxz9|BvX%$D`w`wV>Ob92MO(xl88ssN9clyN1rH} zcXV7a(~gcS2J4^;u9!GS({aVbId<|80mcC~2;v(%Sucof?Bu}`T!UPGID)7~OX4#Y zRD+h$<|qSM_C}c_2}YVD2u7H71a;l<- zpH@;N36n_#V>WUC`tJ3K@5)CL?iJn#-74PpucF=s?y>ICZo!@Gj&n!4HLi62>iph$ z8FBCTk%RukE-)diHUuIW0?(MQW>;?9*c9UJOr`V152s^Y*>(AD&tzTF_L2mi4 zA+!9at^2IIt(&cDkX3%Wb(XcxT7iu6^Q=~Dx|K#Y`Gc*4EXUI1Yw}h30`jeYQ$8Ud z#oG*j89pEWApA!7rSLQ1C-6>!Tk$T#%fcu;JM0cuh0DSdu!nJEm=6!b4#u$1!T!bX zgO`K<2)-A5E%+jKFFqFBg=`2{VejIcU_;OqEDKHuj=@_DbHQOjLohsW1I_;fawXC` z48QI_=0EIz+`k)p7Vq)j<-f!4!H&gg{>lCvyuq;SPs4u2XusB%-hX4a;zjQ{yutA6 z-ecaw-p9RLylcJ7uupNex6WJPE%A=`TD|FB%6l93C~7?6{>A;Z`!noNe9Qfc`>6YX zd#`(kd%e6z-h(hF{uf&ywm@uw*aH6-EPzjHY;oBm6IVlW@NHxyzIImdefeK?V>8~r zi}&v+D0LG5NA~Y_Zrg#+TwM7m?CHxYqR^yWpSW67DGs&kXUZzaq4kLIs}zW8^-GhY zN};G-zeH3y6s=!uRS}COwR&vtTUA7(5ECy$L_i8LiJgZkhotq`+^BL)TE7X+2ui8v zOS)A>TuMD>peKc+7*!!}|f)*{mXJ zP1?2ErJ_nIIu|>{>fkRylaBMZ{P|^h%A_$|{Gi zwb;n4Qv9mbx{x@6t;N1~l|$HC?0Z)^hONa0W|e|itu}zfVQlSioR#C)T1QqnkgctO z87Pv~YOw=ekB`D*TGLjjQOFl(Si)UsBHEM*Nbpm8<~Ystm7)oqRLv9l1cjgUk_I#!pFkv0r9`s0c;rvhPABT+P!ve=f;g|y3g3MY2BKhuH~Iu zdp4}0H@z+I-?%)TE;ghOOB&_Sgot$)H#-Fr)^ZraqQTMU$LFqiPO|g9G}!`kJX&Uu6%4o^>OMP zAD=v&e*c}B-Ngb+f>2Ifr2{T!?%cWee|-Oc@7$TWbN@4^hf)P6Hj&LuCJM2)Np%wE z(!H^mBuNJT*WAwSOwv%4a0&`}WtY=dE4lGsfQ=@6`Ug zc2WHU^>Fxep>KvlI34^22m}ZO2&@Z%6Lz?zvy)vYB*xNC{_!+Au}k?vqR?BJuJ0ci z=o=k~jrJWG8i-Y%=`M_=_oR|@d#FxN@qSC)x_gWE)P+JWb@{TB8_iulGe0?&O%G=B zPOjjlePSbn$Bz$;#Hz}~`i_kvcktwyfsxVJsgp6cQq(vyaD4D&)QI8FJ2`lA^ptnH zKRY>UENn>!y|(a^o^X4 zoftU3CpOa)J2yCb->I{sv5`~f29Fj)rrL7PJ*?QewhYPacs{k@LtaATl9zAZKnkx| zS9dB2-x(bsw_71kej#>b=+u#(VuPW!?BCCdgKNtHPhX`X@{AksN0F}XymOiSvf$(< z_r#_yXR>=LWvD#eQ-#j5uC^RFP#c^?A+buTBr^3Ih(%>;V=|V`j$d_QdAdteTlVhN z-XX6EOEq(k?Sq3Oqi6euyk29KZ*;}Zo*6uOJT_6t@9%cqx2wuSyY{&GaKVC;Da7uH zb-|_g?v3^5oJ7IN#}YB`6#A}wOb8c?6|%8>V#bM)dSi*a6U$E}#+|!kR|coo~D+41Q~AUT+HIjXfdmJ3!ht2nbK)-?bV zWeR5siCh7m;2jP*nahPMT|Lk42&pYwwy^h9_GB*O@LEj)x_Ev!nCx1sV~F*g9X&O8 z5_KOKI63M$V^@VlekK3ZvFUVr{&eMarz`eg-$?&`eIwobZ@aB0cJkC{?Bv;@A-_VE zU8+j=pBfsX>+Z=@{e5R>x3V&NV*=Mj!xyDiDG#KY#poh=14>lnMr4j;lk+zqLq%>x zrqa$eMRp6_h?MI9C*YZ78&@OwfK#}VO`b_z&Lj%cIcKFAJX;+*H8L=G{3Kn#y2~!m z6B`*gHZU@9vLB-gKf8M{*+Xr{yY9ny{e4FV&^$8=+DR)bw)pMDuW{*ED(ws>3RnD$ zkms;xPY#|wI{*m$Ch8X`)o>e(pH1!4r`6RnEQecm?`G%Sj>{X}Igd{}neozK&pT9B zv=D!c=bh}%!1R0a&f`7Bi%e~4ZDmiJf~L>b-}4nzN=;>hEv=-;+Kni-vVHh%YABH} zoXcS#JDQqw&KAaNn%%{=+vm~)1MTDCmi|^I3Hx{;B&G{laeT?w@=~v#k}=5EXrLX{ zJ|s1(4Pou?>=*Tqt8>=NYJ+vm?2kTUyc#)Yk3^Vucl34roc3WOZd{A*P+yIFc3lJX zpiqE7fIxsifIxu2TML2la7ZfN74E4i|H_%acsy0OZ+h(F84NAN zrf(|c@8d^t?{@L%SU=r}%@y(&2an)Ju5=t9&$Cyz7r*-1*4M@qFgfs#!(=TUKXu+S zez6HWc5jTwk?DLYgL_9`v*BEJ0z*AlgXM2uF8pxJ+PDVQ)Z=~z=uhRcj{&83{PNBg zMIVurhw8znV`EwzEo6NK;z(Cg?`&31Gf-~YAZ0Ri{Bo**u{UmoA@I|${iid{;9!KL zQ1QV!klwLD(ynj8t>Q<=R*3w#)vR{m}|F*3x1$3hG-oBz+0|zNx87=-WTG<53e--?lNT=xV0$ z&^_g#>rG5&#;=@N<+Y37{EehQWkVdQjJp;p?A6%8Vf8|4yb*eA^ja`hc_r|;R9y?6 ze*eFF?+24Q8F<60lt|)ovnH3=LFLPD-}A5yE?pbsLT>8O7T35+b9X$eCDk{f0nr|D zrn31|A)A|bFPY_Iw>3P~d^yuN9(ohTsNzD`%vDTwJo>eL7_0OZTQ=0%+#Yr)0x8W6 z;d~LUPY+~WotM4@H-ChK+P;lZtL*TPIx|i>J4MgkR&@UKlD}E|v}BIxo9y4QK40hxQwVTYpiM-wXn6de-HJl5i4G;(r2oMMm2oMMm z_$PtDMWuL<-S}>GL-#{FN0s94jS=@BV)!HF@-vgB3rg{>jSQ5@g9UCOL#$%Pb5vAC*L2@;2iR_1! z;(?8ktoEPkr()KSQrx;B(j_Fzck0ojO3~aHvGQF?8F)q=LSV5pIZGiNP83FR^9fB=g}+fd(}75H4*WW z>T5jg4!=p-WkD~lx?c}%yq#4)q_2K{uH3H_TQ+3DRnJ)E2bJQ!H&3ei?w#MK6r1#o zT>;5xTeBFH6%$eQBE5v+{y+QPJhE%6a~6{yaaze#GY4?b3Io_mxK_tbr}<)iloNAM0%| z^_*i^-pT*YDt;z0e9e~F)vcwH(#~2X#n)sNb-iycy`A);D!rsh@7S#jFM;BPeVWD? zG1t~j(PLa@ak_qyy?m7Y&;CVFJaE9L$ZAkrQ}FJl!|aXiJYr0DgUIq;f`gQ0y~dj5 zeXkudxpEfcGANah)C;aTLtjD zRp~ixrb8Lo1&Y7eE6^Z>*H3Y^YG*g4Ge@Q8)&9;Zgx8jGO~in(^r7w27mZ@mPEdKG z>~+(P6&1?!mVl@5rBcqSjOqf?SL)d2i1dXk0C;89?h=txQ?#mE{!n#^!#$@uAl7+^ z1+;`iu2ZaPN^^D6C#CmZmHw>1y$Y?h33~PEqtcR;`BP1f^y+~0cgE>95Gk1vj^XRJ zvV6%O3nd!98Ou56HZ5;CHlp^$%5uTgYLQ%1u3MY#eK@vY%{v1~Tob9Fly=Q~P_@489G z6--5v{m5j0+2Ju1Io+fF2cJE&tsB*{FPZGiB&nGTnpKDF%QpLbmtK`y!8o%GjHf$G zS{_`tmdBk!3ERpv!}I0r5xp|20@aDFD^cBdGyM9}X`v)&`$=}#WNib)&Clr;)*HD6 zd?s5-FZ#!%b@Or8O`9wDdluH1tx11>i!!_gG%vsv-DbOfnpK`TYfC?7@0#FE>haB> zc<^BPI#Nr@8a{u#x55L#Qw1Cj#!dam%XLp5a)QDFNqg?+Ns8%FHKQP1gROl7y z*K7FeLNoZyi&iQ4_1zr5lH*i0ztCnoG`bK9OMiHshWS`iSyv8S_pO(Ag_Bey<)4{K zT>4}A&sg_rH_A1FS6(y^u;T3CP4Fry31+1<|5${7PkN2Nj~%SlL>3x0h;3CXuR3Jk zwRv=o{i*b+>vRXxo4|Xvr_^ljS+Bk;-D>3#%USG$yV=zX`pW$7QEx!ebGjaEuU53y z^|JLFslR8#8auDCd)t&#bs%}()dZH)q;-;9DWdd#i`@|#mfjiqhx=?0blWOjv{_Ap zHCkS(MJk5XOW_{lP79Py)O+J4^iA4|D&nFLFE0i#m>f)A;EzOywoi$4& z?$8JJc0Qoq9YO70Z=8lsY%RX4B{4Q_KR0a@H4~NHp%lD>vrFL>MN4CWyn7uk9p7-Q z%ATxaGg1+Qjg@0s(U0$m^(V06TRNSfvD7FnOxZJHK$1j5>5|p6Zb_U177}2`Wp?N7 zI#P#52Qr0JVg7J;&$tenPD_bq|9WYHLT+Acq#uN&Z(h_z`cUc0ez@XVJFJ08*(I5@ zPA1~=Q36!@Elc_uJ0N|ST~r5EP$ZueoiKc|7R4I2lAdajKFB8K*t?C1Fi4FH1O%~u zrA8fb1u01rF9X0H39*kJVuz%UUJr!%5cuS~gvfMZKCw<`)h!hWaq6YDRn|6%yNB2 zS)a0Avai_%`!VYU>t9+a>k(_z8noVHEn5Zqr}hu6!`9oZZfl!WXNAj80fJP3K!8Ai zK!8AiK!8AiK!8AiK!8AiK!Cu{9f5wv+Sza9%n&^>-^o6nlb)nBXFH`gq|YuJl#lc~ zc3(ph>795Hy5uGCK6BA6VBoD|w~hjg88aPS?s)^R^mchkyqN2Bi#Fo@*-kgN5ihYi zyd>U5wYvoLV@ ze{Ov-+8X(~{mb@)*1N6E)~{Hq{iwAcPXijGABy%^PV~Fhbo5W`H|*cF^LD%SSJq(k z)6r+5_eOpg%|;)#|6An0Mt3av`^Y6f9}2=2oN9;AP^uBAP^uBAP^uBAP^uB zAn^Yp0*hxzs+sa^fF^k_FCV${U8N_R9np=va&65LOIzdvem$Dj zSgyO+DDTCYsyPT11iPB$UgpnqEZ5srlVYb!apm;Tooi)wRM9BC!_K!?GA&Q9Y^zxz z)*$a@RkNyg*m8%LCnkDrr!rNugIeq4PF6WlX&Y6lm?pI~f{(`iX*RbIg{oO?Teivv z%h0Zzo4L74f|fO;Y_4M1R4q~C8e%tWl6%<7DLb1g1+8CwzV145+F`k#4JNIqyn~fy z&qT=v{=0MfKqD?@=tS0X7*mxS7^apOy4=FV)Cip%LBL6FLUVc`-pZ_+GOTSCm|Cj%6 zHDu{w;>q=*Cb~0ZWi#_QNRGuR&q+-AHO8;d z*}Nz-SD-Qzvsw2flQ9#YC}B=M?Nae12~qG)lQ?rig-Ivj*TCd`qL(W8^a~Er%udYu z85uC)Ja^TvfzUa#Kw;V?l}}8%Cu9cJGMgc4^MXAhPf<;f63R1qI^*fhSrq&2Ttus;X*erfN{Oiib?0uxgm9S(IM%0Dnq>i89J<_zK|( zju~M9lt%@kTz0YKVc-YUcu2s;O&2C^xHxf@$piw|nVe7LpWqQvf~HwQ3vRiha)rqx zAh#7wRW%JiO$)19G4iXv9NQqrJmi>k7Pw3%UJ#5EQwuyKY_vec5L#q`n`DUvt}z*g zSRmT?@??Po0#*woe(vf5uVeC5YI=d>1IP<_0xB1>6AK*cW&p?qk{9qT2$3KSi6q3j z{R2WIS;|17J<4t4@Fc2?IAHT65+Z`l6Hi>A<_RM*6Avk*(Q`xZ_tg0a)Y0yTACFBl zu5+GD$Xr*r9^yI@I<{;~=9a>(EebO6AK61xaxxp?7Bp~dZt0Yo&UEs~5Q&X`yPi`S zG>Ldp=23-5Wi}b1Z4T2yby7W-3-rceThl*U$QQ~-9S!p#sjkUVQb(Ayz^o=pK2uNGyo`* ztD##ldAOCd$!26;F9ZZ(Bw$a1Gt6zqql~sDeqc64rb;F<4O}ru;cS#^Xy=WDq!~t< z1TM(jP`DA|1`;|+Fcy!|j*f@0W#cl@B-lA6)Xl^NEU*Ps!n+!{Y>;|RIzkeOrrN+& zgS;P|A9CEE!b2faD5Ud{Mwy`Mof3)g32}%5kh6hcSHr{#V2#Z;b5*C*_!X0fT8T+= z3^Sn z>6lD35=2Irt1utL?jT3T*|fu{c}~Iy@RxBQI1tH!2z9G%0D$rf$u{a608}GPEW8AX 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 diff --git a/SameApi/.vs/SameApi/FileContentIndex/60e88bd5-9c7d-40fe-9c99-a11db0413425.vsidx b/SameApi/.vs/SameApi/FileContentIndex/60e88bd5-9c7d-40fe-9c99-a11db0413425.vsidx deleted file mode 100644 index 105b9dfef2bf2d831ef321f5e9ae22547ee47b88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5119 zcmb`KZH(Mi6~^z(Y+FQyqNQS>um*{{Qn$vcL8rEzotfQ^yE`-4neDo`0&U&KO=*|x zZjD4yc~J^lY$70`LIg1cA;jnhLexYPVq&7v7&R&;;0Hb!qJA*G#JBi+&V6QfFnm&{ zbD!s)d(S=Rx#!;hf40@yd~Pdbz7DFsdvR`UX?1P!`lX|*hZbuqM@}AJ zIdJ}rrH|m-7(cYO)VIfutflnAj;Eiw z`O;q({=4{xUlLs!NdJ-qJNJEOs670CiT`rp)7jIH-hJ!;pnvYf@_Os&{L1RF#fB4X z3{j!&XI^|r@waWtXHg0oDy2`RG*nFc`KH7<4W(2}XxyZmg3g zI2eQxL}n!2aKC7=M=HjuL4RdQX;ZI6gS*R{Le_vsOx{vTU}- z7D{OZGdja`O6k2>49a`CvH*6Jb?PYNOEe-39u4Dzg&N%K#xAI8EFYZBo62FyqJ44k zLSZgucF6S^ja$)Ig$%yL)CjAxyg0b-z%9~K)2p*ROFE$b;Gmw3da}WR;!q#yiBKDR z=c>ewLb)PGp(uX72`_Vwz3SmZw84tG4)I(tMT&gKilj(s;~cY$xKueKr5n_rHK?Aw zP<>&f+jz!fmOG%M57~XSxzzaq94wtHjPlTcDzdN4_3*7~bxieIM5?>**y<_fI&8cqAG)8scv(>QN~7@xA;gcWzzd=S>U zd79QO*uL8Qe)FRF1LkYY*P5?`wf?Z}Bes`d$yn&R9}lm9969p*dDpMm9n+V)-M&zaA_it~Az{O+MC-n}&CyWjR% z^B2tzm>-0-?n^ZJKSEQyM`;>=%=|d4xKG%A()=~^*I~_ngQhr7(X{?)^EYA5f6M%B zSbpE7Dc>_R`G3#$_su_mweE*B&Hu>uk8S_N{8Nwr%=~kY|HAe!&A&1~3oHL~wx2iu z2G;ls=HJ4~`=a@Gu=M=i{0CV6f27IpPc+T{+58vtUt!Jv&Gz5T|1kg4{4ZF33Zl3} zuDT&2KS}nRmfjzZ=$m-r@0g+P=#6yKI+j?}4RjpT{fas^@Fwx_QDp z2`k?etb8-(mgo7aFXDDQJ_pNx!Sh#pe9?T3$FGIucf|Gw%}eH^u=0J#_Ok6`wy%e^ zpB39Tcz)I6Cq4dQ+c(0>cN46*pD^DH^G&yyZ#C=xQX2o1`P1gx&8N(Fz|!$q+o#QU z!OC+6R^GckevkQH^A|jS7MA}59)A#4+=pyGZ2q$O5%X7I#edB9SIv)`pMVwjN%MW1 zF!<O{^CzikyVRs!X75FhP8dzJQa#yVh?c;jShfUW2&S~YYE<&pDCo7!|> zJFo*DV7^N31}MdfD7`HzQKhw_f*HHcFBR43cRe@{kRP1_q$)ikv+TQYS zvO=ipwqtEO`l^4Oyc3}6FI41C#8iFi_$gYKQxR&#eE7T%Ya;eA!Dxkk7ex~>JBe3^ z6VM9nxf$wa*|(~y`c>S{Og(rM%sE%fTClaJ0oI2E`6cE~T3 zhi;Yb`dDBsup2lB%1cpnYgFZS+;5>2X{~T3a*PF*1KXfZTUql>?a-e?$t>qF8mMPj zO=mU}nEMCm>&^;mfn881B~)K0DfJV98rMFwdS_r6oFlKERnFooFT3>hZV*lf zc0k=L-FNv*rBHWPl@e-|&N)|II2HX~jdMMOxi$;Tb~tg}zrBIVzJO-EA*MrL6|AFK zC$BrI{poE|TG92#Yo`Jz`cR3KM>g_w?2P diff --git a/SameApi/.vs/SameApi/FileContentIndex/77c7dcbb-1f0a-4272-97d3-cffa78e083d8.vsidx b/SameApi/.vs/SameApi/FileContentIndex/77c7dcbb-1f0a-4272-97d3-cffa78e083d8.vsidx deleted file mode 100644 index 9e93d3c40ecc237df5aad1cb15a48adb0807bac2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5528 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 diff --git a/SameApi/.vs/SameApi/v17/DocumentLayout.backup.json b/SameApi/.vs/SameApi/v17/DocumentLayout.backup.json deleted file mode 100644 index 3348252..0000000 --- a/SameApi/.vs/SameApi/v17/DocumentLayout.backup.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "Version": 1, - "WorkspaceRootPath": "C:\\Users\\Mattis.lfrnc\\Desktop\\Code\\SameApi\\", - "Documents": [], - "DocumentGroupContainers": [ - { - "Orientation": 0, - "VerticalTabListWidth": 256, - "DocumentGroups": [] - } - ] -} \ No newline at end of file diff --git a/SameApi/.vs/SameApi/v17/DocumentLayout.json b/SameApi/.vs/SameApi/v17/DocumentLayout.json deleted file mode 100644 index a9b6761..0000000 --- a/SameApi/.vs/SameApi/v17/DocumentLayout.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "Version": 1, - "WorkspaceRootPath": "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\", - "Documents": [ - { - "AbsoluteMoniker": "D:0:0:{1D3795CB-39F8-4FFD-B023-22CF0EEC1140}|SameApi.Db\\SameApi.Db.csproj|c:\\users\\lefra\\documents\\github\\same\\sameapi\\sameapi.db\\unitofwork\\isameapiunitofwork.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{1D3795CB-39F8-4FFD-B023-22CF0EEC1140}|SameApi.Db\\SameApi.Db.csproj|solutionrelative:sameapi.db\\unitofwork\\isameapiunitofwork.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" - }, - { - "AbsoluteMoniker": "D:0:0:{1D3795CB-39F8-4FFD-B023-22CF0EEC1140}|SameApi.Db\\SameApi.Db.csproj|c:\\users\\lefra\\documents\\github\\same\\sameapi\\sameapi.db\\dbcontexts\\sameapidbcontext.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{1D3795CB-39F8-4FFD-B023-22CF0EEC1140}|SameApi.Db\\SameApi.Db.csproj|solutionrelative:sameapi.db\\dbcontexts\\sameapidbcontext.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" - } - ], - "DocumentGroupContainers": [ - { - "Orientation": 0, - "VerticalTabListWidth": 256, - "DocumentGroups": [ - { - "DockedWidth": 200, - "SelectedChildIndex": 1, - "Children": [ - { - "$type": "Document", - "DocumentIndex": 1, - "Title": "SameApiDbContext.cs", - "DocumentMoniker": "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi.Db\\DbContexts\\SameApiDbContext.cs", - "RelativeDocumentMoniker": "SameApi.Db\\DbContexts\\SameApiDbContext.cs", - "ToolTip": "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi.Db\\DbContexts\\SameApiDbContext.cs", - "RelativeToolTip": "SameApi.Db\\DbContexts\\SameApiDbContext.cs", - "ViewState": "AgIAAAAAAAAAAAAAAAAAAAsAAAATAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2025-09-05T16:29:50.778Z", - "EditorCaption": "" - }, - { - "$type": "Document", - "DocumentIndex": 0, - "Title": "ISameApiUnitOfWork.cs", - "DocumentMoniker": "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi.Db\\UnitOfWork\\ISameApiUnitOfWork.cs", - "RelativeDocumentMoniker": "SameApi.Db\\UnitOfWork\\ISameApiUnitOfWork.cs", - "ToolTip": "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi.Db\\UnitOfWork\\ISameApiUnitOfWork.cs", - "RelativeToolTip": "SameApi.Db\\UnitOfWork\\ISameApiUnitOfWork.cs", - "ViewState": "AgIAAAAAAAAAAAAAAAAAAAQAAAAnAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2025-09-05T16:29:41.2Z", - "EditorCaption": "" - } - ] - } - ] - } - ] -} \ No newline at end of file diff --git a/SameApi/SameApi.Business/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs b/SameApi/SameApi.Business/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs deleted file mode 100644 index feda5e9..0000000 --- a/SameApi/SameApi.Business/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs +++ /dev/null @@ -1,4 +0,0 @@ -// -using System; -using System.Reflection; -[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v9.0", FrameworkDisplayName = ".NET 9.0")] diff --git a/SameApi/SameApi.Business/obj/Debug/net9.0/SameApi.Business.AssemblyInfo.cs b/SameApi/SameApi.Business/obj/Debug/net9.0/SameApi.Business.AssemblyInfo.cs deleted file mode 100644 index d80279a..0000000 --- a/SameApi/SameApi.Business/obj/Debug/net9.0/SameApi.Business.AssemblyInfo.cs +++ /dev/null @@ -1,23 +0,0 @@ -//------------------------------------------------------------------------------ -// -// Ce code a été généré par un outil. -// Version du runtime :4.0.30319.42000 -// -// Les modifications apportées à ce fichier peuvent provoquer un comportement incorrect et seront perdues si -// le code est régénéré. -// -//------------------------------------------------------------------------------ - -using System; -using System.Reflection; - -[assembly: System.Reflection.AssemblyCompanyAttribute("SameApi.Business")] -[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] -[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+a64b4febef28275ab85e1ae40dc85ca20fbbfb22")] -[assembly: System.Reflection.AssemblyProductAttribute("SameApi.Business")] -[assembly: System.Reflection.AssemblyTitleAttribute("SameApi.Business")] -[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] - -// Généré par la classe MSBuild WriteCodeFragment. - diff --git a/SameApi/SameApi.Business/obj/Debug/net9.0/SameApi.Business.AssemblyInfoInputs.cache b/SameApi/SameApi.Business/obj/Debug/net9.0/SameApi.Business.AssemblyInfoInputs.cache deleted file mode 100644 index 84354de..0000000 --- a/SameApi/SameApi.Business/obj/Debug/net9.0/SameApi.Business.AssemblyInfoInputs.cache +++ /dev/null @@ -1 +0,0 @@ -1736b53f482080f4da0b1e9026dc924d20bf0c2fb5008257c05a218abfda7f68 diff --git a/SameApi/SameApi.Business/obj/Debug/net9.0/SameApi.Business.GeneratedMSBuildEditorConfig.editorconfig b/SameApi/SameApi.Business/obj/Debug/net9.0/SameApi.Business.GeneratedMSBuildEditorConfig.editorconfig deleted file mode 100644 index 2fdddcd..0000000 --- a/SameApi/SameApi.Business/obj/Debug/net9.0/SameApi.Business.GeneratedMSBuildEditorConfig.editorconfig +++ /dev/null @@ -1,15 +0,0 @@ -is_global = true -build_property.TargetFramework = net9.0 -build_property.TargetPlatformMinVersion = -build_property.UsingMicrosoftNETSdkWeb = -build_property.ProjectTypeGuids = -build_property.InvariantGlobalization = -build_property.PlatformNeutralAssembly = -build_property.EnforceExtendedAnalyzerRules = -build_property._SupportedPlatformList = Linux,macOS,Windows -build_property.RootNamespace = SameApi.Business -build_property.ProjectDir = C:\Users\lefra\Documents\GitHub\Same\SameApi\SameApi.Business\ -build_property.EnableComHosting = -build_property.EnableGeneratedComInterfaceComImportInterop = -build_property.EffectiveAnalysisLevelStyle = 9.0 -build_property.EnableCodeStyleSeverity = diff --git a/SameApi/SameApi.Business/obj/Debug/net9.0/SameApi.Business.GlobalUsings.g.cs b/SameApi/SameApi.Business/obj/Debug/net9.0/SameApi.Business.GlobalUsings.g.cs deleted file mode 100644 index 8578f3d..0000000 --- a/SameApi/SameApi.Business/obj/Debug/net9.0/SameApi.Business.GlobalUsings.g.cs +++ /dev/null @@ -1,8 +0,0 @@ -// -global using global::System; -global using global::System.Collections.Generic; -global using global::System.IO; -global using global::System.Linq; -global using global::System.Net.Http; -global using global::System.Threading; -global using global::System.Threading.Tasks; diff --git a/SameApi/SameApi.Business/obj/Debug/net9.0/SameApi.Business.assets.cache b/SameApi/SameApi.Business/obj/Debug/net9.0/SameApi.Business.assets.cache deleted file mode 100644 index 713f9910e90871fb54d0ee8ee55086ded2306a2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7712 zcmd6sPj4GV6u@2TkfzWA38nmLiA$TdY12s*3OF1Ktk|Qc+cMTzO2XI%`{59(n#LXo0;FfnR)-*_ z{5@Zu{{H8`zTVpT^x5{)fBs~jT>Sml?LYpVt6aNKE4}~U#Zu`s$o+U~?PKdJ$s=j` zd^fT!7PgyQSuNXnWH-6A0?&zr6uXM?PR6`}|ILm)*_KrnB9TXWQT*k8C9(NomW3_9r7+(Rxn6FM1QOP0@}V9%I5c zQ_Km12|r6`p^4|&{aByAw`0LpSJ_g|R>KD4hT`)gv}A)P;rAJ6KO91Jx}!L_(}l@a z$yiibf;pAJM3p@|1ZH}I9NXC&avoz!xIk2Y>Cm-!=rG8aGLU%vpBCTObfJVX;DLxb z2X{A@?m>4DRo=M_*LisV&PaJKZ}HIOq0{lgZ+Q1I7o@B8N7j>(6!Db|;;Zof+fgCv zY){@^>v)Il`)e8aX?PDz_C2!7jD!%8eOQ5QADNb&|WX|i#x$O}B>Jq9=3bH8~ojs5_73m_CYV2s~{cin@A=JH5y zj-zgklwfpwQ2a)YcoH6<>^zZ8&6dtSqV&~~(mi{HayPYdnwyBi9~2cH_|Qw*k@2a; zsr6r{JJu+zpDsRaC@`yCFFgS$gK-vB(_nnI*gaTyV&8&>Zu@O$=pWyKb_v>LXzxOs zg;s%vZhbcAG=oTK17sSJXhJktS@(P{D|5@${pyEv%PXlLtZaL-ZTpo?)pk8$ZSL6- zcddu*4Xzq-go<+=dnmIX^kY>T%8W}0L-1$_V`h_+u)rokQbBv8yPAx^(a`0@LKeb9 zLzZy}RR|glRmM9+A<#5LImXb05YW)X?D!vbNJ8LfNMfWOvrvQ(&`{*qLlDA2Ly!|O z=n$TvA;*Ur^dvXE0{!nny9(_Zv^i+kp^b~dC-~IhBR={@9sUjIH@gu>?GOk&bqENL zxvUQUCiI_}!yvrWVIVK&xH{f>=pP4%LeQy0L3GT0b?CRCf4m(I`6%je@S`v%)_v4% z=r^*su{S6f|0KaXA*2oo2{BjJ5iUT#+4VeXhehD2!$Nq>p>^#Tyqu@`Pu(q=LC?@(+fcKI`tU?Iy(^x1j?6ko z*9OitY_(SpC{_4Lj5hykt MIemKba_~s~51x*>LI3~& diff --git a/SameApi/SameApi.Business/obj/Debug/net9.0/SameApi.Business.csproj.AssemblyReference.cache b/SameApi/SameApi.Business/obj/Debug/net9.0/SameApi.Business.csproj.AssemblyReference.cache deleted file mode 100644 index 41d3c95ec3d644fce59ab4e7287724a35d154f12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6615 zcmds*TSyd99L8tL(v0e%psQurLyFC;Y2|J$C0j<6DOyo5RI{_kZQR)znVGc~qYEig z(M769OX#7@(xRXnWn^}Fh@h9CS|3CodK4ji=%F*0-I>L4I(vKA2A180^D*c9|9|tH zb7nT4k6{=tcwE$e35XKKfku(02tMQoGSy5o0oo5FD#$XTAPJ2!0eG2}!*EOx92dj@ zBZz=<5)Pu0;#e=m1G$oLP&KjPJJjLT(cvCAobYiRj>EfRU)Qgk_db$`<9LCs0-vLd zhF6~Ug(+(Fa~l50IivqM-pF#mMUte)MXF{<)eNbbA){tUTQj6;hJP9vu9}k>l>=dupDJ}I5y!b&Z+JBw(Zm7)vjw}C)=KgANS6^Fn`(TWq;4) z@8PZ^r``4Ui$*UDEy2fs-pGG_wcvJ5$<598ek@wH_`|7*ArLt{Hfwk17v|-bre|Bl zURVDw_kzK<6&G7-`yW1fBe};G9qQ|?J~*>&pi6!?a@P0s^T^K0&KJ4oS9Eohe0_;4 zwR`Y9Tv;6HJBlB*HC0-80HVMOyjv{>;V3Qigg7}Q0yhsrvPg5Kg>@k>$1=M?c%Kje zyqorUotvEHmFt~89}PA-;LYHL=eJZqHp(64Wljt~kEcQzL3<^5Yet6ik`hI(%A_^; zyZb6n=dZ-J9)wwr2xBLn4jSW3CyJ(d)>+DF5WO!Mg0>?8Xivz1R~{RQU})wT%lqTn z7tbtwvdl4QNIklAO83;r+%&v=Xi$yJVpD1C)iGkVhf+^V9mf!l?i86u5!ptiO1EEu8eI(k65Dt(cT3?P!Pija$2K`j8LT;%5*}DY>T1k z5ZOGJ7B)412~uhDmwh}oBD5ewB(^6NoIcPDcpu=IFv~Xqb+Jd}aeGX;E2=c0^ergR zpCz5JhhOiGNvs2&%zaQ>v5hHnzHrj~c+;Ku@ zc!gytbOB=Yh7vzv8G9bx2_leYC)vl{5xZh%2(RSMO?p@2G9y9QrsRZrZu&m3PAAX$ z+!SrFS&fKcYUd^^#|c7do^zJ&0j$qWR!zweu1Te#&}{KCYTAQ+tv1?7!-mol+ceY# zh#01nhPo3(@XSvBmo(HpWe6`RnZ>qQWP_~Cw!ruA>U-Ge8}?}ltBVN?$o{l1)FE4C exe6E>M9x}MS#=Fdh^QIU%hF`?{-f%d0q!s8p!e+n diff --git a/SameApi/SameApi.Business/obj/SameApi.Business.csproj.nuget.dgspec.json b/SameApi/SameApi.Business/obj/SameApi.Business.csproj.nuget.dgspec.json deleted file mode 100644 index a54f484..0000000 --- a/SameApi/SameApi.Business/obj/SameApi.Business.csproj.nuget.dgspec.json +++ /dev/null @@ -1,79 +0,0 @@ -{ - "format": 1, - "restore": { - "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi.Business\\SameApi.Business.csproj": {} - }, - "projects": { - "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi.Business\\SameApi.Business.csproj": { - "version": "1.0.0", - "restore": { - "projectUniqueName": "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi.Business\\SameApi.Business.csproj", - "projectName": "SameApi.Business", - "projectPath": "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi.Business\\SameApi.Business.csproj", - "packagesPath": "C:\\Users\\lefra\\.nuget\\packages\\", - "outputPath": "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi.Business\\obj\\", - "projectStyle": "PackageReference", - "fallbackFolders": [ - "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" - ], - "configFilePaths": [ - "C:\\Users\\lefra\\AppData\\Roaming\\NuGet\\NuGet.Config", - "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", - "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" - ], - "originalTargetFrameworks": [ - "net9.0" - ], - "sources": { - "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, - "https://api.nuget.org/v3/index.json": {} - }, - "frameworks": { - "net9.0": { - "targetAlias": "net9.0", - "projectReferences": {} - } - }, - "warningProperties": { - "warnAsError": [ - "NU1605" - ] - }, - "restoreAuditProperties": { - "enableAudit": "true", - "auditLevel": "low", - "auditMode": "direct" - }, - "SdkAnalysisLevel": "9.0.300" - }, - "frameworks": { - "net9.0": { - "targetAlias": "net9.0", - "dependencies": { - "Microsoft.EntityFrameworkCore": { - "target": "Package", - "version": "[9.0.8, )" - } - }, - "imports": [ - "net461", - "net462", - "net47", - "net471", - "net472", - "net48", - "net481" - ], - "assetTargetFallback": true, - "warn": true, - "frameworkReferences": { - "Microsoft.NETCore.App": { - "privateAssets": "all" - } - }, - "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.304/PortableRuntimeIdentifierGraph.json" - } - } - } - } -} \ No newline at end of file diff --git a/SameApi/SameApi.Business/obj/SameApi.Business.csproj.nuget.g.props b/SameApi/SameApi.Business/obj/SameApi.Business.csproj.nuget.g.props deleted file mode 100644 index 68aeb02..0000000 --- a/SameApi/SameApi.Business/obj/SameApi.Business.csproj.nuget.g.props +++ /dev/null @@ -1,19 +0,0 @@ - - - - True - NuGet - $(MSBuildThisFileDirectory)project.assets.json - $(UserProfile)\.nuget\packages\ - C:\Users\lefra\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages - PackageReference - 6.14.1 - - - - - - - - - \ No newline at end of file diff --git a/SameApi/SameApi.Business/obj/SameApi.Business.csproj.nuget.g.targets b/SameApi/SameApi.Business/obj/SameApi.Business.csproj.nuget.g.targets deleted file mode 100644 index e8c06b7..0000000 --- a/SameApi/SameApi.Business/obj/SameApi.Business.csproj.nuget.g.targets +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/SameApi/SameApi.Business/obj/project.assets.json b/SameApi/SameApi.Business/obj/project.assets.json deleted file mode 100644 index e07c03d..0000000 --- a/SameApi/SameApi.Business/obj/project.assets.json +++ /dev/null @@ -1,615 +0,0 @@ -{ - "version": 3, - "targets": { - "net9.0": { - "Microsoft.EntityFrameworkCore/9.0.8": { - "type": "package", - "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "9.0.8", - "Microsoft.EntityFrameworkCore.Analyzers": "9.0.8", - "Microsoft.Extensions.Caching.Memory": "9.0.8", - "Microsoft.Extensions.Logging": "9.0.8" - }, - "compile": { - "lib/net8.0/Microsoft.EntityFrameworkCore.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net8.0/Microsoft.EntityFrameworkCore.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net8.0/Microsoft.EntityFrameworkCore.props": {} - } - }, - "Microsoft.EntityFrameworkCore.Abstractions/9.0.8": { - "type": "package", - "compile": { - "lib/net8.0/Microsoft.EntityFrameworkCore.Abstractions.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net8.0/Microsoft.EntityFrameworkCore.Abstractions.dll": { - "related": ".xml" - } - } - }, - "Microsoft.EntityFrameworkCore.Analyzers/9.0.8": { - "type": "package" - }, - "Microsoft.Extensions.Caching.Abstractions/9.0.8": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.Primitives": "9.0.8" - }, - "compile": { - "lib/net9.0/Microsoft.Extensions.Caching.Abstractions.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net9.0/Microsoft.Extensions.Caching.Abstractions.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net8.0/_._": {} - } - }, - "Microsoft.Extensions.Caching.Memory/9.0.8": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.Caching.Abstractions": "9.0.8", - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8", - "Microsoft.Extensions.Logging.Abstractions": "9.0.8", - "Microsoft.Extensions.Options": "9.0.8", - "Microsoft.Extensions.Primitives": "9.0.8" - }, - "compile": { - "lib/net9.0/Microsoft.Extensions.Caching.Memory.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net9.0/Microsoft.Extensions.Caching.Memory.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net8.0/_._": {} - } - }, - "Microsoft.Extensions.DependencyInjection/9.0.8": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8" - }, - "compile": { - "lib/net9.0/Microsoft.Extensions.DependencyInjection.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net9.0/Microsoft.Extensions.DependencyInjection.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net8.0/_._": {} - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions/9.0.8": { - "type": "package", - "compile": { - "lib/net9.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net9.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net8.0/_._": {} - } - }, - "Microsoft.Extensions.Logging/9.0.8": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.DependencyInjection": "9.0.8", - "Microsoft.Extensions.Logging.Abstractions": "9.0.8", - "Microsoft.Extensions.Options": "9.0.8" - }, - "compile": { - "lib/net9.0/Microsoft.Extensions.Logging.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net9.0/Microsoft.Extensions.Logging.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net8.0/_._": {} - } - }, - "Microsoft.Extensions.Logging.Abstractions/9.0.8": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8" - }, - "compile": { - "lib/net9.0/Microsoft.Extensions.Logging.Abstractions.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net9.0/Microsoft.Extensions.Logging.Abstractions.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net8.0/Microsoft.Extensions.Logging.Abstractions.targets": {} - } - }, - "Microsoft.Extensions.Options/9.0.8": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8", - "Microsoft.Extensions.Primitives": "9.0.8" - }, - "compile": { - "lib/net9.0/Microsoft.Extensions.Options.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net9.0/Microsoft.Extensions.Options.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net8.0/Microsoft.Extensions.Options.targets": {} - } - }, - "Microsoft.Extensions.Primitives/9.0.8": { - "type": "package", - "compile": { - "lib/net9.0/Microsoft.Extensions.Primitives.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net9.0/Microsoft.Extensions.Primitives.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net8.0/_._": {} - } - } - } - }, - "libraries": { - "Microsoft.EntityFrameworkCore/9.0.8": { - "sha512": "bNGdPhN762+BIIO5MFYLjafRqkSS1MqLOc/erd55InvLnFxt9H3N5JNsuag1ZHyBor1VtD42U0CHpgqkWeAYgQ==", - "type": "package", - "path": "microsoft.entityframeworkcore/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "PACKAGE.md", - "buildTransitive/net8.0/Microsoft.EntityFrameworkCore.props", - "lib/net8.0/Microsoft.EntityFrameworkCore.dll", - "lib/net8.0/Microsoft.EntityFrameworkCore.xml", - "microsoft.entityframeworkcore.9.0.8.nupkg.sha512", - "microsoft.entityframeworkcore.nuspec" - ] - }, - "Microsoft.EntityFrameworkCore.Abstractions/9.0.8": { - "sha512": "B2yfAIQRRAQ4zvvWqh+HudD+juV3YoLlpXnrog3tU0PM9AFpuq6xo0+mEglN1P43WgdcUiF+65CWBcZe35s15Q==", - "type": "package", - "path": "microsoft.entityframeworkcore.abstractions/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "PACKAGE.md", - "lib/net8.0/Microsoft.EntityFrameworkCore.Abstractions.dll", - "lib/net8.0/Microsoft.EntityFrameworkCore.Abstractions.xml", - "microsoft.entityframeworkcore.abstractions.9.0.8.nupkg.sha512", - "microsoft.entityframeworkcore.abstractions.nuspec" - ] - }, - "Microsoft.EntityFrameworkCore.Analyzers/9.0.8": { - "sha512": "2EYStCXt4Hi9p3J3EYMQbItJDtASJd064Kcs8C8hj8Jt5srILrR9qlaL0Ryvk8NrWQoCQvIELsmiuqLEZMLvGA==", - "type": "package", - "path": "microsoft.entityframeworkcore.analyzers/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "analyzers/dotnet/cs/Microsoft.EntityFrameworkCore.Analyzers.dll", - "docs/PACKAGE.md", - "microsoft.entityframeworkcore.analyzers.9.0.8.nupkg.sha512", - "microsoft.entityframeworkcore.analyzers.nuspec" - ] - }, - "Microsoft.Extensions.Caching.Abstractions/9.0.8": { - "sha512": "4h7bsVoKoiK+SlPM+euX/ayGnKZhl47pPCidLTiio9xyG+vgVVfcYxcYQgjm0SCrdSxjG0EGIAKF8EFr3G8Ifw==", - "type": "package", - "path": "microsoft.extensions.caching.abstractions/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/Microsoft.Extensions.Caching.Abstractions.targets", - "buildTransitive/net462/_._", - "buildTransitive/net8.0/_._", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Caching.Abstractions.targets", - "lib/net462/Microsoft.Extensions.Caching.Abstractions.dll", - "lib/net462/Microsoft.Extensions.Caching.Abstractions.xml", - "lib/net8.0/Microsoft.Extensions.Caching.Abstractions.dll", - "lib/net8.0/Microsoft.Extensions.Caching.Abstractions.xml", - "lib/net9.0/Microsoft.Extensions.Caching.Abstractions.dll", - "lib/net9.0/Microsoft.Extensions.Caching.Abstractions.xml", - "lib/netstandard2.0/Microsoft.Extensions.Caching.Abstractions.dll", - "lib/netstandard2.0/Microsoft.Extensions.Caching.Abstractions.xml", - "microsoft.extensions.caching.abstractions.9.0.8.nupkg.sha512", - "microsoft.extensions.caching.abstractions.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.Caching.Memory/9.0.8": { - "sha512": "grR+oPyj8HVn4DT8CFUUdSw2pZZKS13KjytFe4txpHQliGM1GEDotohmjgvyl3hm7RFB3FRqvbouEX3/1ewp5A==", - "type": "package", - "path": "microsoft.extensions.caching.memory/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/Microsoft.Extensions.Caching.Memory.targets", - "buildTransitive/net462/_._", - "buildTransitive/net8.0/_._", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Caching.Memory.targets", - "lib/net462/Microsoft.Extensions.Caching.Memory.dll", - "lib/net462/Microsoft.Extensions.Caching.Memory.xml", - "lib/net8.0/Microsoft.Extensions.Caching.Memory.dll", - "lib/net8.0/Microsoft.Extensions.Caching.Memory.xml", - "lib/net9.0/Microsoft.Extensions.Caching.Memory.dll", - "lib/net9.0/Microsoft.Extensions.Caching.Memory.xml", - "lib/netstandard2.0/Microsoft.Extensions.Caching.Memory.dll", - "lib/netstandard2.0/Microsoft.Extensions.Caching.Memory.xml", - "microsoft.extensions.caching.memory.9.0.8.nupkg.sha512", - "microsoft.extensions.caching.memory.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.DependencyInjection/9.0.8": { - "sha512": "JJjI2Fa+QtZcUyuNjbKn04OjIUX5IgFGFu/Xc+qvzh1rXdZHLcnqqVXhR4093bGirTwacRlHiVg1XYI9xum6QQ==", - "type": "package", - "path": "microsoft.extensions.dependencyinjection/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/Microsoft.Extensions.DependencyInjection.targets", - "buildTransitive/net462/_._", - "buildTransitive/net8.0/_._", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.targets", - "lib/net462/Microsoft.Extensions.DependencyInjection.dll", - "lib/net462/Microsoft.Extensions.DependencyInjection.xml", - "lib/net8.0/Microsoft.Extensions.DependencyInjection.dll", - "lib/net8.0/Microsoft.Extensions.DependencyInjection.xml", - "lib/net9.0/Microsoft.Extensions.DependencyInjection.dll", - "lib/net9.0/Microsoft.Extensions.DependencyInjection.xml", - "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.dll", - "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.xml", - "lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.dll", - "lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.xml", - "microsoft.extensions.dependencyinjection.9.0.8.nupkg.sha512", - "microsoft.extensions.dependencyinjection.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.DependencyInjection.Abstractions/9.0.8": { - "sha512": "xY3lTjj4+ZYmiKIkyWitddrp1uL5uYiweQjqo4BKBw01ZC4HhcfgLghDpPZcUlppgWAFqFy9SgkiYWOMx365pw==", - "type": "package", - "path": "microsoft.extensions.dependencyinjection.abstractions/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/Microsoft.Extensions.DependencyInjection.Abstractions.targets", - "buildTransitive/net462/_._", - "buildTransitive/net8.0/_._", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.Abstractions.targets", - "lib/net462/Microsoft.Extensions.DependencyInjection.Abstractions.dll", - "lib/net462/Microsoft.Extensions.DependencyInjection.Abstractions.xml", - "lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", - "lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml", - "lib/net9.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", - "lib/net9.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml", - "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", - "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml", - "lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.Abstractions.dll", - "lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.Abstractions.xml", - "microsoft.extensions.dependencyinjection.abstractions.9.0.8.nupkg.sha512", - "microsoft.extensions.dependencyinjection.abstractions.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.Logging/9.0.8": { - "sha512": "Z/7ze+0iheT7FJeZPqJKARYvyC2bmwu3whbm/48BJjdlGVvgDguoCqJIkI/67NkroTYobd5geai1WheNQvWrgA==", - "type": "package", - "path": "microsoft.extensions.logging/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/Microsoft.Extensions.Logging.targets", - "buildTransitive/net462/_._", - "buildTransitive/net8.0/_._", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Logging.targets", - "lib/net462/Microsoft.Extensions.Logging.dll", - "lib/net462/Microsoft.Extensions.Logging.xml", - "lib/net8.0/Microsoft.Extensions.Logging.dll", - "lib/net8.0/Microsoft.Extensions.Logging.xml", - "lib/net9.0/Microsoft.Extensions.Logging.dll", - "lib/net9.0/Microsoft.Extensions.Logging.xml", - "lib/netstandard2.0/Microsoft.Extensions.Logging.dll", - "lib/netstandard2.0/Microsoft.Extensions.Logging.xml", - "lib/netstandard2.1/Microsoft.Extensions.Logging.dll", - "lib/netstandard2.1/Microsoft.Extensions.Logging.xml", - "microsoft.extensions.logging.9.0.8.nupkg.sha512", - "microsoft.extensions.logging.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.Logging.Abstractions/9.0.8": { - "sha512": "pYnAffJL7ARD/HCnnPvnFKSIHnTSmWz84WIlT9tPeQ4lHNiu0Az7N/8itihWvcF8sT+VVD5lq8V+ckMzu4SbOw==", - "type": "package", - "path": "microsoft.extensions.logging.abstractions/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "analyzers/dotnet/roslyn3.11/cs/Microsoft.Extensions.Logging.Generators.dll", - "analyzers/dotnet/roslyn3.11/cs/cs/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/de/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/es/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/fr/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/it/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/ja/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/ko/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/pl/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/pt-BR/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/ru/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/tr/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/zh-Hans/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/zh-Hant/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/Microsoft.Extensions.Logging.Generators.dll", - "analyzers/dotnet/roslyn4.0/cs/cs/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/de/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/es/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/fr/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/it/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/ja/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/ko/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/pl/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/pt-BR/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/ru/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/tr/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/zh-Hans/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/zh-Hant/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/Microsoft.Extensions.Logging.Generators.dll", - "analyzers/dotnet/roslyn4.4/cs/cs/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/de/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/es/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/fr/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/it/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/ja/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/ko/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/pl/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/pt-BR/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/ru/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/tr/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/zh-Hans/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/zh-Hant/Microsoft.Extensions.Logging.Generators.resources.dll", - "buildTransitive/net461/Microsoft.Extensions.Logging.Abstractions.targets", - "buildTransitive/net462/Microsoft.Extensions.Logging.Abstractions.targets", - "buildTransitive/net8.0/Microsoft.Extensions.Logging.Abstractions.targets", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Logging.Abstractions.targets", - "buildTransitive/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.targets", - "lib/net462/Microsoft.Extensions.Logging.Abstractions.dll", - "lib/net462/Microsoft.Extensions.Logging.Abstractions.xml", - "lib/net8.0/Microsoft.Extensions.Logging.Abstractions.dll", - "lib/net8.0/Microsoft.Extensions.Logging.Abstractions.xml", - "lib/net9.0/Microsoft.Extensions.Logging.Abstractions.dll", - "lib/net9.0/Microsoft.Extensions.Logging.Abstractions.xml", - "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll", - "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.xml", - "microsoft.extensions.logging.abstractions.9.0.8.nupkg.sha512", - "microsoft.extensions.logging.abstractions.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.Options/9.0.8": { - "sha512": "OmTaQ0v4gxGQkehpwWIqPoEiwsPuG/u4HUsbOFoWGx4DKET2AXzopnFe/fE608FIhzc/kcg2p8JdyMRCCUzitQ==", - "type": "package", - "path": "microsoft.extensions.options/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "analyzers/dotnet/roslyn4.4/cs/Microsoft.Extensions.Options.SourceGeneration.dll", - "analyzers/dotnet/roslyn4.4/cs/cs/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/de/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/es/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/fr/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/it/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/ja/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/ko/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/pl/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/pt-BR/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/ru/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/tr/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/zh-Hans/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/zh-Hant/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "buildTransitive/net461/Microsoft.Extensions.Options.targets", - "buildTransitive/net462/Microsoft.Extensions.Options.targets", - "buildTransitive/net8.0/Microsoft.Extensions.Options.targets", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Options.targets", - "buildTransitive/netstandard2.0/Microsoft.Extensions.Options.targets", - "lib/net462/Microsoft.Extensions.Options.dll", - "lib/net462/Microsoft.Extensions.Options.xml", - "lib/net8.0/Microsoft.Extensions.Options.dll", - "lib/net8.0/Microsoft.Extensions.Options.xml", - "lib/net9.0/Microsoft.Extensions.Options.dll", - "lib/net9.0/Microsoft.Extensions.Options.xml", - "lib/netstandard2.0/Microsoft.Extensions.Options.dll", - "lib/netstandard2.0/Microsoft.Extensions.Options.xml", - "lib/netstandard2.1/Microsoft.Extensions.Options.dll", - "lib/netstandard2.1/Microsoft.Extensions.Options.xml", - "microsoft.extensions.options.9.0.8.nupkg.sha512", - "microsoft.extensions.options.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.Primitives/9.0.8": { - "sha512": "tizSIOEsIgSNSSh+hKeUVPK7xmTIjR8s+mJWOu1KXV3htvNQiPMFRMO17OdI1y/4ZApdBVk49u/08QGC9yvLug==", - "type": "package", - "path": "microsoft.extensions.primitives/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/Microsoft.Extensions.Primitives.targets", - "buildTransitive/net462/_._", - "buildTransitive/net8.0/_._", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Primitives.targets", - "lib/net462/Microsoft.Extensions.Primitives.dll", - "lib/net462/Microsoft.Extensions.Primitives.xml", - "lib/net8.0/Microsoft.Extensions.Primitives.dll", - "lib/net8.0/Microsoft.Extensions.Primitives.xml", - "lib/net9.0/Microsoft.Extensions.Primitives.dll", - "lib/net9.0/Microsoft.Extensions.Primitives.xml", - "lib/netstandard2.0/Microsoft.Extensions.Primitives.dll", - "lib/netstandard2.0/Microsoft.Extensions.Primitives.xml", - "microsoft.extensions.primitives.9.0.8.nupkg.sha512", - "microsoft.extensions.primitives.nuspec", - "useSharedDesignerContext.txt" - ] - } - }, - "projectFileDependencyGroups": { - "net9.0": [ - "Microsoft.EntityFrameworkCore >= 9.0.8" - ] - }, - "packageFolders": { - "C:\\Users\\lefra\\.nuget\\packages\\": {}, - "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages": {} - }, - "project": { - "version": "1.0.0", - "restore": { - "projectUniqueName": "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi.Business\\SameApi.Business.csproj", - "projectName": "SameApi.Business", - "projectPath": "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi.Business\\SameApi.Business.csproj", - "packagesPath": "C:\\Users\\lefra\\.nuget\\packages\\", - "outputPath": "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi.Business\\obj\\", - "projectStyle": "PackageReference", - "fallbackFolders": [ - "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" - ], - "configFilePaths": [ - "C:\\Users\\lefra\\AppData\\Roaming\\NuGet\\NuGet.Config", - "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", - "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" - ], - "originalTargetFrameworks": [ - "net9.0" - ], - "sources": { - "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, - "https://api.nuget.org/v3/index.json": {} - }, - "frameworks": { - "net9.0": { - "targetAlias": "net9.0", - "projectReferences": {} - } - }, - "warningProperties": { - "warnAsError": [ - "NU1605" - ] - }, - "restoreAuditProperties": { - "enableAudit": "true", - "auditLevel": "low", - "auditMode": "direct" - }, - "SdkAnalysisLevel": "9.0.300" - }, - "frameworks": { - "net9.0": { - "targetAlias": "net9.0", - "dependencies": { - "Microsoft.EntityFrameworkCore": { - "target": "Package", - "version": "[9.0.8, )" - } - }, - "imports": [ - "net461", - "net462", - "net47", - "net471", - "net472", - "net48", - "net481" - ], - "assetTargetFallback": true, - "warn": true, - "frameworkReferences": { - "Microsoft.NETCore.App": { - "privateAssets": "all" - } - }, - "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.304/PortableRuntimeIdentifierGraph.json" - } - } - } -} \ No newline at end of file diff --git a/SameApi/SameApi.Business/obj/project.nuget.cache b/SameApi/SameApi.Business/obj/project.nuget.cache deleted file mode 100644 index 1d77b46..0000000 --- a/SameApi/SameApi.Business/obj/project.nuget.cache +++ /dev/null @@ -1,20 +0,0 @@ -{ - "version": 2, - "dgSpecHash": "VU5y6MOv/oc=", - "success": true, - "projectFilePath": "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi.Business\\SameApi.Business.csproj", - "expectedPackageFiles": [ - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.entityframeworkcore\\9.0.8\\microsoft.entityframeworkcore.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.entityframeworkcore.abstractions\\9.0.8\\microsoft.entityframeworkcore.abstractions.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.entityframeworkcore.analyzers\\9.0.8\\microsoft.entityframeworkcore.analyzers.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.extensions.caching.abstractions\\9.0.8\\microsoft.extensions.caching.abstractions.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.extensions.caching.memory\\9.0.8\\microsoft.extensions.caching.memory.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.extensions.dependencyinjection\\9.0.8\\microsoft.extensions.dependencyinjection.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.extensions.dependencyinjection.abstractions\\9.0.8\\microsoft.extensions.dependencyinjection.abstractions.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.extensions.logging\\9.0.8\\microsoft.extensions.logging.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.extensions.logging.abstractions\\9.0.8\\microsoft.extensions.logging.abstractions.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.extensions.options\\9.0.8\\microsoft.extensions.options.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.extensions.primitives\\9.0.8\\microsoft.extensions.primitives.9.0.8.nupkg.sha512" - ], - "logs": [] -} \ No newline at end of file diff --git a/SameApi/SameApi.Db/SameApi.Db.csproj b/SameApi/SameApi.Db/SameApi.Db.csproj index da8dc51..ea94a8c 100644 --- a/SameApi/SameApi.Db/SameApi.Db.csproj +++ b/SameApi/SameApi.Db/SameApi.Db.csproj @@ -12,10 +12,7 @@ - - - - + diff --git a/SameApi/SameApi.Db/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs b/SameApi/SameApi.Db/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs deleted file mode 100644 index feda5e9..0000000 --- a/SameApi/SameApi.Db/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs +++ /dev/null @@ -1,4 +0,0 @@ -// -using System; -using System.Reflection; -[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v9.0", FrameworkDisplayName = ".NET 9.0")] diff --git a/SameApi/SameApi.Db/obj/Debug/net9.0/SameApi.Db.AssemblyInfo.cs b/SameApi/SameApi.Db/obj/Debug/net9.0/SameApi.Db.AssemblyInfo.cs deleted file mode 100644 index 49c5bd4..0000000 --- a/SameApi/SameApi.Db/obj/Debug/net9.0/SameApi.Db.AssemblyInfo.cs +++ /dev/null @@ -1,23 +0,0 @@ -//------------------------------------------------------------------------------ -// -// Ce code a été généré par un outil. -// Version du runtime :4.0.30319.42000 -// -// Les modifications apportées à ce fichier peuvent provoquer un comportement incorrect et seront perdues si -// le code est régénéré. -// -//------------------------------------------------------------------------------ - -using System; -using System.Reflection; - -[assembly: System.Reflection.AssemblyCompanyAttribute("SameApi.Db")] -[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] -[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+a64b4febef28275ab85e1ae40dc85ca20fbbfb22")] -[assembly: System.Reflection.AssemblyProductAttribute("SameApi.Db")] -[assembly: System.Reflection.AssemblyTitleAttribute("SameApi.Db")] -[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] - -// Généré par la classe MSBuild WriteCodeFragment. - diff --git a/SameApi/SameApi.Db/obj/Debug/net9.0/SameApi.Db.AssemblyInfoInputs.cache b/SameApi/SameApi.Db/obj/Debug/net9.0/SameApi.Db.AssemblyInfoInputs.cache deleted file mode 100644 index 01c7514..0000000 --- a/SameApi/SameApi.Db/obj/Debug/net9.0/SameApi.Db.AssemblyInfoInputs.cache +++ /dev/null @@ -1 +0,0 @@ -6a3595a3b9ac6cfec70d0e30014217ec98746b4dd9984b9735d4e6251e94c40e diff --git a/SameApi/SameApi.Db/obj/Debug/net9.0/SameApi.Db.GeneratedMSBuildEditorConfig.editorconfig b/SameApi/SameApi.Db/obj/Debug/net9.0/SameApi.Db.GeneratedMSBuildEditorConfig.editorconfig deleted file mode 100644 index f24b347..0000000 --- a/SameApi/SameApi.Db/obj/Debug/net9.0/SameApi.Db.GeneratedMSBuildEditorConfig.editorconfig +++ /dev/null @@ -1,15 +0,0 @@ -is_global = true -build_property.TargetFramework = net9.0 -build_property.TargetPlatformMinVersion = -build_property.UsingMicrosoftNETSdkWeb = -build_property.ProjectTypeGuids = -build_property.InvariantGlobalization = -build_property.PlatformNeutralAssembly = -build_property.EnforceExtendedAnalyzerRules = -build_property._SupportedPlatformList = Linux,macOS,Windows -build_property.RootNamespace = SameApi.Db -build_property.ProjectDir = C:\Users\lefra\Documents\GitHub\Same\SameApi\SameApi.Db\ -build_property.EnableComHosting = -build_property.EnableGeneratedComInterfaceComImportInterop = -build_property.EffectiveAnalysisLevelStyle = 9.0 -build_property.EnableCodeStyleSeverity = diff --git a/SameApi/SameApi.Db/obj/Debug/net9.0/SameApi.Db.GlobalUsings.g.cs b/SameApi/SameApi.Db/obj/Debug/net9.0/SameApi.Db.GlobalUsings.g.cs deleted file mode 100644 index 8578f3d..0000000 --- a/SameApi/SameApi.Db/obj/Debug/net9.0/SameApi.Db.GlobalUsings.g.cs +++ /dev/null @@ -1,8 +0,0 @@ -// -global using global::System; -global using global::System.Collections.Generic; -global using global::System.IO; -global using global::System.Linq; -global using global::System.Net.Http; -global using global::System.Threading; -global using global::System.Threading.Tasks; diff --git a/SameApi/SameApi.Db/obj/Debug/net9.0/SameApi.Db.assets.cache b/SameApi/SameApi.Db/obj/Debug/net9.0/SameApi.Db.assets.cache deleted file mode 100644 index 3ae93f652072201a13b9f23356860ed1e8f7fd3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7712 zcmd6sPj4GV6u@0@nx-@b8ff{`61O4rPtr{kmEv$qV`5oNTZ@FA_OjWXI7@eT%+72Z zw`YWqxFB)hfP^^02jJ8r-vB-UpMw+c*}LAC_1L?aMu}G%$vb*8^V>Hw@1L9Z>ucvq zrP6Pk=c2ohrk~yW>*b$wwe5v}zFGb$`uq3)YW0_=ul@4Ji+?YbO0R?552w~YH@^}r z6sE^^L(4RRsKun&w(KWXiwV!ywxx+0Ij4!Zl1?)Jmht zc~@6m2aR$5qh8AM8TkZFdz1<_z-!}XY`%&%1Ut9R#DR#QJ%dF+bF@+w<0a$Ih1 z?O7pn%!g5($z~j(;#|ib%Iy37Se1q{;}XIUJQ~92+2kZFut<$A#gM#(Nd3IC_)HmD01u}2;rb1 z$cY$q2+z=v<3kO4lAB(I{%g?YpnVK&9@;0+#>Lx9|wm*(5XW~bj*EK=(nJMyd4htDC%(VqcA5{ zebfTXQip_um@BIY7olJ8dLFgIBJk8dwT zU6H^gXsSIZ-K$8f6rDURxE3y8e3m!2qUeF#dPR?#&T83RQ6IS2t}f)QKV&nm*lnTBZiZO^q`>2+#s*A196v0-_Fo%xap?mcBr zc{_|)8SmM>oC1vB|4&ZwuU^l&O|1#R7S|Y3b+eCcu#$=_bB^;DaFU+EH)***~wXkp&r=lF0oHN*8_17f= P#ik>tPiL4I(vKA2A180^D*c9|9|tH zb7nT4k6{=tcwE$e35XKKfku(02tMQoGSy5o0oo5FD#$XTAPJ2!0eG2}!*EOx92dj@ zBZz=<5)Pu0;#e=m1G$oLP&KjPJJjLT(cvCAobYiRj>EfRU)Qgk_db$`<9LCs0-vLd zhF6~Ug(+(Fa~l50IivqM-pF#mMUte)MXF{<)eNbbA){tUTQj6;hJP9vu9}k>l>=dupDJ}I5y!b&Z+JBw(Zm7)vjw}C)=KgANS6^Fn`(TWq;4) z@8PZ^r``4Ui$*UDEy2fs-pGG_wcvJ5$<598ek@wH_`|7*ArLt{Hfwk17v|-bre|Bl zURVDw_kzK<6&G7-`yW1fBe};G9qQ|?J~*>&pi6!?a@P0s^T^K0&KJ4oS9Eohe0_;4 zwR`Y9Tv;6HJBlB*HC0-80HVMOyjv{>;V3Qigg7}Q0yhsrvPg5Kg>@k>$1=M?c%Kje zyqorUotvEHmFt~89}PA-;LYHL=eJZqHp(64Wljt~kEcQzL3<^5Yet6ik`hI(%A_^; zyZb6n=dZ-J9)wwr2xBLn4jSW3CyJ(d)>+DF5WO!Mg0>?8Xivz1R~{RQU})wT%lqTn z7tbtwvdl4QNIklAO83;r+%&v=Xi$yJVpD1C)iGkVhf+^V9mf!l?i86u5!ptiO1EEu8eI(k65Dt(cT3?P!Pija$2K`j8LT;%5*}DY>T1k z5ZOGJ7B)412~uhDmwh}oBD5ewB(^6NoIcPDcpu=IFv~Xqb+Jd}aeGX;E2=c0^ergR zpCz5JhhOiGNvs2&%zaQ>v5hHnzHrj~c+;Ku@ zc!gytbOB=Yh7vzv8G9bx2_leYC)vl{5xZh%2(RSMO?p@2G9y9QrsRZrZu&m3PAAX$ z+!SrFS&fKcYUd^^#|c7do^zJ&0j$qWR!zweu1Te#&}{KCYTAQ+tv1?7!-mol+ceY# zh#01nhPo3(@XSvBmo(HpWe6`RnZ>qQWP_~Cw!ruA>U-Ge8}?}ltBVN?$o{l1)FE4C exe6E>M9x}MS#=Fdh^QIU%hF`?{-f%d0q!s8p!e+n diff --git a/SameApi/SameApi.Db/obj/SameApi.Db.csproj.nuget.dgspec.json b/SameApi/SameApi.Db/obj/SameApi.Db.csproj.nuget.dgspec.json deleted file mode 100644 index d3c8781..0000000 --- a/SameApi/SameApi.Db/obj/SameApi.Db.csproj.nuget.dgspec.json +++ /dev/null @@ -1,154 +0,0 @@ -{ - "format": 1, - "restore": { - "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi.Db\\SameApi.Db.csproj": {} - }, - "projects": { - "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi.Data\\SameApi.Data.csproj": { - "version": "1.0.0", - "restore": { - "projectUniqueName": "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi.Data\\SameApi.Data.csproj", - "projectName": "SameApi.Data", - "projectPath": "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi.Data\\SameApi.Data.csproj", - "packagesPath": "C:\\Users\\lefra\\.nuget\\packages\\", - "outputPath": "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi.Data\\obj\\", - "projectStyle": "PackageReference", - "fallbackFolders": [ - "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" - ], - "configFilePaths": [ - "C:\\Users\\lefra\\AppData\\Roaming\\NuGet\\NuGet.Config", - "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", - "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" - ], - "originalTargetFrameworks": [ - "net9.0" - ], - "sources": { - "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, - "https://api.nuget.org/v3/index.json": {} - }, - "frameworks": { - "net9.0": { - "targetAlias": "net9.0", - "projectReferences": {} - } - }, - "warningProperties": { - "warnAsError": [ - "NU1605" - ] - }, - "restoreAuditProperties": { - "enableAudit": "true", - "auditLevel": "low", - "auditMode": "direct" - }, - "SdkAnalysisLevel": "9.0.300" - }, - "frameworks": { - "net9.0": { - "targetAlias": "net9.0", - "dependencies": { - "Microsoft.EntityFrameworkCore": { - "target": "Package", - "version": "[9.0.8, )" - } - }, - "imports": [ - "net461", - "net462", - "net47", - "net471", - "net472", - "net48", - "net481" - ], - "assetTargetFallback": true, - "warn": true, - "frameworkReferences": { - "Microsoft.NETCore.App": { - "privateAssets": "all" - } - }, - "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.304/PortableRuntimeIdentifierGraph.json" - } - } - }, - "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi.Db\\SameApi.Db.csproj": { - "version": "1.0.0", - "restore": { - "projectUniqueName": "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi.Db\\SameApi.Db.csproj", - "projectName": "SameApi.Db", - "projectPath": "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi.Db\\SameApi.Db.csproj", - "packagesPath": "C:\\Users\\lefra\\.nuget\\packages\\", - "outputPath": "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi.Db\\obj\\", - "projectStyle": "PackageReference", - "fallbackFolders": [ - "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" - ], - "configFilePaths": [ - "C:\\Users\\lefra\\AppData\\Roaming\\NuGet\\NuGet.Config", - "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", - "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" - ], - "originalTargetFrameworks": [ - "net9.0" - ], - "sources": { - "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, - "https://api.nuget.org/v3/index.json": {} - }, - "frameworks": { - "net9.0": { - "targetAlias": "net9.0", - "projectReferences": { - "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi.Data\\SameApi.Data.csproj": { - "projectPath": "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi.Data\\SameApi.Data.csproj" - } - } - } - }, - "warningProperties": { - "warnAsError": [ - "NU1605" - ] - }, - "restoreAuditProperties": { - "enableAudit": "true", - "auditLevel": "low", - "auditMode": "direct" - }, - "SdkAnalysisLevel": "9.0.300" - }, - "frameworks": { - "net9.0": { - "targetAlias": "net9.0", - "dependencies": { - "Microsoft.EntityFrameworkCore": { - "target": "Package", - "version": "[9.0.8, )" - } - }, - "imports": [ - "net461", - "net462", - "net47", - "net471", - "net472", - "net48", - "net481" - ], - "assetTargetFallback": true, - "warn": true, - "frameworkReferences": { - "Microsoft.NETCore.App": { - "privateAssets": "all" - } - }, - "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.304/PortableRuntimeIdentifierGraph.json" - } - } - } - } -} \ No newline at end of file diff --git a/SameApi/SameApi.Db/obj/SameApi.Db.csproj.nuget.g.props b/SameApi/SameApi.Db/obj/SameApi.Db.csproj.nuget.g.props deleted file mode 100644 index 68aeb02..0000000 --- a/SameApi/SameApi.Db/obj/SameApi.Db.csproj.nuget.g.props +++ /dev/null @@ -1,19 +0,0 @@ - - - - True - NuGet - $(MSBuildThisFileDirectory)project.assets.json - $(UserProfile)\.nuget\packages\ - C:\Users\lefra\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages - PackageReference - 6.14.1 - - - - - - - - - \ No newline at end of file diff --git a/SameApi/SameApi.Db/obj/SameApi.Db.csproj.nuget.g.targets b/SameApi/SameApi.Db/obj/SameApi.Db.csproj.nuget.g.targets deleted file mode 100644 index e8c06b7..0000000 --- a/SameApi/SameApi.Db/obj/SameApi.Db.csproj.nuget.g.targets +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/SameApi/SameApi.Db/obj/project.assets.json b/SameApi/SameApi.Db/obj/project.assets.json deleted file mode 100644 index 390687f..0000000 --- a/SameApi/SameApi.Db/obj/project.assets.json +++ /dev/null @@ -1,638 +0,0 @@ -{ - "version": 3, - "targets": { - "net9.0": { - "Microsoft.EntityFrameworkCore/9.0.8": { - "type": "package", - "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "9.0.8", - "Microsoft.EntityFrameworkCore.Analyzers": "9.0.8", - "Microsoft.Extensions.Caching.Memory": "9.0.8", - "Microsoft.Extensions.Logging": "9.0.8" - }, - "compile": { - "lib/net8.0/Microsoft.EntityFrameworkCore.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net8.0/Microsoft.EntityFrameworkCore.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net8.0/Microsoft.EntityFrameworkCore.props": {} - } - }, - "Microsoft.EntityFrameworkCore.Abstractions/9.0.8": { - "type": "package", - "compile": { - "lib/net8.0/Microsoft.EntityFrameworkCore.Abstractions.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net8.0/Microsoft.EntityFrameworkCore.Abstractions.dll": { - "related": ".xml" - } - } - }, - "Microsoft.EntityFrameworkCore.Analyzers/9.0.8": { - "type": "package" - }, - "Microsoft.Extensions.Caching.Abstractions/9.0.8": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.Primitives": "9.0.8" - }, - "compile": { - "lib/net9.0/Microsoft.Extensions.Caching.Abstractions.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net9.0/Microsoft.Extensions.Caching.Abstractions.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net8.0/_._": {} - } - }, - "Microsoft.Extensions.Caching.Memory/9.0.8": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.Caching.Abstractions": "9.0.8", - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8", - "Microsoft.Extensions.Logging.Abstractions": "9.0.8", - "Microsoft.Extensions.Options": "9.0.8", - "Microsoft.Extensions.Primitives": "9.0.8" - }, - "compile": { - "lib/net9.0/Microsoft.Extensions.Caching.Memory.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net9.0/Microsoft.Extensions.Caching.Memory.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net8.0/_._": {} - } - }, - "Microsoft.Extensions.DependencyInjection/9.0.8": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8" - }, - "compile": { - "lib/net9.0/Microsoft.Extensions.DependencyInjection.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net9.0/Microsoft.Extensions.DependencyInjection.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net8.0/_._": {} - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions/9.0.8": { - "type": "package", - "compile": { - "lib/net9.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net9.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net8.0/_._": {} - } - }, - "Microsoft.Extensions.Logging/9.0.8": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.DependencyInjection": "9.0.8", - "Microsoft.Extensions.Logging.Abstractions": "9.0.8", - "Microsoft.Extensions.Options": "9.0.8" - }, - "compile": { - "lib/net9.0/Microsoft.Extensions.Logging.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net9.0/Microsoft.Extensions.Logging.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net8.0/_._": {} - } - }, - "Microsoft.Extensions.Logging.Abstractions/9.0.8": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8" - }, - "compile": { - "lib/net9.0/Microsoft.Extensions.Logging.Abstractions.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net9.0/Microsoft.Extensions.Logging.Abstractions.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net8.0/Microsoft.Extensions.Logging.Abstractions.targets": {} - } - }, - "Microsoft.Extensions.Options/9.0.8": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8", - "Microsoft.Extensions.Primitives": "9.0.8" - }, - "compile": { - "lib/net9.0/Microsoft.Extensions.Options.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net9.0/Microsoft.Extensions.Options.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net8.0/Microsoft.Extensions.Options.targets": {} - } - }, - "Microsoft.Extensions.Primitives/9.0.8": { - "type": "package", - "compile": { - "lib/net9.0/Microsoft.Extensions.Primitives.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net9.0/Microsoft.Extensions.Primitives.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net8.0/_._": {} - } - }, - "SameApi.Data/1.0.0": { - "type": "project", - "framework": ".NETCoreApp,Version=v9.0", - "dependencies": { - "Microsoft.EntityFrameworkCore": "9.0.8" - }, - "compile": { - "bin/placeholder/SameApi.Data.dll": {} - }, - "runtime": { - "bin/placeholder/SameApi.Data.dll": {} - } - } - } - }, - "libraries": { - "Microsoft.EntityFrameworkCore/9.0.8": { - "sha512": "bNGdPhN762+BIIO5MFYLjafRqkSS1MqLOc/erd55InvLnFxt9H3N5JNsuag1ZHyBor1VtD42U0CHpgqkWeAYgQ==", - "type": "package", - "path": "microsoft.entityframeworkcore/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "PACKAGE.md", - "buildTransitive/net8.0/Microsoft.EntityFrameworkCore.props", - "lib/net8.0/Microsoft.EntityFrameworkCore.dll", - "lib/net8.0/Microsoft.EntityFrameworkCore.xml", - "microsoft.entityframeworkcore.9.0.8.nupkg.sha512", - "microsoft.entityframeworkcore.nuspec" - ] - }, - "Microsoft.EntityFrameworkCore.Abstractions/9.0.8": { - "sha512": "B2yfAIQRRAQ4zvvWqh+HudD+juV3YoLlpXnrog3tU0PM9AFpuq6xo0+mEglN1P43WgdcUiF+65CWBcZe35s15Q==", - "type": "package", - "path": "microsoft.entityframeworkcore.abstractions/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "PACKAGE.md", - "lib/net8.0/Microsoft.EntityFrameworkCore.Abstractions.dll", - "lib/net8.0/Microsoft.EntityFrameworkCore.Abstractions.xml", - "microsoft.entityframeworkcore.abstractions.9.0.8.nupkg.sha512", - "microsoft.entityframeworkcore.abstractions.nuspec" - ] - }, - "Microsoft.EntityFrameworkCore.Analyzers/9.0.8": { - "sha512": "2EYStCXt4Hi9p3J3EYMQbItJDtASJd064Kcs8C8hj8Jt5srILrR9qlaL0Ryvk8NrWQoCQvIELsmiuqLEZMLvGA==", - "type": "package", - "path": "microsoft.entityframeworkcore.analyzers/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "analyzers/dotnet/cs/Microsoft.EntityFrameworkCore.Analyzers.dll", - "docs/PACKAGE.md", - "microsoft.entityframeworkcore.analyzers.9.0.8.nupkg.sha512", - "microsoft.entityframeworkcore.analyzers.nuspec" - ] - }, - "Microsoft.Extensions.Caching.Abstractions/9.0.8": { - "sha512": "4h7bsVoKoiK+SlPM+euX/ayGnKZhl47pPCidLTiio9xyG+vgVVfcYxcYQgjm0SCrdSxjG0EGIAKF8EFr3G8Ifw==", - "type": "package", - "path": "microsoft.extensions.caching.abstractions/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/Microsoft.Extensions.Caching.Abstractions.targets", - "buildTransitive/net462/_._", - "buildTransitive/net8.0/_._", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Caching.Abstractions.targets", - "lib/net462/Microsoft.Extensions.Caching.Abstractions.dll", - "lib/net462/Microsoft.Extensions.Caching.Abstractions.xml", - "lib/net8.0/Microsoft.Extensions.Caching.Abstractions.dll", - "lib/net8.0/Microsoft.Extensions.Caching.Abstractions.xml", - "lib/net9.0/Microsoft.Extensions.Caching.Abstractions.dll", - "lib/net9.0/Microsoft.Extensions.Caching.Abstractions.xml", - "lib/netstandard2.0/Microsoft.Extensions.Caching.Abstractions.dll", - "lib/netstandard2.0/Microsoft.Extensions.Caching.Abstractions.xml", - "microsoft.extensions.caching.abstractions.9.0.8.nupkg.sha512", - "microsoft.extensions.caching.abstractions.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.Caching.Memory/9.0.8": { - "sha512": "grR+oPyj8HVn4DT8CFUUdSw2pZZKS13KjytFe4txpHQliGM1GEDotohmjgvyl3hm7RFB3FRqvbouEX3/1ewp5A==", - "type": "package", - "path": "microsoft.extensions.caching.memory/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/Microsoft.Extensions.Caching.Memory.targets", - "buildTransitive/net462/_._", - "buildTransitive/net8.0/_._", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Caching.Memory.targets", - "lib/net462/Microsoft.Extensions.Caching.Memory.dll", - "lib/net462/Microsoft.Extensions.Caching.Memory.xml", - "lib/net8.0/Microsoft.Extensions.Caching.Memory.dll", - "lib/net8.0/Microsoft.Extensions.Caching.Memory.xml", - "lib/net9.0/Microsoft.Extensions.Caching.Memory.dll", - "lib/net9.0/Microsoft.Extensions.Caching.Memory.xml", - "lib/netstandard2.0/Microsoft.Extensions.Caching.Memory.dll", - "lib/netstandard2.0/Microsoft.Extensions.Caching.Memory.xml", - "microsoft.extensions.caching.memory.9.0.8.nupkg.sha512", - "microsoft.extensions.caching.memory.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.DependencyInjection/9.0.8": { - "sha512": "JJjI2Fa+QtZcUyuNjbKn04OjIUX5IgFGFu/Xc+qvzh1rXdZHLcnqqVXhR4093bGirTwacRlHiVg1XYI9xum6QQ==", - "type": "package", - "path": "microsoft.extensions.dependencyinjection/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/Microsoft.Extensions.DependencyInjection.targets", - "buildTransitive/net462/_._", - "buildTransitive/net8.0/_._", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.targets", - "lib/net462/Microsoft.Extensions.DependencyInjection.dll", - "lib/net462/Microsoft.Extensions.DependencyInjection.xml", - "lib/net8.0/Microsoft.Extensions.DependencyInjection.dll", - "lib/net8.0/Microsoft.Extensions.DependencyInjection.xml", - "lib/net9.0/Microsoft.Extensions.DependencyInjection.dll", - "lib/net9.0/Microsoft.Extensions.DependencyInjection.xml", - "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.dll", - "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.xml", - "lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.dll", - "lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.xml", - "microsoft.extensions.dependencyinjection.9.0.8.nupkg.sha512", - "microsoft.extensions.dependencyinjection.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.DependencyInjection.Abstractions/9.0.8": { - "sha512": "xY3lTjj4+ZYmiKIkyWitddrp1uL5uYiweQjqo4BKBw01ZC4HhcfgLghDpPZcUlppgWAFqFy9SgkiYWOMx365pw==", - "type": "package", - "path": "microsoft.extensions.dependencyinjection.abstractions/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/Microsoft.Extensions.DependencyInjection.Abstractions.targets", - "buildTransitive/net462/_._", - "buildTransitive/net8.0/_._", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.Abstractions.targets", - "lib/net462/Microsoft.Extensions.DependencyInjection.Abstractions.dll", - "lib/net462/Microsoft.Extensions.DependencyInjection.Abstractions.xml", - "lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", - "lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml", - "lib/net9.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", - "lib/net9.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml", - "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", - "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml", - "lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.Abstractions.dll", - "lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.Abstractions.xml", - "microsoft.extensions.dependencyinjection.abstractions.9.0.8.nupkg.sha512", - "microsoft.extensions.dependencyinjection.abstractions.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.Logging/9.0.8": { - "sha512": "Z/7ze+0iheT7FJeZPqJKARYvyC2bmwu3whbm/48BJjdlGVvgDguoCqJIkI/67NkroTYobd5geai1WheNQvWrgA==", - "type": "package", - "path": "microsoft.extensions.logging/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/Microsoft.Extensions.Logging.targets", - "buildTransitive/net462/_._", - "buildTransitive/net8.0/_._", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Logging.targets", - "lib/net462/Microsoft.Extensions.Logging.dll", - "lib/net462/Microsoft.Extensions.Logging.xml", - "lib/net8.0/Microsoft.Extensions.Logging.dll", - "lib/net8.0/Microsoft.Extensions.Logging.xml", - "lib/net9.0/Microsoft.Extensions.Logging.dll", - "lib/net9.0/Microsoft.Extensions.Logging.xml", - "lib/netstandard2.0/Microsoft.Extensions.Logging.dll", - "lib/netstandard2.0/Microsoft.Extensions.Logging.xml", - "lib/netstandard2.1/Microsoft.Extensions.Logging.dll", - "lib/netstandard2.1/Microsoft.Extensions.Logging.xml", - "microsoft.extensions.logging.9.0.8.nupkg.sha512", - "microsoft.extensions.logging.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.Logging.Abstractions/9.0.8": { - "sha512": "pYnAffJL7ARD/HCnnPvnFKSIHnTSmWz84WIlT9tPeQ4lHNiu0Az7N/8itihWvcF8sT+VVD5lq8V+ckMzu4SbOw==", - "type": "package", - "path": "microsoft.extensions.logging.abstractions/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "analyzers/dotnet/roslyn3.11/cs/Microsoft.Extensions.Logging.Generators.dll", - "analyzers/dotnet/roslyn3.11/cs/cs/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/de/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/es/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/fr/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/it/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/ja/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/ko/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/pl/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/pt-BR/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/ru/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/tr/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/zh-Hans/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/zh-Hant/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/Microsoft.Extensions.Logging.Generators.dll", - "analyzers/dotnet/roslyn4.0/cs/cs/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/de/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/es/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/fr/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/it/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/ja/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/ko/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/pl/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/pt-BR/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/ru/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/tr/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/zh-Hans/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/zh-Hant/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/Microsoft.Extensions.Logging.Generators.dll", - "analyzers/dotnet/roslyn4.4/cs/cs/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/de/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/es/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/fr/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/it/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/ja/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/ko/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/pl/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/pt-BR/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/ru/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/tr/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/zh-Hans/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/zh-Hant/Microsoft.Extensions.Logging.Generators.resources.dll", - "buildTransitive/net461/Microsoft.Extensions.Logging.Abstractions.targets", - "buildTransitive/net462/Microsoft.Extensions.Logging.Abstractions.targets", - "buildTransitive/net8.0/Microsoft.Extensions.Logging.Abstractions.targets", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Logging.Abstractions.targets", - "buildTransitive/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.targets", - "lib/net462/Microsoft.Extensions.Logging.Abstractions.dll", - "lib/net462/Microsoft.Extensions.Logging.Abstractions.xml", - "lib/net8.0/Microsoft.Extensions.Logging.Abstractions.dll", - "lib/net8.0/Microsoft.Extensions.Logging.Abstractions.xml", - "lib/net9.0/Microsoft.Extensions.Logging.Abstractions.dll", - "lib/net9.0/Microsoft.Extensions.Logging.Abstractions.xml", - "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll", - "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.xml", - "microsoft.extensions.logging.abstractions.9.0.8.nupkg.sha512", - "microsoft.extensions.logging.abstractions.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.Options/9.0.8": { - "sha512": "OmTaQ0v4gxGQkehpwWIqPoEiwsPuG/u4HUsbOFoWGx4DKET2AXzopnFe/fE608FIhzc/kcg2p8JdyMRCCUzitQ==", - "type": "package", - "path": "microsoft.extensions.options/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "analyzers/dotnet/roslyn4.4/cs/Microsoft.Extensions.Options.SourceGeneration.dll", - "analyzers/dotnet/roslyn4.4/cs/cs/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/de/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/es/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/fr/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/it/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/ja/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/ko/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/pl/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/pt-BR/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/ru/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/tr/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/zh-Hans/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/zh-Hant/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "buildTransitive/net461/Microsoft.Extensions.Options.targets", - "buildTransitive/net462/Microsoft.Extensions.Options.targets", - "buildTransitive/net8.0/Microsoft.Extensions.Options.targets", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Options.targets", - "buildTransitive/netstandard2.0/Microsoft.Extensions.Options.targets", - "lib/net462/Microsoft.Extensions.Options.dll", - "lib/net462/Microsoft.Extensions.Options.xml", - "lib/net8.0/Microsoft.Extensions.Options.dll", - "lib/net8.0/Microsoft.Extensions.Options.xml", - "lib/net9.0/Microsoft.Extensions.Options.dll", - "lib/net9.0/Microsoft.Extensions.Options.xml", - "lib/netstandard2.0/Microsoft.Extensions.Options.dll", - "lib/netstandard2.0/Microsoft.Extensions.Options.xml", - "lib/netstandard2.1/Microsoft.Extensions.Options.dll", - "lib/netstandard2.1/Microsoft.Extensions.Options.xml", - "microsoft.extensions.options.9.0.8.nupkg.sha512", - "microsoft.extensions.options.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.Primitives/9.0.8": { - "sha512": "tizSIOEsIgSNSSh+hKeUVPK7xmTIjR8s+mJWOu1KXV3htvNQiPMFRMO17OdI1y/4ZApdBVk49u/08QGC9yvLug==", - "type": "package", - "path": "microsoft.extensions.primitives/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/Microsoft.Extensions.Primitives.targets", - "buildTransitive/net462/_._", - "buildTransitive/net8.0/_._", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Primitives.targets", - "lib/net462/Microsoft.Extensions.Primitives.dll", - "lib/net462/Microsoft.Extensions.Primitives.xml", - "lib/net8.0/Microsoft.Extensions.Primitives.dll", - "lib/net8.0/Microsoft.Extensions.Primitives.xml", - "lib/net9.0/Microsoft.Extensions.Primitives.dll", - "lib/net9.0/Microsoft.Extensions.Primitives.xml", - "lib/netstandard2.0/Microsoft.Extensions.Primitives.dll", - "lib/netstandard2.0/Microsoft.Extensions.Primitives.xml", - "microsoft.extensions.primitives.9.0.8.nupkg.sha512", - "microsoft.extensions.primitives.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "SameApi.Data/1.0.0": { - "type": "project", - "path": "../SameApi.Data/SameApi.Data.csproj", - "msbuildProject": "../SameApi.Data/SameApi.Data.csproj" - } - }, - "projectFileDependencyGroups": { - "net9.0": [ - "Microsoft.EntityFrameworkCore >= 9.0.8", - "SameApi.Data >= 1.0.0" - ] - }, - "packageFolders": { - "C:\\Users\\lefra\\.nuget\\packages\\": {}, - "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages": {} - }, - "project": { - "version": "1.0.0", - "restore": { - "projectUniqueName": "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi.Db\\SameApi.Db.csproj", - "projectName": "SameApi.Db", - "projectPath": "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi.Db\\SameApi.Db.csproj", - "packagesPath": "C:\\Users\\lefra\\.nuget\\packages\\", - "outputPath": "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi.Db\\obj\\", - "projectStyle": "PackageReference", - "fallbackFolders": [ - "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" - ], - "configFilePaths": [ - "C:\\Users\\lefra\\AppData\\Roaming\\NuGet\\NuGet.Config", - "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", - "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" - ], - "originalTargetFrameworks": [ - "net9.0" - ], - "sources": { - "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, - "https://api.nuget.org/v3/index.json": {} - }, - "frameworks": { - "net9.0": { - "targetAlias": "net9.0", - "projectReferences": { - "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi.Data\\SameApi.Data.csproj": { - "projectPath": "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi.Data\\SameApi.Data.csproj" - } - } - } - }, - "warningProperties": { - "warnAsError": [ - "NU1605" - ] - }, - "restoreAuditProperties": { - "enableAudit": "true", - "auditLevel": "low", - "auditMode": "direct" - }, - "SdkAnalysisLevel": "9.0.300" - }, - "frameworks": { - "net9.0": { - "targetAlias": "net9.0", - "dependencies": { - "Microsoft.EntityFrameworkCore": { - "target": "Package", - "version": "[9.0.8, )" - } - }, - "imports": [ - "net461", - "net462", - "net47", - "net471", - "net472", - "net48", - "net481" - ], - "assetTargetFallback": true, - "warn": true, - "frameworkReferences": { - "Microsoft.NETCore.App": { - "privateAssets": "all" - } - }, - "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.304/PortableRuntimeIdentifierGraph.json" - } - } - } -} \ No newline at end of file diff --git a/SameApi/SameApi.Db/obj/project.nuget.cache b/SameApi/SameApi.Db/obj/project.nuget.cache deleted file mode 100644 index 6692863..0000000 --- a/SameApi/SameApi.Db/obj/project.nuget.cache +++ /dev/null @@ -1,20 +0,0 @@ -{ - "version": 2, - "dgSpecHash": "BN5gRR5zNns=", - "success": true, - "projectFilePath": "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi.Db\\SameApi.Db.csproj", - "expectedPackageFiles": [ - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.entityframeworkcore\\9.0.8\\microsoft.entityframeworkcore.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.entityframeworkcore.abstractions\\9.0.8\\microsoft.entityframeworkcore.abstractions.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.entityframeworkcore.analyzers\\9.0.8\\microsoft.entityframeworkcore.analyzers.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.extensions.caching.abstractions\\9.0.8\\microsoft.extensions.caching.abstractions.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.extensions.caching.memory\\9.0.8\\microsoft.extensions.caching.memory.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.extensions.dependencyinjection\\9.0.8\\microsoft.extensions.dependencyinjection.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.extensions.dependencyinjection.abstractions\\9.0.8\\microsoft.extensions.dependencyinjection.abstractions.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.extensions.logging\\9.0.8\\microsoft.extensions.logging.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.extensions.logging.abstractions\\9.0.8\\microsoft.extensions.logging.abstractions.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.extensions.options\\9.0.8\\microsoft.extensions.options.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.extensions.primitives\\9.0.8\\microsoft.extensions.primitives.9.0.8.nupkg.sha512" - ], - "logs": [] -} \ No newline at end of file diff --git a/SameApi/SameApi.Dto/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs b/SameApi/SameApi.Dto/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs deleted file mode 100644 index feda5e9..0000000 --- a/SameApi/SameApi.Dto/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs +++ /dev/null @@ -1,4 +0,0 @@ -// -using System; -using System.Reflection; -[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v9.0", FrameworkDisplayName = ".NET 9.0")] diff --git a/SameApi/SameApi.Dto/obj/Debug/net9.0/SameApi.Dto.AssemblyInfo.cs b/SameApi/SameApi.Dto/obj/Debug/net9.0/SameApi.Dto.AssemblyInfo.cs deleted file mode 100644 index 2d797cd..0000000 --- a/SameApi/SameApi.Dto/obj/Debug/net9.0/SameApi.Dto.AssemblyInfo.cs +++ /dev/null @@ -1,23 +0,0 @@ -//------------------------------------------------------------------------------ -// -// Ce code a été généré par un outil. -// Version du runtime :4.0.30319.42000 -// -// Les modifications apportées à ce fichier peuvent provoquer un comportement incorrect et seront perdues si -// le code est régénéré. -// -//------------------------------------------------------------------------------ - -using System; -using System.Reflection; - -[assembly: System.Reflection.AssemblyCompanyAttribute("SameApi.Dto")] -[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] -[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+a64b4febef28275ab85e1ae40dc85ca20fbbfb22")] -[assembly: System.Reflection.AssemblyProductAttribute("SameApi.Dto")] -[assembly: System.Reflection.AssemblyTitleAttribute("SameApi.Dto")] -[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] - -// Généré par la classe MSBuild WriteCodeFragment. - diff --git a/SameApi/SameApi.Dto/obj/Debug/net9.0/SameApi.Dto.AssemblyInfoInputs.cache b/SameApi/SameApi.Dto/obj/Debug/net9.0/SameApi.Dto.AssemblyInfoInputs.cache deleted file mode 100644 index cae6187..0000000 --- a/SameApi/SameApi.Dto/obj/Debug/net9.0/SameApi.Dto.AssemblyInfoInputs.cache +++ /dev/null @@ -1 +0,0 @@ -77fb650b04d77768b7808bb1845d38d9937f33f3d2344c2afb88f2fc151f123d diff --git a/SameApi/SameApi.Dto/obj/Debug/net9.0/SameApi.Dto.GeneratedMSBuildEditorConfig.editorconfig b/SameApi/SameApi.Dto/obj/Debug/net9.0/SameApi.Dto.GeneratedMSBuildEditorConfig.editorconfig deleted file mode 100644 index 5337c3e..0000000 --- a/SameApi/SameApi.Dto/obj/Debug/net9.0/SameApi.Dto.GeneratedMSBuildEditorConfig.editorconfig +++ /dev/null @@ -1,15 +0,0 @@ -is_global = true -build_property.TargetFramework = net9.0 -build_property.TargetPlatformMinVersion = -build_property.UsingMicrosoftNETSdkWeb = -build_property.ProjectTypeGuids = -build_property.InvariantGlobalization = -build_property.PlatformNeutralAssembly = -build_property.EnforceExtendedAnalyzerRules = -build_property._SupportedPlatformList = Linux,macOS,Windows -build_property.RootNamespace = SameApi.Dto -build_property.ProjectDir = C:\Users\lefra\Documents\GitHub\Same\SameApi\SameApi.Dto\ -build_property.EnableComHosting = -build_property.EnableGeneratedComInterfaceComImportInterop = -build_property.EffectiveAnalysisLevelStyle = 9.0 -build_property.EnableCodeStyleSeverity = diff --git a/SameApi/SameApi.Dto/obj/Debug/net9.0/SameApi.Dto.GlobalUsings.g.cs b/SameApi/SameApi.Dto/obj/Debug/net9.0/SameApi.Dto.GlobalUsings.g.cs deleted file mode 100644 index 8578f3d..0000000 --- a/SameApi/SameApi.Dto/obj/Debug/net9.0/SameApi.Dto.GlobalUsings.g.cs +++ /dev/null @@ -1,8 +0,0 @@ -// -global using global::System; -global using global::System.Collections.Generic; -global using global::System.IO; -global using global::System.Linq; -global using global::System.Net.Http; -global using global::System.Threading; -global using global::System.Threading.Tasks; diff --git a/SameApi/SameApi.Dto/obj/Debug/net9.0/SameApi.Dto.assets.cache b/SameApi/SameApi.Dto/obj/Debug/net9.0/SameApi.Dto.assets.cache deleted file mode 100644 index 494983b7bda2f61aa3e1be12aa39509bcb06bf54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7712 zcmd6s&2Jk;6u@0@NCW+VhL6$@;!;At(oGZvu#q@~ghW=;)*_{+y=-XBvh%lp31dSdqAqnwU!&4y*)uFS346J ztGpT7EW(6urkEoH6Mh!ngvMWG_al9J?wSc(T{dPiwi-4VHx!>Ypv4db56R&?#OC9k|G{X zA-)aozwQ*G%JyXKwTidjzQ2=#KLYQ*&b~*sGN(#oTS%_Sc#7m*c-Olo1I%`o>SC^b z>Y`Q}P0o9|>e_0ov#?^zOw>gUF_OFwP3UY~BXoUNx;Md1cie9lOszYB-U0{(wix51 z@UD8$(3~9T&2iNEff5GY9uz;5As&YZD0_~`CT2@zA5r@BK(`&=6!#3_65oXvp!Q20hMAPeK33&`v}91llCDPoWKq!6*3C;3GczMiu@U=-0au zJM9n%Jaq^NkGZT0{w(zGnZqEw)L|em=C~@}bI?Bw4uzmohl1#s`>N2-L;r9)9P&}r z;owJMPOSQ<3(&7+aU*Y#GyaK#cS1-V5)xvrtRkF(e!c6t(+-QkQ-_7{m_w`JFG9bT zdi5L{A*2os2{E@;5gO3H>kf}_Qiq3}m~*Q*r=g!dGw^bV=08;@Zw5V1hh2x7J=BLs z+UZ^X%yVGYIk+}(ux81PY7nJuQ&6gy?o^GZNut`DfMTIy8zqHG?s;h;0vAy$L6yOj zqcuQxlznhT0+*nvcCU1&A~BnH@}%IJyMXaU*4&Ds2XgBbJr;FVOYe&Mz(scTLe>hz z{$_4kESo0CT!d8kvT80y7I0FYLA@8Rz<+I{(N!I+!d~g*!b~Y=?Q{4mxrNg>CFRKY WoWcI8zb+QYHyt^BYV)%7Nc|60OTc*m diff --git a/SameApi/SameApi.Dto/obj/Debug/net9.0/SameApi.Dto.csproj.AssemblyReference.cache b/SameApi/SameApi.Dto/obj/Debug/net9.0/SameApi.Dto.csproj.AssemblyReference.cache deleted file mode 100644 index 41d3c95ec3d644fce59ab4e7287724a35d154f12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6615 zcmds*TSyd99L8tL(v0e%psQurLyFC;Y2|J$C0j<6DOyo5RI{_kZQR)znVGc~qYEig z(M769OX#7@(xRXnWn^}Fh@h9CS|3CodK4ji=%F*0-I>L4I(vKA2A180^D*c9|9|tH zb7nT4k6{=tcwE$e35XKKfku(02tMQoGSy5o0oo5FD#$XTAPJ2!0eG2}!*EOx92dj@ zBZz=<5)Pu0;#e=m1G$oLP&KjPJJjLT(cvCAobYiRj>EfRU)Qgk_db$`<9LCs0-vLd zhF6~Ug(+(Fa~l50IivqM-pF#mMUte)MXF{<)eNbbA){tUTQj6;hJP9vu9}k>l>=dupDJ}I5y!b&Z+JBw(Zm7)vjw}C)=KgANS6^Fn`(TWq;4) z@8PZ^r``4Ui$*UDEy2fs-pGG_wcvJ5$<598ek@wH_`|7*ArLt{Hfwk17v|-bre|Bl zURVDw_kzK<6&G7-`yW1fBe};G9qQ|?J~*>&pi6!?a@P0s^T^K0&KJ4oS9Eohe0_;4 zwR`Y9Tv;6HJBlB*HC0-80HVMOyjv{>;V3Qigg7}Q0yhsrvPg5Kg>@k>$1=M?c%Kje zyqorUotvEHmFt~89}PA-;LYHL=eJZqHp(64Wljt~kEcQzL3<^5Yet6ik`hI(%A_^; zyZb6n=dZ-J9)wwr2xBLn4jSW3CyJ(d)>+DF5WO!Mg0>?8Xivz1R~{RQU})wT%lqTn z7tbtwvdl4QNIklAO83;r+%&v=Xi$yJVpD1C)iGkVhf+^V9mf!l?i86u5!ptiO1EEu8eI(k65Dt(cT3?P!Pija$2K`j8LT;%5*}DY>T1k z5ZOGJ7B)412~uhDmwh}oBD5ewB(^6NoIcPDcpu=IFv~Xqb+Jd}aeGX;E2=c0^ergR zpCz5JhhOiGNvs2&%zaQ>v5hHnzHrj~c+;Ku@ zc!gytbOB=Yh7vzv8G9bx2_leYC)vl{5xZh%2(RSMO?p@2G9y9QrsRZrZu&m3PAAX$ z+!SrFS&fKcYUd^^#|c7do^zJ&0j$qWR!zweu1Te#&}{KCYTAQ+tv1?7!-mol+ceY# zh#01nhPo3(@XSvBmo(HpWe6`RnZ>qQWP_~Cw!ruA>U-Ge8}?}ltBVN?$o{l1)FE4C exe6E>M9x}MS#=Fdh^QIU%hF`?{-f%d0q!s8p!e+n diff --git a/SameApi/SameApi.Dto/obj/SameApi.Dto.csproj.nuget.dgspec.json b/SameApi/SameApi.Dto/obj/SameApi.Dto.csproj.nuget.dgspec.json deleted file mode 100644 index 6ee6161..0000000 --- a/SameApi/SameApi.Dto/obj/SameApi.Dto.csproj.nuget.dgspec.json +++ /dev/null @@ -1,79 +0,0 @@ -{ - "format": 1, - "restore": { - "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi.Dto\\SameApi.Dto.csproj": {} - }, - "projects": { - "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi.Dto\\SameApi.Dto.csproj": { - "version": "1.0.0", - "restore": { - "projectUniqueName": "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi.Dto\\SameApi.Dto.csproj", - "projectName": "SameApi.Dto", - "projectPath": "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi.Dto\\SameApi.Dto.csproj", - "packagesPath": "C:\\Users\\lefra\\.nuget\\packages\\", - "outputPath": "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi.Dto\\obj\\", - "projectStyle": "PackageReference", - "fallbackFolders": [ - "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" - ], - "configFilePaths": [ - "C:\\Users\\lefra\\AppData\\Roaming\\NuGet\\NuGet.Config", - "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", - "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" - ], - "originalTargetFrameworks": [ - "net9.0" - ], - "sources": { - "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, - "https://api.nuget.org/v3/index.json": {} - }, - "frameworks": { - "net9.0": { - "targetAlias": "net9.0", - "projectReferences": {} - } - }, - "warningProperties": { - "warnAsError": [ - "NU1605" - ] - }, - "restoreAuditProperties": { - "enableAudit": "true", - "auditLevel": "low", - "auditMode": "direct" - }, - "SdkAnalysisLevel": "9.0.300" - }, - "frameworks": { - "net9.0": { - "targetAlias": "net9.0", - "dependencies": { - "Microsoft.EntityFrameworkCore": { - "target": "Package", - "version": "[9.0.8, )" - } - }, - "imports": [ - "net461", - "net462", - "net47", - "net471", - "net472", - "net48", - "net481" - ], - "assetTargetFallback": true, - "warn": true, - "frameworkReferences": { - "Microsoft.NETCore.App": { - "privateAssets": "all" - } - }, - "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.304/PortableRuntimeIdentifierGraph.json" - } - } - } - } -} \ No newline at end of file diff --git a/SameApi/SameApi.Dto/obj/SameApi.Dto.csproj.nuget.g.props b/SameApi/SameApi.Dto/obj/SameApi.Dto.csproj.nuget.g.props deleted file mode 100644 index 68aeb02..0000000 --- a/SameApi/SameApi.Dto/obj/SameApi.Dto.csproj.nuget.g.props +++ /dev/null @@ -1,19 +0,0 @@ - - - - True - NuGet - $(MSBuildThisFileDirectory)project.assets.json - $(UserProfile)\.nuget\packages\ - C:\Users\lefra\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages - PackageReference - 6.14.1 - - - - - - - - - \ No newline at end of file diff --git a/SameApi/SameApi.Dto/obj/SameApi.Dto.csproj.nuget.g.targets b/SameApi/SameApi.Dto/obj/SameApi.Dto.csproj.nuget.g.targets deleted file mode 100644 index e8c06b7..0000000 --- a/SameApi/SameApi.Dto/obj/SameApi.Dto.csproj.nuget.g.targets +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/SameApi/SameApi.Dto/obj/project.assets.json b/SameApi/SameApi.Dto/obj/project.assets.json deleted file mode 100644 index 14f545a..0000000 --- a/SameApi/SameApi.Dto/obj/project.assets.json +++ /dev/null @@ -1,615 +0,0 @@ -{ - "version": 3, - "targets": { - "net9.0": { - "Microsoft.EntityFrameworkCore/9.0.8": { - "type": "package", - "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "9.0.8", - "Microsoft.EntityFrameworkCore.Analyzers": "9.0.8", - "Microsoft.Extensions.Caching.Memory": "9.0.8", - "Microsoft.Extensions.Logging": "9.0.8" - }, - "compile": { - "lib/net8.0/Microsoft.EntityFrameworkCore.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net8.0/Microsoft.EntityFrameworkCore.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net8.0/Microsoft.EntityFrameworkCore.props": {} - } - }, - "Microsoft.EntityFrameworkCore.Abstractions/9.0.8": { - "type": "package", - "compile": { - "lib/net8.0/Microsoft.EntityFrameworkCore.Abstractions.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net8.0/Microsoft.EntityFrameworkCore.Abstractions.dll": { - "related": ".xml" - } - } - }, - "Microsoft.EntityFrameworkCore.Analyzers/9.0.8": { - "type": "package" - }, - "Microsoft.Extensions.Caching.Abstractions/9.0.8": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.Primitives": "9.0.8" - }, - "compile": { - "lib/net9.0/Microsoft.Extensions.Caching.Abstractions.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net9.0/Microsoft.Extensions.Caching.Abstractions.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net8.0/_._": {} - } - }, - "Microsoft.Extensions.Caching.Memory/9.0.8": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.Caching.Abstractions": "9.0.8", - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8", - "Microsoft.Extensions.Logging.Abstractions": "9.0.8", - "Microsoft.Extensions.Options": "9.0.8", - "Microsoft.Extensions.Primitives": "9.0.8" - }, - "compile": { - "lib/net9.0/Microsoft.Extensions.Caching.Memory.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net9.0/Microsoft.Extensions.Caching.Memory.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net8.0/_._": {} - } - }, - "Microsoft.Extensions.DependencyInjection/9.0.8": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8" - }, - "compile": { - "lib/net9.0/Microsoft.Extensions.DependencyInjection.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net9.0/Microsoft.Extensions.DependencyInjection.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net8.0/_._": {} - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions/9.0.8": { - "type": "package", - "compile": { - "lib/net9.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net9.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net8.0/_._": {} - } - }, - "Microsoft.Extensions.Logging/9.0.8": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.DependencyInjection": "9.0.8", - "Microsoft.Extensions.Logging.Abstractions": "9.0.8", - "Microsoft.Extensions.Options": "9.0.8" - }, - "compile": { - "lib/net9.0/Microsoft.Extensions.Logging.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net9.0/Microsoft.Extensions.Logging.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net8.0/_._": {} - } - }, - "Microsoft.Extensions.Logging.Abstractions/9.0.8": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8" - }, - "compile": { - "lib/net9.0/Microsoft.Extensions.Logging.Abstractions.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net9.0/Microsoft.Extensions.Logging.Abstractions.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net8.0/Microsoft.Extensions.Logging.Abstractions.targets": {} - } - }, - "Microsoft.Extensions.Options/9.0.8": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8", - "Microsoft.Extensions.Primitives": "9.0.8" - }, - "compile": { - "lib/net9.0/Microsoft.Extensions.Options.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net9.0/Microsoft.Extensions.Options.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net8.0/Microsoft.Extensions.Options.targets": {} - } - }, - "Microsoft.Extensions.Primitives/9.0.8": { - "type": "package", - "compile": { - "lib/net9.0/Microsoft.Extensions.Primitives.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net9.0/Microsoft.Extensions.Primitives.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net8.0/_._": {} - } - } - } - }, - "libraries": { - "Microsoft.EntityFrameworkCore/9.0.8": { - "sha512": "bNGdPhN762+BIIO5MFYLjafRqkSS1MqLOc/erd55InvLnFxt9H3N5JNsuag1ZHyBor1VtD42U0CHpgqkWeAYgQ==", - "type": "package", - "path": "microsoft.entityframeworkcore/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "PACKAGE.md", - "buildTransitive/net8.0/Microsoft.EntityFrameworkCore.props", - "lib/net8.0/Microsoft.EntityFrameworkCore.dll", - "lib/net8.0/Microsoft.EntityFrameworkCore.xml", - "microsoft.entityframeworkcore.9.0.8.nupkg.sha512", - "microsoft.entityframeworkcore.nuspec" - ] - }, - "Microsoft.EntityFrameworkCore.Abstractions/9.0.8": { - "sha512": "B2yfAIQRRAQ4zvvWqh+HudD+juV3YoLlpXnrog3tU0PM9AFpuq6xo0+mEglN1P43WgdcUiF+65CWBcZe35s15Q==", - "type": "package", - "path": "microsoft.entityframeworkcore.abstractions/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "PACKAGE.md", - "lib/net8.0/Microsoft.EntityFrameworkCore.Abstractions.dll", - "lib/net8.0/Microsoft.EntityFrameworkCore.Abstractions.xml", - "microsoft.entityframeworkcore.abstractions.9.0.8.nupkg.sha512", - "microsoft.entityframeworkcore.abstractions.nuspec" - ] - }, - "Microsoft.EntityFrameworkCore.Analyzers/9.0.8": { - "sha512": "2EYStCXt4Hi9p3J3EYMQbItJDtASJd064Kcs8C8hj8Jt5srILrR9qlaL0Ryvk8NrWQoCQvIELsmiuqLEZMLvGA==", - "type": "package", - "path": "microsoft.entityframeworkcore.analyzers/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "analyzers/dotnet/cs/Microsoft.EntityFrameworkCore.Analyzers.dll", - "docs/PACKAGE.md", - "microsoft.entityframeworkcore.analyzers.9.0.8.nupkg.sha512", - "microsoft.entityframeworkcore.analyzers.nuspec" - ] - }, - "Microsoft.Extensions.Caching.Abstractions/9.0.8": { - "sha512": "4h7bsVoKoiK+SlPM+euX/ayGnKZhl47pPCidLTiio9xyG+vgVVfcYxcYQgjm0SCrdSxjG0EGIAKF8EFr3G8Ifw==", - "type": "package", - "path": "microsoft.extensions.caching.abstractions/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/Microsoft.Extensions.Caching.Abstractions.targets", - "buildTransitive/net462/_._", - "buildTransitive/net8.0/_._", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Caching.Abstractions.targets", - "lib/net462/Microsoft.Extensions.Caching.Abstractions.dll", - "lib/net462/Microsoft.Extensions.Caching.Abstractions.xml", - "lib/net8.0/Microsoft.Extensions.Caching.Abstractions.dll", - "lib/net8.0/Microsoft.Extensions.Caching.Abstractions.xml", - "lib/net9.0/Microsoft.Extensions.Caching.Abstractions.dll", - "lib/net9.0/Microsoft.Extensions.Caching.Abstractions.xml", - "lib/netstandard2.0/Microsoft.Extensions.Caching.Abstractions.dll", - "lib/netstandard2.0/Microsoft.Extensions.Caching.Abstractions.xml", - "microsoft.extensions.caching.abstractions.9.0.8.nupkg.sha512", - "microsoft.extensions.caching.abstractions.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.Caching.Memory/9.0.8": { - "sha512": "grR+oPyj8HVn4DT8CFUUdSw2pZZKS13KjytFe4txpHQliGM1GEDotohmjgvyl3hm7RFB3FRqvbouEX3/1ewp5A==", - "type": "package", - "path": "microsoft.extensions.caching.memory/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/Microsoft.Extensions.Caching.Memory.targets", - "buildTransitive/net462/_._", - "buildTransitive/net8.0/_._", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Caching.Memory.targets", - "lib/net462/Microsoft.Extensions.Caching.Memory.dll", - "lib/net462/Microsoft.Extensions.Caching.Memory.xml", - "lib/net8.0/Microsoft.Extensions.Caching.Memory.dll", - "lib/net8.0/Microsoft.Extensions.Caching.Memory.xml", - "lib/net9.0/Microsoft.Extensions.Caching.Memory.dll", - "lib/net9.0/Microsoft.Extensions.Caching.Memory.xml", - "lib/netstandard2.0/Microsoft.Extensions.Caching.Memory.dll", - "lib/netstandard2.0/Microsoft.Extensions.Caching.Memory.xml", - "microsoft.extensions.caching.memory.9.0.8.nupkg.sha512", - "microsoft.extensions.caching.memory.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.DependencyInjection/9.0.8": { - "sha512": "JJjI2Fa+QtZcUyuNjbKn04OjIUX5IgFGFu/Xc+qvzh1rXdZHLcnqqVXhR4093bGirTwacRlHiVg1XYI9xum6QQ==", - "type": "package", - "path": "microsoft.extensions.dependencyinjection/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/Microsoft.Extensions.DependencyInjection.targets", - "buildTransitive/net462/_._", - "buildTransitive/net8.0/_._", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.targets", - "lib/net462/Microsoft.Extensions.DependencyInjection.dll", - "lib/net462/Microsoft.Extensions.DependencyInjection.xml", - "lib/net8.0/Microsoft.Extensions.DependencyInjection.dll", - "lib/net8.0/Microsoft.Extensions.DependencyInjection.xml", - "lib/net9.0/Microsoft.Extensions.DependencyInjection.dll", - "lib/net9.0/Microsoft.Extensions.DependencyInjection.xml", - "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.dll", - "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.xml", - "lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.dll", - "lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.xml", - "microsoft.extensions.dependencyinjection.9.0.8.nupkg.sha512", - "microsoft.extensions.dependencyinjection.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.DependencyInjection.Abstractions/9.0.8": { - "sha512": "xY3lTjj4+ZYmiKIkyWitddrp1uL5uYiweQjqo4BKBw01ZC4HhcfgLghDpPZcUlppgWAFqFy9SgkiYWOMx365pw==", - "type": "package", - "path": "microsoft.extensions.dependencyinjection.abstractions/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/Microsoft.Extensions.DependencyInjection.Abstractions.targets", - "buildTransitive/net462/_._", - "buildTransitive/net8.0/_._", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.Abstractions.targets", - "lib/net462/Microsoft.Extensions.DependencyInjection.Abstractions.dll", - "lib/net462/Microsoft.Extensions.DependencyInjection.Abstractions.xml", - "lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", - "lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml", - "lib/net9.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", - "lib/net9.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml", - "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", - "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml", - "lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.Abstractions.dll", - "lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.Abstractions.xml", - "microsoft.extensions.dependencyinjection.abstractions.9.0.8.nupkg.sha512", - "microsoft.extensions.dependencyinjection.abstractions.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.Logging/9.0.8": { - "sha512": "Z/7ze+0iheT7FJeZPqJKARYvyC2bmwu3whbm/48BJjdlGVvgDguoCqJIkI/67NkroTYobd5geai1WheNQvWrgA==", - "type": "package", - "path": "microsoft.extensions.logging/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/Microsoft.Extensions.Logging.targets", - "buildTransitive/net462/_._", - "buildTransitive/net8.0/_._", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Logging.targets", - "lib/net462/Microsoft.Extensions.Logging.dll", - "lib/net462/Microsoft.Extensions.Logging.xml", - "lib/net8.0/Microsoft.Extensions.Logging.dll", - "lib/net8.0/Microsoft.Extensions.Logging.xml", - "lib/net9.0/Microsoft.Extensions.Logging.dll", - "lib/net9.0/Microsoft.Extensions.Logging.xml", - "lib/netstandard2.0/Microsoft.Extensions.Logging.dll", - "lib/netstandard2.0/Microsoft.Extensions.Logging.xml", - "lib/netstandard2.1/Microsoft.Extensions.Logging.dll", - "lib/netstandard2.1/Microsoft.Extensions.Logging.xml", - "microsoft.extensions.logging.9.0.8.nupkg.sha512", - "microsoft.extensions.logging.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.Logging.Abstractions/9.0.8": { - "sha512": "pYnAffJL7ARD/HCnnPvnFKSIHnTSmWz84WIlT9tPeQ4lHNiu0Az7N/8itihWvcF8sT+VVD5lq8V+ckMzu4SbOw==", - "type": "package", - "path": "microsoft.extensions.logging.abstractions/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "analyzers/dotnet/roslyn3.11/cs/Microsoft.Extensions.Logging.Generators.dll", - "analyzers/dotnet/roslyn3.11/cs/cs/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/de/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/es/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/fr/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/it/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/ja/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/ko/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/pl/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/pt-BR/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/ru/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/tr/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/zh-Hans/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/zh-Hant/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/Microsoft.Extensions.Logging.Generators.dll", - "analyzers/dotnet/roslyn4.0/cs/cs/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/de/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/es/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/fr/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/it/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/ja/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/ko/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/pl/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/pt-BR/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/ru/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/tr/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/zh-Hans/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/zh-Hant/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/Microsoft.Extensions.Logging.Generators.dll", - "analyzers/dotnet/roslyn4.4/cs/cs/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/de/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/es/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/fr/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/it/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/ja/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/ko/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/pl/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/pt-BR/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/ru/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/tr/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/zh-Hans/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/zh-Hant/Microsoft.Extensions.Logging.Generators.resources.dll", - "buildTransitive/net461/Microsoft.Extensions.Logging.Abstractions.targets", - "buildTransitive/net462/Microsoft.Extensions.Logging.Abstractions.targets", - "buildTransitive/net8.0/Microsoft.Extensions.Logging.Abstractions.targets", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Logging.Abstractions.targets", - "buildTransitive/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.targets", - "lib/net462/Microsoft.Extensions.Logging.Abstractions.dll", - "lib/net462/Microsoft.Extensions.Logging.Abstractions.xml", - "lib/net8.0/Microsoft.Extensions.Logging.Abstractions.dll", - "lib/net8.0/Microsoft.Extensions.Logging.Abstractions.xml", - "lib/net9.0/Microsoft.Extensions.Logging.Abstractions.dll", - "lib/net9.0/Microsoft.Extensions.Logging.Abstractions.xml", - "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll", - "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.xml", - "microsoft.extensions.logging.abstractions.9.0.8.nupkg.sha512", - "microsoft.extensions.logging.abstractions.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.Options/9.0.8": { - "sha512": "OmTaQ0v4gxGQkehpwWIqPoEiwsPuG/u4HUsbOFoWGx4DKET2AXzopnFe/fE608FIhzc/kcg2p8JdyMRCCUzitQ==", - "type": "package", - "path": "microsoft.extensions.options/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "analyzers/dotnet/roslyn4.4/cs/Microsoft.Extensions.Options.SourceGeneration.dll", - "analyzers/dotnet/roslyn4.4/cs/cs/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/de/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/es/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/fr/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/it/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/ja/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/ko/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/pl/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/pt-BR/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/ru/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/tr/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/zh-Hans/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/zh-Hant/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "buildTransitive/net461/Microsoft.Extensions.Options.targets", - "buildTransitive/net462/Microsoft.Extensions.Options.targets", - "buildTransitive/net8.0/Microsoft.Extensions.Options.targets", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Options.targets", - "buildTransitive/netstandard2.0/Microsoft.Extensions.Options.targets", - "lib/net462/Microsoft.Extensions.Options.dll", - "lib/net462/Microsoft.Extensions.Options.xml", - "lib/net8.0/Microsoft.Extensions.Options.dll", - "lib/net8.0/Microsoft.Extensions.Options.xml", - "lib/net9.0/Microsoft.Extensions.Options.dll", - "lib/net9.0/Microsoft.Extensions.Options.xml", - "lib/netstandard2.0/Microsoft.Extensions.Options.dll", - "lib/netstandard2.0/Microsoft.Extensions.Options.xml", - "lib/netstandard2.1/Microsoft.Extensions.Options.dll", - "lib/netstandard2.1/Microsoft.Extensions.Options.xml", - "microsoft.extensions.options.9.0.8.nupkg.sha512", - "microsoft.extensions.options.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.Primitives/9.0.8": { - "sha512": "tizSIOEsIgSNSSh+hKeUVPK7xmTIjR8s+mJWOu1KXV3htvNQiPMFRMO17OdI1y/4ZApdBVk49u/08QGC9yvLug==", - "type": "package", - "path": "microsoft.extensions.primitives/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/Microsoft.Extensions.Primitives.targets", - "buildTransitive/net462/_._", - "buildTransitive/net8.0/_._", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Primitives.targets", - "lib/net462/Microsoft.Extensions.Primitives.dll", - "lib/net462/Microsoft.Extensions.Primitives.xml", - "lib/net8.0/Microsoft.Extensions.Primitives.dll", - "lib/net8.0/Microsoft.Extensions.Primitives.xml", - "lib/net9.0/Microsoft.Extensions.Primitives.dll", - "lib/net9.0/Microsoft.Extensions.Primitives.xml", - "lib/netstandard2.0/Microsoft.Extensions.Primitives.dll", - "lib/netstandard2.0/Microsoft.Extensions.Primitives.xml", - "microsoft.extensions.primitives.9.0.8.nupkg.sha512", - "microsoft.extensions.primitives.nuspec", - "useSharedDesignerContext.txt" - ] - } - }, - "projectFileDependencyGroups": { - "net9.0": [ - "Microsoft.EntityFrameworkCore >= 9.0.8" - ] - }, - "packageFolders": { - "C:\\Users\\lefra\\.nuget\\packages\\": {}, - "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages": {} - }, - "project": { - "version": "1.0.0", - "restore": { - "projectUniqueName": "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi.Dto\\SameApi.Dto.csproj", - "projectName": "SameApi.Dto", - "projectPath": "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi.Dto\\SameApi.Dto.csproj", - "packagesPath": "C:\\Users\\lefra\\.nuget\\packages\\", - "outputPath": "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi.Dto\\obj\\", - "projectStyle": "PackageReference", - "fallbackFolders": [ - "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" - ], - "configFilePaths": [ - "C:\\Users\\lefra\\AppData\\Roaming\\NuGet\\NuGet.Config", - "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", - "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" - ], - "originalTargetFrameworks": [ - "net9.0" - ], - "sources": { - "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, - "https://api.nuget.org/v3/index.json": {} - }, - "frameworks": { - "net9.0": { - "targetAlias": "net9.0", - "projectReferences": {} - } - }, - "warningProperties": { - "warnAsError": [ - "NU1605" - ] - }, - "restoreAuditProperties": { - "enableAudit": "true", - "auditLevel": "low", - "auditMode": "direct" - }, - "SdkAnalysisLevel": "9.0.300" - }, - "frameworks": { - "net9.0": { - "targetAlias": "net9.0", - "dependencies": { - "Microsoft.EntityFrameworkCore": { - "target": "Package", - "version": "[9.0.8, )" - } - }, - "imports": [ - "net461", - "net462", - "net47", - "net471", - "net472", - "net48", - "net481" - ], - "assetTargetFallback": true, - "warn": true, - "frameworkReferences": { - "Microsoft.NETCore.App": { - "privateAssets": "all" - } - }, - "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.304/PortableRuntimeIdentifierGraph.json" - } - } - } -} \ No newline at end of file diff --git a/SameApi/SameApi.Dto/obj/project.nuget.cache b/SameApi/SameApi.Dto/obj/project.nuget.cache deleted file mode 100644 index ef4cca8..0000000 --- a/SameApi/SameApi.Dto/obj/project.nuget.cache +++ /dev/null @@ -1,20 +0,0 @@ -{ - "version": 2, - "dgSpecHash": "CwJRwAKVUJo=", - "success": true, - "projectFilePath": "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi.Dto\\SameApi.Dto.csproj", - "expectedPackageFiles": [ - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.entityframeworkcore\\9.0.8\\microsoft.entityframeworkcore.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.entityframeworkcore.abstractions\\9.0.8\\microsoft.entityframeworkcore.abstractions.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.entityframeworkcore.analyzers\\9.0.8\\microsoft.entityframeworkcore.analyzers.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.extensions.caching.abstractions\\9.0.8\\microsoft.extensions.caching.abstractions.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.extensions.caching.memory\\9.0.8\\microsoft.extensions.caching.memory.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.extensions.dependencyinjection\\9.0.8\\microsoft.extensions.dependencyinjection.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.extensions.dependencyinjection.abstractions\\9.0.8\\microsoft.extensions.dependencyinjection.abstractions.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.extensions.logging\\9.0.8\\microsoft.extensions.logging.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.extensions.logging.abstractions\\9.0.8\\microsoft.extensions.logging.abstractions.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.extensions.options\\9.0.8\\microsoft.extensions.options.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.extensions.primitives\\9.0.8\\microsoft.extensions.primitives.9.0.8.nupkg.sha512" - ], - "logs": [] -} \ No newline at end of file diff --git a/SameApi/SameApi.Model/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs b/SameApi/SameApi.Model/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs deleted file mode 100644 index feda5e9..0000000 --- a/SameApi/SameApi.Model/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs +++ /dev/null @@ -1,4 +0,0 @@ -// -using System; -using System.Reflection; -[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v9.0", FrameworkDisplayName = ".NET 9.0")] diff --git a/SameApi/SameApi.Model/obj/Debug/net9.0/SameApi.Model.AssemblyInfo.cs b/SameApi/SameApi.Model/obj/Debug/net9.0/SameApi.Model.AssemblyInfo.cs deleted file mode 100644 index 0cac3d8..0000000 --- a/SameApi/SameApi.Model/obj/Debug/net9.0/SameApi.Model.AssemblyInfo.cs +++ /dev/null @@ -1,23 +0,0 @@ -//------------------------------------------------------------------------------ -// -// Ce code a été généré par un outil. -// Version du runtime :4.0.30319.42000 -// -// Les modifications apportées à ce fichier peuvent provoquer un comportement incorrect et seront perdues si -// le code est régénéré. -// -//------------------------------------------------------------------------------ - -using System; -using System.Reflection; - -[assembly: System.Reflection.AssemblyCompanyAttribute("SameApi.Model")] -[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] -[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+4bae564f642c7550a68c6f28b12fbcf029e72aec")] -[assembly: System.Reflection.AssemblyProductAttribute("SameApi.Model")] -[assembly: System.Reflection.AssemblyTitleAttribute("SameApi.Model")] -[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] - -// Généré par la classe MSBuild WriteCodeFragment. - diff --git a/SameApi/SameApi.Model/obj/Debug/net9.0/SameApi.Model.AssemblyInfoInputs.cache b/SameApi/SameApi.Model/obj/Debug/net9.0/SameApi.Model.AssemblyInfoInputs.cache deleted file mode 100644 index 4294219..0000000 --- a/SameApi/SameApi.Model/obj/Debug/net9.0/SameApi.Model.AssemblyInfoInputs.cache +++ /dev/null @@ -1 +0,0 @@ -280a847c2623346eac62b478448a228706e8931c4637240aa2097f5184b0df9d diff --git a/SameApi/SameApi.Model/obj/Debug/net9.0/SameApi.Model.GeneratedMSBuildEditorConfig.editorconfig b/SameApi/SameApi.Model/obj/Debug/net9.0/SameApi.Model.GeneratedMSBuildEditorConfig.editorconfig deleted file mode 100644 index 18f16d5..0000000 --- a/SameApi/SameApi.Model/obj/Debug/net9.0/SameApi.Model.GeneratedMSBuildEditorConfig.editorconfig +++ /dev/null @@ -1,15 +0,0 @@ -is_global = true -build_property.TargetFramework = net9.0 -build_property.TargetPlatformMinVersion = -build_property.UsingMicrosoftNETSdkWeb = -build_property.ProjectTypeGuids = -build_property.InvariantGlobalization = -build_property.PlatformNeutralAssembly = -build_property.EnforceExtendedAnalyzerRules = -build_property._SupportedPlatformList = Linux,macOS,Windows -build_property.RootNamespace = SameApi.Model -build_property.ProjectDir = C:\Users\Mattis.lfrnc\Documents\GitHub\Same\SameApi\SameApi.Model\ -build_property.EnableComHosting = -build_property.EnableGeneratedComInterfaceComImportInterop = -build_property.EffectiveAnalysisLevelStyle = 9.0 -build_property.EnableCodeStyleSeverity = diff --git a/SameApi/SameApi.Model/obj/Debug/net9.0/SameApi.Model.GlobalUsings.g.cs b/SameApi/SameApi.Model/obj/Debug/net9.0/SameApi.Model.GlobalUsings.g.cs deleted file mode 100644 index 8578f3d..0000000 --- a/SameApi/SameApi.Model/obj/Debug/net9.0/SameApi.Model.GlobalUsings.g.cs +++ /dev/null @@ -1,8 +0,0 @@ -// -global using global::System; -global using global::System.Collections.Generic; -global using global::System.IO; -global using global::System.Linq; -global using global::System.Net.Http; -global using global::System.Threading; -global using global::System.Threading.Tasks; diff --git a/SameApi/SameApi.Model/obj/Debug/net9.0/SameApi.Model.assets.cache b/SameApi/SameApi.Model/obj/Debug/net9.0/SameApi.Model.assets.cache deleted file mode 100644 index b882473bc2000b25369f7d68cc8614345046b918..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7960 zcmdT}&2Q936klLNNK5z%(3a1IG=z`fL{ZvqkczZQNVMW>)lj(j;@FeTfIVK>vmwi& zhn{+0%)eV-OWRKpw`MsGp@5`0DtEI!a zT<-XjV^as;-yRpw|9(CB=G`wpE=<2I{WtcZ^zq-{if4|N{`oqWI{-P;Qxv$w9o-lPy)T>PDHN$*nRGF_k-1J=E-H;j+lFP=1XE^M+>pe4Fk7S+>0&fZ?+b2;ULtoBn}rOD25o3ed@| zR=KEZ#=0*(!<0DK4JxQju5o)n)?E1YXBw@?5@q%bvXZ`HkWYzaO!x<_#6ZZPkj{L4*~tz|3<3J zwDb5=11yobxPc+su^3w1z(4v&8(EiWn44W}H2@2DjP7PMbt#zI4eOUNtmr6y9RyZ~ zIj+~(dFF{I?>8sWy&R9>I|ARoXTfK&8WR>1W`m2Tta3UboGo zULKv)sf?Sq)7dAX3q3p8JnG01&}pC-8BVk2afeI31+l*s(~~e&+7swS`3hiAXAWtH z@hzGsSn)2{dA(CA?y`*Z?(m~$ZSHNqR&w92C*_he7*mS;o0t4cn_Ek)+<(lU1_ zdQLeruwfLf)=p*Q$gLI^7#%WPRIV3U0P6>jD78>q1Kp6JV0AXM~3v>?X zJkSN8i$Db+w4^KPj2bv|tH4_E+$v<6g%xfyzc4jl+%A4UHNO}I(86Qx*A2U{ChHb= z^|ejIW0wA)zRF}J$bM1Quo9zfr=1Sd#AuHtLWA?F9~u|Jg834RUj~{4`W9#k=nBvtiyK4>8aGf247e&SreQqOr5SWwAv(~wf;wP< ztG z#X74U85}-6L zB2X;&RX{ZuA6DEXaB18`xY!6#!JUP1`pm({5n7Fvt+ZwR1fBL6{!T#ed!$)&rZ0zk zmcqRo7ULB|Zk9z*M9x6}WVY1`pC#3EXH|^dlRo+!i>c+(?g%cT-UL<0qZq6Kdq=VN zZj;~=wEpkpZna6~(+ZFJ#i_e0KP1UkbYc+q?m98cyIC!MDr$oZob8RI6^K(#JhYHE zjv#Rn(tS*71Zhctqn;7&d;S6ZRU8ej>O|QuJ2jh|T-uFgw!sCnMpg{lXNP`bzH4tW zEC0x=vwZWOrRxeg?Vpf}-o)D z2L7E}tFPngmlAKZ)|(@K1~&)9 PLppK92-RL@r)7NtBx4ua diff --git a/SameApi/SameApi.Model/obj/Debug/net9.0/SameApi.Model.csproj.AssemblyReference.cache b/SameApi/SameApi.Model/obj/Debug/net9.0/SameApi.Model.csproj.AssemblyReference.cache deleted file mode 100644 index eb01b24775810f1b20bda946bb8d9eb033823148..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6757 zcmds*TWHfz7{?QxIw$Ibg4gLpAKaKp=ccyRqEelR&dH{t5Y#k1t=ZC~BGb!Py?kcoR56}@B8JS z@0{^?35H>KOVCekmw+fyb+jzA62V18o}man5d|_8r}5t#tI%*x4# zNXNi_L2PCO5l}wDLwG5U4N*Lhy@ZFV8(F?yU0$179)!z@FvsCIygBw|>AcDBdW&%! zFSU)pCn~GqRjhqsO0@bp3V#$G)BhZaupID{BpLLRswUE`iPSWaDNUrUCQ{WzLQSNm ziL}j7)zpE(Ymt`FCHQmv80~*UV@d=-oXyZqtR& z%=1-EPgaYa{(C|KJeNc6O**_Dr~LPX6Y$1BOc0Yi&;PA@sZsfB7pSS=DS&~cy{wJ|PXd&6ODa~TY*x@kQm^d6d}1HBBj zZq@^@^5Ru4>%CZ)OLV6dClAy!iqoNJDX2l>Ku-O0=^>D_-qRVw9VbMia3Dss>&@C~ z!=fkrB6OnXT2@34K(yt&S7F2i??y;-6OR(j&{nBYmGm - - - True - NuGet - $(MSBuildThisFileDirectory)project.assets.json - $(UserProfile)\.nuget\packages\ - C:\Users\Mattis.lfrnc\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages - PackageReference - 6.14.1 - - - - - - - - - \ No newline at end of file diff --git a/SameApi/SameApi.Model/obj/SameApi.Model.csproj.nuget.g.targets b/SameApi/SameApi.Model/obj/SameApi.Model.csproj.nuget.g.targets deleted file mode 100644 index e8c06b7..0000000 --- a/SameApi/SameApi.Model/obj/SameApi.Model.csproj.nuget.g.targets +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/SameApi/SameApi.Model/obj/project.assets.json b/SameApi/SameApi.Model/obj/project.assets.json deleted file mode 100644 index 862cabc..0000000 --- a/SameApi/SameApi.Model/obj/project.assets.json +++ /dev/null @@ -1,639 +0,0 @@ -{ - "version": 3, - "targets": { - "net9.0": { - "Microsoft.EntityFrameworkCore/9.0.8": { - "type": "package", - "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "9.0.8", - "Microsoft.EntityFrameworkCore.Analyzers": "9.0.8", - "Microsoft.Extensions.Caching.Memory": "9.0.8", - "Microsoft.Extensions.Logging": "9.0.8" - }, - "compile": { - "lib/net8.0/Microsoft.EntityFrameworkCore.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net8.0/Microsoft.EntityFrameworkCore.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net8.0/Microsoft.EntityFrameworkCore.props": {} - } - }, - "Microsoft.EntityFrameworkCore.Abstractions/9.0.8": { - "type": "package", - "compile": { - "lib/net8.0/Microsoft.EntityFrameworkCore.Abstractions.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net8.0/Microsoft.EntityFrameworkCore.Abstractions.dll": { - "related": ".xml" - } - } - }, - "Microsoft.EntityFrameworkCore.Analyzers/9.0.8": { - "type": "package" - }, - "Microsoft.Extensions.Caching.Abstractions/9.0.8": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.Primitives": "9.0.8" - }, - "compile": { - "lib/net9.0/Microsoft.Extensions.Caching.Abstractions.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net9.0/Microsoft.Extensions.Caching.Abstractions.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net8.0/_._": {} - } - }, - "Microsoft.Extensions.Caching.Memory/9.0.8": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.Caching.Abstractions": "9.0.8", - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8", - "Microsoft.Extensions.Logging.Abstractions": "9.0.8", - "Microsoft.Extensions.Options": "9.0.8", - "Microsoft.Extensions.Primitives": "9.0.8" - }, - "compile": { - "lib/net9.0/Microsoft.Extensions.Caching.Memory.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net9.0/Microsoft.Extensions.Caching.Memory.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net8.0/_._": {} - } - }, - "Microsoft.Extensions.DependencyInjection/9.0.8": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8" - }, - "compile": { - "lib/net9.0/Microsoft.Extensions.DependencyInjection.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net9.0/Microsoft.Extensions.DependencyInjection.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net8.0/_._": {} - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions/9.0.8": { - "type": "package", - "compile": { - "lib/net9.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net9.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net8.0/_._": {} - } - }, - "Microsoft.Extensions.Logging/9.0.8": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.DependencyInjection": "9.0.8", - "Microsoft.Extensions.Logging.Abstractions": "9.0.8", - "Microsoft.Extensions.Options": "9.0.8" - }, - "compile": { - "lib/net9.0/Microsoft.Extensions.Logging.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net9.0/Microsoft.Extensions.Logging.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net8.0/_._": {} - } - }, - "Microsoft.Extensions.Logging.Abstractions/9.0.8": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8" - }, - "compile": { - "lib/net9.0/Microsoft.Extensions.Logging.Abstractions.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net9.0/Microsoft.Extensions.Logging.Abstractions.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net8.0/Microsoft.Extensions.Logging.Abstractions.targets": {} - } - }, - "Microsoft.Extensions.Options/9.0.8": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8", - "Microsoft.Extensions.Primitives": "9.0.8" - }, - "compile": { - "lib/net9.0/Microsoft.Extensions.Options.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net9.0/Microsoft.Extensions.Options.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net8.0/Microsoft.Extensions.Options.targets": {} - } - }, - "Microsoft.Extensions.Primitives/9.0.8": { - "type": "package", - "compile": { - "lib/net9.0/Microsoft.Extensions.Primitives.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net9.0/Microsoft.Extensions.Primitives.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net8.0/_._": {} - } - }, - "SameApi.Data/1.0.0": { - "type": "project", - "framework": ".NETCoreApp,Version=v9.0", - "dependencies": { - "Microsoft.EntityFrameworkCore": "9.0.8" - }, - "compile": { - "bin/placeholder/SameApi.Data.dll": {} - }, - "runtime": { - "bin/placeholder/SameApi.Data.dll": {} - } - } - } - }, - "libraries": { - "Microsoft.EntityFrameworkCore/9.0.8": { - "sha512": "bNGdPhN762+BIIO5MFYLjafRqkSS1MqLOc/erd55InvLnFxt9H3N5JNsuag1ZHyBor1VtD42U0CHpgqkWeAYgQ==", - "type": "package", - "path": "microsoft.entityframeworkcore/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "PACKAGE.md", - "buildTransitive/net8.0/Microsoft.EntityFrameworkCore.props", - "lib/net8.0/Microsoft.EntityFrameworkCore.dll", - "lib/net8.0/Microsoft.EntityFrameworkCore.xml", - "microsoft.entityframeworkcore.9.0.8.nupkg.sha512", - "microsoft.entityframeworkcore.nuspec" - ] - }, - "Microsoft.EntityFrameworkCore.Abstractions/9.0.8": { - "sha512": "B2yfAIQRRAQ4zvvWqh+HudD+juV3YoLlpXnrog3tU0PM9AFpuq6xo0+mEglN1P43WgdcUiF+65CWBcZe35s15Q==", - "type": "package", - "path": "microsoft.entityframeworkcore.abstractions/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "PACKAGE.md", - "lib/net8.0/Microsoft.EntityFrameworkCore.Abstractions.dll", - "lib/net8.0/Microsoft.EntityFrameworkCore.Abstractions.xml", - "microsoft.entityframeworkcore.abstractions.9.0.8.nupkg.sha512", - "microsoft.entityframeworkcore.abstractions.nuspec" - ] - }, - "Microsoft.EntityFrameworkCore.Analyzers/9.0.8": { - "sha512": "2EYStCXt4Hi9p3J3EYMQbItJDtASJd064Kcs8C8hj8Jt5srILrR9qlaL0Ryvk8NrWQoCQvIELsmiuqLEZMLvGA==", - "type": "package", - "path": "microsoft.entityframeworkcore.analyzers/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "analyzers/dotnet/cs/Microsoft.EntityFrameworkCore.Analyzers.dll", - "docs/PACKAGE.md", - "microsoft.entityframeworkcore.analyzers.9.0.8.nupkg.sha512", - "microsoft.entityframeworkcore.analyzers.nuspec" - ] - }, - "Microsoft.Extensions.Caching.Abstractions/9.0.8": { - "sha512": "4h7bsVoKoiK+SlPM+euX/ayGnKZhl47pPCidLTiio9xyG+vgVVfcYxcYQgjm0SCrdSxjG0EGIAKF8EFr3G8Ifw==", - "type": "package", - "path": "microsoft.extensions.caching.abstractions/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/Microsoft.Extensions.Caching.Abstractions.targets", - "buildTransitive/net462/_._", - "buildTransitive/net8.0/_._", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Caching.Abstractions.targets", - "lib/net462/Microsoft.Extensions.Caching.Abstractions.dll", - "lib/net462/Microsoft.Extensions.Caching.Abstractions.xml", - "lib/net8.0/Microsoft.Extensions.Caching.Abstractions.dll", - "lib/net8.0/Microsoft.Extensions.Caching.Abstractions.xml", - "lib/net9.0/Microsoft.Extensions.Caching.Abstractions.dll", - "lib/net9.0/Microsoft.Extensions.Caching.Abstractions.xml", - "lib/netstandard2.0/Microsoft.Extensions.Caching.Abstractions.dll", - "lib/netstandard2.0/Microsoft.Extensions.Caching.Abstractions.xml", - "microsoft.extensions.caching.abstractions.9.0.8.nupkg.sha512", - "microsoft.extensions.caching.abstractions.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.Caching.Memory/9.0.8": { - "sha512": "grR+oPyj8HVn4DT8CFUUdSw2pZZKS13KjytFe4txpHQliGM1GEDotohmjgvyl3hm7RFB3FRqvbouEX3/1ewp5A==", - "type": "package", - "path": "microsoft.extensions.caching.memory/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/Microsoft.Extensions.Caching.Memory.targets", - "buildTransitive/net462/_._", - "buildTransitive/net8.0/_._", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Caching.Memory.targets", - "lib/net462/Microsoft.Extensions.Caching.Memory.dll", - "lib/net462/Microsoft.Extensions.Caching.Memory.xml", - "lib/net8.0/Microsoft.Extensions.Caching.Memory.dll", - "lib/net8.0/Microsoft.Extensions.Caching.Memory.xml", - "lib/net9.0/Microsoft.Extensions.Caching.Memory.dll", - "lib/net9.0/Microsoft.Extensions.Caching.Memory.xml", - "lib/netstandard2.0/Microsoft.Extensions.Caching.Memory.dll", - "lib/netstandard2.0/Microsoft.Extensions.Caching.Memory.xml", - "microsoft.extensions.caching.memory.9.0.8.nupkg.sha512", - "microsoft.extensions.caching.memory.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.DependencyInjection/9.0.8": { - "sha512": "JJjI2Fa+QtZcUyuNjbKn04OjIUX5IgFGFu/Xc+qvzh1rXdZHLcnqqVXhR4093bGirTwacRlHiVg1XYI9xum6QQ==", - "type": "package", - "path": "microsoft.extensions.dependencyinjection/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/Microsoft.Extensions.DependencyInjection.targets", - "buildTransitive/net462/_._", - "buildTransitive/net8.0/_._", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.targets", - "lib/net462/Microsoft.Extensions.DependencyInjection.dll", - "lib/net462/Microsoft.Extensions.DependencyInjection.xml", - "lib/net8.0/Microsoft.Extensions.DependencyInjection.dll", - "lib/net8.0/Microsoft.Extensions.DependencyInjection.xml", - "lib/net9.0/Microsoft.Extensions.DependencyInjection.dll", - "lib/net9.0/Microsoft.Extensions.DependencyInjection.xml", - "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.dll", - "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.xml", - "lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.dll", - "lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.xml", - "microsoft.extensions.dependencyinjection.9.0.8.nupkg.sha512", - "microsoft.extensions.dependencyinjection.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.DependencyInjection.Abstractions/9.0.8": { - "sha512": "xY3lTjj4+ZYmiKIkyWitddrp1uL5uYiweQjqo4BKBw01ZC4HhcfgLghDpPZcUlppgWAFqFy9SgkiYWOMx365pw==", - "type": "package", - "path": "microsoft.extensions.dependencyinjection.abstractions/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/Microsoft.Extensions.DependencyInjection.Abstractions.targets", - "buildTransitive/net462/_._", - "buildTransitive/net8.0/_._", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.Abstractions.targets", - "lib/net462/Microsoft.Extensions.DependencyInjection.Abstractions.dll", - "lib/net462/Microsoft.Extensions.DependencyInjection.Abstractions.xml", - "lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", - "lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml", - "lib/net9.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", - "lib/net9.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml", - "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", - "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml", - "lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.Abstractions.dll", - "lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.Abstractions.xml", - "microsoft.extensions.dependencyinjection.abstractions.9.0.8.nupkg.sha512", - "microsoft.extensions.dependencyinjection.abstractions.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.Logging/9.0.8": { - "sha512": "Z/7ze+0iheT7FJeZPqJKARYvyC2bmwu3whbm/48BJjdlGVvgDguoCqJIkI/67NkroTYobd5geai1WheNQvWrgA==", - "type": "package", - "path": "microsoft.extensions.logging/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/Microsoft.Extensions.Logging.targets", - "buildTransitive/net462/_._", - "buildTransitive/net8.0/_._", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Logging.targets", - "lib/net462/Microsoft.Extensions.Logging.dll", - "lib/net462/Microsoft.Extensions.Logging.xml", - "lib/net8.0/Microsoft.Extensions.Logging.dll", - "lib/net8.0/Microsoft.Extensions.Logging.xml", - "lib/net9.0/Microsoft.Extensions.Logging.dll", - "lib/net9.0/Microsoft.Extensions.Logging.xml", - "lib/netstandard2.0/Microsoft.Extensions.Logging.dll", - "lib/netstandard2.0/Microsoft.Extensions.Logging.xml", - "lib/netstandard2.1/Microsoft.Extensions.Logging.dll", - "lib/netstandard2.1/Microsoft.Extensions.Logging.xml", - "microsoft.extensions.logging.9.0.8.nupkg.sha512", - "microsoft.extensions.logging.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.Logging.Abstractions/9.0.8": { - "sha512": "pYnAffJL7ARD/HCnnPvnFKSIHnTSmWz84WIlT9tPeQ4lHNiu0Az7N/8itihWvcF8sT+VVD5lq8V+ckMzu4SbOw==", - "type": "package", - "path": "microsoft.extensions.logging.abstractions/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "analyzers/dotnet/roslyn3.11/cs/Microsoft.Extensions.Logging.Generators.dll", - "analyzers/dotnet/roslyn3.11/cs/cs/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/de/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/es/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/fr/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/it/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/ja/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/ko/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/pl/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/pt-BR/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/ru/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/tr/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/zh-Hans/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/zh-Hant/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/Microsoft.Extensions.Logging.Generators.dll", - "analyzers/dotnet/roslyn4.0/cs/cs/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/de/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/es/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/fr/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/it/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/ja/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/ko/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/pl/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/pt-BR/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/ru/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/tr/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/zh-Hans/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/zh-Hant/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/Microsoft.Extensions.Logging.Generators.dll", - "analyzers/dotnet/roslyn4.4/cs/cs/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/de/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/es/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/fr/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/it/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/ja/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/ko/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/pl/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/pt-BR/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/ru/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/tr/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/zh-Hans/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/zh-Hant/Microsoft.Extensions.Logging.Generators.resources.dll", - "buildTransitive/net461/Microsoft.Extensions.Logging.Abstractions.targets", - "buildTransitive/net462/Microsoft.Extensions.Logging.Abstractions.targets", - "buildTransitive/net8.0/Microsoft.Extensions.Logging.Abstractions.targets", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Logging.Abstractions.targets", - "buildTransitive/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.targets", - "lib/net462/Microsoft.Extensions.Logging.Abstractions.dll", - "lib/net462/Microsoft.Extensions.Logging.Abstractions.xml", - "lib/net8.0/Microsoft.Extensions.Logging.Abstractions.dll", - "lib/net8.0/Microsoft.Extensions.Logging.Abstractions.xml", - "lib/net9.0/Microsoft.Extensions.Logging.Abstractions.dll", - "lib/net9.0/Microsoft.Extensions.Logging.Abstractions.xml", - "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll", - "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.xml", - "microsoft.extensions.logging.abstractions.9.0.8.nupkg.sha512", - "microsoft.extensions.logging.abstractions.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.Options/9.0.8": { - "sha512": "OmTaQ0v4gxGQkehpwWIqPoEiwsPuG/u4HUsbOFoWGx4DKET2AXzopnFe/fE608FIhzc/kcg2p8JdyMRCCUzitQ==", - "type": "package", - "path": "microsoft.extensions.options/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "analyzers/dotnet/roslyn4.4/cs/Microsoft.Extensions.Options.SourceGeneration.dll", - "analyzers/dotnet/roslyn4.4/cs/cs/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/de/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/es/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/fr/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/it/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/ja/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/ko/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/pl/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/pt-BR/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/ru/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/tr/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/zh-Hans/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/zh-Hant/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "buildTransitive/net461/Microsoft.Extensions.Options.targets", - "buildTransitive/net462/Microsoft.Extensions.Options.targets", - "buildTransitive/net8.0/Microsoft.Extensions.Options.targets", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Options.targets", - "buildTransitive/netstandard2.0/Microsoft.Extensions.Options.targets", - "lib/net462/Microsoft.Extensions.Options.dll", - "lib/net462/Microsoft.Extensions.Options.xml", - "lib/net8.0/Microsoft.Extensions.Options.dll", - "lib/net8.0/Microsoft.Extensions.Options.xml", - "lib/net9.0/Microsoft.Extensions.Options.dll", - "lib/net9.0/Microsoft.Extensions.Options.xml", - "lib/netstandard2.0/Microsoft.Extensions.Options.dll", - "lib/netstandard2.0/Microsoft.Extensions.Options.xml", - "lib/netstandard2.1/Microsoft.Extensions.Options.dll", - "lib/netstandard2.1/Microsoft.Extensions.Options.xml", - "microsoft.extensions.options.9.0.8.nupkg.sha512", - "microsoft.extensions.options.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.Primitives/9.0.8": { - "sha512": "tizSIOEsIgSNSSh+hKeUVPK7xmTIjR8s+mJWOu1KXV3htvNQiPMFRMO17OdI1y/4ZApdBVk49u/08QGC9yvLug==", - "type": "package", - "path": "microsoft.extensions.primitives/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/Microsoft.Extensions.Primitives.targets", - "buildTransitive/net462/_._", - "buildTransitive/net8.0/_._", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Primitives.targets", - "lib/net462/Microsoft.Extensions.Primitives.dll", - "lib/net462/Microsoft.Extensions.Primitives.xml", - "lib/net8.0/Microsoft.Extensions.Primitives.dll", - "lib/net8.0/Microsoft.Extensions.Primitives.xml", - "lib/net9.0/Microsoft.Extensions.Primitives.dll", - "lib/net9.0/Microsoft.Extensions.Primitives.xml", - "lib/netstandard2.0/Microsoft.Extensions.Primitives.dll", - "lib/netstandard2.0/Microsoft.Extensions.Primitives.xml", - "microsoft.extensions.primitives.9.0.8.nupkg.sha512", - "microsoft.extensions.primitives.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "SameApi.Data/1.0.0": { - "type": "project", - "path": "../SameApi.Data/SameApi.Data.csproj", - "msbuildProject": "../SameApi.Data/SameApi.Data.csproj" - } - }, - "projectFileDependencyGroups": { - "net9.0": [ - "Microsoft.EntityFrameworkCore >= 9.0.8", - "SameApi.Data >= 1.0.0" - ] - }, - "packageFolders": { - "C:\\Users\\Mattis.lfrnc\\.nuget\\packages\\": {}, - "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages": {} - }, - "project": { - "version": "1.0.0", - "restore": { - "projectUniqueName": "C:\\Users\\Mattis.lfrnc\\Documents\\GitHub\\Same\\SameApi\\SameApi.Model\\SameApi.Model.csproj", - "projectName": "SameApi.Model", - "projectPath": "C:\\Users\\Mattis.lfrnc\\Documents\\GitHub\\Same\\SameApi\\SameApi.Model\\SameApi.Model.csproj", - "packagesPath": "C:\\Users\\Mattis.lfrnc\\.nuget\\packages\\", - "outputPath": "C:\\Users\\Mattis.lfrnc\\Documents\\GitHub\\Same\\SameApi\\SameApi.Model\\obj\\", - "projectStyle": "PackageReference", - "fallbackFolders": [ - "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" - ], - "configFilePaths": [ - "C:\\Users\\Mattis.lfrnc\\AppData\\Roaming\\NuGet\\NuGet.Config", - "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", - "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" - ], - "originalTargetFrameworks": [ - "net9.0" - ], - "sources": { - "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, - "C:\\Program Files\\dotnet\\library-packs": {}, - "https://api.nuget.org/v3/index.json": {} - }, - "frameworks": { - "net9.0": { - "targetAlias": "net9.0", - "projectReferences": { - "C:\\Users\\Mattis.lfrnc\\Documents\\GitHub\\Same\\SameApi\\SameApi.Data\\SameApi.Data.csproj": { - "projectPath": "C:\\Users\\Mattis.lfrnc\\Documents\\GitHub\\Same\\SameApi\\SameApi.Data\\SameApi.Data.csproj" - } - } - } - }, - "warningProperties": { - "warnAsError": [ - "NU1605" - ] - }, - "restoreAuditProperties": { - "enableAudit": "true", - "auditLevel": "low", - "auditMode": "direct" - }, - "SdkAnalysisLevel": "9.0.300" - }, - "frameworks": { - "net9.0": { - "targetAlias": "net9.0", - "dependencies": { - "Microsoft.EntityFrameworkCore": { - "target": "Package", - "version": "[9.0.8, )" - } - }, - "imports": [ - "net461", - "net462", - "net47", - "net471", - "net472", - "net48", - "net481" - ], - "assetTargetFallback": true, - "warn": true, - "frameworkReferences": { - "Microsoft.NETCore.App": { - "privateAssets": "all" - } - }, - "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.304/PortableRuntimeIdentifierGraph.json" - } - } - } -} \ No newline at end of file diff --git a/SameApi/SameApi.Model/obj/project.nuget.cache b/SameApi/SameApi.Model/obj/project.nuget.cache deleted file mode 100644 index 747fc5c..0000000 --- a/SameApi/SameApi.Model/obj/project.nuget.cache +++ /dev/null @@ -1,20 +0,0 @@ -{ - "version": 2, - "dgSpecHash": "GS0lUNtbifU=", - "success": true, - "projectFilePath": "C:\\Users\\Mattis.lfrnc\\Documents\\GitHub\\Same\\SameApi\\SameApi.Model\\SameApi.Model.csproj", - "expectedPackageFiles": [ - "C:\\Users\\Mattis.lfrnc\\.nuget\\packages\\microsoft.entityframeworkcore\\9.0.8\\microsoft.entityframeworkcore.9.0.8.nupkg.sha512", - "C:\\Users\\Mattis.lfrnc\\.nuget\\packages\\microsoft.entityframeworkcore.abstractions\\9.0.8\\microsoft.entityframeworkcore.abstractions.9.0.8.nupkg.sha512", - "C:\\Users\\Mattis.lfrnc\\.nuget\\packages\\microsoft.entityframeworkcore.analyzers\\9.0.8\\microsoft.entityframeworkcore.analyzers.9.0.8.nupkg.sha512", - "C:\\Users\\Mattis.lfrnc\\.nuget\\packages\\microsoft.extensions.caching.abstractions\\9.0.8\\microsoft.extensions.caching.abstractions.9.0.8.nupkg.sha512", - "C:\\Users\\Mattis.lfrnc\\.nuget\\packages\\microsoft.extensions.caching.memory\\9.0.8\\microsoft.extensions.caching.memory.9.0.8.nupkg.sha512", - "C:\\Users\\Mattis.lfrnc\\.nuget\\packages\\microsoft.extensions.dependencyinjection\\9.0.8\\microsoft.extensions.dependencyinjection.9.0.8.nupkg.sha512", - "C:\\Users\\Mattis.lfrnc\\.nuget\\packages\\microsoft.extensions.dependencyinjection.abstractions\\9.0.8\\microsoft.extensions.dependencyinjection.abstractions.9.0.8.nupkg.sha512", - "C:\\Users\\Mattis.lfrnc\\.nuget\\packages\\microsoft.extensions.logging\\9.0.8\\microsoft.extensions.logging.9.0.8.nupkg.sha512", - "C:\\Users\\Mattis.lfrnc\\.nuget\\packages\\microsoft.extensions.logging.abstractions\\9.0.8\\microsoft.extensions.logging.abstractions.9.0.8.nupkg.sha512", - "C:\\Users\\Mattis.lfrnc\\.nuget\\packages\\microsoft.extensions.options\\9.0.8\\microsoft.extensions.options.9.0.8.nupkg.sha512", - "C:\\Users\\Mattis.lfrnc\\.nuget\\packages\\microsoft.extensions.primitives\\9.0.8\\microsoft.extensions.primitives.9.0.8.nupkg.sha512" - ], - "logs": [] -} \ No newline at end of file diff --git a/SameApi/SameApi/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs b/SameApi/SameApi/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs deleted file mode 100644 index feda5e9..0000000 --- a/SameApi/SameApi/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs +++ /dev/null @@ -1,4 +0,0 @@ -// -using System; -using System.Reflection; -[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v9.0", FrameworkDisplayName = ".NET 9.0")] diff --git a/SameApi/SameApi/obj/Debug/net9.0/SameApi.App.AssemblyInfo.cs b/SameApi/SameApi/obj/Debug/net9.0/SameApi.App.AssemblyInfo.cs deleted file mode 100644 index fbd16ea..0000000 --- a/SameApi/SameApi/obj/Debug/net9.0/SameApi.App.AssemblyInfo.cs +++ /dev/null @@ -1,23 +0,0 @@ -//------------------------------------------------------------------------------ -// -// Ce code a été généré par un outil. -// Version du runtime :4.0.30319.42000 -// -// Les modifications apportées à ce fichier peuvent provoquer un comportement incorrect et seront perdues si -// le code est régénéré. -// -//------------------------------------------------------------------------------ - -using System; -using System.Reflection; - -[assembly: System.Reflection.AssemblyCompanyAttribute("SameApi.App")] -[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] -[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+a64b4febef28275ab85e1ae40dc85ca20fbbfb22")] -[assembly: System.Reflection.AssemblyProductAttribute("SameApi.App")] -[assembly: System.Reflection.AssemblyTitleAttribute("SameApi.App")] -[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] - -// Généré par la classe MSBuild WriteCodeFragment. - diff --git a/SameApi/SameApi/obj/Debug/net9.0/SameApi.App.AssemblyInfoInputs.cache b/SameApi/SameApi/obj/Debug/net9.0/SameApi.App.AssemblyInfoInputs.cache deleted file mode 100644 index 5bc3175..0000000 --- a/SameApi/SameApi/obj/Debug/net9.0/SameApi.App.AssemblyInfoInputs.cache +++ /dev/null @@ -1 +0,0 @@ -045d08b8adf53a38e208c68778e8110b57fccafe1bbc985367a29194da8f61d7 diff --git a/SameApi/SameApi/obj/Debug/net9.0/SameApi.App.GeneratedMSBuildEditorConfig.editorconfig b/SameApi/SameApi/obj/Debug/net9.0/SameApi.App.GeneratedMSBuildEditorConfig.editorconfig deleted file mode 100644 index c44b110..0000000 --- a/SameApi/SameApi/obj/Debug/net9.0/SameApi.App.GeneratedMSBuildEditorConfig.editorconfig +++ /dev/null @@ -1,21 +0,0 @@ -is_global = true -build_property.TargetFramework = net9.0 -build_property.TargetPlatformMinVersion = -build_property.UsingMicrosoftNETSdkWeb = true -build_property.ProjectTypeGuids = -build_property.InvariantGlobalization = -build_property.PlatformNeutralAssembly = -build_property.EnforceExtendedAnalyzerRules = -build_property._SupportedPlatformList = Linux,macOS,Windows -build_property.RootNamespace = SameApi.App -build_property.RootNamespace = SameApi.App -build_property.ProjectDir = C:\Users\lefra\Documents\GitHub\Same\SameApi\SameApi\ -build_property.EnableComHosting = -build_property.EnableGeneratedComInterfaceComImportInterop = -build_property.RazorLangVersion = 9.0 -build_property.SupportLocalizedComponentNames = -build_property.GenerateRazorMetadataSourceChecksumAttributes = -build_property.MSBuildProjectDirectory = C:\Users\lefra\Documents\GitHub\Same\SameApi\SameApi -build_property._RazorSourceGeneratorDebug = -build_property.EffectiveAnalysisLevelStyle = 9.0 -build_property.EnableCodeStyleSeverity = diff --git a/SameApi/SameApi/obj/Debug/net9.0/SameApi.App.GlobalUsings.g.cs b/SameApi/SameApi/obj/Debug/net9.0/SameApi.App.GlobalUsings.g.cs deleted file mode 100644 index 025530a..0000000 --- a/SameApi/SameApi/obj/Debug/net9.0/SameApi.App.GlobalUsings.g.cs +++ /dev/null @@ -1,17 +0,0 @@ -// -global using global::Microsoft.AspNetCore.Builder; -global using global::Microsoft.AspNetCore.Hosting; -global using global::Microsoft.AspNetCore.Http; -global using global::Microsoft.AspNetCore.Routing; -global using global::Microsoft.Extensions.Configuration; -global using global::Microsoft.Extensions.DependencyInjection; -global using global::Microsoft.Extensions.Hosting; -global using global::Microsoft.Extensions.Logging; -global using global::System; -global using global::System.Collections.Generic; -global using global::System.IO; -global using global::System.Linq; -global using global::System.Net.Http; -global using global::System.Net.Http.Json; -global using global::System.Threading; -global using global::System.Threading.Tasks; diff --git a/SameApi/SameApi/obj/Debug/net9.0/SameApi.App.assets.cache b/SameApi/SameApi/obj/Debug/net9.0/SameApi.App.assets.cache deleted file mode 100644 index 39c67895095dd18c17cace83432e669c0906db15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9073 zcmd6tL2ukt5XZMAX&Rt~CKL*^&9)&lZ4;*nX|h3Fwn-C3q-jJ-x%hx%ziixkZOitS zEQljQNO0f;he~`7u3V5n91t8iA;f_LpMjZOJN~ct?b|PW|NOi0`}kKsKR*7$pTExDnm%7BJVSC{ z9$S7}ecud z)j#IZOUezUq{i2V6WF9j_tiTG8g4fX2?TVu9_<^VC0e5y{r1@EOdtRAO(8k&}LTzip7M>P3o{zKxK>KwrTF3pL zfOne;lx?Tx=_16WIV0vEVA9tDZubJC_G}p4afPk9X1JV|xueoAWPh-9*>^WZ z&@k{_k}kU@ldw7YbAnoA-XZ#alA4p5M6wTCQA#Z+vP}mp!wHsW>H3R97*XaF?Rzd< zq;#?}jKw8;E`iC$`}`1?@m|(7eXoOONKJV=9=aS3?F4x$0ePCPKgn*__(l<9Ra70X z-fG>}jV7VH(-?${_d8kMMB`Y=NVjq@ay=S}h-VUrBXs@U zQ6b7s!8BXTcstpBGy(q-U1vX8L~Qr))Xuo1(WwmHd^SPyGF|6$lP&=yZRsMePRoVy zf{(vf@-A0v*hs^QVgxJ~h6E-#N6pXUu&!rT&A@y_2}3gxNQ2or7=T{zD%~Fg!)tW? zVP>8vF3l(?0iNexCxCyH_}NM_4(D)g{WTs1A>7boUQ`=y16xurPIEZ#T$nr0QZgPLJF>h_-I2}9kit%+bO ze1KtHJ@3pQLt`+BIs|sZCMqX`BN_jC0J$l^hx4H1+pO90Yuf zgN)C{mfNpAT7$+H?D?c*$8R~y(aTItljxsM-gk-!osJ|cLETChYWpu6- z$tnpc>r)?9>APjp^|YfQ2&$7695YH1cu_u zl?-Z;`tehui_`eDyl!MI>Wt#B`}6{kUN#LjiVN9`Azce0@MC)!vb}(Iv1v;EJN_UCm4w(k= ycDGJS)5NlhzCjM2+0O;0U}DM(DtPE1cNj>*kTF3K;?Pb<+& zEH21PElJKVO4Z9RNX<(u$c(YnGtje$$;nKL0m=Y5F}`rsj>QFjsU^-J)&4-$js=-| zDLFZej6gdX%%)fw9J|ZG$jB&zPXi+-NHGv_Kqv-~W-zV?GFTd*oYJ(+oK!1)eSK#u zeXvjT!9LN4_(UJ(6McL>(FglPALtW(h)?wKISlNR1q?u-0&&L_Ad`&=!Vd~|G-Ln< zEh7+qw$fzrUwPf(tE zu6+|^7yD|>vtD&uL`wX4-RGmJcjKP2dQUu`yxS&ghkem%tMxB!`41m5=`QnMzhUEn zV%w)8k?U5wMKHJQpIdU|QDe&Xvya?=Ox(rZDKocS>(XvUP{^&_S!tnpcU=NwJU&0^ zD1-qML1uoQEjTFj40IHnOLIy}i&Aa#QcFvU5_5DE0!ou|GLyYiD?{?LQ}b*SQ<5yr zEsZUVEK^bvQ_T#3b^!q+SD6VgSr{7_8(K0j<`bQ~Qu9hOODcg$FgLY4zbG4&&QQ~r z1xosI1uJ)hDF-Jscmlg*B*zO$V6q55W6?om3M(f$g<G`U^7Tga8MWPLtG52R*_tcRQ4gecmc>A1nShO zHCvk7H!c0@AMyO=i0n@#r7ZEyl*$({rQhtKl1-Sup)l)wUl41>)C%TUUliItAy_U ziaPtt+F@%}#(rFU5pH$oF(v1HP&)a+iT&LQHJ5Nb2`{2YFiV>)Y -// Ce code a été généré par un outil. -// Version du runtime :4.0.30319.42000 -// -// Les modifications apportées à ce fichier peuvent provoquer un comportement incorrect et seront perdues si -// le code est régénéré. -// -//------------------------------------------------------------------------------ - -using System; -using System.Reflection; - -[assembly: System.Reflection.AssemblyCompanyAttribute("SameApi")] -[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] -[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+a64b4febef28275ab85e1ae40dc85ca20fbbfb22")] -[assembly: System.Reflection.AssemblyProductAttribute("SameApi")] -[assembly: System.Reflection.AssemblyTitleAttribute("SameApi")] -[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] - -// Généré par la classe MSBuild WriteCodeFragment. - diff --git a/SameApi/SameApi/obj/Debug/net9.0/SameApi.AssemblyInfoInputs.cache b/SameApi/SameApi/obj/Debug/net9.0/SameApi.AssemblyInfoInputs.cache deleted file mode 100644 index b334922..0000000 --- a/SameApi/SameApi/obj/Debug/net9.0/SameApi.AssemblyInfoInputs.cache +++ /dev/null @@ -1 +0,0 @@ -cae9f5ad03e8b9160119aa44b8d8143b9c108ea35637aa2eb06c9b54b00b026a diff --git a/SameApi/SameApi/obj/Debug/net9.0/SameApi.GeneratedMSBuildEditorConfig.editorconfig b/SameApi/SameApi/obj/Debug/net9.0/SameApi.GeneratedMSBuildEditorConfig.editorconfig deleted file mode 100644 index be06c0a..0000000 --- a/SameApi/SameApi/obj/Debug/net9.0/SameApi.GeneratedMSBuildEditorConfig.editorconfig +++ /dev/null @@ -1,21 +0,0 @@ -is_global = true -build_property.TargetFramework = net9.0 -build_property.TargetPlatformMinVersion = -build_property.UsingMicrosoftNETSdkWeb = true -build_property.ProjectTypeGuids = -build_property.InvariantGlobalization = -build_property.PlatformNeutralAssembly = -build_property.EnforceExtendedAnalyzerRules = -build_property._SupportedPlatformList = Linux,macOS,Windows -build_property.RootNamespace = SameApi -build_property.RootNamespace = SameApi -build_property.ProjectDir = C:\Users\lefra\Documents\GitHub\Same\SameApi\SameApi\ -build_property.EnableComHosting = -build_property.EnableGeneratedComInterfaceComImportInterop = -build_property.RazorLangVersion = 9.0 -build_property.SupportLocalizedComponentNames = -build_property.GenerateRazorMetadataSourceChecksumAttributes = -build_property.MSBuildProjectDirectory = C:\Users\lefra\Documents\GitHub\Same\SameApi\SameApi -build_property._RazorSourceGeneratorDebug = -build_property.EffectiveAnalysisLevelStyle = 9.0 -build_property.EnableCodeStyleSeverity = diff --git a/SameApi/SameApi/obj/Debug/net9.0/SameApi.GlobalUsings.g.cs b/SameApi/SameApi/obj/Debug/net9.0/SameApi.GlobalUsings.g.cs deleted file mode 100644 index 025530a..0000000 --- a/SameApi/SameApi/obj/Debug/net9.0/SameApi.GlobalUsings.g.cs +++ /dev/null @@ -1,17 +0,0 @@ -// -global using global::Microsoft.AspNetCore.Builder; -global using global::Microsoft.AspNetCore.Hosting; -global using global::Microsoft.AspNetCore.Http; -global using global::Microsoft.AspNetCore.Routing; -global using global::Microsoft.Extensions.Configuration; -global using global::Microsoft.Extensions.DependencyInjection; -global using global::Microsoft.Extensions.Hosting; -global using global::Microsoft.Extensions.Logging; -global using global::System; -global using global::System.Collections.Generic; -global using global::System.IO; -global using global::System.Linq; -global using global::System.Net.Http; -global using global::System.Net.Http.Json; -global using global::System.Threading; -global using global::System.Threading.Tasks; diff --git a/SameApi/SameApi/obj/Debug/net9.0/SameApi.assets.cache b/SameApi/SameApi/obj/Debug/net9.0/SameApi.assets.cache deleted file mode 100644 index 233365f759788a2b5114d39e20fe2eeb99a5c0de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1754 zcmcgs!EVz)5Dnlo4bVUv3ax}hgcJ!0;gB5Klnb&_HHv@`kpNIKfQoGz$$4mvp2jXYH4LZ)azw^Q`Gy&tx*|zrqjd$5C?d?fu?& z>*>+YukSv6Y&e@=dRDctUjFLR?9eFX5Ba zX>B3M)SLfyGM2B}8+LVbtgkc+eHQz*KYUCPUqCSu&ml;B5kWzw=4(RweG;ZHP0*Ue z*QTb=k&*}$^yj-%N$D|(v^*ggZ)yMglP_nlr*eFmbP;(3(XS%tg03N`w3ZMB#0|tv z1i864niBeZ5K9Ah)K8wM3+es62 zC#^-=i!?8=WDf%|zA(xN{ick}w@M7rzpLbekB=Qo4k*myk2`i5->)Ewh+BwN#BIcU z(_@%2(=+bmX{PR=DKpk^Q7~((<)7PDMU%UW!;(i~_PAe`I!y1k!n8ym;wY?~jKa!! zy+)((Y@05e%(DmSCdNE7HZ$g#)n)3`MiO#y5^5emz7fgM^T=bu(x|ht4NCKnX-ri&>62<{ MR!UYU1ml>$0qbA{CjbBd diff --git a/SameApi/SameApi/obj/Debug/net9.0/SameApi.csproj.AssemblyReference.cache b/SameApi/SameApi/obj/Debug/net9.0/SameApi.csproj.AssemblyReference.cache deleted file mode 100644 index baaf087d652af8ce264b686b59d032e966aacba9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1173 zcmZQ$WMW`oV9a&4iU}=FEh>)5NlhzCjM2+0O;0U}DM(DtPE1cNj>*kTF3K;?Pb<+& zEH21PElJKVO4Z9RNX<(u$c(YnGtje$$;nKL0m=Y5F}`rsj>QFjsU^-J)&4-$js=-| zDLFZej6gdX%%)fw9J|ZG$jB&zPXi+-NHGv_Kqv-~W-zV?GFTd*oYJ(+oK!1)eSK#u zeXvjT!9LN4_(UJ(6McL>(FglPALtW(h)?wKISlNR1q?u-0&&L_Ad?LgoIrk1u%jUZ z3&?GZ44A&KVJ9wXzJa#r>x!+&nNG;$=YFGwAyO@OI!ZKhfKQ5{MT>T zc%az!sYv9y)ou~YE&Jz|9C_53viM9fg3>q@2uT@6^hW{Or^`+r*S4 zOLI$O3nR;vl*Cjs1E5_%z{pi*0!$Xh2F8Y#42%gxCofo?O=Fk)AIC3Gs|!EoNM#q72AJs^S<4D_vb%q{mB3Sz>4_E*HV75 zu4n(Xc-5t+t`fTYE9&eoYlp2_8T)bZk>{~*#JudKd{S+vOEdmIJa6+6aLTa{cb<}5 o_Q8oU6eCa($pzwjV$zFonyI;ov89QbvAJ2Afr$|)7|_xS05Ii^Jpcdz diff --git a/SameApi/SameApi/obj/Debug/net9.0/rpswa.dswa.cache.json b/SameApi/SameApi/obj/Debug/net9.0/rpswa.dswa.cache.json deleted file mode 100644 index 820ab92..0000000 --- a/SameApi/SameApi/obj/Debug/net9.0/rpswa.dswa.cache.json +++ /dev/null @@ -1 +0,0 @@ -{"GlobalPropertiesHash":"fp/PWjXnktX0vay81hrV+JT1Lkzd/Qv9xfEEYfbAYGM=","FingerprintPatternsHash":"gq3WsqcKBUGTSNle7RKKyXRIwh7M8ccEqOqYvIzoM04=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["LuJiZ4lcEXFrUZNoOrHMezOGUxn3d7p9P9JWb\u002BgOjJ8=","TL0w/5e5iiTHVlKmwxs7hUjWEpwHc0rtMG\u002BTjicRqt0="],"CachedAssets":{},"CachedCopyCandidates":{}} \ No newline at end of file diff --git a/SameApi/SameApi/obj/Debug/net9.0/staticwebassets.removed.txt b/SameApi/SameApi/obj/Debug/net9.0/staticwebassets.removed.txt deleted file mode 100644 index e69de29..0000000 diff --git a/SameApi/SameApi/obj/SameApi.App.csproj.nuget.dgspec.json b/SameApi/SameApi/obj/SameApi.App.csproj.nuget.dgspec.json deleted file mode 100644 index 45faa9a..0000000 --- a/SameApi/SameApi/obj/SameApi.App.csproj.nuget.dgspec.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "format": 1, - "restore": { - "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi\\SameApi.App.csproj": {} - }, - "projects": { - "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi\\SameApi.App.csproj": { - "version": "1.0.0", - "restore": { - "projectUniqueName": "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi\\SameApi.App.csproj", - "projectName": "SameApi.App", - "projectPath": "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi\\SameApi.App.csproj", - "packagesPath": "C:\\Users\\lefra\\.nuget\\packages\\", - "outputPath": "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi\\obj\\", - "projectStyle": "PackageReference", - "fallbackFolders": [ - "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" - ], - "configFilePaths": [ - "C:\\Users\\lefra\\AppData\\Roaming\\NuGet\\NuGet.Config", - "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", - "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" - ], - "originalTargetFrameworks": [ - "net9.0" - ], - "sources": { - "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, - "https://api.nuget.org/v3/index.json": {} - }, - "frameworks": { - "net9.0": { - "targetAlias": "net9.0", - "projectReferences": {} - } - }, - "warningProperties": { - "warnAsError": [ - "NU1605" - ] - }, - "restoreAuditProperties": { - "enableAudit": "true", - "auditLevel": "low", - "auditMode": "direct" - }, - "SdkAnalysisLevel": "9.0.300" - }, - "frameworks": { - "net9.0": { - "targetAlias": "net9.0", - "dependencies": { - "Microsoft.AspNetCore.OpenApi": { - "target": "Package", - "version": "[9.0.8, )" - }, - "Microsoft.EntityFrameworkCore": { - "target": "Package", - "version": "[9.0.8, )" - } - }, - "imports": [ - "net461", - "net462", - "net47", - "net471", - "net472", - "net48", - "net481" - ], - "assetTargetFallback": true, - "warn": true, - "frameworkReferences": { - "Microsoft.AspNetCore.App": { - "privateAssets": "none" - }, - "Microsoft.NETCore.App": { - "privateAssets": "all" - } - }, - "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.304/PortableRuntimeIdentifierGraph.json" - } - } - } - } -} \ No newline at end of file diff --git a/SameApi/SameApi/obj/SameApi.App.csproj.nuget.g.props b/SameApi/SameApi/obj/SameApi.App.csproj.nuget.g.props deleted file mode 100644 index 68aeb02..0000000 --- a/SameApi/SameApi/obj/SameApi.App.csproj.nuget.g.props +++ /dev/null @@ -1,19 +0,0 @@ - - - - True - NuGet - $(MSBuildThisFileDirectory)project.assets.json - $(UserProfile)\.nuget\packages\ - C:\Users\lefra\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages - PackageReference - 6.14.1 - - - - - - - - - \ No newline at end of file diff --git a/SameApi/SameApi/obj/SameApi.App.csproj.nuget.g.targets b/SameApi/SameApi/obj/SameApi.App.csproj.nuget.g.targets deleted file mode 100644 index e8c06b7..0000000 --- a/SameApi/SameApi/obj/SameApi.App.csproj.nuget.g.targets +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/SameApi/SameApi/obj/SameApi.csproj.nuget.dgspec.json b/SameApi/SameApi/obj/SameApi.csproj.nuget.dgspec.json deleted file mode 100644 index dffb3a7..0000000 --- a/SameApi/SameApi/obj/SameApi.csproj.nuget.dgspec.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "format": 1, - "restore": { - "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi\\SameApi.csproj": {} - }, - "projects": { - "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi\\SameApi.csproj": { - "version": "1.0.0", - "restore": { - "projectUniqueName": "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi\\SameApi.csproj", - "projectName": "SameApi", - "projectPath": "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi\\SameApi.csproj", - "packagesPath": "C:\\Users\\lefra\\.nuget\\packages\\", - "outputPath": "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi\\obj\\", - "projectStyle": "PackageReference", - "fallbackFolders": [ - "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" - ], - "configFilePaths": [ - "C:\\Users\\lefra\\AppData\\Roaming\\NuGet\\NuGet.Config", - "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", - "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" - ], - "originalTargetFrameworks": [ - "net9.0" - ], - "sources": { - "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, - "https://api.nuget.org/v3/index.json": {} - }, - "frameworks": { - "net9.0": { - "targetAlias": "net9.0", - "projectReferences": {} - } - }, - "warningProperties": { - "warnAsError": [ - "NU1605" - ] - }, - "restoreAuditProperties": { - "enableAudit": "true", - "auditLevel": "low", - "auditMode": "direct" - }, - "SdkAnalysisLevel": "9.0.100" - }, - "frameworks": { - "net9.0": { - "targetAlias": "net9.0", - "dependencies": { - "Microsoft.AspNetCore.OpenApi": { - "target": "Package", - "version": "[9.0.8, )" - } - }, - "imports": [ - "net461", - "net462", - "net47", - "net471", - "net472", - "net48", - "net481" - ], - "assetTargetFallback": true, - "warn": true, - "frameworkReferences": { - "Microsoft.AspNetCore.App": { - "privateAssets": "none" - }, - "Microsoft.NETCore.App": { - "privateAssets": "all" - } - }, - "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.102/PortableRuntimeIdentifierGraph.json" - } - } - } - } -} \ No newline at end of file diff --git a/SameApi/SameApi/obj/SameApi.csproj.nuget.g.props b/SameApi/SameApi/obj/SameApi.csproj.nuget.g.props deleted file mode 100644 index 2309439..0000000 --- a/SameApi/SameApi/obj/SameApi.csproj.nuget.g.props +++ /dev/null @@ -1,16 +0,0 @@ - - - - True - NuGet - $(MSBuildThisFileDirectory)project.assets.json - $(UserProfile)\.nuget\packages\ - C:\Users\lefra\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages - PackageReference - 6.12.3 - - - - - - \ No newline at end of file diff --git a/SameApi/SameApi/obj/SameApi.csproj.nuget.g.targets b/SameApi/SameApi/obj/SameApi.csproj.nuget.g.targets deleted file mode 100644 index 3dc06ef..0000000 --- a/SameApi/SameApi/obj/SameApi.csproj.nuget.g.targets +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/SameApi/SameApi/obj/project.assets.json b/SameApi/SameApi/obj/project.assets.json deleted file mode 100644 index 8d2cf32..0000000 --- a/SameApi/SameApi/obj/project.assets.json +++ /dev/null @@ -1,686 +0,0 @@ -{ - "version": 3, - "targets": { - "net9.0": { - "Microsoft.AspNetCore.OpenApi/9.0.8": { - "type": "package", - "dependencies": { - "Microsoft.OpenApi": "1.6.17" - }, - "compile": { - "lib/net9.0/Microsoft.AspNetCore.OpenApi.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net9.0/Microsoft.AspNetCore.OpenApi.dll": { - "related": ".xml" - } - }, - "frameworkReferences": [ - "Microsoft.AspNetCore.App" - ] - }, - "Microsoft.EntityFrameworkCore/9.0.8": { - "type": "package", - "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "9.0.8", - "Microsoft.EntityFrameworkCore.Analyzers": "9.0.8", - "Microsoft.Extensions.Caching.Memory": "9.0.8", - "Microsoft.Extensions.Logging": "9.0.8" - }, - "compile": { - "lib/net8.0/Microsoft.EntityFrameworkCore.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net8.0/Microsoft.EntityFrameworkCore.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net8.0/Microsoft.EntityFrameworkCore.props": {} - } - }, - "Microsoft.EntityFrameworkCore.Abstractions/9.0.8": { - "type": "package", - "compile": { - "lib/net8.0/Microsoft.EntityFrameworkCore.Abstractions.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net8.0/Microsoft.EntityFrameworkCore.Abstractions.dll": { - "related": ".xml" - } - } - }, - "Microsoft.EntityFrameworkCore.Analyzers/9.0.8": { - "type": "package" - }, - "Microsoft.Extensions.Caching.Abstractions/9.0.8": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.Primitives": "9.0.8" - }, - "compile": { - "lib/net9.0/Microsoft.Extensions.Caching.Abstractions.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net9.0/Microsoft.Extensions.Caching.Abstractions.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net8.0/_._": {} - } - }, - "Microsoft.Extensions.Caching.Memory/9.0.8": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.Caching.Abstractions": "9.0.8", - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8", - "Microsoft.Extensions.Logging.Abstractions": "9.0.8", - "Microsoft.Extensions.Options": "9.0.8", - "Microsoft.Extensions.Primitives": "9.0.8" - }, - "compile": { - "lib/net9.0/Microsoft.Extensions.Caching.Memory.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net9.0/Microsoft.Extensions.Caching.Memory.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net8.0/_._": {} - } - }, - "Microsoft.Extensions.DependencyInjection/9.0.8": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8" - }, - "compile": { - "lib/net9.0/Microsoft.Extensions.DependencyInjection.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net9.0/Microsoft.Extensions.DependencyInjection.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net8.0/_._": {} - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions/9.0.8": { - "type": "package", - "compile": { - "lib/net9.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net9.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net8.0/_._": {} - } - }, - "Microsoft.Extensions.Logging/9.0.8": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.DependencyInjection": "9.0.8", - "Microsoft.Extensions.Logging.Abstractions": "9.0.8", - "Microsoft.Extensions.Options": "9.0.8" - }, - "compile": { - "lib/net9.0/Microsoft.Extensions.Logging.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net9.0/Microsoft.Extensions.Logging.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net8.0/_._": {} - } - }, - "Microsoft.Extensions.Logging.Abstractions/9.0.8": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8" - }, - "compile": { - "lib/net9.0/Microsoft.Extensions.Logging.Abstractions.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net9.0/Microsoft.Extensions.Logging.Abstractions.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net8.0/Microsoft.Extensions.Logging.Abstractions.targets": {} - } - }, - "Microsoft.Extensions.Options/9.0.8": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8", - "Microsoft.Extensions.Primitives": "9.0.8" - }, - "compile": { - "lib/net9.0/Microsoft.Extensions.Options.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net9.0/Microsoft.Extensions.Options.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net8.0/Microsoft.Extensions.Options.targets": {} - } - }, - "Microsoft.Extensions.Primitives/9.0.8": { - "type": "package", - "compile": { - "lib/net9.0/Microsoft.Extensions.Primitives.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net9.0/Microsoft.Extensions.Primitives.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net8.0/_._": {} - } - }, - "Microsoft.OpenApi/1.6.17": { - "type": "package", - "compile": { - "lib/netstandard2.0/Microsoft.OpenApi.dll": { - "related": ".pdb;.xml" - } - }, - "runtime": { - "lib/netstandard2.0/Microsoft.OpenApi.dll": { - "related": ".pdb;.xml" - } - } - } - } - }, - "libraries": { - "Microsoft.AspNetCore.OpenApi/9.0.8": { - "sha512": "BwF9sQCKmvu93C/pmKxJjPhF5fFB23MEcgTsGL+7W3wKLYawS4lyFSL5/qh00IJzuADLf+1SmvxMaphbyZYqQQ==", - "type": "package", - "path": "microsoft.aspnetcore.openapi/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "lib/net9.0/Microsoft.AspNetCore.OpenApi.dll", - "lib/net9.0/Microsoft.AspNetCore.OpenApi.xml", - "microsoft.aspnetcore.openapi.9.0.8.nupkg.sha512", - "microsoft.aspnetcore.openapi.nuspec" - ] - }, - "Microsoft.EntityFrameworkCore/9.0.8": { - "sha512": "bNGdPhN762+BIIO5MFYLjafRqkSS1MqLOc/erd55InvLnFxt9H3N5JNsuag1ZHyBor1VtD42U0CHpgqkWeAYgQ==", - "type": "package", - "path": "microsoft.entityframeworkcore/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "PACKAGE.md", - "buildTransitive/net8.0/Microsoft.EntityFrameworkCore.props", - "lib/net8.0/Microsoft.EntityFrameworkCore.dll", - "lib/net8.0/Microsoft.EntityFrameworkCore.xml", - "microsoft.entityframeworkcore.9.0.8.nupkg.sha512", - "microsoft.entityframeworkcore.nuspec" - ] - }, - "Microsoft.EntityFrameworkCore.Abstractions/9.0.8": { - "sha512": "B2yfAIQRRAQ4zvvWqh+HudD+juV3YoLlpXnrog3tU0PM9AFpuq6xo0+mEglN1P43WgdcUiF+65CWBcZe35s15Q==", - "type": "package", - "path": "microsoft.entityframeworkcore.abstractions/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "PACKAGE.md", - "lib/net8.0/Microsoft.EntityFrameworkCore.Abstractions.dll", - "lib/net8.0/Microsoft.EntityFrameworkCore.Abstractions.xml", - "microsoft.entityframeworkcore.abstractions.9.0.8.nupkg.sha512", - "microsoft.entityframeworkcore.abstractions.nuspec" - ] - }, - "Microsoft.EntityFrameworkCore.Analyzers/9.0.8": { - "sha512": "2EYStCXt4Hi9p3J3EYMQbItJDtASJd064Kcs8C8hj8Jt5srILrR9qlaL0Ryvk8NrWQoCQvIELsmiuqLEZMLvGA==", - "type": "package", - "path": "microsoft.entityframeworkcore.analyzers/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "analyzers/dotnet/cs/Microsoft.EntityFrameworkCore.Analyzers.dll", - "docs/PACKAGE.md", - "microsoft.entityframeworkcore.analyzers.9.0.8.nupkg.sha512", - "microsoft.entityframeworkcore.analyzers.nuspec" - ] - }, - "Microsoft.Extensions.Caching.Abstractions/9.0.8": { - "sha512": "4h7bsVoKoiK+SlPM+euX/ayGnKZhl47pPCidLTiio9xyG+vgVVfcYxcYQgjm0SCrdSxjG0EGIAKF8EFr3G8Ifw==", - "type": "package", - "path": "microsoft.extensions.caching.abstractions/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/Microsoft.Extensions.Caching.Abstractions.targets", - "buildTransitive/net462/_._", - "buildTransitive/net8.0/_._", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Caching.Abstractions.targets", - "lib/net462/Microsoft.Extensions.Caching.Abstractions.dll", - "lib/net462/Microsoft.Extensions.Caching.Abstractions.xml", - "lib/net8.0/Microsoft.Extensions.Caching.Abstractions.dll", - "lib/net8.0/Microsoft.Extensions.Caching.Abstractions.xml", - "lib/net9.0/Microsoft.Extensions.Caching.Abstractions.dll", - "lib/net9.0/Microsoft.Extensions.Caching.Abstractions.xml", - "lib/netstandard2.0/Microsoft.Extensions.Caching.Abstractions.dll", - "lib/netstandard2.0/Microsoft.Extensions.Caching.Abstractions.xml", - "microsoft.extensions.caching.abstractions.9.0.8.nupkg.sha512", - "microsoft.extensions.caching.abstractions.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.Caching.Memory/9.0.8": { - "sha512": "grR+oPyj8HVn4DT8CFUUdSw2pZZKS13KjytFe4txpHQliGM1GEDotohmjgvyl3hm7RFB3FRqvbouEX3/1ewp5A==", - "type": "package", - "path": "microsoft.extensions.caching.memory/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/Microsoft.Extensions.Caching.Memory.targets", - "buildTransitive/net462/_._", - "buildTransitive/net8.0/_._", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Caching.Memory.targets", - "lib/net462/Microsoft.Extensions.Caching.Memory.dll", - "lib/net462/Microsoft.Extensions.Caching.Memory.xml", - "lib/net8.0/Microsoft.Extensions.Caching.Memory.dll", - "lib/net8.0/Microsoft.Extensions.Caching.Memory.xml", - "lib/net9.0/Microsoft.Extensions.Caching.Memory.dll", - "lib/net9.0/Microsoft.Extensions.Caching.Memory.xml", - "lib/netstandard2.0/Microsoft.Extensions.Caching.Memory.dll", - "lib/netstandard2.0/Microsoft.Extensions.Caching.Memory.xml", - "microsoft.extensions.caching.memory.9.0.8.nupkg.sha512", - "microsoft.extensions.caching.memory.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.DependencyInjection/9.0.8": { - "sha512": "JJjI2Fa+QtZcUyuNjbKn04OjIUX5IgFGFu/Xc+qvzh1rXdZHLcnqqVXhR4093bGirTwacRlHiVg1XYI9xum6QQ==", - "type": "package", - "path": "microsoft.extensions.dependencyinjection/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/Microsoft.Extensions.DependencyInjection.targets", - "buildTransitive/net462/_._", - "buildTransitive/net8.0/_._", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.targets", - "lib/net462/Microsoft.Extensions.DependencyInjection.dll", - "lib/net462/Microsoft.Extensions.DependencyInjection.xml", - "lib/net8.0/Microsoft.Extensions.DependencyInjection.dll", - "lib/net8.0/Microsoft.Extensions.DependencyInjection.xml", - "lib/net9.0/Microsoft.Extensions.DependencyInjection.dll", - "lib/net9.0/Microsoft.Extensions.DependencyInjection.xml", - "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.dll", - "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.xml", - "lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.dll", - "lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.xml", - "microsoft.extensions.dependencyinjection.9.0.8.nupkg.sha512", - "microsoft.extensions.dependencyinjection.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.DependencyInjection.Abstractions/9.0.8": { - "sha512": "xY3lTjj4+ZYmiKIkyWitddrp1uL5uYiweQjqo4BKBw01ZC4HhcfgLghDpPZcUlppgWAFqFy9SgkiYWOMx365pw==", - "type": "package", - "path": "microsoft.extensions.dependencyinjection.abstractions/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/Microsoft.Extensions.DependencyInjection.Abstractions.targets", - "buildTransitive/net462/_._", - "buildTransitive/net8.0/_._", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.Abstractions.targets", - "lib/net462/Microsoft.Extensions.DependencyInjection.Abstractions.dll", - "lib/net462/Microsoft.Extensions.DependencyInjection.Abstractions.xml", - "lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", - "lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml", - "lib/net9.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", - "lib/net9.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml", - "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", - "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml", - "lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.Abstractions.dll", - "lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.Abstractions.xml", - "microsoft.extensions.dependencyinjection.abstractions.9.0.8.nupkg.sha512", - "microsoft.extensions.dependencyinjection.abstractions.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.Logging/9.0.8": { - "sha512": "Z/7ze+0iheT7FJeZPqJKARYvyC2bmwu3whbm/48BJjdlGVvgDguoCqJIkI/67NkroTYobd5geai1WheNQvWrgA==", - "type": "package", - "path": "microsoft.extensions.logging/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/Microsoft.Extensions.Logging.targets", - "buildTransitive/net462/_._", - "buildTransitive/net8.0/_._", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Logging.targets", - "lib/net462/Microsoft.Extensions.Logging.dll", - "lib/net462/Microsoft.Extensions.Logging.xml", - "lib/net8.0/Microsoft.Extensions.Logging.dll", - "lib/net8.0/Microsoft.Extensions.Logging.xml", - "lib/net9.0/Microsoft.Extensions.Logging.dll", - "lib/net9.0/Microsoft.Extensions.Logging.xml", - "lib/netstandard2.0/Microsoft.Extensions.Logging.dll", - "lib/netstandard2.0/Microsoft.Extensions.Logging.xml", - "lib/netstandard2.1/Microsoft.Extensions.Logging.dll", - "lib/netstandard2.1/Microsoft.Extensions.Logging.xml", - "microsoft.extensions.logging.9.0.8.nupkg.sha512", - "microsoft.extensions.logging.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.Logging.Abstractions/9.0.8": { - "sha512": "pYnAffJL7ARD/HCnnPvnFKSIHnTSmWz84WIlT9tPeQ4lHNiu0Az7N/8itihWvcF8sT+VVD5lq8V+ckMzu4SbOw==", - "type": "package", - "path": "microsoft.extensions.logging.abstractions/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "analyzers/dotnet/roslyn3.11/cs/Microsoft.Extensions.Logging.Generators.dll", - "analyzers/dotnet/roslyn3.11/cs/cs/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/de/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/es/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/fr/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/it/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/ja/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/ko/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/pl/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/pt-BR/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/ru/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/tr/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/zh-Hans/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/zh-Hant/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/Microsoft.Extensions.Logging.Generators.dll", - "analyzers/dotnet/roslyn4.0/cs/cs/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/de/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/es/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/fr/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/it/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/ja/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/ko/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/pl/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/pt-BR/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/ru/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/tr/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/zh-Hans/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/zh-Hant/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/Microsoft.Extensions.Logging.Generators.dll", - "analyzers/dotnet/roslyn4.4/cs/cs/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/de/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/es/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/fr/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/it/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/ja/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/ko/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/pl/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/pt-BR/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/ru/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/tr/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/zh-Hans/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/zh-Hant/Microsoft.Extensions.Logging.Generators.resources.dll", - "buildTransitive/net461/Microsoft.Extensions.Logging.Abstractions.targets", - "buildTransitive/net462/Microsoft.Extensions.Logging.Abstractions.targets", - "buildTransitive/net8.0/Microsoft.Extensions.Logging.Abstractions.targets", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Logging.Abstractions.targets", - "buildTransitive/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.targets", - "lib/net462/Microsoft.Extensions.Logging.Abstractions.dll", - "lib/net462/Microsoft.Extensions.Logging.Abstractions.xml", - "lib/net8.0/Microsoft.Extensions.Logging.Abstractions.dll", - "lib/net8.0/Microsoft.Extensions.Logging.Abstractions.xml", - "lib/net9.0/Microsoft.Extensions.Logging.Abstractions.dll", - "lib/net9.0/Microsoft.Extensions.Logging.Abstractions.xml", - "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll", - "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.xml", - "microsoft.extensions.logging.abstractions.9.0.8.nupkg.sha512", - "microsoft.extensions.logging.abstractions.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.Options/9.0.8": { - "sha512": "OmTaQ0v4gxGQkehpwWIqPoEiwsPuG/u4HUsbOFoWGx4DKET2AXzopnFe/fE608FIhzc/kcg2p8JdyMRCCUzitQ==", - "type": "package", - "path": "microsoft.extensions.options/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "analyzers/dotnet/roslyn4.4/cs/Microsoft.Extensions.Options.SourceGeneration.dll", - "analyzers/dotnet/roslyn4.4/cs/cs/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/de/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/es/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/fr/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/it/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/ja/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/ko/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/pl/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/pt-BR/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/ru/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/tr/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/zh-Hans/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/zh-Hant/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "buildTransitive/net461/Microsoft.Extensions.Options.targets", - "buildTransitive/net462/Microsoft.Extensions.Options.targets", - "buildTransitive/net8.0/Microsoft.Extensions.Options.targets", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Options.targets", - "buildTransitive/netstandard2.0/Microsoft.Extensions.Options.targets", - "lib/net462/Microsoft.Extensions.Options.dll", - "lib/net462/Microsoft.Extensions.Options.xml", - "lib/net8.0/Microsoft.Extensions.Options.dll", - "lib/net8.0/Microsoft.Extensions.Options.xml", - "lib/net9.0/Microsoft.Extensions.Options.dll", - "lib/net9.0/Microsoft.Extensions.Options.xml", - "lib/netstandard2.0/Microsoft.Extensions.Options.dll", - "lib/netstandard2.0/Microsoft.Extensions.Options.xml", - "lib/netstandard2.1/Microsoft.Extensions.Options.dll", - "lib/netstandard2.1/Microsoft.Extensions.Options.xml", - "microsoft.extensions.options.9.0.8.nupkg.sha512", - "microsoft.extensions.options.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.Primitives/9.0.8": { - "sha512": "tizSIOEsIgSNSSh+hKeUVPK7xmTIjR8s+mJWOu1KXV3htvNQiPMFRMO17OdI1y/4ZApdBVk49u/08QGC9yvLug==", - "type": "package", - "path": "microsoft.extensions.primitives/9.0.8", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/Microsoft.Extensions.Primitives.targets", - "buildTransitive/net462/_._", - "buildTransitive/net8.0/_._", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Primitives.targets", - "lib/net462/Microsoft.Extensions.Primitives.dll", - "lib/net462/Microsoft.Extensions.Primitives.xml", - "lib/net8.0/Microsoft.Extensions.Primitives.dll", - "lib/net8.0/Microsoft.Extensions.Primitives.xml", - "lib/net9.0/Microsoft.Extensions.Primitives.dll", - "lib/net9.0/Microsoft.Extensions.Primitives.xml", - "lib/netstandard2.0/Microsoft.Extensions.Primitives.dll", - "lib/netstandard2.0/Microsoft.Extensions.Primitives.xml", - "microsoft.extensions.primitives.9.0.8.nupkg.sha512", - "microsoft.extensions.primitives.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.OpenApi/1.6.17": { - "sha512": "Le+kehlmrlQfuDFUt1zZ2dVwrhFQtKREdKBo+rexOwaCoYP0/qpgT9tLxCsZjsgR5Itk1UKPcbgO+FyaNid/bA==", - "type": "package", - "path": "microsoft.openapi/1.6.17", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "README.md", - "lib/netstandard2.0/Microsoft.OpenApi.dll", - "lib/netstandard2.0/Microsoft.OpenApi.pdb", - "lib/netstandard2.0/Microsoft.OpenApi.xml", - "microsoft.openapi.1.6.17.nupkg.sha512", - "microsoft.openapi.nuspec" - ] - } - }, - "projectFileDependencyGroups": { - "net9.0": [ - "Microsoft.AspNetCore.OpenApi >= 9.0.8", - "Microsoft.EntityFrameworkCore >= 9.0.8" - ] - }, - "packageFolders": { - "C:\\Users\\lefra\\.nuget\\packages\\": {}, - "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages": {} - }, - "project": { - "version": "1.0.0", - "restore": { - "projectUniqueName": "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi\\SameApi.App.csproj", - "projectName": "SameApi.App", - "projectPath": "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi\\SameApi.App.csproj", - "packagesPath": "C:\\Users\\lefra\\.nuget\\packages\\", - "outputPath": "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi\\obj\\", - "projectStyle": "PackageReference", - "fallbackFolders": [ - "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" - ], - "configFilePaths": [ - "C:\\Users\\lefra\\AppData\\Roaming\\NuGet\\NuGet.Config", - "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", - "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" - ], - "originalTargetFrameworks": [ - "net9.0" - ], - "sources": { - "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, - "https://api.nuget.org/v3/index.json": {} - }, - "frameworks": { - "net9.0": { - "targetAlias": "net9.0", - "projectReferences": {} - } - }, - "warningProperties": { - "warnAsError": [ - "NU1605" - ] - }, - "restoreAuditProperties": { - "enableAudit": "true", - "auditLevel": "low", - "auditMode": "direct" - }, - "SdkAnalysisLevel": "9.0.300" - }, - "frameworks": { - "net9.0": { - "targetAlias": "net9.0", - "dependencies": { - "Microsoft.AspNetCore.OpenApi": { - "target": "Package", - "version": "[9.0.8, )" - }, - "Microsoft.EntityFrameworkCore": { - "target": "Package", - "version": "[9.0.8, )" - } - }, - "imports": [ - "net461", - "net462", - "net47", - "net471", - "net472", - "net48", - "net481" - ], - "assetTargetFallback": true, - "warn": true, - "frameworkReferences": { - "Microsoft.AspNetCore.App": { - "privateAssets": "none" - }, - "Microsoft.NETCore.App": { - "privateAssets": "all" - } - }, - "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.304/PortableRuntimeIdentifierGraph.json" - } - } - } -} \ No newline at end of file diff --git a/SameApi/SameApi/obj/project.nuget.cache b/SameApi/SameApi/obj/project.nuget.cache deleted file mode 100644 index 9b576a8..0000000 --- a/SameApi/SameApi/obj/project.nuget.cache +++ /dev/null @@ -1,22 +0,0 @@ -{ - "version": 2, - "dgSpecHash": "qym3qBgv0Y0=", - "success": true, - "projectFilePath": "C:\\Users\\lefra\\Documents\\GitHub\\Same\\SameApi\\SameApi\\SameApi.App.csproj", - "expectedPackageFiles": [ - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.aspnetcore.openapi\\9.0.8\\microsoft.aspnetcore.openapi.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.entityframeworkcore\\9.0.8\\microsoft.entityframeworkcore.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.entityframeworkcore.abstractions\\9.0.8\\microsoft.entityframeworkcore.abstractions.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.entityframeworkcore.analyzers\\9.0.8\\microsoft.entityframeworkcore.analyzers.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.extensions.caching.abstractions\\9.0.8\\microsoft.extensions.caching.abstractions.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.extensions.caching.memory\\9.0.8\\microsoft.extensions.caching.memory.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.extensions.dependencyinjection\\9.0.8\\microsoft.extensions.dependencyinjection.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.extensions.dependencyinjection.abstractions\\9.0.8\\microsoft.extensions.dependencyinjection.abstractions.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.extensions.logging\\9.0.8\\microsoft.extensions.logging.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.extensions.logging.abstractions\\9.0.8\\microsoft.extensions.logging.abstractions.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.extensions.options\\9.0.8\\microsoft.extensions.options.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.extensions.primitives\\9.0.8\\microsoft.extensions.primitives.9.0.8.nupkg.sha512", - "C:\\Users\\lefra\\.nuget\\packages\\microsoft.openapi\\1.6.17\\microsoft.openapi.1.6.17.nupkg.sha512" - ], - "logs": [] -} \ No newline at end of file From 13f82d44a48a145f6f3921b1d2d8821195cf00e1 Mon Sep 17 00:00:00 2001 From: IlP4rAd0xlI Date: Wed, 17 Sep 2025 09:01:24 +0200 Subject: [PATCH 14/77] feature/signup Update : pseudoField change check errors structure --- .../components/forms/signup/PseudoField.tsx | 54 +++++++++++-------- 1 file changed, 33 insertions(+), 21 deletions(-) diff --git a/React/src/components/forms/signup/PseudoField.tsx b/React/src/components/forms/signup/PseudoField.tsx index 74b5133..ed4c542 100644 --- a/React/src/components/forms/signup/PseudoField.tsx +++ b/React/src/components/forms/signup/PseudoField.tsx @@ -21,46 +21,59 @@ interface PseudoFieldProps { export default function PseudoField({ value, onChange }: PseudoFieldProps) { - // const [error, setError] = useState(''); const handleBlur = () => { - if (value.trim() == null || value.trim() == "") { - console.log("Username is required") + const trimmedValue = value.trim(); + + // Check if empty first + if (trimmedValue === "") { + console.log("Username is required"); + return; + } + + // Collect all validation errors + const errors: string[] = []; + + if (!/[a-zA-Z]/.test(value)) { + errors.push("Username must contain at least one letter"); } - if (value.trim().length > 0 && value.trim().length < 3 || value.trim().length > 19) { - if (value.trim().length == 20) { - console.log("You can't input more char for you username (20 is the max)") + + if (trimmedValue.length < 3 || trimmedValue.length > 19) { + if (trimmedValue.length === 20) { + errors.push("You can't input more char for you username (20 is the max)"); } else { - // setError('Username must habe between 3 and 20 characters'); - console.log('Username must habe between 3 and 20 characters') + errors.push('Username must have between 3 and 20 characters'); } } - if (reservedWords.includes(value.trim().toLowerCase())) { - // setError("Username can not be reserved words (like admin, root,...)"); - console.log("Username can not be reserved words (like admin, root,...)") - } - if (!/[a-zA-Z]/.test(value)) { - console.log("Username must contain at least one letter") + + if (reservedWords.includes(trimmedValue.toLowerCase())) { + errors.push("Username can not be reserved words (like admin, root,...)"); } + if (specialCharsRegex.test(value)) { if (/\s/.test(value)) { - // setError("Username can not contains spaces"); - console.log("Username cannot contain spaces") + errors.push("Username cannot contain spaces"); } else { - console.log("Username cannot contains others special char then - and _"); + errors.push("Username cannot contains others special char then - and _"); } } - if (/[-_]{2,}/.test(value.trim())) { - console.log("Username cannot contain successive hyphens or underscores"); + + if (/[-_]{2,}/.test(trimmedValue)) { + errors.push("Username cannot contain successive hyphens or underscores"); } + // Log results + if (errors.length === 0) { + console.log("Username is valid"); + } else { + errors.forEach(error => console.log(error)); + } } const handleChange = (e: React.ChangeEvent) => { onChange(e.target.value); console.clear(); - // setError(''); // Clear error when user types }; return ( @@ -74,7 +87,6 @@ export default function PseudoField({ value, onChange }: PseudoFieldProps) className={"border-2"} maxLength={20} /> - {/*{error &&

{error}

}*/} ); } \ No newline at end of file From 4d681ddebcaae51efc81db808de7c2997916424e Mon Sep 17 00:00:00 2001 From: Mattis Date: Fri, 19 Sep 2025 11:16:47 +0200 Subject: [PATCH 15/77] Update .gitignore remove .db --- SameApi/.gitignore | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/SameApi/.gitignore b/SameApi/.gitignore index 9d9d402..57f7080 100644 --- a/SameApi/.gitignore +++ b/SameApi/.gitignore @@ -69,5 +69,4 @@ project.fragment.lock.json artifacts/ # Others -*.cache -*.db \ No newline at end of file +*.cache \ No newline at end of file From 825a8f1f69b5cf142f767b7f4085cc04f7fdfea8 Mon Sep 17 00:00:00 2001 From: Mattis Date: Fri, 19 Sep 2025 11:19:51 +0200 Subject: [PATCH 16/77] update and add connectionstring --- .../SameApi.Business/SameApi.Business.csproj | 2 +- SameApi/SameApi.Data/SameApi.Data.csproj | 2 +- .../SameApi.Db/DbConfigurationExtension.cs | 22 +++++++++++++++++++ .../SameApi.Db/Repository/IUserRepository.cs | 10 +++++++++ .../Implementation/UserRepository.cs | 13 +++++++++++ SameApi/SameApi.Db/SameApi.Db.csproj | 3 ++- SameApi/SameApi.Dto/SameApi.Dto.csproj | 2 +- SameApi/SameApi.Model/SameApi.Model.csproj | 2 +- SameApi/SameApi/SameApi.App.csproj | 3 ++- 9 files changed, 53 insertions(+), 6 deletions(-) create mode 100644 SameApi/SameApi.Db/DbConfigurationExtension.cs create mode 100644 SameApi/SameApi.Db/Repository/IUserRepository.cs create mode 100644 SameApi/SameApi.Db/Repository/Implementation/UserRepository.cs diff --git a/SameApi/SameApi.Business/SameApi.Business.csproj b/SameApi/SameApi.Business/SameApi.Business.csproj index e355ac8..1e53d7d 100644 --- a/SameApi/SameApi.Business/SameApi.Business.csproj +++ b/SameApi/SameApi.Business/SameApi.Business.csproj @@ -12,7 +12,7 @@ - +
diff --git a/SameApi/SameApi.Data/SameApi.Data.csproj b/SameApi/SameApi.Data/SameApi.Data.csproj index face20a..9ba7383 100644 --- a/SameApi/SameApi.Data/SameApi.Data.csproj +++ b/SameApi/SameApi.Data/SameApi.Data.csproj @@ -7,7 +7,7 @@ - + diff --git a/SameApi/SameApi.Db/DbConfigurationExtension.cs b/SameApi/SameApi.Db/DbConfigurationExtension.cs new file mode 100644 index 0000000..2639ca1 --- /dev/null +++ b/SameApi/SameApi.Db/DbConfigurationExtension.cs @@ -0,0 +1,22 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Configuration; +using SameApi.Db.DbContexts; +using Microsoft.EntityFrameworkCore; + +namespace ApiTest.Db +{ + public static class DbConfigurationExtension + { + public static void AddApiTestDbContext(this IServiceCollection services, IConfiguration configuration) + { + var connectionString = configuration.GetConnectionString("DefaultConnection"); + + services.AddDbContext(options => + options.UseMySql(connectionString, ServerVersion.AutoDetect(connectionString), o => + { + o.UseQuerySplittingBehavior(QuerySplittingBehavior.SplitQuery).UseRelationalNulls(); + o.CommandTimeout((int)TimeSpan.FromMinutes(10).TotalSeconds); + })); + } + } +} \ No newline at end of file diff --git a/SameApi/SameApi.Db/Repository/IUserRepository.cs b/SameApi/SameApi.Db/Repository/IUserRepository.cs new file mode 100644 index 0000000..b5f985d --- /dev/null +++ b/SameApi/SameApi.Db/Repository/IUserRepository.cs @@ -0,0 +1,10 @@ +using SameApi.Data.Repository; +using SameApi.Db.DbContexts; +using SameApi.Model; + +namespace SameApi.Db.Repository +{ + public interface IUserRepository : IBaseRepository + { + } +} \ No newline at end of file diff --git a/SameApi/SameApi.Db/Repository/Implementation/UserRepository.cs b/SameApi/SameApi.Db/Repository/Implementation/UserRepository.cs new file mode 100644 index 0000000..9d71f51 --- /dev/null +++ b/SameApi/SameApi.Db/Repository/Implementation/UserRepository.cs @@ -0,0 +1,13 @@ +using SameApi.Data.Repository; +using SameApi.Db.DbContexts; +using SameApi.Model; + +namespace SameApi.Db.Repository.Implementation +{ + class UserRepository : BaseRepository, IUserRepository + { + public UserRepository(ISameApitDbContext context) : base(context) + { + } + } +} \ No newline at end of file diff --git a/SameApi/SameApi.Db/SameApi.Db.csproj b/SameApi/SameApi.Db/SameApi.Db.csproj index ea94a8c..e609177 100644 --- a/SameApi/SameApi.Db/SameApi.Db.csproj +++ b/SameApi/SameApi.Db/SameApi.Db.csproj @@ -7,7 +7,8 @@ - + + diff --git a/SameApi/SameApi.Dto/SameApi.Dto.csproj b/SameApi/SameApi.Dto/SameApi.Dto.csproj index face20a..9ba7383 100644 --- a/SameApi/SameApi.Dto/SameApi.Dto.csproj +++ b/SameApi/SameApi.Dto/SameApi.Dto.csproj @@ -7,7 +7,7 @@ - + diff --git a/SameApi/SameApi.Model/SameApi.Model.csproj b/SameApi/SameApi.Model/SameApi.Model.csproj index 38fe818..776ab7f 100644 --- a/SameApi/SameApi.Model/SameApi.Model.csproj +++ b/SameApi/SameApi.Model/SameApi.Model.csproj @@ -7,7 +7,7 @@ - + diff --git a/SameApi/SameApi/SameApi.App.csproj b/SameApi/SameApi/SameApi.App.csproj index 1373fa8..637f56c 100644 --- a/SameApi/SameApi/SameApi.App.csproj +++ b/SameApi/SameApi/SameApi.App.csproj @@ -4,11 +4,12 @@ net9.0 enable enable + 178caa09-02fe-4c7f-8045-380bd957697f - + From e80ab616a63d17ecbbaa0705b11bf5942b454d59 Mon Sep 17 00:00:00 2001 From: Mattis Date: Fri, 19 Sep 2025 11:30:36 +0200 Subject: [PATCH 17/77] Miaou --- .../SameApi.Business/SameApi.Business.csproj | 8 ++++- .../User/Query/GetByIdUserQuery.cs | 34 +++++++++++++++++++ SameApi/SameApi.Dto/UserResponse.cs | 16 +++++++++ SameApi/SameApi/Controllers/UserController.cs | 32 +++++++++++++++++ SameApi/SameApi/SameApi.App.csproj | 6 ++-- SameApi/SameApi/SameApi.App.csproj.user | 2 ++ 6 files changed, 93 insertions(+), 5 deletions(-) create mode 100644 SameApi/SameApi.Business/User/Query/GetByIdUserQuery.cs create mode 100644 SameApi/SameApi.Dto/UserResponse.cs create mode 100644 SameApi/SameApi/Controllers/UserController.cs diff --git a/SameApi/SameApi.Business/SameApi.Business.csproj b/SameApi/SameApi.Business/SameApi.Business.csproj index 1e53d7d..0d97634 100644 --- a/SameApi/SameApi.Business/SameApi.Business.csproj +++ b/SameApi/SameApi.Business/SameApi.Business.csproj @@ -8,11 +8,17 @@ - + + + + + + + diff --git a/SameApi/SameApi.Business/User/Query/GetByIdUserQuery.cs b/SameApi/SameApi.Business/User/Query/GetByIdUserQuery.cs new file mode 100644 index 0000000..9bcf473 --- /dev/null +++ b/SameApi/SameApi.Business/User/Query/GetByIdUserQuery.cs @@ -0,0 +1,34 @@ +using SameApi.Db.UnitOfWork; +using AutoMapper; +using SameApi.Dto; +using MediatR; + +namespace SameApi.Business.User.Command +{ + public class GetByIdUserQuery: IRequest + { + public int Id { get; set; } + } + public class GetPersonByIdQueryHandler : IRequestHandler + { + readonly ISameApiUnitOfWork _apiTestUnitOfWork; + readonly IMapper _mapper; + + public GetPersonByIdQueryHandler( + ISameApiUnitOfWork apiTestUnitOfWork, IMapper mapper) + { + _apiTestUnitOfWork = apiTestUnitOfWork; + _mapper = mapper; + } + + + public async Task Handle(GetPersonByIdQuery request, CancellationToken cancellationToken) + { + var data = await _apiTestUnitOfWork.PersonRepository.GetByIdAsync(request.Id); + + var result = _mapper.Map(data); + return result; + } + } + +} \ No newline at end of file diff --git a/SameApi/SameApi.Dto/UserResponse.cs b/SameApi/SameApi.Dto/UserResponse.cs new file mode 100644 index 0000000..836ba5a --- /dev/null +++ b/SameApi/SameApi.Dto/UserResponse.cs @@ -0,0 +1,16 @@ +namespace SameApi.Dto +{ + public class UserResponse + { + public int Id { get; set; } + public bool IsAdmin { get; set; } + public int Age { get; set; } + public required string Pseudo { get; set; } + public required string Email { get; set; } + public required string Password { get; set; } + public int NumberFollowers { get; set; } + public DateTime CreateAt { get; set; } + public int GenderId { get; set; } + public int? GenderDao { get; set; } + } +} \ No newline at end of file diff --git a/SameApi/SameApi/Controllers/UserController.cs b/SameApi/SameApi/Controllers/UserController.cs new file mode 100644 index 0000000..5f9686e --- /dev/null +++ b/SameApi/SameApi/Controllers/UserController.cs @@ -0,0 +1,32 @@ +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; + +using MediatR; +using AutoMapper; + +namespace SameApi.App.Controllers +{ + public class UserController : Controller + { + [ApiController] + [Route("api/person")] + public class PersonController : ControllerBase + { + readonly IMediator _mediator; + readonly IMapper _mapper; + + public PersonController(IMediator mediator, IMapper mapper) + { + _mediator = mediator; + _mapper = mapper; + } + + [HttpGet] + public async Task> GetAllAync() + { + var result = await _mediator.Send(new GetByIdUserQuery()); + return Ok(result); + } + } + } +} diff --git a/SameApi/SameApi/SameApi.App.csproj b/SameApi/SameApi/SameApi.App.csproj index 637f56c..0ae2017 100644 --- a/SameApi/SameApi/SameApi.App.csproj +++ b/SameApi/SameApi/SameApi.App.csproj @@ -8,12 +8,10 @@ + + - - - - diff --git a/SameApi/SameApi/SameApi.App.csproj.user b/SameApi/SameApi/SameApi.App.csproj.user index 9ff5820..7b51d0d 100644 --- a/SameApi/SameApi/SameApi.App.csproj.user +++ b/SameApi/SameApi/SameApi.App.csproj.user @@ -2,5 +2,7 @@ https + MvcControllerWithActionsScaffolder + root/Common/MVC/Controller \ No newline at end of file From 5b1c87838ebae74ee854760140ea2e16d2669682 Mon Sep 17 00:00:00 2001 From: Tisa_48 <130873934+Tisa40486@users.noreply.github.com> Date: Sun, 21 Sep 2025 13:02:50 +0200 Subject: [PATCH 18/77] api completed first validation --- .../SameApi.App/Controllers/UserController.cs | 29 +++++ SameApi/SameApi.App/Program.cs | 66 ++++++++++++ .../Properties/launchSettings.json | 5 +- SameApi/SameApi.App/SameApi.App.csproj | 32 ++++++ SameApi/{SameApi => SameApi.App}/SameApi.http | 0 .../appsettings.Development.json | 0 .../{SameApi => SameApi.App}/appsettings.json | 0 .../SameApi.Business/SameApi.Business.csproj | 2 + SameApi/SameApi.Business/SameApiProfile.cs | 16 ++- .../User/Query/GetByIdUserQuery.cs | 12 +-- .../SameApi.Db/DbConfigurationExtension.cs | 8 +- .../SameApi.Db/DbContexts/SameApiDbContext.cs | 3 +- SameApi/SameApi.Db/DbRegisterExtension.cs | 18 ++++ .../20250921103910_1.0.0.Designer.cs | 101 ++++++++++++++++++ .../Migrations/20250921103910_1.0.0.cs | 79 ++++++++++++++ .../SameApiDbContextModelSnapshot.cs | 98 +++++++++++++++++ SameApi/SameApi.Db/SameApi.Db.csproj | 9 ++ SameApi/SameApi/Controllers/UserController.cs | 32 ------ SameApi/SameApi/Program.cs | 23 ---- SameApi/SameApi/SameApi.App.csproj | 17 --- SameApi/SameApi/SameApi.App.csproj.user | 8 -- 21 files changed, 462 insertions(+), 96 deletions(-) create mode 100644 SameApi/SameApi.App/Controllers/UserController.cs create mode 100644 SameApi/SameApi.App/Program.cs rename SameApi/{SameApi => SameApi.App}/Properties/launchSettings.json (86%) create mode 100644 SameApi/SameApi.App/SameApi.App.csproj rename SameApi/{SameApi => SameApi.App}/SameApi.http (100%) rename SameApi/{SameApi => SameApi.App}/appsettings.Development.json (100%) rename SameApi/{SameApi => SameApi.App}/appsettings.json (100%) create mode 100644 SameApi/SameApi.Db/DbRegisterExtension.cs create mode 100644 SameApi/SameApi.Db/Migrations/20250921103910_1.0.0.Designer.cs create mode 100644 SameApi/SameApi.Db/Migrations/20250921103910_1.0.0.cs create mode 100644 SameApi/SameApi.Db/Migrations/SameApiDbContextModelSnapshot.cs delete mode 100644 SameApi/SameApi/Controllers/UserController.cs delete mode 100644 SameApi/SameApi/Program.cs delete mode 100644 SameApi/SameApi/SameApi.App.csproj delete mode 100644 SameApi/SameApi/SameApi.App.csproj.user diff --git a/SameApi/SameApi.App/Controllers/UserController.cs b/SameApi/SameApi.App/Controllers/UserController.cs new file mode 100644 index 0000000..bd5a5f1 --- /dev/null +++ b/SameApi/SameApi.App/Controllers/UserController.cs @@ -0,0 +1,29 @@ +using AutoMapper; +using MediatR; +using Microsoft.AspNetCore.Mvc; +using SameApi.Business.User.Command; +using SameApi.Dto; + +namespace SameApi.App.Controllers +{ + [ApiController] + [Route("api/person")] + public class UserController : ControllerBase + { + private readonly IMediator _mediator; + private readonly IMapper _mapper; + + public UserController(IMediator mediator, IMapper mapper) + { + _mediator = mediator; + _mapper = mapper; + } + + [HttpGet] + public async Task> GetAllAsync() + { + var result = await _mediator.Send(new GetByIdUserQuery()); + return Ok(result); + } + } +} diff --git a/SameApi/SameApi.App/Program.cs b/SameApi/SameApi.App/Program.cs new file mode 100644 index 0000000..7c81cde --- /dev/null +++ b/SameApi/SameApi.App/Program.cs @@ -0,0 +1,66 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.OpenApi.Models; +using SameApi.Business; +using SameApi.Db; +using Swashbuckle.AspNetCore.SwaggerGen; +using Swashbuckle.AspNetCore.SwaggerUI; + +var builder = WebApplication.CreateBuilder(args); + +// -------------------- CORS -------------------- +builder.Services.AddCors(options => +{ + options.AddPolicy("AllowReactDevClient", policy => + { + policy.WithOrigins("http://localhost:3000") + .AllowAnyHeader() + .AllowAnyMethod(); + }); +}); + +// -------------------- Controllers -------------------- +builder.Services.AddControllers(); + +// -------------------- Swagger -------------------- +builder.Services.AddSwaggerGen(c => +{ + c.SwaggerDoc("v1", new OpenApiInfo + { + Title = "Api Test", + Version = "v1" + }); + + c.AddServer(new OpenApiServer + { + Url = "https://localhost:7171", + Description = "Local dev server" + }); +}); + +// -------------------- Services -------------------- +builder.Services.AddSameApibContext(builder.Configuration); +builder.Services.RegisterSameApiDbContainer(); +builder.Services.AddAutoMapper(typeof(SameApiProfile).Assembly); +builder.Services.AddMediatR(x => x.RegisterServicesFromAssemblies(typeof(SameApiProfile).Assembly)); + +var app = builder.Build(); + +// -------------------- Middleware -------------------- +app.UseCors("AllowReactDevClient"); + +if (app.Environment.IsDevelopment()) +{ + // Swagger uniquement en dveloppement + app.UseSwagger(); + app.UseSwaggerUI(c => + { + c.SwaggerEndpoint("/swagger/v1/swagger.json", "Api Test v1"); + c.RoutePrefix = "swagger"; // Accessible via /swagger + }); +} + +app.UseHttpsRedirection(); +app.UseAuthorization(); +app.MapControllers(); + +app.Run(); diff --git a/SameApi/SameApi/Properties/launchSettings.json b/SameApi/SameApi.App/Properties/launchSettings.json similarity index 86% rename from SameApi/SameApi/Properties/launchSettings.json rename to SameApi/SameApi.App/Properties/launchSettings.json index fee954e..c0fd7fb 100644 --- a/SameApi/SameApi/Properties/launchSettings.json +++ b/SameApi/SameApi.App/Properties/launchSettings.json @@ -4,7 +4,7 @@ "http": { "commandName": "Project", "dotnetRunMessages": true, - "launchBrowser": false, + "launchBrowser": true, "applicationUrl": "http://localhost:5133", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" @@ -13,7 +13,8 @@ "https": { "commandName": "Project", "dotnetRunMessages": true, - "launchBrowser": false, + "launchBrowser": true, + "launchUrl": "swagger", "applicationUrl": "https://localhost:7171;http://localhost:5133", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" diff --git a/SameApi/SameApi.App/SameApi.App.csproj b/SameApi/SameApi.App/SameApi.App.csproj new file mode 100644 index 0000000..6b3ae75 --- /dev/null +++ b/SameApi/SameApi.App/SameApi.App.csproj @@ -0,0 +1,32 @@ + + + + net9.0 + enable + enable + 178caa09-02fe-4c7f-8045-380bd957697f + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + diff --git a/SameApi/SameApi/SameApi.http b/SameApi/SameApi.App/SameApi.http similarity index 100% rename from SameApi/SameApi/SameApi.http rename to SameApi/SameApi.App/SameApi.http diff --git a/SameApi/SameApi/appsettings.Development.json b/SameApi/SameApi.App/appsettings.Development.json similarity index 100% rename from SameApi/SameApi/appsettings.Development.json rename to SameApi/SameApi.App/appsettings.Development.json diff --git a/SameApi/SameApi/appsettings.json b/SameApi/SameApi.App/appsettings.json similarity index 100% rename from SameApi/SameApi/appsettings.json rename to SameApi/SameApi.App/appsettings.json diff --git a/SameApi/SameApi.Business/SameApi.Business.csproj b/SameApi/SameApi.Business/SameApi.Business.csproj index 0d97634..926acac 100644 --- a/SameApi/SameApi.Business/SameApi.Business.csproj +++ b/SameApi/SameApi.Business/SameApi.Business.csproj @@ -14,6 +14,8 @@ + + diff --git a/SameApi/SameApi.Business/SameApiProfile.cs b/SameApi/SameApi.Business/SameApiProfile.cs index 7f32240..3489ecb 100644 --- a/SameApi/SameApi.Business/SameApiProfile.cs +++ b/SameApi/SameApi.Business/SameApiProfile.cs @@ -1,6 +1,16 @@ -namespace SameApi.Business +using AutoMapper; +using SameApi.Dto; +using SameApi.Model; + +namespace SameApi.Business { - public class SameApiProfile + public class SameApiProfile : Profile { + public SameApiProfile() + { + CreateMap(); + //CreateMap(); + + } } -} +} \ No newline at end of file diff --git a/SameApi/SameApi.Business/User/Query/GetByIdUserQuery.cs b/SameApi/SameApi.Business/User/Query/GetByIdUserQuery.cs index 9bcf473..f557d46 100644 --- a/SameApi/SameApi.Business/User/Query/GetByIdUserQuery.cs +++ b/SameApi/SameApi.Business/User/Query/GetByIdUserQuery.cs @@ -9,9 +9,9 @@ public class GetByIdUserQuery: IRequest { public int Id { get; set; } } - public class GetPersonByIdQueryHandler : IRequestHandler + public class GetPersonByIdQueryHandler : IRequestHandler { - readonly ISameApiUnitOfWork _apiTestUnitOfWork; + readonly ISameApiUnitOfWork _apiTestUnitOfWork; readonly IMapper _mapper; public GetPersonByIdQueryHandler( @@ -22,13 +22,13 @@ public GetPersonByIdQueryHandler( } - public async Task Handle(GetPersonByIdQuery request, CancellationToken cancellationToken) + public async Task Handle(GetByIdUserQuery request, CancellationToken cancellationToken) { - var data = await _apiTestUnitOfWork.PersonRepository.GetByIdAsync(request.Id); + var data = await _apiTestUnitOfWork.UserRepository.GetByIdAsync(request.Id); - var result = _mapper.Map(data); + var result = _mapper.Map(data); return result; } - } + } } \ No newline at end of file diff --git a/SameApi/SameApi.Db/DbConfigurationExtension.cs b/SameApi/SameApi.Db/DbConfigurationExtension.cs index 2639ca1..93a344d 100644 --- a/SameApi/SameApi.Db/DbConfigurationExtension.cs +++ b/SameApi/SameApi.Db/DbConfigurationExtension.cs @@ -1,13 +1,13 @@ -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; using SameApi.Db.DbContexts; using Microsoft.EntityFrameworkCore; -namespace ApiTest.Db +namespace SameApi.Db { public static class DbConfigurationExtension { - public static void AddApiTestDbContext(this IServiceCollection services, IConfiguration configuration) + public static void AddSameApibContext(this IServiceCollection services, IConfiguration configuration) { var connectionString = configuration.GetConnectionString("DefaultConnection"); diff --git a/SameApi/SameApi.Db/DbContexts/SameApiDbContext.cs b/SameApi/SameApi.Db/DbContexts/SameApiDbContext.cs index fbeb4c0..d3ebe0c 100644 --- a/SameApi/SameApi.Db/DbContexts/SameApiDbContext.cs +++ b/SameApi/SameApi.Db/DbContexts/SameApiDbContext.cs @@ -1,5 +1,6 @@ using Microsoft.EntityFrameworkCore; using SameApi.Data.DbContexts; +using SameApi.Model; namespace SameApi.Db.DbContexts { @@ -8,7 +9,7 @@ public class SameApiDbContext : BaseDbContext, ISameApitDbContext public SameApiDbContext(DbContextOptions options) : base(options) { } - + public DbSet Users { get; set; } //put dbset } } \ No newline at end of file diff --git a/SameApi/SameApi.Db/DbRegisterExtension.cs b/SameApi/SameApi.Db/DbRegisterExtension.cs new file mode 100644 index 0000000..c571a4c --- /dev/null +++ b/SameApi/SameApi.Db/DbRegisterExtension.cs @@ -0,0 +1,18 @@ +using Microsoft.Extensions.DependencyInjection; +using SameApi.Db.DbContexts; +using SameApi.Db.Repository; +using SameApi.Db.Repository.Implementation; +using SameApi.Db.UnitOfWork; + +namespace SameApi.Db +{ + public static class DbRegisterExtension + { + public static void RegisterSameApiDbContainer(this IServiceCollection services) + { + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + } + } +} \ No newline at end of file diff --git a/SameApi/SameApi.Db/Migrations/20250921103910_1.0.0.Designer.cs b/SameApi/SameApi.Db/Migrations/20250921103910_1.0.0.Designer.cs new file mode 100644 index 0000000..b0ace4f --- /dev/null +++ b/SameApi/SameApi.Db/Migrations/20250921103910_1.0.0.Designer.cs @@ -0,0 +1,101 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using SameApi.Db.DbContexts; + +#nullable disable + +namespace SameApi.Db.Migrations +{ + [DbContext(typeof(SameApiDbContext))] + [Migration("20250921103910_1.0.0")] + partial class _100 + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "9.0.9") + .HasAnnotation("Relational:MaxIdentifierLength", 64); + + MySqlModelBuilderExtensions.AutoIncrementColumns(modelBuilder); + + modelBuilder.Entity("SameApi.Model.LKP.LKP_GenderDao", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("LKP_SameApi_Gender"); + }); + + modelBuilder.Entity("SameApi.Model.UserDao", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("Age") + .HasColumnType("int"); + + b.Property("CreateAt") + .HasColumnType("datetime(6)"); + + b.Property("Email") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("GenderDaoId") + .HasColumnType("int"); + + b.Property("GenderId") + .HasColumnType("int"); + + b.Property("IsAdmin") + .HasColumnType("tinyint(1)"); + + b.Property("NumberFollowers") + .HasColumnType("int"); + + b.Property("Password") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Pseudo") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("GenderDaoId"); + + b.ToTable("SameApi_User"); + }); + + modelBuilder.Entity("SameApi.Model.UserDao", b => + { + b.HasOne("SameApi.Model.LKP.LKP_GenderDao", "GenderDao") + .WithMany() + .HasForeignKey("GenderDaoId"); + + b.Navigation("GenderDao"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/SameApi/SameApi.Db/Migrations/20250921103910_1.0.0.cs b/SameApi/SameApi.Db/Migrations/20250921103910_1.0.0.cs new file mode 100644 index 0000000..8255d14 --- /dev/null +++ b/SameApi/SameApi.Db/Migrations/20250921103910_1.0.0.cs @@ -0,0 +1,79 @@ +using System; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace SameApi.Db.Migrations +{ + /// + public partial class _100 : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterDatabase() + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "LKP_SameApi_Gender", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), + Name = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4") + }, + constraints: table => + { + table.PrimaryKey("PK_LKP_SameApi_Gender", x => x.Id); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "SameApi_User", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), + IsAdmin = table.Column(type: "tinyint(1)", nullable: false), + Age = table.Column(type: "int", nullable: false), + Pseudo = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + Email = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + Password = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + NumberFollowers = table.Column(type: "int", nullable: false), + CreateAt = table.Column(type: "datetime(6)", nullable: false), + GenderId = table.Column(type: "int", nullable: false), + GenderDaoId = table.Column(type: "int", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_SameApi_User", x => x.Id); + table.ForeignKey( + name: "FK_SameApi_User_LKP_SameApi_Gender_GenderDaoId", + column: x => x.GenderDaoId, + principalTable: "LKP_SameApi_Gender", + principalColumn: "Id"); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateIndex( + name: "IX_SameApi_User_GenderDaoId", + table: "SameApi_User", + column: "GenderDaoId"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "SameApi_User"); + + migrationBuilder.DropTable( + name: "LKP_SameApi_Gender"); + } + } +} diff --git a/SameApi/SameApi.Db/Migrations/SameApiDbContextModelSnapshot.cs b/SameApi/SameApi.Db/Migrations/SameApiDbContextModelSnapshot.cs new file mode 100644 index 0000000..e164067 --- /dev/null +++ b/SameApi/SameApi.Db/Migrations/SameApiDbContextModelSnapshot.cs @@ -0,0 +1,98 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using SameApi.Db.DbContexts; + +#nullable disable + +namespace SameApi.Db.Migrations +{ + [DbContext(typeof(SameApiDbContext))] + partial class SameApiDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "9.0.9") + .HasAnnotation("Relational:MaxIdentifierLength", 64); + + MySqlModelBuilderExtensions.AutoIncrementColumns(modelBuilder); + + modelBuilder.Entity("SameApi.Model.LKP.LKP_GenderDao", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("LKP_SameApi_Gender"); + }); + + modelBuilder.Entity("SameApi.Model.UserDao", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("Age") + .HasColumnType("int"); + + b.Property("CreateAt") + .HasColumnType("datetime(6)"); + + b.Property("Email") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("GenderDaoId") + .HasColumnType("int"); + + b.Property("GenderId") + .HasColumnType("int"); + + b.Property("IsAdmin") + .HasColumnType("tinyint(1)"); + + b.Property("NumberFollowers") + .HasColumnType("int"); + + b.Property("Password") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Pseudo") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("GenderDaoId"); + + b.ToTable("SameApi_User"); + }); + + modelBuilder.Entity("SameApi.Model.UserDao", b => + { + b.HasOne("SameApi.Model.LKP.LKP_GenderDao", "GenderDao") + .WithMany() + .HasForeignKey("GenderDaoId"); + + b.Navigation("GenderDao"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/SameApi/SameApi.Db/SameApi.Db.csproj b/SameApi/SameApi.Db/SameApi.Db.csproj index e609177..5ae8b9c 100644 --- a/SameApi/SameApi.Db/SameApi.Db.csproj +++ b/SameApi/SameApi.Db/SameApi.Db.csproj @@ -8,7 +8,16 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + diff --git a/SameApi/SameApi/Controllers/UserController.cs b/SameApi/SameApi/Controllers/UserController.cs deleted file mode 100644 index 5f9686e..0000000 --- a/SameApi/SameApi/Controllers/UserController.cs +++ /dev/null @@ -1,32 +0,0 @@ -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc; - -using MediatR; -using AutoMapper; - -namespace SameApi.App.Controllers -{ - public class UserController : Controller - { - [ApiController] - [Route("api/person")] - public class PersonController : ControllerBase - { - readonly IMediator _mediator; - readonly IMapper _mapper; - - public PersonController(IMediator mediator, IMapper mapper) - { - _mediator = mediator; - _mapper = mapper; - } - - [HttpGet] - public async Task> GetAllAync() - { - var result = await _mediator.Send(new GetByIdUserQuery()); - return Ok(result); - } - } - } -} diff --git a/SameApi/SameApi/Program.cs b/SameApi/SameApi/Program.cs deleted file mode 100644 index 666a9c5..0000000 --- a/SameApi/SameApi/Program.cs +++ /dev/null @@ -1,23 +0,0 @@ -var builder = WebApplication.CreateBuilder(args); - -// Add services to the container. - -builder.Services.AddControllers(); -// Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi -builder.Services.AddOpenApi(); - -var app = builder.Build(); - -// Configure the HTTP request pipeline. -if (app.Environment.IsDevelopment()) -{ - app.MapOpenApi(); -} - -app.UseHttpsRedirection(); - -app.UseAuthorization(); - -app.MapControllers(); - -app.Run(); diff --git a/SameApi/SameApi/SameApi.App.csproj b/SameApi/SameApi/SameApi.App.csproj deleted file mode 100644 index 0ae2017..0000000 --- a/SameApi/SameApi/SameApi.App.csproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - net9.0 - enable - enable - 178caa09-02fe-4c7f-8045-380bd957697f - - - - - - - - - - diff --git a/SameApi/SameApi/SameApi.App.csproj.user b/SameApi/SameApi/SameApi.App.csproj.user deleted file mode 100644 index 7b51d0d..0000000 --- a/SameApi/SameApi/SameApi.App.csproj.user +++ /dev/null @@ -1,8 +0,0 @@ - - - - https - MvcControllerWithActionsScaffolder - root/Common/MVC/Controller - - \ No newline at end of file From 0839f0ce44e0d2005c166d4437ed11561c2556ff Mon Sep 17 00:00:00 2001 From: Tisa_48 <130873934+Tisa40486@users.noreply.github.com> Date: Sun, 21 Sep 2025 13:57:17 +0200 Subject: [PATCH 19/77] api struct work --- SameApi/SameApi.App/Controllers/UserController.cs | 6 +++--- SameApi/SameApi.App/Program.cs | 6 +++--- SameApi/SameApi.App/SameApi.App.csproj | 11 +++++------ SameApi/SameApi.App/SameApi.App.http | 6 ++++++ SameApi/SameApi.App/SameApi.http | 6 ------ .../{GetByIdUserQuery.cs => GetAllUserQuery.cs} | 12 ++++++------ ....Designer.cs => 20250921114954_1.0.0.Designer.cs} | 2 +- ...250921103910_1.0.0.cs => 20250921114954_1.0.0.cs} | 0 SameApi/SameApi.sln | 12 ++++++------ 9 files changed, 30 insertions(+), 31 deletions(-) create mode 100644 SameApi/SameApi.App/SameApi.App.http delete mode 100644 SameApi/SameApi.App/SameApi.http rename SameApi/SameApi.Business/User/Query/{GetByIdUserQuery.cs => GetAllUserQuery.cs} (57%) rename SameApi/SameApi.Db/Migrations/{20250921103910_1.0.0.Designer.cs => 20250921114954_1.0.0.Designer.cs} (98%) rename SameApi/SameApi.Db/Migrations/{20250921103910_1.0.0.cs => 20250921114954_1.0.0.cs} (100%) diff --git a/SameApi/SameApi.App/Controllers/UserController.cs b/SameApi/SameApi.App/Controllers/UserController.cs index bd5a5f1..8f6a01d 100644 --- a/SameApi/SameApi.App/Controllers/UserController.cs +++ b/SameApi/SameApi.App/Controllers/UserController.cs @@ -20,10 +20,10 @@ public UserController(IMediator mediator, IMapper mapper) } [HttpGet] - public async Task> GetAllAsync() + public async Task>> GetAllAsync() { - var result = await _mediator.Send(new GetByIdUserQuery()); + var result = await _mediator.Send(new GetAllUserQuery()); return Ok(result); } } -} +} \ No newline at end of file diff --git a/SameApi/SameApi.App/Program.cs b/SameApi/SameApi.App/Program.cs index 7c81cde..892effc 100644 --- a/SameApi/SameApi.App/Program.cs +++ b/SameApi/SameApi.App/Program.cs @@ -4,7 +4,7 @@ using SameApi.Db; using Swashbuckle.AspNetCore.SwaggerGen; using Swashbuckle.AspNetCore.SwaggerUI; - +using AutoMapper; var builder = WebApplication.CreateBuilder(args); // -------------------- CORS -------------------- @@ -40,7 +40,7 @@ // -------------------- Services -------------------- builder.Services.AddSameApibContext(builder.Configuration); builder.Services.RegisterSameApiDbContainer(); -builder.Services.AddAutoMapper(typeof(SameApiProfile).Assembly); +builder.Services.AddAutoMapper(cfg => { }, typeof(SameApiProfile).Assembly); builder.Services.AddMediatR(x => x.RegisterServicesFromAssemblies(typeof(SameApiProfile).Assembly)); var app = builder.Build(); @@ -63,4 +63,4 @@ app.UseAuthorization(); app.MapControllers(); -app.Run(); +app.Run(); \ No newline at end of file diff --git a/SameApi/SameApi.App/SameApi.App.csproj b/SameApi/SameApi.App/SameApi.App.csproj index 6b3ae75..793d740 100644 --- a/SameApi/SameApi.App/SameApi.App.csproj +++ b/SameApi/SameApi.App/SameApi.App.csproj @@ -1,4 +1,4 @@ - + net9.0 @@ -8,8 +8,7 @@ - - + @@ -17,8 +16,8 @@ - all - runtime; build; native; contentfiles; analyzers; buildtransitive + all + runtime; build; native; contentfiles; analyzers; buildtransitive @@ -29,4 +28,4 @@ - + \ No newline at end of file diff --git a/SameApi/SameApi.App/SameApi.App.http b/SameApi/SameApi.App/SameApi.App.http new file mode 100644 index 0000000..eee9431 --- /dev/null +++ b/SameApi/SameApi.App/SameApi.App.http @@ -0,0 +1,6 @@ +@SameApi.App_HostAddress = http://localhost:5288 + +GET {{SameApi.App_HostAddress}}/weatherforecast/ +Accept: application/json + +### diff --git a/SameApi/SameApi.App/SameApi.http b/SameApi/SameApi.App/SameApi.http deleted file mode 100644 index 7e2d24a..0000000 --- a/SameApi/SameApi.App/SameApi.http +++ /dev/null @@ -1,6 +0,0 @@ -@SameApi_HostAddress = http://localhost:5133 - -GET {{SameApi_HostAddress}}/weatherforecast/ -Accept: application/json - -### diff --git a/SameApi/SameApi.Business/User/Query/GetByIdUserQuery.cs b/SameApi/SameApi.Business/User/Query/GetAllUserQuery.cs similarity index 57% rename from SameApi/SameApi.Business/User/Query/GetByIdUserQuery.cs rename to SameApi/SameApi.Business/User/Query/GetAllUserQuery.cs index f557d46..ca0066a 100644 --- a/SameApi/SameApi.Business/User/Query/GetByIdUserQuery.cs +++ b/SameApi/SameApi.Business/User/Query/GetAllUserQuery.cs @@ -5,16 +5,16 @@ namespace SameApi.Business.User.Command { - public class GetByIdUserQuery: IRequest + public class GetAllUserQuery: IRequest> { public int Id { get; set; } } - public class GetPersonByIdQueryHandler : IRequestHandler + public class GetAllUserQueryHandler : IRequestHandler> { readonly ISameApiUnitOfWork _apiTestUnitOfWork; readonly IMapper _mapper; - public GetPersonByIdQueryHandler( + public GetAllUserQueryHandler( ISameApiUnitOfWork apiTestUnitOfWork, IMapper mapper) { _apiTestUnitOfWork = apiTestUnitOfWork; @@ -22,11 +22,11 @@ public GetPersonByIdQueryHandler( } - public async Task Handle(GetByIdUserQuery request, CancellationToken cancellationToken) + public async Task> Handle(GetAllUserQuery request, CancellationToken cancellationToken) { - var data = await _apiTestUnitOfWork.UserRepository.GetByIdAsync(request.Id); + var data = await _apiTestUnitOfWork.UserRepository.GetAllAsync(); - var result = _mapper.Map(data); + var result = _mapper.Map>(data); return result; } diff --git a/SameApi/SameApi.Db/Migrations/20250921103910_1.0.0.Designer.cs b/SameApi/SameApi.Db/Migrations/20250921114954_1.0.0.Designer.cs similarity index 98% rename from SameApi/SameApi.Db/Migrations/20250921103910_1.0.0.Designer.cs rename to SameApi/SameApi.Db/Migrations/20250921114954_1.0.0.Designer.cs index b0ace4f..51703ea 100644 --- a/SameApi/SameApi.Db/Migrations/20250921103910_1.0.0.Designer.cs +++ b/SameApi/SameApi.Db/Migrations/20250921114954_1.0.0.Designer.cs @@ -12,7 +12,7 @@ namespace SameApi.Db.Migrations { [DbContext(typeof(SameApiDbContext))] - [Migration("20250921103910_1.0.0")] + [Migration("20250921114954_1.0.0")] partial class _100 { /// diff --git a/SameApi/SameApi.Db/Migrations/20250921103910_1.0.0.cs b/SameApi/SameApi.Db/Migrations/20250921114954_1.0.0.cs similarity index 100% rename from SameApi/SameApi.Db/Migrations/20250921103910_1.0.0.cs rename to SameApi/SameApi.Db/Migrations/20250921114954_1.0.0.cs diff --git a/SameApi/SameApi.sln b/SameApi/SameApi.sln index fe764f3..e3dd9cd 100644 --- a/SameApi/SameApi.sln +++ b/SameApi/SameApi.sln @@ -3,8 +3,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.14.36414.22 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SameApi.App", "SameApi\SameApi.App.csproj", "{63096BD5-8A15-4FCF-AE6D-66D3C9C42C51}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SameApi.Business", "SameApi.Business\SameApi.Business.csproj", "{7A6884A3-41EA-4DBD-909D-E60A8089CC7C}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SameApi.Data", "SameApi.Data\SameApi.Data.csproj", "{8952E3E2-42C3-49F8-B280-CBCD3626963D}" @@ -15,16 +13,14 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SameApi.Dto", "SameApi.Dto\ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SameApi.Model", "SameApi.Model\SameApi.Model.csproj", "{46AE2F08-6435-4248-8C9A-F4606A24CA98}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SameApi.App", "SameApi.App\SameApi.App.csproj", "{376BF37E-F49D-479B-91A3-3D7A6D33CC1E}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {63096BD5-8A15-4FCF-AE6D-66D3C9C42C51}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {63096BD5-8A15-4FCF-AE6D-66D3C9C42C51}.Debug|Any CPU.Build.0 = Debug|Any CPU - {63096BD5-8A15-4FCF-AE6D-66D3C9C42C51}.Release|Any CPU.ActiveCfg = Release|Any CPU - {63096BD5-8A15-4FCF-AE6D-66D3C9C42C51}.Release|Any CPU.Build.0 = Release|Any CPU {7A6884A3-41EA-4DBD-909D-E60A8089CC7C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7A6884A3-41EA-4DBD-909D-E60A8089CC7C}.Debug|Any CPU.Build.0 = Debug|Any CPU {7A6884A3-41EA-4DBD-909D-E60A8089CC7C}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -45,6 +41,10 @@ Global {46AE2F08-6435-4248-8C9A-F4606A24CA98}.Debug|Any CPU.Build.0 = Debug|Any CPU {46AE2F08-6435-4248-8C9A-F4606A24CA98}.Release|Any CPU.ActiveCfg = Release|Any CPU {46AE2F08-6435-4248-8C9A-F4606A24CA98}.Release|Any CPU.Build.0 = Release|Any CPU + {376BF37E-F49D-479B-91A3-3D7A6D33CC1E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {376BF37E-F49D-479B-91A3-3D7A6D33CC1E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {376BF37E-F49D-479B-91A3-3D7A6D33CC1E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {376BF37E-F49D-479B-91A3-3D7A6D33CC1E}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE From a5ea98910b8f163c92b58ff0b8130f7cb4b339ef Mon Sep 17 00:00:00 2001 From: IlP4rAd0xlI Date: Mon, 22 Sep 2025 13:38:51 +0200 Subject: [PATCH 20/77] feature/signup Create : Birthdate & email fields --- .../forms/signup/BirthdateField.tsx | 175 ++++++++++++++++++ .../components/forms/signup/EmailField.tsx | 55 ++++++ 2 files changed, 230 insertions(+) create mode 100644 React/src/components/forms/signup/BirthdateField.tsx create mode 100644 React/src/components/forms/signup/EmailField.tsx diff --git a/React/src/components/forms/signup/BirthdateField.tsx b/React/src/components/forms/signup/BirthdateField.tsx new file mode 100644 index 0000000..30504a8 --- /dev/null +++ b/React/src/components/forms/signup/BirthdateField.tsx @@ -0,0 +1,175 @@ +interface DateFieldProps { + value: { month: string; day: string; year: string }; + onChange: (value: { month: string; day: string; year: string }) => void; + label?: string; +} + +const months = [ + { value: '1', label: 'January' }, + { value: '2', label: 'February' }, + { value: '3', label: 'March' }, + { value: '4', label: 'April' }, + { value: '5', label: 'May' }, + { value: '6', label: 'June' }, + { value: '7', label: 'July' }, + { value: '8', label: 'August' }, + { value: '9', label: 'September' }, + { value: '10', label: 'October' }, + { value: '11', label: 'November' }, + { value: '12', label: 'December' } +]; + +const getDaysInMonth = (month: number, year: number): number => { + if (month === 2) { + return (year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0)) ? 29 : 28; + } + return [4, 6, 9, 11].includes(month) ? 30 : 31; +}; + +const generateYears = (): number[] => { + const currentYear = new Date().getFullYear(); + const years: number[] = []; + for (let year = currentYear - 100; year <= currentYear - 13; year++) { + years.push(year); + } + return years.reverse(); +}; + +export default function DateField({ value, onChange, label = "Date of Birth" }: DateFieldProps) { + const handleBlur = () => { + const { month, day, year } = value; + + // Check if all fields are filled + if (!month || !day || !year) { + console.log("All date fields are required"); + return; + } + + const errors: string[] = []; + const monthNum = parseInt(month); + const dayNum = parseInt(day); + const yearNum = parseInt(year); + + // Validate date logic + if (dayNum > getDaysInMonth(monthNum, yearNum)) { + errors.push("Invalid day for the selected month and year"); + } + + // Age validation (must be 13+ years old) + const birthDate = new Date(yearNum, monthNum - 1, dayNum); + const today = new Date(); + const age = today.getFullYear() - birthDate.getFullYear() - + (today < new Date(today.getFullYear(), birthDate.getMonth(), birthDate.getDate()) ? 1 : 0); + + if (age < 13) { + errors.push("You must be at least 13 years old to register"); + } + + // Future date validation + if (birthDate > today) { + errors.push("Birth date cannot be in the future"); + } + + // Log results + if (errors.length === 0) { + console.log("Date is valid"); + } else { + errors.forEach(error => console.log(error)); + } + }; + + const handleMonthChange = (e: React.ChangeEvent) => { + const newMonth = e.target.value; + let newDay = value.day; + + // Adjust day if current day is invalid for new month + if (value.year && newDay) { + const maxDays = getDaysInMonth(parseInt(newMonth), parseInt(value.year)); + if (parseInt(newDay) > maxDays) { + newDay = maxDays.toString(); + } + } + + onChange({ ...value, month: newMonth, day: newDay }); + console.clear(); + }; + + const handleDayChange = (e: React.ChangeEvent) => { + onChange({ ...value, day: e.target.value }); + console.clear(); + }; + + const handleYearChange = (e: React.ChangeEvent) => { + const newYear = e.target.value; + let newDay = value.day; + + // Adjust day if current day is invalid for new year (leap year logic) + if (value.month && newDay) { + const maxDays = getDaysInMonth(parseInt(value.month), parseInt(newYear)); + if (parseInt(newDay) > maxDays) { + newDay = maxDays.toString(); + } + } + + onChange({ ...value, year: newYear, day: newDay }); + console.clear(); + }; + + // Generate days based on selected month/year + const getDayOptions = () => { + if (!value.month || !value.year) { + return Array.from({ length: 31 }, (_, i) => i + 1); + } + const maxDays = getDaysInMonth(parseInt(value.month), parseInt(value.year)); + return Array.from({ length: maxDays }, (_, i) => i + 1); + }; + + return ( +
+ +
+ + + + + +
+
+ ); +} \ No newline at end of file diff --git a/React/src/components/forms/signup/EmailField.tsx b/React/src/components/forms/signup/EmailField.tsx new file mode 100644 index 0000000..609228e --- /dev/null +++ b/React/src/components/forms/signup/EmailField.tsx @@ -0,0 +1,55 @@ +const edugeEmailRegex = /^[a-zA-Z]+\.[a-zA-Z]+@eduge\.ch$/ + +interface EmailFieldProps { + value: string; + onChange: (value: string) => void; +} + +export default function EmailField({ value, onChange }: EmailFieldProps) +{ + // const [error, setError] = useState(''); + const handleBlur = () => + { + const trimmedValue = value.trim(); + + // Check if empty first + if (trimmedValue === "") { + console.log("Email is required"); + return; + } + + // Collect all validation errors + const errors: string[] = []; + + if (!edugeEmailRegex.test(value)) { + errors.push("Please enter a valid eduge email") + } + + // Log results + if (errors.length === 0) { + console.log("Email is valid"); + } else { + errors.forEach(error => console.log(error)); + } + } + + const handleChange = (e: React.ChangeEvent) => + { + onChange(e.target.value); + console.clear(); + }; + + return ( +
+ + +
+ ); +} \ No newline at end of file From 7d1b6ddff5973b7aa4cbcc6bd7f1ed6820b2e769 Mon Sep 17 00:00:00 2001 From: IlP4rAd0xlI Date: Mon, 22 Sep 2025 13:52:37 +0200 Subject: [PATCH 21/77] feature/signup Create : Password field --- .../forms/signup/PasswordFields.tsx | 221 ++++++++++++++++++ 1 file changed, 221 insertions(+) create mode 100644 React/src/components/forms/signup/PasswordFields.tsx diff --git a/React/src/components/forms/signup/PasswordFields.tsx b/React/src/components/forms/signup/PasswordFields.tsx new file mode 100644 index 0000000..81e9f81 --- /dev/null +++ b/React/src/components/forms/signup/PasswordFields.tsx @@ -0,0 +1,221 @@ +const sequences = [ + 'abcdefghijklmnopqrstuvwxyz', + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', + '0123456789', + 'qwertyuiopasdfghjklzxcvbnm', // QWERTY keyboard layout + 'QWERTYUIOPASDFGHJKLZXCVBNM' +]; + +const specialCharsRegex = /[!@#$%^&*()_+\-=[\]{};':"\\|,.<>/?~`]/; + +interface PasswordFieldsProps { + passwordValue: string; + confirmValue: string; + onPasswordChange: (value: string) => void; + onConfirmChange: (value: string) => void; + // User context for validation + username?: string; + firstName?: string; + lastName?: string; + email?: string; + birthdate?: string; // Format: YYYY-MM-DD or any date format +} + +export default function PasswordFields({ + passwordValue, + confirmValue, + onPasswordChange, + onConfirmChange, + username = '', + firstName = '', + lastName = '', + email = '', + birthdate = '' + }: PasswordFieldsProps) +{ + const checkConsecutiveRepeated = (password: string): boolean => + { + for (let i = 0; i < password.length - 2; i++) { + if (password[i] === password[i + 1] && password[i] === password[i + 2]) { + return true; + } + } + return false; + }; + + const checkSequentialChars = (password: string): boolean => + { + for (const sequence of sequences) { + for (let i = 0; i < sequence.length - 2; i++) { + const subSeq = sequence.substring(i, i + 3); + const reverseSeq = subSeq.split('').reverse().join(''); + if (password.toLowerCase().includes(subSeq.toLowerCase()) || + password.toLowerCase().includes(reverseSeq.toLowerCase())) { + return true; + } + } + } + return false; + }; + + const checkContainsPersonalInfo = (password: string): string[] => + { + const violations = []; + const lowerPassword = password.toLowerCase(); + + if (username && username.length >= 3 && lowerPassword.includes(username.toLowerCase())) { + violations.push("user's name"); + } + if (firstName && firstName.length >= 3 && lowerPassword.includes(firstName.toLowerCase())) { + violations.push("firstName"); + } + if (lastName && lastName.length >= 3 && lowerPassword.includes(lastName.toLowerCase())) { + violations.push("lastName"); + } + if (email && email.length >= 3) { + const emailParts = email.toLowerCase().split('@'); + if (emailParts[0].length >= 3 && lowerPassword.includes(emailParts[0])) { + violations.push("email address"); + } + } + if (birthdate && birthdate.length >= 4) { + // Check for various date formats + const dateNumbers = birthdate.replace(/[^0-9]/g, ''); + if (dateNumbers.length >= 4) { + // Check for year, month, day in various combinations + const year = dateNumbers.substring(0, 4); + const month = dateNumbers.substring(4, 6); + const day = dateNumbers.substring(6, 8); + + if (year && lowerPassword.includes(year)) violations.push("birthdate (year)"); + if (month && month.length === 2 && lowerPassword.includes(month)) violations.push("birthdate (month)"); + if (day && day.length === 2 && lowerPassword.includes(day)) violations.push("birthdate (day)"); + } + } + + return violations; + }; + + const handlePasswordBlur = () => + { + const trimmedValue = passwordValue.trim(); + + // Check if empty first + if (trimmedValue === "") { + console.log("Password is required"); + return; + } + + // Collect all validation errors + const errors: string[] = []; + + if (trimmedValue.length < 16) { + errors.push('Password must be at least 16 characters long'); + } + + if (!/[a-z]/.test(passwordValue)) { + errors.push("Password must contain at least one lowercase letter"); + } + + if (!/[A-Z]/.test(passwordValue)) { + errors.push("Password must contain at least one uppercase letter"); + } + + if (!/[0-9]/.test(passwordValue)) { + errors.push("Password must contain at least one number"); + } + + if (!specialCharsRegex.test(passwordValue)) { + errors.push("Password must contain at least one special character"); + } + + if (/\s/.test(passwordValue)) { + errors.push("Password cannot contain spaces"); + } + + if (checkConsecutiveRepeated(passwordValue)) { + errors.push("Password cannot contain 3 or more consecutive repeated characters (like 'aaa' or '111')"); + } + + if (checkSequentialChars(passwordValue)) { + errors.push("Password cannot contain sequential characters (like 'abc', '123', or 'qwerty')"); + } + + const personalInfoViolations = checkContainsPersonalInfo(passwordValue); + if (personalInfoViolations.length > 0) { + errors.push(`Password cannot contain your ${personalInfoViolations.join(', ')}`); + } + + // Log results + if (errors.length === 0) { + console.log("Password is valid"); + } else { + errors.forEach(error => console.log(error)); + } + } + + const handleConfirmBlur = () => + { + const trimmedValue = confirmValue.trim(); + + // Check if empty first + if (trimmedValue === "" && passwordValue.trim().length > 0) { + console.log('Please confirm your password'); + return; + } + + // Collect all validation errors + const errors: string[] = []; + + if (trimmedValue.length > 0 && trimmedValue !== passwordValue) { + errors.push('Passwords do not match - the two passwords must be identical'); + } + + // Log results + if (errors.length === 0 && trimmedValue.length > 0) { + console.log("Password confirmation is valid"); + } else if (errors.length > 0) { + errors.forEach(error => console.log(error)); + } + } + + const handlePasswordChange = (e: React.ChangeEvent) => + { + onPasswordChange(e.target.value); + console.clear(); + }; + + const handleConfirmChange = (e: React.ChangeEvent) => + { + onConfirmChange(e.target.value); + console.clear(); + }; + + return ( +
+
+ + +
+ +
+ + +
+
+ ); +} \ No newline at end of file From 8f80d8c11113bda2013d7473f3c6a61ea2cbd7fd Mon Sep 17 00:00:00 2001 From: IlP4rAd0xlI Date: Mon, 22 Sep 2025 13:53:14 +0200 Subject: [PATCH 22/77] feature/signup Rename : pseudo -> username --- .../components/forms/signup/SignupForm.tsx | 27 ++++++++++++++++--- .../signup/{PseudoField.tsx => Username.tsx} | 6 ++--- 2 files changed, 27 insertions(+), 6 deletions(-) rename React/src/components/forms/signup/{PseudoField.tsx => Username.tsx} (94%) diff --git a/React/src/components/forms/signup/SignupForm.tsx b/React/src/components/forms/signup/SignupForm.tsx index b0dc7e8..1688a7e 100644 --- a/React/src/components/forms/signup/SignupForm.tsx +++ b/React/src/components/forms/signup/SignupForm.tsx @@ -1,18 +1,39 @@ import { useState } from 'react'; -import PseudoField from "./PseudoField.tsx"; +import Username from "./Username.tsx"; +import EmailField from "./EmailField.tsx"; import FirstNameField from "./FirstNameField.tsx"; import LastNameField from "./LastNameField.tsx"; +import BirthdateField from "./BirthdateField.tsx"; +import PasswordFields from "./PasswordFields.tsx"; export default function SignupForm() { - const [pseudo, setPseudo] = useState(''); + const [username, setUsername] = useState(''); const [firstName, setFirstName] = useState(''); const [lastName, setLastName] = useState(''); + const [email, setEmail] = useState(''); + const [birthdate, setBirthdate] = useState(''); + const [password, setPassword] = useState(''); + const [confirmPassword, setConfirmPassword] = useState(''); + return ( <>

SignupForm

- + + + + ); } \ No newline at end of file diff --git a/React/src/components/forms/signup/PseudoField.tsx b/React/src/components/forms/signup/Username.tsx similarity index 94% rename from React/src/components/forms/signup/PseudoField.tsx rename to React/src/components/forms/signup/Username.tsx index ed4c542..e6ffd84 100644 --- a/React/src/components/forms/signup/PseudoField.tsx +++ b/React/src/components/forms/signup/Username.tsx @@ -14,12 +14,12 @@ const reservedWords = [ const specialCharsRegex = /[^a-zA-Z0-9_-]/; -interface PseudoFieldProps { +interface UsernameFieldProps { value: string; onChange: (value: string) => void; } -export default function PseudoField({ value, onChange }: PseudoFieldProps) +export default function Username({ value, onChange }: UsernameFieldProps) { const handleBlur = () => { @@ -78,7 +78,7 @@ export default function PseudoField({ value, onChange }: PseudoFieldProps) return (
- + Date: Mon, 22 Sep 2025 13:53:32 +0200 Subject: [PATCH 23/77] feature/signup Update : firstname / lastname logic --- .../forms/signup/FirstNameField.tsx | 32 +++++++++++++++---- .../components/forms/signup/LastNameField.tsx | 32 +++++++++++++++---- 2 files changed, 50 insertions(+), 14 deletions(-) diff --git a/React/src/components/forms/signup/FirstNameField.tsx b/React/src/components/forms/signup/FirstNameField.tsx index 1e397ab..c618c58 100644 --- a/React/src/components/forms/signup/FirstNameField.tsx +++ b/React/src/components/forms/signup/FirstNameField.tsx @@ -8,14 +8,34 @@ export default function FirstNameField({ value, onChange }: FirstNameFieldProps) // const [error, setError] = useState(''); const handleBlur = () => { - if (value.trim() == null || value.trim() == "") { - console.log("First name is required") + const trimmedValue = value.trim(); + + // Check if empty first + if (trimmedValue === "") { + console.log("First name is required"); + return; } - if (value.trim().length == 50) { - console.log("You cannot input more chars (max name length = 50)") + + // Collect all validation errors + const errors: string[] = []; + + if (trimmedValue.length < 2 || trimmedValue.length > 49) { + if (trimmedValue.length === 20) { + errors.push("You can't input more char for you first name (50 is the max)"); + } else { + errors.push('First name must have between 2 and 50 characters'); + } } + if (!/^[a-zA-Z]+$/.test(value) && !(value.trim() == null || value.trim() == "")) { - console.log("First Name can only contain letters") + errors.push("First name can only contain letters") + } + + // Log results + if (errors.length === 0) { + console.log("First name is valid"); + } else { + errors.forEach(error => console.log(error)); } } @@ -23,7 +43,6 @@ export default function FirstNameField({ value, onChange }: FirstNameFieldProps) { onChange(e.target.value); console.clear(); - // setError(''); // Clear error when user types }; return ( @@ -37,7 +56,6 @@ export default function FirstNameField({ value, onChange }: FirstNameFieldProps) className={"border-2"} maxLength={50} /> - {/*{error &&

{error}

}*/}
); } \ No newline at end of file diff --git a/React/src/components/forms/signup/LastNameField.tsx b/React/src/components/forms/signup/LastNameField.tsx index 17c6a0c..9a6ecd1 100644 --- a/React/src/components/forms/signup/LastNameField.tsx +++ b/React/src/components/forms/signup/LastNameField.tsx @@ -8,14 +8,34 @@ export default function LastNameField({ value, onChange }: LastNameFieldProps) // const [error, setError] = useState(''); const handleBlur = () => { - if (value.trim() == null || value.trim() == "") { - console.log("Last name is required") + const trimmedValue = value.trim(); + + // Check if empty first + if (trimmedValue === "") { + console.log("Last name is required"); + return; } - if (value.trim().length == 50) { - console.log("You cannot input more chars (max name length = 50)") + + // Collect all validation errors + const errors: string[] = []; + + if (trimmedValue.length < 2 || trimmedValue.length > 49) { + if (trimmedValue.length === 20) { + errors.push("You can't input more char for you last name (50 is the max)"); + } else { + errors.push('Last name must have between 2 and 50 characters'); + } } + if (!/^[a-zA-Z]+$/.test(value) && !(value.trim() == null || value.trim() == "")) { - console.log("Last Name can only contain letters") + errors.push("Last name can only contain letters") + } + + // Log results + if (errors.length === 0) { + console.log("Last name is valid"); + } else { + errors.forEach(error => console.log(error)); } } @@ -23,7 +43,6 @@ export default function LastNameField({ value, onChange }: LastNameFieldProps) { onChange(e.target.value); console.clear(); - // setError(''); // Clear error when user types }; return ( @@ -37,7 +56,6 @@ export default function LastNameField({ value, onChange }: LastNameFieldProps) className={"border-2"} maxLength={50} /> - {/*{error &&

{error}

}*/} ); } \ No newline at end of file From c93d48aee8c97fe7f19bda2049f1439d1259dae6 Mon Sep 17 00:00:00 2001 From: Tisa_48 <130873934+Tisa40486@users.noreply.github.com> Date: Mon, 22 Sep 2025 22:13:34 +0200 Subject: [PATCH 24/77] Add genderinput and getall and adminController --- .../Controllers/AdminController.cs | 33 +++++++++++++++++ .../SameApi.App/Controllers/UserController.cs | 2 +- .../Admin/Command/CreateGenderCommand.cs | 32 +++++++++++++++++ .../Admin/Query/GetAllGenderQuery.cs | 29 +++++++++++++++ SameApi/SameApi.Business/SameApiProfile.cs | 4 ++- .../User/Query/GetAllUserQuery.cs | 3 +- .../DbContexts/ISameApiDbContext.cs | 4 +-- .../SameApi.Db/DbContexts/SameApiDbContext.cs | 6 ++-- SameApi/SameApi.Db/DbRegisterExtension.cs | 3 +- .../Repository/IGenderRepository.cs | 12 +++++++ .../SameApi.Db/Repository/IUserRepository.cs | 2 +- .../Implementation/GenderRepository.cs | 22 ++++++++++++ .../Implementation/UserRepository.cs | 4 +-- .../UnitOfWork/ISameApiUnitOfWork.cs | 3 +- .../UnitOfWork/SameApiUnitOfWork.cs | 11 +++--- SameApi/SameApi.Dto/GenderInput.cs | 8 +++++ SameApi/SameApi.Dto/GenderResponse.cs | 8 +++++ SameApi/SameApi.Model/LKP/LKP_GenderDao.cs | 5 +-- SameApi/Sql/insertAdmin.sql | 35 +++++++++++++++++++ 19 files changed, 206 insertions(+), 20 deletions(-) create mode 100644 SameApi/SameApi.App/Controllers/AdminController.cs create mode 100644 SameApi/SameApi.Business/Admin/Command/CreateGenderCommand.cs create mode 100644 SameApi/SameApi.Business/Admin/Query/GetAllGenderQuery.cs create mode 100644 SameApi/SameApi.Db/Repository/IGenderRepository.cs create mode 100644 SameApi/SameApi.Db/Repository/Implementation/GenderRepository.cs create mode 100644 SameApi/SameApi.Dto/GenderInput.cs create mode 100644 SameApi/SameApi.Dto/GenderResponse.cs create mode 100644 SameApi/Sql/insertAdmin.sql diff --git a/SameApi/SameApi.App/Controllers/AdminController.cs b/SameApi/SameApi.App/Controllers/AdminController.cs new file mode 100644 index 0000000..eac13df --- /dev/null +++ b/SameApi/SameApi.App/Controllers/AdminController.cs @@ -0,0 +1,33 @@ +using MediatR; +using Microsoft.AspNetCore.Mvc; +using SameApi.Business.Admin.Command; +using SameApi.Business.Admin.Query; +using SameApi.Dto; + +namespace SameApi.App.Controllers +{ + [ApiController] + [Route("api/admin")] + public class AdminController : Controller + { + private readonly IMediator _mediator; + + public AdminController(IMediator mediator) + { + _mediator = mediator; + } + + [HttpGet] + public async Task>> GetAllAsync() + { + var result = await _mediator.Send(new GetAllGenderQuery()); + return Ok(result); + } + + [HttpPost] + public async Task CreateGenderAsync([FromBody] CreateGenderCommand command) + { + await _mediator.Send(command); + } + } +} \ No newline at end of file diff --git a/SameApi/SameApi.App/Controllers/UserController.cs b/SameApi/SameApi.App/Controllers/UserController.cs index 8f6a01d..7fdfe88 100644 --- a/SameApi/SameApi.App/Controllers/UserController.cs +++ b/SameApi/SameApi.App/Controllers/UserController.cs @@ -7,7 +7,7 @@ namespace SameApi.App.Controllers { [ApiController] - [Route("api/person")] + [Route("api/user")] public class UserController : ControllerBase { private readonly IMediator _mediator; diff --git a/SameApi/SameApi.Business/Admin/Command/CreateGenderCommand.cs b/SameApi/SameApi.Business/Admin/Command/CreateGenderCommand.cs new file mode 100644 index 0000000..0e157ac --- /dev/null +++ b/SameApi/SameApi.Business/Admin/Command/CreateGenderCommand.cs @@ -0,0 +1,32 @@ +using AutoMapper; +using MediatR; +using SameApi.Db.UnitOfWork; +using SameApi.Dto; +using SameApi.Model.LKP; + +namespace SameApi.Business.Admin.Command +{ + public class CreateGenderCommand : GenderInput, IRequest + { + + public class CreateGenderCommandHandler : IRequestHandler + { + private readonly IMapper _mapper; + private readonly ISameApiUnitOfWork _uow; + + public CreateGenderCommandHandler(IMapper mapper, ISameApiUnitOfWork uow) + { + _mapper = mapper; + _uow = uow; + } + + public async Task Handle(CreateGenderCommand command, CancellationToken cancellationToken) + { + var dao = _mapper.Map(command); + + await _uow.GenderRepository.AddAndSaveAsync(dao); + } + } + + } +} \ No newline at end of file diff --git a/SameApi/SameApi.Business/Admin/Query/GetAllGenderQuery.cs b/SameApi/SameApi.Business/Admin/Query/GetAllGenderQuery.cs new file mode 100644 index 0000000..82a40f0 --- /dev/null +++ b/SameApi/SameApi.Business/Admin/Query/GetAllGenderQuery.cs @@ -0,0 +1,29 @@ +using AutoMapper; +using MediatR; +using SameApi.Db.UnitOfWork; +using SameApi.Dto; + +namespace SameApi.Business.Admin.Query +{ + public class GetAllGenderQuery : IRequest> + { + public class GetAllGenderQueryHandler : IRequestHandler> + { + readonly ISameApiUnitOfWork _uow; + readonly IMapper _mapper; + + public GetAllGenderQueryHandler( + ISameApiUnitOfWork ISameApiUnitOfWork, IMapper mapper) + { + _uow = ISameApiUnitOfWork; + _mapper = mapper; + } + public async Task> Handle(GetAllGenderQuery request, CancellationToken cancellationToken) + { + var data = await _uow.GenderRepository.GetAllAsync(); + + return _mapper.Map>(data); + } + } + } +} \ No newline at end of file diff --git a/SameApi/SameApi.Business/SameApiProfile.cs b/SameApi/SameApi.Business/SameApiProfile.cs index 3489ecb..3cc255e 100644 --- a/SameApi/SameApi.Business/SameApiProfile.cs +++ b/SameApi/SameApi.Business/SameApiProfile.cs @@ -1,6 +1,7 @@ using AutoMapper; using SameApi.Dto; using SameApi.Model; +using SameApi.Model.LKP; namespace SameApi.Business { @@ -9,7 +10,8 @@ public class SameApiProfile : Profile public SameApiProfile() { CreateMap(); - //CreateMap(); + CreateMap(); + CreateMap(); } } diff --git a/SameApi/SameApi.Business/User/Query/GetAllUserQuery.cs b/SameApi/SameApi.Business/User/Query/GetAllUserQuery.cs index ca0066a..e588b46 100644 --- a/SameApi/SameApi.Business/User/Query/GetAllUserQuery.cs +++ b/SameApi/SameApi.Business/User/Query/GetAllUserQuery.cs @@ -5,9 +5,8 @@ namespace SameApi.Business.User.Command { - public class GetAllUserQuery: IRequest> + public class GetAllUserQuery : IRequest> { - public int Id { get; set; } } public class GetAllUserQueryHandler : IRequestHandler> { diff --git a/SameApi/SameApi.Db/DbContexts/ISameApiDbContext.cs b/SameApi/SameApi.Db/DbContexts/ISameApiDbContext.cs index 1ec5cff..d2fc32b 100644 --- a/SameApi/SameApi.Db/DbContexts/ISameApiDbContext.cs +++ b/SameApi/SameApi.Db/DbContexts/ISameApiDbContext.cs @@ -2,8 +2,8 @@ namespace SameApi.Db.DbContexts { - public interface ISameApitDbContext : IBaseDbContext + public interface ISameApiDbContext : IBaseDbContext { - //put dao + } } \ No newline at end of file diff --git a/SameApi/SameApi.Db/DbContexts/SameApiDbContext.cs b/SameApi/SameApi.Db/DbContexts/SameApiDbContext.cs index d3ebe0c..08ed57f 100644 --- a/SameApi/SameApi.Db/DbContexts/SameApiDbContext.cs +++ b/SameApi/SameApi.Db/DbContexts/SameApiDbContext.cs @@ -1,15 +1,17 @@ using Microsoft.EntityFrameworkCore; using SameApi.Data.DbContexts; using SameApi.Model; +using SameApi.Model.LKP; namespace SameApi.Db.DbContexts { - public class SameApiDbContext : BaseDbContext, ISameApitDbContext + public class SameApiDbContext : BaseDbContext, ISameApiDbContext { public SameApiDbContext(DbContextOptions options) : base(options) { } public DbSet Users { get; set; } - //put dbset + public DbSet Genders { get; set; } + } } \ No newline at end of file diff --git a/SameApi/SameApi.Db/DbRegisterExtension.cs b/SameApi/SameApi.Db/DbRegisterExtension.cs index c571a4c..aa5ce0c 100644 --- a/SameApi/SameApi.Db/DbRegisterExtension.cs +++ b/SameApi/SameApi.Db/DbRegisterExtension.cs @@ -10,9 +10,10 @@ public static class DbRegisterExtension { public static void RegisterSameApiDbContainer(this IServiceCollection services) { - services.AddScoped(); + services.AddScoped(); services.AddScoped(); services.AddScoped(); + services.AddScoped(); } } } \ No newline at end of file diff --git a/SameApi/SameApi.Db/Repository/IGenderRepository.cs b/SameApi/SameApi.Db/Repository/IGenderRepository.cs new file mode 100644 index 0000000..9a6bb34 --- /dev/null +++ b/SameApi/SameApi.Db/Repository/IGenderRepository.cs @@ -0,0 +1,12 @@ +using SameApi.Data.Repository; +using SameApi.Db.DbContexts; +using SameApi.Model.LKP; + +namespace SameApi.Db.Repository +{ + public interface IGenderRepository : IBaseRepository + { + + + } +} diff --git a/SameApi/SameApi.Db/Repository/IUserRepository.cs b/SameApi/SameApi.Db/Repository/IUserRepository.cs index b5f985d..bc78d8d 100644 --- a/SameApi/SameApi.Db/Repository/IUserRepository.cs +++ b/SameApi/SameApi.Db/Repository/IUserRepository.cs @@ -4,7 +4,7 @@ namespace SameApi.Db.Repository { - public interface IUserRepository : IBaseRepository + public interface IUserRepository : IBaseRepository { } } \ No newline at end of file diff --git a/SameApi/SameApi.Db/Repository/Implementation/GenderRepository.cs b/SameApi/SameApi.Db/Repository/Implementation/GenderRepository.cs new file mode 100644 index 0000000..35592e7 --- /dev/null +++ b/SameApi/SameApi.Db/Repository/Implementation/GenderRepository.cs @@ -0,0 +1,22 @@ +using SameApi.Data.Repository; +using SameApi.Db.DbContexts; +using SameApi.Model.LKP; + +namespace SameApi.Db.Repository.Implementation +{ + public class GenderRepository : BaseRepository, IGenderRepository + { + private readonly ISameApiDbContext _dbContext; + + public GenderRepository(ISameApiDbContext dbContext): base(dbContext) + { + _dbContext = dbContext; + } + + public async Task AddAndSaveAsync(LKP_GenderDao entity) + { + _dbContext.Set().Add(entity); + await _dbContext.SaveChangesAsync(); + } + } +} \ No newline at end of file diff --git a/SameApi/SameApi.Db/Repository/Implementation/UserRepository.cs b/SameApi/SameApi.Db/Repository/Implementation/UserRepository.cs index 9d71f51..1eab5ce 100644 --- a/SameApi/SameApi.Db/Repository/Implementation/UserRepository.cs +++ b/SameApi/SameApi.Db/Repository/Implementation/UserRepository.cs @@ -4,9 +4,9 @@ namespace SameApi.Db.Repository.Implementation { - class UserRepository : BaseRepository, IUserRepository + class UserRepository : BaseRepository, IUserRepository { - public UserRepository(ISameApitDbContext context) : base(context) + public UserRepository(ISameApiDbContext context) : base(context) { } } diff --git a/SameApi/SameApi.Db/UnitOfWork/ISameApiUnitOfWork.cs b/SameApi/SameApi.Db/UnitOfWork/ISameApiUnitOfWork.cs index 3e1d171..ead6d35 100644 --- a/SameApi/SameApi.Db/UnitOfWork/ISameApiUnitOfWork.cs +++ b/SameApi/SameApi.Db/UnitOfWork/ISameApiUnitOfWork.cs @@ -5,8 +5,9 @@ namespace SameApi.Db.UnitOfWork { public interface ISameApiUnitOfWork { - ISameApitDbContext Context { get; } + ISameApiDbContext Context { get; } IUserRepository UserRepository { get; } + IGenderRepository GenderRepository { get; } Task SaveChangesAsync(); } diff --git a/SameApi/SameApi.Db/UnitOfWork/SameApiUnitOfWork.cs b/SameApi/SameApi.Db/UnitOfWork/SameApiUnitOfWork.cs index 34a4d92..97a1271 100644 --- a/SameApi/SameApi.Db/UnitOfWork/SameApiUnitOfWork.cs +++ b/SameApi/SameApi.Db/UnitOfWork/SameApiUnitOfWork.cs @@ -1,18 +1,19 @@ using SameApi.Db.DbContexts; using SameApi.Db.Repository; -using SameApi.Db.Repository.Implementation; namespace SameApi.Db.UnitOfWork { public class SameApiUnitOfWork : ISameApiUnitOfWork { - public ISameApitDbContext Context { get; } + public ISameApiDbContext Context { get; } public IUserRepository UserRepository { get; } + public IGenderRepository GenderRepository { get; } - public SameApiUnitOfWork(ISameApitDbContext context , IUserRepository repository) + public SameApiUnitOfWork(ISameApiDbContext context , IUserRepository repository, IGenderRepository genderRepository) { - this.Context = context; - this.UserRepository = repository; + Context = context; + UserRepository = repository; + GenderRepository = genderRepository; } public async Task SaveChangesAsync() diff --git a/SameApi/SameApi.Dto/GenderInput.cs b/SameApi/SameApi.Dto/GenderInput.cs new file mode 100644 index 0000000..d0e14b9 --- /dev/null +++ b/SameApi/SameApi.Dto/GenderInput.cs @@ -0,0 +1,8 @@ +namespace SameApi.Dto +{ + public class GenderInput + { + public int Id { get; set; } + public string Name { get; set; } + } +} diff --git a/SameApi/SameApi.Dto/GenderResponse.cs b/SameApi/SameApi.Dto/GenderResponse.cs new file mode 100644 index 0000000..2d936cd --- /dev/null +++ b/SameApi/SameApi.Dto/GenderResponse.cs @@ -0,0 +1,8 @@ +namespace SameApi.Dto +{ + public class GenderResponse + { + public int Id { get; set; } + public string? Name { get; set; } + } +} \ No newline at end of file diff --git a/SameApi/SameApi.Model/LKP/LKP_GenderDao.cs b/SameApi/SameApi.Model/LKP/LKP_GenderDao.cs index 6b47f22..f9353cd 100644 --- a/SameApi/SameApi.Model/LKP/LKP_GenderDao.cs +++ b/SameApi/SameApi.Model/LKP/LKP_GenderDao.cs @@ -1,10 +1,11 @@ -using System.ComponentModel.DataAnnotations; +using SameApi.Data.Model; +using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace SameApi.Model.LKP { [Table("LKP_SameApi_Gender")] - public class LKP_GenderDao + public class LKP_GenderDao : IModelDao { [Key] public int Id { get; set; } diff --git a/SameApi/Sql/insertAdmin.sql b/SameApi/Sql/insertAdmin.sql new file mode 100644 index 0000000..ed3f759 --- /dev/null +++ b/SameApi/Sql/insertAdmin.sql @@ -0,0 +1,35 @@ +INSERT INTO UserDao ( + IsAdmin, + Age, + Pseudo, + Email, + Password, + NumberFollowers, + CreateAt, + GenderId +) VALUES ( + 1, -- IsAdmin: true (admin user) + 30, -- Age: example value + 'adminuser', -- Pseudo: example username + 'admin@example.com', -- Email: example email + 'hashedpassword', -- Password: store hashed password + 0, -- NumberFollowers: initial value + GETDATE(), -- CreateAt: current date/time + 1 -- GenderId: example gender id +); + +INSERT INTO LKP_SameApi_Gender ( + Id, + Name +) VALUES ( + 1, + 'Male' +); + +INSERT INTO LKP_SameApi_Gender ( + Id, + Name +) VALUES ( + 2, + 'Female' +); From 337633f48b074e83aa4f5a04feefbd3d93481c2d Mon Sep 17 00:00:00 2001 From: IlP4rAd0xlI Date: Tue, 23 Sep 2025 13:33:08 +0200 Subject: [PATCH 25/77] feature/signup SignupForm V1 (before the mess) : Add css instead of tailwind --- .../img/same-accessibility-settings-icon.png | Bin 0 -> 95633 bytes .../img/same-register-login-background.png | Bin 0 -> 600296 bytes .../forms/signup/BirthdateField.tsx | 4 +- .../forms/signup/PasswordFields.tsx | 20 +- .../components/forms/signup/SignupForm.tsx | 59 +++-- React/src/pages/Signup.tsx | 6 +- React/src/styles/signup.css | 209 ++++++++++++++++++ React/tailwind.config.js | 5 +- 8 files changed, 264 insertions(+), 39 deletions(-) create mode 100644 React/src/assets/img/same-accessibility-settings-icon.png create mode 100644 React/src/assets/img/same-register-login-background.png create mode 100644 React/src/styles/signup.css diff --git a/React/src/assets/img/same-accessibility-settings-icon.png b/React/src/assets/img/same-accessibility-settings-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..35e5020af78cc9cf97c616aea0672189b94a5968 GIT binary patch literal 95633 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 literal 0 HcmV?d00001 diff --git a/React/src/assets/img/same-register-login-background.png b/React/src/assets/img/same-register-login-background.png new file mode 100644 index 0000000000000000000000000000000000000000..46439baf7c652e5711472034d473dfd38c5369c2 GIT binary patch literal 600296 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 z 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%0Du6d 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
JwJY8@8Sm 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%0DdSM}q^JVOKkai1a|+^GSeFw;2>#aFwciy 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ˆ%H*9rjxY8`}OJL;gw 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%0DDs;yNWBeG>VD{-Au%TllKV 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 z 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

D-PEQ`suhdOD-U^Yhu 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%0DAtBmVa0N)S?Aw}ye$3;@Q+m{ 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

R9h18&4%0sVai<~ ziEWKnBKcu4+u{WbSC7}(8G9gQjB6YkCV(K@u@+01(~ftbo-KdiT;%VZ#8XrhIVt+b z@epS7Vc~mW_~Z{zcS*vJ_J7=cGBnz|mAAYiqmdj%)!`l46MbLzzWPU8VWjQDujUo$ zh^b$IV-mF&V|Uvxg^;`z0=JL%(z0L!jJZjys@^LH%+d&R*gBLQWwx)OQqMM+9^oMHOx)-2wnlQG@ikX|kf||}*b`fAjT#e@L^GBO$Z)1K zFRZMe-SoRrrDboAc;=*#HN6r&^mExdaI8AdI$^Db{8Nlj!7NFt3#u4PnxhLsh#$`- zkR?|V0`|;7B#ubLt$Q8b+CW^w+FO+U(=35p8VSlT$*a|pb{iEQqw~}5;Ms1Y$1Y;^ z5`X%$g=S4?Z7eGy>n^Icb90euSy}O35GBgVptq16%gV@EJU$1vibt)cMoz5*oivlp zN#U)V)2$QJnB0Blxt~AEtgP>Xlp(C6?G=b>QIlSy>ZY0}v&&ZPrg3J*;WdmSzaPw+ z9KBN{2;P87)a53*7)OfN0@(_6JTsRKx!hdc`Np~Q>MxyrA7toqzcvPS)R)SrQd>!d)0xr)up4V-_*Q8U(m z>7J`SbrtdGH3`uKR*@@Sq$19s(_#J3v$sXk+#N2~T364x!)!+xzTm9vcm$SZ0n7d{ ze4>D9H_^R==yV}R>%R+>ox&BCo*89e4?V@t8qK9~Au_-4cP<}BkU;I#TA{%2cS!HI zD2sTJCrh<`9c5S{`?uu;HBZzyo;Gou~R#x$>A_=|MpeT?xn zf)-I+KVCzHY;--`?i`hT8A?8g6v8|LJBVl~Y|UQkjt>o4S`OCTfPw#O)Z?`OuT&ql z(LenaoA&JFv6gBlV8wCzO+rlU0;P*EwyY~c;SEoUt_^#WMWO@(sG=ZzdXPD zUvJm`msGaJPw$7OIrmfPt!!*EGoSfL@i}F8x{7J$sEH5M%m<3j6%`-&sLzbfElWcZ z?GjEUDvkI+5#KoDy`o||3Cb-(^n*!?0!avpz&+Od4R?Lc5Bqb@Uf*^0+TXSIPkSw2 zV>#DkxTMsexNdf}W0rnbC<6Zzq)i7{c3RVo1a}q zrYadt-U|1$qLiod;}0l9wX1qra>!T1m>&)P#Xk94YT&rN_ykBI4uP#&+yC4M5+NP@ zwEHDWl}_K)@ZtH3QHP5Z^oeF=R7g;!(WS#-zmbP$ok}cD>-KH;3t8pA&NzNGd+!`0 ze=lb&d%FI7I@V=WEm$}kMy^Y}_qF|?zcP9psI$rcro}gCC!^)w>7SmTY5ny;=VC4D zAz-YE^E8K=+?b;GE^%LysfAsdm~d(H3NK$3HqIghs+qX8TP1GsZx)gM4Z#oD@dM*l zOZ_74`~@1POju2#`8UYfJ(KNHaae0dm0EMlk77dCfEV^5!~h8KYzU*}1HQBX(Lde> z6R}Rv!#fhL>=d-;Y5u9%sM%6Rzaa{mbCW-ya+|V_Rj3?xDd1*#2Lwx$;&HgP2bLnq?oC;ef~7e~{acxC?+Y1|^EnuCgTBn-QyEY7AKccW zei2z*;KuYm<>Q^o2!}biB<6(fi~$CGDKtVyv}SoG``@<11;|%Dj05VET_HB+p3XFy zJ_$+5rB~HhidPBva(c!cmYSp(hqB&fJbir-9@m)FTSM`F5SpazjFU48sn|lNuUAc+x?1J!z3Zd`9C;)jpl)%Fylu7NhOVFt9O4blzg2#{V#|3jhWw z-DT-Z$z%$tjue0Bj@_{`+ZR!JYu}S}`(|w3bJ@nr$;(R-Co_O1-l7SMpI zms^$!gN`g%L25-F9;R}(;i=%1SJV!|ga~|A%CCaqw2+v=< zSXW!s;LQ!oOL3>fJ%R|C z>zgQfx9GFJ<`hw{j1;kwjvNGgCjkP}9rnPW zJ2#k$GqV|TyHu~l4NTO$@w-Ex`NJHU5AtT9nRQ}>k!N~p?5)v=@iCw)3Je7R8@Z^P zaoVs208Aw!PvQq1%SI(I2tqqXq=7u8Ct_@KBdYX(KwnE3IB>1T37O(L7i@n_8Y>DEwI8_l}^%9b8LzXoyx6xqp}OnTEa!zbcK zd)*msD;W;}kw2!tBjpw^27?*Hh!H8=V=OO!eW3&nLf~R>o zGgvEPo9X(~H#p45yK#Sl)Pf*UC=-Cb^^6jU58S9gWv6S*zi9WlgK6GSf%AWF%a#b*#ZbwnW$(pA0&JOsotk1*Kz!;k zBRDhYa)dYXvqmu*3g}}Vp-eJtPYE`Yzo5th&rSd7<}Rac_H4^%hkqIVA7AQ#72e~x UC+Fj;w@v&0E#OM?<(Rww19RGTJOBUy literal 0 HcmV?d00001 diff --git a/React/src/components/forms/signup/BirthdateField.tsx b/React/src/components/forms/signup/BirthdateField.tsx index 30504a8..880f335 100644 --- a/React/src/components/forms/signup/BirthdateField.tsx +++ b/React/src/components/forms/signup/BirthdateField.tsx @@ -1,4 +1,4 @@ -interface DateFieldProps { +interface BirthdateFieldProps { value: { month: string; day: string; year: string }; onChange: (value: { month: string; day: string; year: string }) => void; label?: string; @@ -35,7 +35,7 @@ const generateYears = (): number[] => { return years.reverse(); }; -export default function DateField({ value, onChange, label = "Date of Birth" }: DateFieldProps) { +export default function BirthdateField({ value, onChange, label = "Date of Birth" }: BirthdateFieldProps) { const handleBlur = () => { const { month, day, year } = value; diff --git a/React/src/components/forms/signup/PasswordFields.tsx b/React/src/components/forms/signup/PasswordFields.tsx index 81e9f81..bd1e55f 100644 --- a/React/src/components/forms/signup/PasswordFields.tsx +++ b/React/src/components/forms/signup/PasswordFields.tsx @@ -18,7 +18,7 @@ interface PasswordFieldsProps { firstName?: string; lastName?: string; email?: string; - birthdate?: string; // Format: YYYY-MM-DD or any date format + birthdate?: { month: string; day: string; year: string }; } export default function PasswordFields({ @@ -30,7 +30,7 @@ export default function PasswordFields({ firstName = '', lastName = '', email = '', - birthdate = '' + birthdate = { month: '', day: '', year: '' } }: PasswordFieldsProps) { const checkConsecutiveRepeated = (password: string): boolean => @@ -78,18 +78,12 @@ export default function PasswordFields({ violations.push("email address"); } } - if (birthdate && birthdate.length >= 4) { - // Check for various date formats - const dateNumbers = birthdate.replace(/[^0-9]/g, ''); - if (dateNumbers.length >= 4) { - // Check for year, month, day in various combinations - const year = dateNumbers.substring(0, 4); - const month = dateNumbers.substring(4, 6); - const day = dateNumbers.substring(6, 8); - + if (birthdate && (birthdate.year || birthdate.month || birthdate.day)) { + const { year, month, day } = birthdate; + if (year && month && day) { if (year && lowerPassword.includes(year)) violations.push("birthdate (year)"); - if (month && month.length === 2 && lowerPassword.includes(month)) violations.push("birthdate (month)"); - if (day && day.length === 2 && lowerPassword.includes(day)) violations.push("birthdate (day)"); + if (month && lowerPassword.includes(month.padStart(2, '0'))) violations.push("birthdate (month)"); + if (day && lowerPassword.includes(day.padStart(2, '0'))) violations.push("birthdate (day)"); } } diff --git a/React/src/components/forms/signup/SignupForm.tsx b/React/src/components/forms/signup/SignupForm.tsx index 1688a7e..ad8c919 100644 --- a/React/src/components/forms/signup/SignupForm.tsx +++ b/React/src/components/forms/signup/SignupForm.tsx @@ -1,4 +1,5 @@ import { useState } from 'react'; +// import { useForm } from 'react-hook-form' import Username from "./Username.tsx"; import EmailField from "./EmailField.tsx"; import FirstNameField from "./FirstNameField.tsx"; @@ -7,33 +8,51 @@ import BirthdateField from "./BirthdateField.tsx"; import PasswordFields from "./PasswordFields.tsx"; export default function SignupForm() { + // const form = useForm() + // const { handleSubmit } = form + const [username, setUsername] = useState(''); const [firstName, setFirstName] = useState(''); const [lastName, setLastName] = useState(''); const [email, setEmail] = useState(''); - const [birthdate, setBirthdate] = useState(''); + const [birthdate, setBirthdate] = useState({ month: '', day: '', year: '' }); const [password, setPassword] = useState(''); const [confirmPassword, setConfirmPassword] = useState(''); return ( - <> -

SignupForm

- - - - - - - +
+
+
+
+ +
+
+

Register

+
+ + + + + + + + +
+
+ +
); } \ No newline at end of file diff --git a/React/src/pages/Signup.tsx b/React/src/pages/Signup.tsx index 2292c14..62a80be 100644 --- a/React/src/pages/Signup.tsx +++ b/React/src/pages/Signup.tsx @@ -1,10 +1,10 @@ import SignupForm from '../components/forms/signup/SignupForm' +import '../styles/signup.css' export default function Signup() { return ( - <> -

Signup

+
- +
); } \ No newline at end of file diff --git a/React/src/styles/signup.css b/React/src/styles/signup.css new file mode 100644 index 0000000..b99a150 --- /dev/null +++ b/React/src/styles/signup.css @@ -0,0 +1,209 @@ +/* PAGE BACKGROUND & LAYOUT */ +html, body { height: 100%; } +body { + margin: 0; + min-height: 100dvh; + display: grid; + place-items: center; + background: url('../assets/img/same-register-login-background.png') center / cover no-repeat fixed; + overflow: hidden; + font-family: system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif; +} +.page { width: 100%; display: grid; place-items: center; padding: 16px; } + +/* GLASS CARD — compact, auto height */ +.glass-form { + --bg-color: rgba(255, 255, 255, 0.20); + --highlight: rgba(255, 255, 255, 0.65); + --text: #ffffff; + --input-bg: rgba(255, 255, 255, 0.08); + --input-border: rgba(255, 255, 255, 0.18); + --input-focus: rgba(255, 255, 255, 0.20); + + position: relative; + z-index: 10; /* card below the a11y sheet/fab */ + width: min(380px, 92vw); + border-radius: 20px; + overflow: hidden; + box-shadow: 0 6px 24px rgba(0,0,0,0.25); + transition: transform .28s cubic-bezier(.2,.7,.3,1); +} + +.glass-filter, +.glass-overlay, +.glass-specular { position: absolute; inset: 0; border-radius: inherit; } + +/* Distortion ON by default */ +.glass-filter { + z-index: 1; + backdrop-filter: blur(2px); + filter: url(#glass-distortion) saturate(110%) brightness(1.05); +} + +.glass-overlay { z-index: 2; background: var(--bg-color); } + +.glass-specular { + z-index: 3; pointer-events: none; + box-shadow: inset 1px 1px 1px var(--highlight); + /* mouse-follow shimmer set via JS */ +} + +.glass-content { position: relative; z-index: 4; padding: 24px; color: var(--text); } + +/* Forms in-flow so the card can shrink/grow naturally */ +.form-container { display: none; } +.form-container.active { display: block; } + +.form-container h3 { + margin: 4px 0 16px 0; + font-size: 30px; font-weight: 800; text-align: center; +} + +/* Shared grid + exact control widths */ +.form-grid { display: grid; gap: 12px; justify-items: center; } +.form-group, .form-actions { width: 100%; display: flex; justify-content: center; } + +:root { --control-max: 320px; } +.control { + width: 100%; + max-width: var(--control-max); /* EXACT same width for fields & button */ + box-sizing: border-box; + border-radius: 12px; +} + +/* Inputs */ +.form-group .control { + padding: 12px 14px; + background: var(--input-bg); + border: 1px solid var(--input-border); + color: var(--text); + font-size: 16px; + transition: border-color .2s ease, background .2s ease, transform .08s ease; +} +.form-group .control:focus { + outline: none; background: var(--input-focus); border-color: var(--highlight); +} +/*HERE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ +/* Button matches EXACT width + radius */ +.form-actions .control { + padding: 12px 14px; + background: rgba(255,255,255,.22); + border: 1px solid rgba(255,255,255,.30); + color: var(--text); + font-size: 16px; font-weight: 700; cursor: pointer; + transition: background .2s, border-color .2s, transform .08s ease; +} +.form-actions .control:hover { background: rgba(255,255,255,.30); border-color: rgba(255,255,255,.45); } +.form-actions .control:active { transform: translateY(1px); } +button.success { background: rgba(60,255,150,.35); border-color: rgba(60,255,150,.65); } + +.form-switch { text-align: center; margin: 14px 0 4px; font-size: 14px; } +.form-switch a { color: var(--text); text-decoration: none; font-weight: 800; } +.form-switch a:hover { text-decoration: underline; } + +/* -------- Apple-style switch animation between forms -------- */ +.glass-form.animating { transform: scale(.985); } /* subtle “press” feel */ + +.form-container.entering { + animation: slideIn .34s cubic-bezier(.2,.7,.3,1) both; +} +.form-container.leaving { + position: absolute; inset: 0; /* overlay without affecting layout */ + animation: slideOut .28s cubic-bezier(.2,.7,.3,1) forwards; +} + +@keyframes slideIn { + 0% { opacity: 0; transform: translateX(18px); } + 100% { opacity: 1; transform: translateX(0); } +} +@keyframes slideOut { + 0% { opacity: 1; transform: translateX(0); } + 100% { opacity: 0; transform: translateX(-18px); } +} + +/* ----------------------------- */ +/* Accessibility FAB + Sheet */ +/* ----------------------------- */ + +.a11y-fab { + position: fixed; right: 16px; bottom: 16px; + z-index: 1001; /* always above the card */ + width: 60px; height: 60px; /* slightly bigger */ + border-radius: 999px; + border: 1px solid rgba(255,255,255,.35); + background: rgba(255,255,255,.18); + color: #fff; display: grid; place-items: center; + cursor: pointer; backdrop-filter: blur(8px); + box-shadow: 0 8px 24px rgba(0,0,0,.35), inset 0 1px 0 rgba(255,255,255,.5); +} +.a11y-fab:focus-visible { outline: 3px solid #fff; outline-offset: 2px; } +.a11y-icon { width: 36px; height: 36px; display: block; } /* bigger icon */ + +.a11y-panel { + position: fixed; right: 16px; bottom: 86px; /* offset for larger FAB */ + z-index: 1002; /* on top of everything */ + width: min(320px, 92vw); + padding: 14px 14px; + border-radius: 16px; + border: 1px solid rgba(255,255,255,.35); + background: rgba(20,20,20,.55); + color: #fff; backdrop-filter: blur(18px) saturate(120%); + box-shadow: 0 20px 40px rgba(0,0,0,.45), inset 0 1px 0 rgba(255,255,255,.2); +} +.a11y-panel[hidden] { display: none; } +.sheet-grabber { width: 36px; height: 4px; border-radius: 999px; margin: 2px auto 8px; background: rgba(255,255,255,.5); } +.a11y-panel h2 { margin: 0 0 8px 0; font-size: 17px; font-weight: 800; } + +.a11y-row { display: flex; align-items: center; justify-content: space-between; padding: 10px 10px; border-radius: 12px; } +.a11y-row:hover { background: rgba(255,255,255,.06); } +.a11y-text { font-size: 14px; } + +.switch-input { position: absolute; opacity: 0; width: 0; height: 0; } +.switch { + position: relative; width: 48px; height: 28px; border-radius: 999px; + background: rgba(255,255,255,.25); + box-shadow: inset 0 0 0 1px rgba(255,255,255,.35); + transition: background .2s ease; +} +.switch::after { + content: ""; position: absolute; top: 3px; left: 3px; width: 22px; height: 22px; border-radius: 50%; + background: #fff; box-shadow: 0 1px 2px rgba(0,0,0,.35); + transition: transform .2s ease; +} +.a11y-row .switch-input:checked + .switch { background: #34c759; box-shadow: inset 0 0 0 1px rgba(0,0,0,.15); } +.a11y-row .switch-input:checked + .switch::after { transform: translateX(20px); } + +.a11y-footer { margin-top: 8px; font-size: 12px; opacity: .85; } + +/* ----------------------------- */ +/* Accessibility EFFECT classes */ +/* ----------------------------- */ + +/* 1) Reduce transparency */ +.a11y-reduced-transparency .glass-form { + --bg-color: rgba(255,255,255,0.35); + --input-bg: rgba(255,255,255,0.16); + --input-focus: rgba(255,255,255,0.24); +} + +/* 2) Remove distortion ONLY when toggle is on */ +.a11y-no-distortion .glass-filter { + filter: saturate(110%) brightness(1.05); /* no url(#glass-distortion) */ +} + +/* 3) Increase contrast */ +.a11y-high-contrast .glass-form { + --bg-color: rgba(0,0,0,0.55); + --text: #ffffff; + --input-bg: rgba(0,0,0,0.5); + --input-border: rgba(255,255,255,0.6); + --input-focus: rgba(0,0,0,0.65); +} +.a11y-high-contrast .glass-specular { box-shadow: inset 1px 1px 0 rgba(255,255,255,0.9); } +.a11y-high-contrast .form-actions .control { + background: rgba(255,255,255,0.10); + border-color: rgba(255,255,255,0.75); +} + +/* Small viewport height fallback */ +@media (max-height: 640px) { .glass-form { width: min(400px, 92vw); } } diff --git a/React/tailwind.config.js b/React/tailwind.config.js index 29f9502..39291f0 100644 --- a/React/tailwind.config.js +++ b/React/tailwind.config.js @@ -5,7 +5,10 @@ export default { "./src/**/*.{js,jsx,ts,tsx}", ], theme: { - extend: {}, + extend: { + colors: { + }, + }, }, plugins: [], } From c41221ee4facc984669adf1ad6a1158e059e4120 Mon Sep 17 00:00:00 2001 From: IlP4rAd0xlI Date: Tue, 23 Sep 2025 16:36:08 +0200 Subject: [PATCH 26/77] feature/signup SignupForm Add : style by myself --- React/src/App.tsx | 2 + .../forms/signup/BirthdateField.tsx | 8 +- .../components/forms/signup/EmailField.tsx | 1 - .../forms/signup/FirstNameField.tsx | 1 - .../components/forms/signup/LastNameField.tsx | 1 - .../forms/signup/PasswordFields.tsx | 2 - .../components/forms/signup/SignupCard.tsx | 18 ++ .../components/forms/signup/SignupForm.tsx | 53 ++--- .../src/components/forms/signup/Username.tsx | 6 +- React/src/pages/Login.tsx | 7 + React/src/pages/Signup.tsx | 6 +- React/src/styles/signup.css | 218 +++--------------- 12 files changed, 85 insertions(+), 238 deletions(-) create mode 100644 React/src/components/forms/signup/SignupCard.tsx create mode 100644 React/src/pages/Login.tsx diff --git a/React/src/App.tsx b/React/src/App.tsx index 027cc68..fdedc37 100644 --- a/React/src/App.tsx +++ b/React/src/App.tsx @@ -1,6 +1,7 @@ import { Routes, Route } from 'react-router-dom' import Signup from './pages/Signup.tsx' import Home from './pages/Home.tsx' +import Login from './pages/Login.tsx' function App() { return ( @@ -9,6 +10,7 @@ function App() { } /> } /> } /> + } /> ) diff --git a/React/src/components/forms/signup/BirthdateField.tsx b/React/src/components/forms/signup/BirthdateField.tsx index 880f335..ee227a4 100644 --- a/React/src/components/forms/signup/BirthdateField.tsx +++ b/React/src/components/forms/signup/BirthdateField.tsx @@ -125,14 +125,14 @@ export default function BirthdateField({ value, onChange, label = "Date of Birth }; return ( -
+
diff --git a/React/src/pages/Login.tsx b/React/src/pages/Login.tsx new file mode 100644 index 0000000..4dffd13 --- /dev/null +++ b/React/src/pages/Login.tsx @@ -0,0 +1,7 @@ +export default function Login(){ + return ( + <> +

Login

+ + ) +} \ No newline at end of file diff --git a/React/src/pages/Signup.tsx b/React/src/pages/Signup.tsx index 62a80be..7291ddd 100644 --- a/React/src/pages/Signup.tsx +++ b/React/src/pages/Signup.tsx @@ -1,10 +1,10 @@ -import SignupForm from '../components/forms/signup/SignupForm' +import SignupCard from '../components/forms/signup/SignupCard' import '../styles/signup.css' export default function Signup() { return ( -
- +
+
); } \ No newline at end of file diff --git a/React/src/styles/signup.css b/React/src/styles/signup.css index b99a150..22b0c4e 100644 --- a/React/src/styles/signup.css +++ b/React/src/styles/signup.css @@ -1,5 +1,3 @@ -/* PAGE BACKGROUND & LAYOUT */ -html, body { height: 100%; } body { margin: 0; min-height: 100dvh; @@ -9,201 +7,41 @@ body { overflow: hidden; font-family: system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif; } -.page { width: 100%; display: grid; place-items: center; padding: 16px; } -/* GLASS CARD — compact, auto height */ -.glass-form { - --bg-color: rgba(255, 255, 255, 0.20); - --highlight: rgba(255, 255, 255, 0.65); - --text: #ffffff; - --input-bg: rgba(255, 255, 255, 0.08); - --input-border: rgba(255, 255, 255, 0.18); - --input-focus: rgba(255, 255, 255, 0.20); - - position: relative; - z-index: 10; /* card below the a11y sheet/fab */ - width: min(380px, 92vw); +.glass-card { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; border-radius: 20px; - overflow: hidden; - box-shadow: 0 6px 24px rgba(0,0,0,0.25); - transition: transform .28s cubic-bezier(.2,.7,.3,1); -} - -.glass-filter, -.glass-overlay, -.glass-specular { position: absolute; inset: 0; border-radius: inherit; } - -/* Distortion ON by default */ -.glass-filter { - z-index: 1; - backdrop-filter: blur(2px); - filter: url(#glass-distortion) saturate(110%) brightness(1.05); -} - -.glass-overlay { z-index: 2; background: var(--bg-color); } - -.glass-specular { - z-index: 3; pointer-events: none; - box-shadow: inset 1px 1px 1px var(--highlight); - /* mouse-follow shimmer set via JS */ -} - -.glass-content { position: relative; z-index: 4; padding: 24px; color: var(--text); } - -/* Forms in-flow so the card can shrink/grow naturally */ -.form-container { display: none; } -.form-container.active { display: block; } - -.form-container h3 { - margin: 4px 0 16px 0; - font-size: 30px; font-weight: 800; text-align: center; -} - -/* Shared grid + exact control widths */ -.form-grid { display: grid; gap: 12px; justify-items: center; } -.form-group, .form-actions { width: 100%; display: flex; justify-content: center; } - -:root { --control-max: 320px; } -.control { - width: 100%; - max-width: var(--control-max); /* EXACT same width for fields & button */ - box-sizing: border-box; - border-radius: 12px; + background-color: rgba(255, 255, 255, 0.20); + padding: 26px; } -/* Inputs */ -.form-group .control { - padding: 12px 14px; - background: var(--input-bg); - border: 1px solid var(--input-border); - color: var(--text); - font-size: 16px; - transition: border-color .2s ease, background .2s ease, transform .08s ease; +input { + border-radius: 9px; + height: 45px; + width: 50vh; + background-color: rgba(255, 255, 255, 0.20); + border: solid 1px rgba(255, 255, 255, 0.20); } -.form-group .control:focus { - outline: none; background: var(--input-focus); border-color: var(--highlight); -} -/*HERE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ -/* Button matches EXACT width + radius */ -.form-actions .control { - padding: 12px 14px; - background: rgba(255,255,255,.22); - border: 1px solid rgba(255,255,255,.30); - color: var(--text); - font-size: 16px; font-weight: 700; cursor: pointer; - transition: background .2s, border-color .2s, transform .08s ease; -} -.form-actions .control:hover { background: rgba(255,255,255,.30); border-color: rgba(255,255,255,.45); } -.form-actions .control:active { transform: translateY(1px); } -button.success { background: rgba(60,255,150,.35); border-color: rgba(60,255,150,.65); } - -.form-switch { text-align: center; margin: 14px 0 4px; font-size: 14px; } -.form-switch a { color: var(--text); text-decoration: none; font-weight: 800; } -.form-switch a:hover { text-decoration: underline; } -/* -------- Apple-style switch animation between forms -------- */ -.glass-form.animating { transform: scale(.985); } /* subtle “press” feel */ - -.form-container.entering { - animation: slideIn .34s cubic-bezier(.2,.7,.3,1) both; -} -.form-container.leaving { - position: absolute; inset: 0; /* overlay without affecting layout */ - animation: slideOut .28s cubic-bezier(.2,.7,.3,1) forwards; +label { + display: none; } -@keyframes slideIn { - 0% { opacity: 0; transform: translateX(18px); } - 100% { opacity: 1; transform: translateX(0); } -} -@keyframes slideOut { - 0% { opacity: 1; transform: translateX(0); } - 100% { opacity: 0; transform: translateX(-18px); } -} - -/* ----------------------------- */ -/* Accessibility FAB + Sheet */ -/* ----------------------------- */ - -.a11y-fab { - position: fixed; right: 16px; bottom: 16px; - z-index: 1001; /* always above the card */ - width: 60px; height: 60px; /* slightly bigger */ - border-radius: 999px; - border: 1px solid rgba(255,255,255,.35); - background: rgba(255,255,255,.18); - color: #fff; display: grid; place-items: center; - cursor: pointer; backdrop-filter: blur(8px); - box-shadow: 0 8px 24px rgba(0,0,0,.35), inset 0 1px 0 rgba(255,255,255,.5); -} -.a11y-fab:focus-visible { outline: 3px solid #fff; outline-offset: 2px; } -.a11y-icon { width: 36px; height: 36px; display: block; } /* bigger icon */ - -.a11y-panel { - position: fixed; right: 16px; bottom: 86px; /* offset for larger FAB */ - z-index: 1002; /* on top of everything */ - width: min(320px, 92vw); - padding: 14px 14px; - border-radius: 16px; - border: 1px solid rgba(255,255,255,.35); - background: rgba(20,20,20,.55); - color: #fff; backdrop-filter: blur(18px) saturate(120%); - box-shadow: 0 20px 40px rgba(0,0,0,.45), inset 0 1px 0 rgba(255,255,255,.2); -} -.a11y-panel[hidden] { display: none; } -.sheet-grabber { width: 36px; height: 4px; border-radius: 999px; margin: 2px auto 8px; background: rgba(255,255,255,.5); } -.a11y-panel h2 { margin: 0 0 8px 0; font-size: 17px; font-weight: 800; } - -.a11y-row { display: flex; align-items: center; justify-content: space-between; padding: 10px 10px; border-radius: 12px; } -.a11y-row:hover { background: rgba(255,255,255,.06); } -.a11y-text { font-size: 14px; } - -.switch-input { position: absolute; opacity: 0; width: 0; height: 0; } -.switch { - position: relative; width: 48px; height: 28px; border-radius: 999px; - background: rgba(255,255,255,.25); - box-shadow: inset 0 0 0 1px rgba(255,255,255,.35); - transition: background .2s ease; -} -.switch::after { - content: ""; position: absolute; top: 3px; left: 3px; width: 22px; height: 22px; border-radius: 50%; - background: #fff; box-shadow: 0 1px 2px rgba(0,0,0,.35); - transition: transform .2s ease; -} -.a11y-row .switch-input:checked + .switch { background: #34c759; box-shadow: inset 0 0 0 1px rgba(0,0,0,.15); } -.a11y-row .switch-input:checked + .switch::after { transform: translateX(20px); } - -.a11y-footer { margin-top: 8px; font-size: 12px; opacity: .85; } - -/* ----------------------------- */ -/* Accessibility EFFECT classes */ -/* ----------------------------- */ - -/* 1) Reduce transparency */ -.a11y-reduced-transparency .glass-form { - --bg-color: rgba(255,255,255,0.35); - --input-bg: rgba(255,255,255,0.16); - --input-focus: rgba(255,255,255,0.24); -} - -/* 2) Remove distortion ONLY when toggle is on */ -.a11y-no-distortion .glass-filter { - filter: saturate(110%) brightness(1.05); /* no url(#glass-distortion) */ -} - -/* 3) Increase contrast */ -.a11y-high-contrast .glass-form { - --bg-color: rgba(0,0,0,0.55); - --text: #ffffff; - --input-bg: rgba(0,0,0,0.5); - --input-border: rgba(255,255,255,0.6); - --input-focus: rgba(0,0,0,0.65); -} -.a11y-high-contrast .glass-specular { box-shadow: inset 1px 1px 0 rgba(255,255,255,0.9); } -.a11y-high-contrast .form-actions .control { - background: rgba(255,255,255,0.10); - border-color: rgba(255,255,255,0.75); +#birthdate-field { + display: flex; + justify-content: center; + border-radius: 9px; + height: 45px; + width: 50vh; } -/* Small viewport height fallback */ -@media (max-height: 640px) { .glass-form { width: min(400px, 92vw); } } +.dropdown { + border-radius: 9px; + height: 45px; + width: 16vh; + background-color: rgba(255, 255, 255, 0.20); + border: solid 1px rgba(255, 255, 255, 0.20); +} \ No newline at end of file From 365f13f53b749a36981aa233bef6d11445325019 Mon Sep 17 00:00:00 2001 From: Tisa_48 <130873934+Tisa40486@users.noreply.github.com> Date: Tue, 23 Sep 2025 21:57:23 +0200 Subject: [PATCH 27/77] Crud User completed --- .../Controllers/AdminController.cs | 4 +- .../SameApi.App/Controllers/UserController.cs | 23 +++++++++++- .../Admin/Command/CreateGenderCommand.cs | 4 +- .../Admin/Query/GetAllGenderQuery.cs | 4 +- .../SameApi.Business/SameApi.Business.csproj | 4 -- SameApi/SameApi.Business/SameApiProfile.cs | 2 +- .../User/Command/CreateUserCommand.cs | 28 ++++++++++++++ .../User/Command/DeleteUserCommand.cs | 32 ++++++++++++++++ .../User/Command/UpdateUserCommand.cs | 37 +++++++++++++++++++ .../User/Query/GetAllUserQuery.cs | 4 +- ...meApiDbContext.cs => IApiSameDbContext.cs} | 2 +- .../SameApi.Db/DbContexts/SameApiDbContext.cs | 2 +- SameApi/SameApi.Db/DbRegisterExtension.cs | 4 +- ...er.cs => 20250923173100_1.0.0.Designer.cs} | 2 +- ...14954_1.0.0.cs => 20250923173100_1.0.0.cs} | 0 .../Repository/IGenderRepository.cs | 2 +- .../SameApi.Db/Repository/IUserRepository.cs | 2 +- .../Implementation/GenderRepository.cs | 6 +-- .../Implementation/UserRepository.cs | 4 +- ...ApiUnitOfWork.cs => IApiSameUnitOfWork.cs} | 4 +- .../UnitOfWork/SameApiUnitOfWork.cs | 6 +-- SameApi/SameApi.Dto/UserInput.cs | 16 ++++++++ 22 files changed, 161 insertions(+), 31 deletions(-) create mode 100644 SameApi/SameApi.Business/User/Command/CreateUserCommand.cs create mode 100644 SameApi/SameApi.Business/User/Command/DeleteUserCommand.cs create mode 100644 SameApi/SameApi.Business/User/Command/UpdateUserCommand.cs rename SameApi/SameApi.Db/DbContexts/{ISameApiDbContext.cs => IApiSameDbContext.cs} (61%) rename SameApi/SameApi.Db/Migrations/{20250921114954_1.0.0.Designer.cs => 20250923173100_1.0.0.Designer.cs} (98%) rename SameApi/SameApi.Db/Migrations/{20250921114954_1.0.0.cs => 20250923173100_1.0.0.cs} (100%) rename SameApi/SameApi.Db/UnitOfWork/{ISameApiUnitOfWork.cs => IApiSameUnitOfWork.cs} (75%) create mode 100644 SameApi/SameApi.Dto/UserInput.cs diff --git a/SameApi/SameApi.App/Controllers/AdminController.cs b/SameApi/SameApi.App/Controllers/AdminController.cs index eac13df..fdea7dc 100644 --- a/SameApi/SameApi.App/Controllers/AdminController.cs +++ b/SameApi/SameApi.App/Controllers/AdminController.cs @@ -17,14 +17,14 @@ public AdminController(IMediator mediator) _mediator = mediator; } - [HttpGet] + [HttpGet("/Gender")] public async Task>> GetAllAsync() { var result = await _mediator.Send(new GetAllGenderQuery()); return Ok(result); } - [HttpPost] + [HttpPost("/CreateGender")] public async Task CreateGenderAsync([FromBody] CreateGenderCommand command) { await _mediator.Send(command); diff --git a/SameApi/SameApi.App/Controllers/UserController.cs b/SameApi/SameApi.App/Controllers/UserController.cs index 7fdfe88..54381ca 100644 --- a/SameApi/SameApi.App/Controllers/UserController.cs +++ b/SameApi/SameApi.App/Controllers/UserController.cs @@ -19,11 +19,32 @@ public UserController(IMediator mediator, IMapper mapper) _mapper = mapper; } - [HttpGet] + [HttpGet("/GetAll")] public async Task>> GetAllAsync() { var result = await _mediator.Send(new GetAllUserQuery()); return Ok(result); } + + [HttpPost] + public async Task CreateUserAsync([FromBody] CreateUserCommand command) + { + await _mediator.Send(command); + return Ok(); + } + + [HttpDelete("/User")] + public async Task DeleteUserAsync([FromQuery] int id) + { + await _mediator.Send(new DeleteUserCommand { Id = id}); + return Ok(); + } + + [HttpPut("/Update")] + public async Task UpdateUserAsync([FromBody] UpdateUserCommand command) + { + var result = await _mediator.Send(command); + return Ok(result); + } } } \ No newline at end of file diff --git a/SameApi/SameApi.Business/Admin/Command/CreateGenderCommand.cs b/SameApi/SameApi.Business/Admin/Command/CreateGenderCommand.cs index 0e157ac..2c9a794 100644 --- a/SameApi/SameApi.Business/Admin/Command/CreateGenderCommand.cs +++ b/SameApi/SameApi.Business/Admin/Command/CreateGenderCommand.cs @@ -12,9 +12,9 @@ public class CreateGenderCommand : GenderInput, IRequest public class CreateGenderCommandHandler : IRequestHandler { private readonly IMapper _mapper; - private readonly ISameApiUnitOfWork _uow; + private readonly IApiSameUnitOfWork _uow; - public CreateGenderCommandHandler(IMapper mapper, ISameApiUnitOfWork uow) + public CreateGenderCommandHandler(IMapper mapper, IApiSameUnitOfWork uow) { _mapper = mapper; _uow = uow; diff --git a/SameApi/SameApi.Business/Admin/Query/GetAllGenderQuery.cs b/SameApi/SameApi.Business/Admin/Query/GetAllGenderQuery.cs index 82a40f0..a507189 100644 --- a/SameApi/SameApi.Business/Admin/Query/GetAllGenderQuery.cs +++ b/SameApi/SameApi.Business/Admin/Query/GetAllGenderQuery.cs @@ -9,11 +9,11 @@ public class GetAllGenderQuery : IRequest> { public class GetAllGenderQueryHandler : IRequestHandler> { - readonly ISameApiUnitOfWork _uow; + readonly IApiSameUnitOfWork _uow; readonly IMapper _mapper; public GetAllGenderQueryHandler( - ISameApiUnitOfWork ISameApiUnitOfWork, IMapper mapper) + IApiSameUnitOfWork ISameApiUnitOfWork, IMapper mapper) { _uow = ISameApiUnitOfWork; _mapper = mapper; diff --git a/SameApi/SameApi.Business/SameApi.Business.csproj b/SameApi/SameApi.Business/SameApi.Business.csproj index 926acac..845bf3e 100644 --- a/SameApi/SameApi.Business/SameApi.Business.csproj +++ b/SameApi/SameApi.Business/SameApi.Business.csproj @@ -6,10 +6,6 @@ enable - - - - diff --git a/SameApi/SameApi.Business/SameApiProfile.cs b/SameApi/SameApi.Business/SameApiProfile.cs index 3cc255e..f72570e 100644 --- a/SameApi/SameApi.Business/SameApiProfile.cs +++ b/SameApi/SameApi.Business/SameApiProfile.cs @@ -9,10 +9,10 @@ public class SameApiProfile : Profile { public SameApiProfile() { + CreateMap(); CreateMap(); CreateMap(); CreateMap(); - } } } \ No newline at end of file diff --git a/SameApi/SameApi.Business/User/Command/CreateUserCommand.cs b/SameApi/SameApi.Business/User/Command/CreateUserCommand.cs new file mode 100644 index 0000000..6304a02 --- /dev/null +++ b/SameApi/SameApi.Business/User/Command/CreateUserCommand.cs @@ -0,0 +1,28 @@ +using AutoMapper; +using MediatR; +using SameApi.Db.UnitOfWork; +using SameApi.Dto; +using SameApi.Model; + +namespace SameApi.Business.User.Command +{ + public class CreateUserCommand : UserInput, IRequest + { + } + public class CreateUserCommandHandler : IRequestHandler + { + private readonly IApiSameUnitOfWork _uow; + private readonly IMapper _mapper; + public CreateUserCommandHandler( + IApiSameUnitOfWork unitOfWork, IMapper mapper) + { + _uow = unitOfWork; + _mapper = mapper; + } + public async Task Handle(CreateUserCommand request, CancellationToken cancellationToken) + { + var dao = _mapper.Map(request); + await _uow.UserRepository.AddAndSaveAsync(dao); + } + } +} \ No newline at end of file diff --git a/SameApi/SameApi.Business/User/Command/DeleteUserCommand.cs b/SameApi/SameApi.Business/User/Command/DeleteUserCommand.cs new file mode 100644 index 0000000..80ba69c --- /dev/null +++ b/SameApi/SameApi.Business/User/Command/DeleteUserCommand.cs @@ -0,0 +1,32 @@ +using AutoMapper; +using MediatR; +using SameApi.Db.UnitOfWork; +using SameApi.Dto; +using SameApi.Model; + +namespace SameApi.Business.User.Command +{ + public class DeleteUserCommand : UserInput, IRequest + { + } + public class DeleteUserCommandHandler : IRequestHandler + { + private readonly IMapper _mapper; + private readonly IApiSameUnitOfWork _iuow; + + public DeleteUserCommandHandler(IMapper mapper, IApiSameUnitOfWork iuow) + { + _mapper = mapper; + _iuow = iuow; + } + + public async Task Handle(DeleteUserCommand command, CancellationToken cancellationToken) + { + var dao = _mapper.Map(command); + + await _iuow.UserRepository.RemoveByIdAsync(command.Id); + + return dao.Id; + } + } +} diff --git a/SameApi/SameApi.Business/User/Command/UpdateUserCommand.cs b/SameApi/SameApi.Business/User/Command/UpdateUserCommand.cs new file mode 100644 index 0000000..087de76 --- /dev/null +++ b/SameApi/SameApi.Business/User/Command/UpdateUserCommand.cs @@ -0,0 +1,37 @@ +using AutoMapper; +using MediatR; +using SameApi.Db.UnitOfWork; +using SameApi.Dto; +using SameApi.Model; + +namespace SameApi.Business.User.Command +{ + public class UpdateUserCommand : UserInput, IRequest + { + + } + public class UpdateUserCommandHandler : IRequestHandler + { + readonly IApiSameUnitOfWork _apiSameUnitOfWork; + readonly IMapper _mapper; + + public UpdateUserCommandHandler( + IApiSameUnitOfWork apiSameUnitOfWork, + IMapper mapper) + { + _apiSameUnitOfWork = apiSameUnitOfWork; + _mapper = mapper; + } + + public async Task Handle(UpdateUserCommand request, CancellationToken cancellationToken) + { + var data = await _apiSameUnitOfWork.UserRepository.GetByIdAsync(request.Id, false); + + _mapper.Map(request, data); + + await _apiSameUnitOfWork.SaveChangesAsync(); + + return data.Id; + } + } +} \ No newline at end of file diff --git a/SameApi/SameApi.Business/User/Query/GetAllUserQuery.cs b/SameApi/SameApi.Business/User/Query/GetAllUserQuery.cs index e588b46..94a366c 100644 --- a/SameApi/SameApi.Business/User/Query/GetAllUserQuery.cs +++ b/SameApi/SameApi.Business/User/Query/GetAllUserQuery.cs @@ -10,11 +10,11 @@ public class GetAllUserQuery : IRequest> } public class GetAllUserQueryHandler : IRequestHandler> { - readonly ISameApiUnitOfWork _apiTestUnitOfWork; + readonly IApiSameUnitOfWork _apiTestUnitOfWork; readonly IMapper _mapper; public GetAllUserQueryHandler( - ISameApiUnitOfWork apiTestUnitOfWork, IMapper mapper) + IApiSameUnitOfWork apiTestUnitOfWork, IMapper mapper) { _apiTestUnitOfWork = apiTestUnitOfWork; _mapper = mapper; diff --git a/SameApi/SameApi.Db/DbContexts/ISameApiDbContext.cs b/SameApi/SameApi.Db/DbContexts/IApiSameDbContext.cs similarity index 61% rename from SameApi/SameApi.Db/DbContexts/ISameApiDbContext.cs rename to SameApi/SameApi.Db/DbContexts/IApiSameDbContext.cs index d2fc32b..dfa3c54 100644 --- a/SameApi/SameApi.Db/DbContexts/ISameApiDbContext.cs +++ b/SameApi/SameApi.Db/DbContexts/IApiSameDbContext.cs @@ -2,7 +2,7 @@ namespace SameApi.Db.DbContexts { - public interface ISameApiDbContext : IBaseDbContext + public interface IApiSameDbContext : IBaseDbContext { } diff --git a/SameApi/SameApi.Db/DbContexts/SameApiDbContext.cs b/SameApi/SameApi.Db/DbContexts/SameApiDbContext.cs index 08ed57f..28fce22 100644 --- a/SameApi/SameApi.Db/DbContexts/SameApiDbContext.cs +++ b/SameApi/SameApi.Db/DbContexts/SameApiDbContext.cs @@ -5,7 +5,7 @@ namespace SameApi.Db.DbContexts { - public class SameApiDbContext : BaseDbContext, ISameApiDbContext + public class SameApiDbContext : BaseDbContext, IApiSameDbContext { public SameApiDbContext(DbContextOptions options) : base(options) { diff --git a/SameApi/SameApi.Db/DbRegisterExtension.cs b/SameApi/SameApi.Db/DbRegisterExtension.cs index aa5ce0c..b57fb5f 100644 --- a/SameApi/SameApi.Db/DbRegisterExtension.cs +++ b/SameApi/SameApi.Db/DbRegisterExtension.cs @@ -10,9 +10,9 @@ public static class DbRegisterExtension { public static void RegisterSameApiDbContainer(this IServiceCollection services) { - services.AddScoped(); + services.AddScoped(); services.AddScoped(); - services.AddScoped(); + services.AddScoped(); services.AddScoped(); } } diff --git a/SameApi/SameApi.Db/Migrations/20250921114954_1.0.0.Designer.cs b/SameApi/SameApi.Db/Migrations/20250923173100_1.0.0.Designer.cs similarity index 98% rename from SameApi/SameApi.Db/Migrations/20250921114954_1.0.0.Designer.cs rename to SameApi/SameApi.Db/Migrations/20250923173100_1.0.0.Designer.cs index 51703ea..6eb1c27 100644 --- a/SameApi/SameApi.Db/Migrations/20250921114954_1.0.0.Designer.cs +++ b/SameApi/SameApi.Db/Migrations/20250923173100_1.0.0.Designer.cs @@ -12,7 +12,7 @@ namespace SameApi.Db.Migrations { [DbContext(typeof(SameApiDbContext))] - [Migration("20250921114954_1.0.0")] + [Migration("20250923173100_1.0.0")] partial class _100 { /// diff --git a/SameApi/SameApi.Db/Migrations/20250921114954_1.0.0.cs b/SameApi/SameApi.Db/Migrations/20250923173100_1.0.0.cs similarity index 100% rename from SameApi/SameApi.Db/Migrations/20250921114954_1.0.0.cs rename to SameApi/SameApi.Db/Migrations/20250923173100_1.0.0.cs diff --git a/SameApi/SameApi.Db/Repository/IGenderRepository.cs b/SameApi/SameApi.Db/Repository/IGenderRepository.cs index 9a6bb34..76e733c 100644 --- a/SameApi/SameApi.Db/Repository/IGenderRepository.cs +++ b/SameApi/SameApi.Db/Repository/IGenderRepository.cs @@ -4,7 +4,7 @@ namespace SameApi.Db.Repository { - public interface IGenderRepository : IBaseRepository + public interface IGenderRepository : IBaseRepository { diff --git a/SameApi/SameApi.Db/Repository/IUserRepository.cs b/SameApi/SameApi.Db/Repository/IUserRepository.cs index bc78d8d..9b2a7e2 100644 --- a/SameApi/SameApi.Db/Repository/IUserRepository.cs +++ b/SameApi/SameApi.Db/Repository/IUserRepository.cs @@ -4,7 +4,7 @@ namespace SameApi.Db.Repository { - public interface IUserRepository : IBaseRepository + public interface IUserRepository : IBaseRepository { } } \ No newline at end of file diff --git a/SameApi/SameApi.Db/Repository/Implementation/GenderRepository.cs b/SameApi/SameApi.Db/Repository/Implementation/GenderRepository.cs index 35592e7..7f3d89a 100644 --- a/SameApi/SameApi.Db/Repository/Implementation/GenderRepository.cs +++ b/SameApi/SameApi.Db/Repository/Implementation/GenderRepository.cs @@ -4,11 +4,11 @@ namespace SameApi.Db.Repository.Implementation { - public class GenderRepository : BaseRepository, IGenderRepository + public class GenderRepository : BaseRepository, IGenderRepository { - private readonly ISameApiDbContext _dbContext; + private readonly IApiSameDbContext _dbContext; - public GenderRepository(ISameApiDbContext dbContext): base(dbContext) + public GenderRepository(IApiSameDbContext dbContext): base(dbContext) { _dbContext = dbContext; } diff --git a/SameApi/SameApi.Db/Repository/Implementation/UserRepository.cs b/SameApi/SameApi.Db/Repository/Implementation/UserRepository.cs index 1eab5ce..c381a88 100644 --- a/SameApi/SameApi.Db/Repository/Implementation/UserRepository.cs +++ b/SameApi/SameApi.Db/Repository/Implementation/UserRepository.cs @@ -4,9 +4,9 @@ namespace SameApi.Db.Repository.Implementation { - class UserRepository : BaseRepository, IUserRepository + class UserRepository : BaseRepository, IUserRepository { - public UserRepository(ISameApiDbContext context) : base(context) + public UserRepository(IApiSameDbContext context) : base(context) { } } diff --git a/SameApi/SameApi.Db/UnitOfWork/ISameApiUnitOfWork.cs b/SameApi/SameApi.Db/UnitOfWork/IApiSameUnitOfWork.cs similarity index 75% rename from SameApi/SameApi.Db/UnitOfWork/ISameApiUnitOfWork.cs rename to SameApi/SameApi.Db/UnitOfWork/IApiSameUnitOfWork.cs index ead6d35..a2701c5 100644 --- a/SameApi/SameApi.Db/UnitOfWork/ISameApiUnitOfWork.cs +++ b/SameApi/SameApi.Db/UnitOfWork/IApiSameUnitOfWork.cs @@ -3,9 +3,9 @@ namespace SameApi.Db.UnitOfWork { - public interface ISameApiUnitOfWork + public interface IApiSameUnitOfWork { - ISameApiDbContext Context { get; } + IApiSameDbContext Context { get; } IUserRepository UserRepository { get; } IGenderRepository GenderRepository { get; } Task SaveChangesAsync(); diff --git a/SameApi/SameApi.Db/UnitOfWork/SameApiUnitOfWork.cs b/SameApi/SameApi.Db/UnitOfWork/SameApiUnitOfWork.cs index 97a1271..db13f4f 100644 --- a/SameApi/SameApi.Db/UnitOfWork/SameApiUnitOfWork.cs +++ b/SameApi/SameApi.Db/UnitOfWork/SameApiUnitOfWork.cs @@ -3,13 +3,13 @@ namespace SameApi.Db.UnitOfWork { - public class SameApiUnitOfWork : ISameApiUnitOfWork + public class SameApiUnitOfWork : IApiSameUnitOfWork { - public ISameApiDbContext Context { get; } + public IApiSameDbContext Context { get; } public IUserRepository UserRepository { get; } public IGenderRepository GenderRepository { get; } - public SameApiUnitOfWork(ISameApiDbContext context , IUserRepository repository, IGenderRepository genderRepository) + public SameApiUnitOfWork(IApiSameDbContext context , IUserRepository repository, IGenderRepository genderRepository) { Context = context; UserRepository = repository; diff --git a/SameApi/SameApi.Dto/UserInput.cs b/SameApi/SameApi.Dto/UserInput.cs new file mode 100644 index 0000000..e9ec804 --- /dev/null +++ b/SameApi/SameApi.Dto/UserInput.cs @@ -0,0 +1,16 @@ +namespace SameApi.Dto +{ + public class UserInput + { + public int Id { get; set; } + public bool IsAdmin { get; set; } + public int Age { get; set; } + public string? Pseudo { get; set; } + public string? Email { get; set; } + public string? Password { get; set; } + public int NumberFollowers { get; set; } + public DateTime CreateAt { get; set; } = DateTime.Now; + public int GenderId { get; set; } + + } +} \ No newline at end of file From 4ef786adf094fc7ec6eb0e506fdfab3a7cba817d Mon Sep 17 00:00:00 2001 From: IlP4rAd0xlI Date: Wed, 24 Sep 2025 09:23:40 +0200 Subject: [PATCH 28/77] feature/signup Update :formstyle V2 pc -> before t mobile first --- .../forms/signup/BirthdateField.tsx | 10 ++--- .../components/forms/signup/EmailField.tsx | 4 +- .../forms/signup/FirstNameField.tsx | 2 + .../components/forms/signup/LastNameField.tsx | 2 + .../forms/signup/PasswordFields.tsx | 10 +++-- .../components/forms/signup/SignupCard.tsx | 4 +- .../components/forms/signup/SignupForm.tsx | 8 ++-- .../src/components/forms/signup/Username.tsx | 3 +- React/src/styles/signup.css | 41 ++++++++++++++----- 9 files changed, 58 insertions(+), 26 deletions(-) diff --git a/React/src/components/forms/signup/BirthdateField.tsx b/React/src/components/forms/signup/BirthdateField.tsx index ee227a4..50aaa47 100644 --- a/React/src/components/forms/signup/BirthdateField.tsx +++ b/React/src/components/forms/signup/BirthdateField.tsx @@ -125,14 +125,14 @@ export default function BirthdateField({ value, onChange, label = "Date of Birth }; return ( -
+
-
+
); diff --git a/React/src/components/forms/signup/FirstNameField.tsx b/React/src/components/forms/signup/FirstNameField.tsx index e5a2e9d..ffb1cc0 100644 --- a/React/src/components/forms/signup/FirstNameField.tsx +++ b/React/src/components/forms/signup/FirstNameField.tsx @@ -54,6 +54,8 @@ export default function FirstNameField({ value, onChange }: FirstNameFieldProps) onChange={handleChange} onBlur={handleBlur} maxLength={50} + placeholder={"First Name"} + className={"field-input demi-input"} />
); diff --git a/React/src/components/forms/signup/LastNameField.tsx b/React/src/components/forms/signup/LastNameField.tsx index 919a472..2f319f1 100644 --- a/React/src/components/forms/signup/LastNameField.tsx +++ b/React/src/components/forms/signup/LastNameField.tsx @@ -49,11 +49,13 @@ export default function LastNameField({ value, onChange }: LastNameFieldProps)
); diff --git a/React/src/components/forms/signup/PasswordFields.tsx b/React/src/components/forms/signup/PasswordFields.tsx index c503bba..a3bec96 100644 --- a/React/src/components/forms/signup/PasswordFields.tsx +++ b/React/src/components/forms/signup/PasswordFields.tsx @@ -186,8 +186,8 @@ export default function PasswordFields({ }; return ( -
-
+ <> +
-
+
-
+ ); } \ No newline at end of file diff --git a/React/src/components/forms/signup/SignupCard.tsx b/React/src/components/forms/signup/SignupCard.tsx index e7ccef1..3a6c3aa 100644 --- a/React/src/components/forms/signup/SignupCard.tsx +++ b/React/src/components/forms/signup/SignupCard.tsx @@ -7,11 +7,11 @@ export default function SignupCard(){ {/*
*/} {/*
*/} {/*
*/} -

Signup

+

Signup

Already have an account? - Login + Login
); diff --git a/React/src/components/forms/signup/SignupForm.tsx b/React/src/components/forms/signup/SignupForm.tsx index 064e5c2..d7c314d 100644 --- a/React/src/components/forms/signup/SignupForm.tsx +++ b/React/src/components/forms/signup/SignupForm.tsx @@ -23,8 +23,10 @@ export default function SignupForm() {
- - +
+ + +
- + ); } \ No newline at end of file diff --git a/React/src/components/forms/signup/Username.tsx b/React/src/components/forms/signup/Username.tsx index 2c50bfe..6e1e645 100644 --- a/React/src/components/forms/signup/Username.tsx +++ b/React/src/components/forms/signup/Username.tsx @@ -77,7 +77,7 @@ export default function Username({ value, onChange }: UsernameFieldProps) }; return ( -
+
{/*Hide label*/}
); diff --git a/React/src/styles/signup.css b/React/src/styles/signup.css index 22b0c4e..a8888cb 100644 --- a/React/src/styles/signup.css +++ b/React/src/styles/signup.css @@ -3,9 +3,16 @@ body { min-height: 100dvh; display: grid; place-items: center; - background: url('../assets/img/same-register-login-background.png') center / cover no-repeat fixed; + background: url('../assets/img/same-register-login-background.png') left top / cover no-repeat fixed; + backdrop-filter: blur(4px); overflow: hidden; font-family: system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif; + font-size: 18px; +} + +.card-title { + font-size: 30px; + font-weight: bold; } .glass-card { @@ -18,12 +25,13 @@ body { padding: 26px; } -input { +.field-input { border-radius: 9px; height: 45px; width: 50vh; background-color: rgba(255, 255, 255, 0.20); border: solid 1px rgba(255, 255, 255, 0.20); + padding: 0 18px !important; } label { @@ -32,16 +40,29 @@ label { #birthdate-field { display: flex; - justify-content: center; - border-radius: 9px; - height: 45px; - width: 50vh; + justify-content: space-around !important; } .dropdown { - border-radius: 9px; - height: 45px; - width: 16vh; + width: 15vh; +} + +fieldset { + display: flex; +} + +.demi-input { + width: 25vh; +} + +button[type='submit'] { background-color: rgba(255, 255, 255, 0.20); - border: solid 1px rgba(255, 255, 255, 0.20); + border-radius: 8px; + width: 50vh; + height: 45px; + +} + +.card-line { + margin-bottom: 18px; } \ No newline at end of file From 277b29cedd80270820ea2d5dde951cb2ba84866d Mon Sep 17 00:00:00 2001 From: IlP4rAd0xlI Date: Wed, 24 Sep 2025 15:33:23 +0200 Subject: [PATCH 29/77] feature/signup Update CSS + Add SASS --- .../forms/signup/BirthdateField.tsx | 10 +- .../components/forms/signup/EmailField.tsx | 4 +- .../forms/signup/FirstNameField.tsx | 2 +- .../components/forms/signup/LastNameField.tsx | 2 +- .../forms/signup/PasswordFields.tsx | 8 +- .../components/forms/signup/SignupCard.tsx | 5 +- .../components/forms/signup/SignupForm.tsx | 6 +- .../src/components/forms/signup/Username.tsx | 4 +- React/src/pages/Signup.tsx | 2 +- React/src/styles/signup-old.css | 440 ++++++++++++++++++ React/src/styles/signup.css | 68 --- React/src/styles/signup.scss | 393 ++++++++++++++++ 12 files changed, 853 insertions(+), 91 deletions(-) create mode 100644 React/src/styles/signup-old.css delete mode 100644 React/src/styles/signup.css create mode 100644 React/src/styles/signup.scss diff --git a/React/src/components/forms/signup/BirthdateField.tsx b/React/src/components/forms/signup/BirthdateField.tsx index 50aaa47..fa9ede8 100644 --- a/React/src/components/forms/signup/BirthdateField.tsx +++ b/React/src/components/forms/signup/BirthdateField.tsx @@ -125,14 +125,14 @@ export default function BirthdateField({ value, onChange, label = "Date of Birth }; return ( -
+
); diff --git a/React/src/components/forms/signup/FirstNameField.tsx b/React/src/components/forms/signup/FirstNameField.tsx index ffb1cc0..a9a7605 100644 --- a/React/src/components/forms/signup/FirstNameField.tsx +++ b/React/src/components/forms/signup/FirstNameField.tsx @@ -55,7 +55,7 @@ export default function FirstNameField({ value, onChange }: FirstNameFieldProps) onBlur={handleBlur} maxLength={50} placeholder={"First Name"} - className={"field-input demi-input"} + className={"glass-input half-input"} />
); diff --git a/React/src/components/forms/signup/LastNameField.tsx b/React/src/components/forms/signup/LastNameField.tsx index 2f319f1..e32d4fe 100644 --- a/React/src/components/forms/signup/LastNameField.tsx +++ b/React/src/components/forms/signup/LastNameField.tsx @@ -49,13 +49,13 @@ export default function LastNameField({ value, onChange }: LastNameFieldProps)
); diff --git a/React/src/components/forms/signup/PasswordFields.tsx b/React/src/components/forms/signup/PasswordFields.tsx index a3bec96..7a1cf17 100644 --- a/React/src/components/forms/signup/PasswordFields.tsx +++ b/React/src/components/forms/signup/PasswordFields.tsx @@ -187,7 +187,7 @@ export default function PasswordFields({ return ( <> -
+
-
+
diff --git a/React/src/components/forms/signup/SignupCard.tsx b/React/src/components/forms/signup/SignupCard.tsx index 3a6c3aa..37f90fd 100644 --- a/React/src/components/forms/signup/SignupCard.tsx +++ b/React/src/components/forms/signup/SignupCard.tsx @@ -4,10 +4,7 @@ import SignupForm from './SignupForm'; export default function SignupCard(){ return (
- {/*
*/} - {/*
*/} - {/*
*/} -

Signup

+

Sign Up

Already have an account? diff --git a/React/src/components/forms/signup/SignupForm.tsx b/React/src/components/forms/signup/SignupForm.tsx index d7c314d..ef2d31a 100644 --- a/React/src/components/forms/signup/SignupForm.tsx +++ b/React/src/components/forms/signup/SignupForm.tsx @@ -20,10 +20,10 @@ export default function SignupForm() { const [confirmPassword, setConfirmPassword] = useState(''); return ( -
+ -
+
@@ -39,7 +39,7 @@ export default function SignupForm() { email={email} birthdate={birthdate} /> - + ); } \ No newline at end of file diff --git a/React/src/components/forms/signup/Username.tsx b/React/src/components/forms/signup/Username.tsx index 6e1e645..298700f 100644 --- a/React/src/components/forms/signup/Username.tsx +++ b/React/src/components/forms/signup/Username.tsx @@ -77,7 +77,7 @@ export default function Username({ value, onChange }: UsernameFieldProps) }; return ( -
+
{/*Hide label*/}
); diff --git a/React/src/pages/Signup.tsx b/React/src/pages/Signup.tsx index 7291ddd..d320884 100644 --- a/React/src/pages/Signup.tsx +++ b/React/src/pages/Signup.tsx @@ -1,5 +1,5 @@ import SignupCard from '../components/forms/signup/SignupCard' -import '../styles/signup.css' +import '../styles/signup.scss' export default function Signup() { return ( diff --git a/React/src/styles/signup-old.css b/React/src/styles/signup-old.css new file mode 100644 index 0000000..b966032 --- /dev/null +++ b/React/src/styles/signup-old.css @@ -0,0 +1,440 @@ +/* ========================================================================== + CSS RESET & BASE STYLES + ========================================================================== */ + +/* Modern CSS Reset */ +*, +*::before, +*::after { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +html { + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} + +body { + margin: 0; + min-height: 100dvh; /* Your preference - modern viewport height */ + display: grid; + place-items: center; + background: url('../assets/img/same-register-login-background.png') left top / cover no-repeat fixed; + backdrop-filter: blur(4px); /* Your glassmorphism effect */ + overflow: hidden; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* Remove default button styles */ +button { + background: none; + border: none; + padding: 0; + margin: 0; + cursor: pointer; + font: inherit; +} + +/* Remove default link styles */ +a { + color: inherit; + text-decoration: none; +} + +/* Remove list styles */ +ul, ol { + list-style: none; +} + +/* Images and media */ +img, video, iframe { + max-width: 100%; + height: auto; + display: block; +} + +/* Form elements */ +input, textarea, select { + font: inherit; + border: none; + outline: none; +} + +/* ========================================================================== + CSS CUSTOM PROPERTIES (CSS VARIABLES) + Adapted to match your glassmorphism design + ========================================================================== */ + +:root { + /* Glass Effect Colors */ + --glass-bg: rgba(255, 255, 255, 0.20); + --glass-border: rgba(255, 255, 255, 0.20); + --glass-backdrop: blur(10px); + + /* Colors */ + --color-primary: #3498db; + --color-primary-dark: #2980b9; + --color-secondary: #2ecc71; + --color-accent: #e74c3c; + + --color-text: #333333; + --color-text-light: #666666; + --color-text-lighter: #999999; + --color-text-white: #ffffff; + + --color-bg: transparent; + --color-bg-light: rgba(255, 255, 255, 0.1); + --color-bg-dark: #2c3e50; + + --color-border: var(--glass-border); + --color-border-dark: #ddd; + + /* Typography - Adapted to your 18px base */ + --font-size-xs: 0.78rem; /* 14px */ + --font-size-sm: 0.89rem; /* 16px */ + --font-size-base: 1rem; /* 18px - your base */ + --font-size-lg: 1.22rem; /* 22px */ + --font-size-xl: 1.33rem; /* 24px */ + --font-size-2xl: 1.67rem; /* 30px - matches your card-title */ + --font-size-3xl: 2.11rem; /* 38px */ + --font-size-4xl: 2.56rem; /* 46px */ + + --font-weight-light: 300; + --font-weight-normal: 400; + --font-weight-medium: 500; + --font-weight-semibold: 600; + --font-weight-bold: 700; /* Your card-title weight */ + + --line-height-tight: 1.25; + --line-height-normal: 1.5; + --line-height-loose: 1.75; + + /* Spacing - Adapted to your measurements */ + --space-xs: 0.28rem; /* 5px */ + --space-sm: 0.56rem; /* 10px */ + --space-md: 1rem; /* 18px - matches your card-line margin */ + --space-lg: 1.44rem; /* 26px - matches your glass-card padding */ + --space-xl: 2rem; /* 36px */ + --space-2xl: 3rem; /* 54px */ + --space-3xl: 4rem; /* 72px */ + + /* Layout - Adapted to your vh-based sizing */ + --container-sm: 90vw; + --container-md: 80vw; + --container-lg: 70vw; + --container-xl: 60vw; + + /* Input dimensions - Based on your field-input */ + --input-width: 50vh; /* Your preference */ + --input-width-half: 25vh; /* Your demi-input */ + --input-width-dropdown: 10vh; /* Your dropdown */ + --input-height: 45px; /* Your field-input height */ + + /* Breakpoints (for reference in media queries) */ + --breakpoint-sm: 640px; /* Small tablets/large phones */ + --breakpoint-md: 768px; /* Tablets */ + --breakpoint-lg: 1024px; /* Desktop */ + --breakpoint-xl: 1280px; /* Large desktop */ + + /* Borders & Radius - Matches your design */ + --border-width: 1px; + --border-radius-sm: 8px; /* Your submit button */ + --border-radius-md: 9px; /* Your field-input */ + --border-radius-lg: 20px; /* Your glass-card */ + --border-radius-xl: 24px; + --border-radius-full: 9999px; + + /* Shadows */ + --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05); + --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.07); + --shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1); + --shadow-xl: 0 25px 50px rgba(0, 0, 0, 0.15); + + /* Transitions */ + --transition-fast: 0.15s ease; + --transition-normal: 0.3s ease; + --transition-slow: 0.5s ease; + + /* Z-index scale */ + --z-dropdown: 1000; + --z-modal: 1050; + --z-popover: 1060; + --z-tooltip: 1070; + --z-fixed: 1080; +} + +/* ========================================================================== + UTILITY CLASSES + Common patterns used across projects + ========================================================================== */ + +/* Screen reader only - for accessibility */ +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} + +/* Container classes */ +.container { + width: 100%; + padding: 0 var(--space-md); + margin: 0 auto; + max-width: var(--container-sm); +} + +/* Flexbox utilities */ +.flex { + display: flex; +} + +.flex-col { + flex-direction: column; +} + +.items-center { + align-items: center; +} + +.justify-center { + justify-content: center; +} + +.justify-between { + justify-content: space-between; +} + +.justify-around { + justify-content: space-around; +} + +/* Text utilities */ +.text-center { + text-align: center; +} + +.text-left { + text-align: left; +} + +.text-right { + text-align: right; +} + +/* ========================================================================== + MOBILE BASE STYLES (320px and up) + Start here - mobile first approach + -> no media query needed for base styles + ========================================================================== */ + +/* Typography */ +h1, h2, h3, h4, h5, h6 { + font-weight: var(--font-weight-semibold); + line-height: var(--line-height-tight); + margin-bottom: var(--space-md); + color: var(--color-text-white); +} + +h1 { font-size: var(--font-size-2xl); } +h2 { font-size: var(--font-size-xl); } +h3 { font-size: var(--font-size-lg); } +h4 { font-size: var(--font-size-base); } +h5 { font-size: var(--font-size-sm); } +h6 { font-size: var(--font-size-xs); } + +p { + margin-bottom: var(--space-md); + line-height: var(--line-height-normal); + color: var(--color-text-white); +} + +/* Links */ +a { + color: var(--color-primary); + transition: color var(--transition-fast); +} + +a:hover, +a:focus { + color: var(--color-primary-dark); +} + +/* ========================================================================== + GLASS CARD SYSTEM - Your Core Component + ========================================================================== */ + +.glass-card { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + border-radius: var(--border-radius-lg); /* 20px */ + background-color: var(--glass-bg); + backdrop-filter: var(--glass-backdrop); + border: solid 1px var(--glass-border); + padding: var(--space-lg); /* 26px */ + box-shadow: var(--shadow-lg); + width: 100%; +} + +.card-title { + font-weight: var(--font-weight-bold); + color: var(--color-text-white); + margin-bottom: var(--space-lg); + text-align: center; +} + +.card-line { + margin-bottom: var(--space-md); /* 18px */ + width: 100%; + display: flex; + flex-direction: row; + justify-content: space-around !important; +} + +/* ========================================================================== + FORM SYSTEM - Adapted to Your Glassmorphism Style + ========================================================================== */ + +/* Hide labels as per your design */ +label { + display: none; +} + +/* Base input styling - matches your field-input */ +.field-input { + border-radius: var(--border-radius-md); /* 9px */ + height: var(--input-height); /* 45px */ + width: 100%; /* Responsive instead of fixed vh */ + max-width: var(--input-width); /* 50vh on larger screens */ + background-color: var(--glass-bg); + border: solid 1px var(--glass-border); + padding: 0 18px; + color: var(--color-text-white); + transition: all var(--transition-fast); +} + +.field-input:focus { + background-color: rgba(255, 255, 255, 0.3); + border-color: rgba(255, 255, 255, 0.5); + box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.1); +} + +.field-input::placeholder { + color: rgba(255, 255, 255, 0.7); +} + +/* Half-width inputs - your demi-input */ +.demi-input { + width: 100%; + max-width: var(--input-width-half); /* 25vh on larger screens */ +} + +/* Dropdown styling */ +.dropdown { + width: 100%; + max-width: var(--input-width-dropdown); /* 15vh on larger screens */ + appearance: none; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3e%3c/svg%3e"); + background-position: right 12px center; + background-repeat: no-repeat; + background-size: 16px; + padding-right: 40px; +} + +/* Fieldset for grouping - matches your birthdate-field */ +fieldset { + display: flex; + gap: var(--space-sm); + border: none; + padding: 0; + margin: 0; + width: 100%; +} + +#birthdate-field .dropdown { + flex: 1; + margin: 10px; +} + +/* Submit button styling */ +button[type='submit'] { + background-color: var(--glass-bg); + border: solid 1px var(--glass-border); + border-radius: var(--border-radius-sm); /* 8px */ + width: 100%; + max-width: var(--input-width); /* 50vh on larger screens */ + height: var(--input-height); /* 45px */ + color: var(--color-text-white); + font-weight: var(--font-weight-medium); + cursor: pointer; + transition: all var(--transition-fast); + font-size: var(--font-size-base); +} + +button[type='submit']:hover, +button[type='submit']:focus { + background-color: rgba(255, 255, 255, 0.3); + transform: translateY(-1px); + box-shadow: var(--shadow-md); +} + +button[type='submit']:active { + transform: translateY(0); +} + +/* ========================================================================== + GRID SYSTEM - Mobile First + ========================================================================== */ + +.grid { + display: grid; + gap: var(--space-md); + grid-template-columns: 1fr; /* Single column on mobile */ +} + +/* ========================================================================== + SMALL MOBILE LANDSCAPE (640px and up) + ========================================================================== */ + +@media (min-width: var(--breakpoint-sm)) { + +} + +/* ========================================================================== + TABLET (768px and up) + ========================================================================== */ + +@media (min-width: var(--breakpoint-md)) { + +} + +/* ========================================================================== + DESKTOP (1024px and up) + ========================================================================== */ + +@media (min-width: var(--breakpoint-lg)) { + +} + +/* ========================================================================== + LARGE DESKTOP (1280px and up) + ========================================================================== */ + +@media (min-width: var(--breakpoint-xl)) { + +} + +/* ========================================================================== + COMPONENT EXTENSIONS + Additional components in your glassmorphism style + ========================================================================== */ \ No newline at end of file diff --git a/React/src/styles/signup.css b/React/src/styles/signup.css deleted file mode 100644 index a8888cb..0000000 --- a/React/src/styles/signup.css +++ /dev/null @@ -1,68 +0,0 @@ -body { - margin: 0; - min-height: 100dvh; - display: grid; - place-items: center; - background: url('../assets/img/same-register-login-background.png') left top / cover no-repeat fixed; - backdrop-filter: blur(4px); - overflow: hidden; - font-family: system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif; - font-size: 18px; -} - -.card-title { - font-size: 30px; - font-weight: bold; -} - -.glass-card { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - border-radius: 20px; - background-color: rgba(255, 255, 255, 0.20); - padding: 26px; -} - -.field-input { - border-radius: 9px; - height: 45px; - width: 50vh; - background-color: rgba(255, 255, 255, 0.20); - border: solid 1px rgba(255, 255, 255, 0.20); - padding: 0 18px !important; -} - -label { - display: none; -} - -#birthdate-field { - display: flex; - justify-content: space-around !important; -} - -.dropdown { - width: 15vh; -} - -fieldset { - display: flex; -} - -.demi-input { - width: 25vh; -} - -button[type='submit'] { - background-color: rgba(255, 255, 255, 0.20); - border-radius: 8px; - width: 50vh; - height: 45px; - -} - -.card-line { - margin-bottom: 18px; -} \ No newline at end of file diff --git a/React/src/styles/signup.scss b/React/src/styles/signup.scss new file mode 100644 index 0000000..5952e8f --- /dev/null +++ b/React/src/styles/signup.scss @@ -0,0 +1,393 @@ + +/* ========================================================================== + MOBILE-FIRST CSS TEMPLATE - CLEANED GLASSMORPHISM DESIGN + Universal template with contradictions and duplications resolved + ========================================================================== */ + +/* ========================================================================== + CSS RESET & BASE STYLES + ========================================================================== */ + +/* Modern CSS Reset */ +*, +*::before, +*::after { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +html { + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} + +body { + margin: 0; + min-height: 100dvh; + display: grid; + place-items: center; + background: url('../assets/img/same-register-login-background.png') left top / cover no-repeat fixed; + backdrop-filter: blur(4px); + overflow: hidden; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + color: var(--color-text-white); +} + +/* Remove default button styles */ +button { + background: none; + border: none; + padding: 0; + margin: 0; + cursor: pointer; + font: inherit; +} + +/* Remove default link styles */ +a { + color: inherit; + text-decoration: none; +} + +/* Remove list styles */ +ul, ol { + list-style: none; +} + +/* Images and media */ +img, video, iframe { + max-width: 100%; + height: auto; + display: block; +} + +/* Form elements */ +input, textarea, select { + font: inherit; + border: none; + outline: none; +} + +/* ========================================================================== + CSS CUSTOM PROPERTIES (CSS VARIABLES) + ========================================================================== */ + +:root { + /* Glass Effect Colors */ + --glass-bg: rgba(255, 255, 255, 0.20); + --glass-border: rgba(255, 255, 255, 0.20); + --glass-backdrop: blur(10px); + + /* Colors */ + --color-primary: #3498db; + --color-primary-dark: #2980b9; + --color-text-white: #ffffff; + + /* Typography */ + --font-size-xs: 0.78rem; /* 14px */ + --font-size-sm: 0.89rem; /* 16px */ + --font-size-base: 1rem; /* 18px */ + --font-size-lg: 1.22rem; /* 22px */ + --font-size-xl: 1.33rem; /* 24px */ + --font-size-2xl: 1.67rem; /* 30px */ + --font-size-3xl: 2.11rem; /* 38px */ + --font-size-4xl: 2.56rem; /* 46px */ + + --font-weight-normal: 400; + --font-weight-medium: 500; + --font-weight-semibold: 600; + --font-weight-bold: 700; + + --line-height-tight: 1.25; + --line-height-normal: 1.5; + + /* Spacing */ + --space-xs: 0.28rem; /* 5px */ + --space-sm: 0.56rem; /* 10px */ + --space-md: 1rem; /* 18px */ + --space-lg: 1.44rem; /* 26px */ + --space-xl: 2rem; /* 36px */ + --space-2xl: 3rem; /* 54px */ + + /* Layout - Responsive containers */ + --container-sm: 90vw; + --container-md: 80vw; + --container-lg: 70vw; + --container-xl: 60vw; + + /* Input dimensions */ + --input-width: min(37vh, 400px); /* Responsive with fallback */ + --input-width-half: min(17vh, 200px); /* Responsive with fallback */ + --input-width-dropdown: min(11vh, 150px); /* Responsive with fallback */ + --input-height: 45px; + + /* Breakpoints (for reference) */ + --breakpoint-sm: 640px; + --breakpoint-md: 768px; + --breakpoint-lg: 1024px; + --breakpoint-xl: 1280px; + + /* Borders & Radius */ + --border-radius-sm: 8px; + --border-radius-md: 9px; + --border-radius-lg: 20px; + + /* Shadows */ + --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.07); + --shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1); + + /* Transitions */ + --transition-fast: 0.15s ease; + --transition-normal: 0.3s ease; + + /* Z-index scale */ + --z-modal: 1050; + --z-fixed: 1080; +} + +/* ========================================================================== + UTILITY CLASSES + ========================================================================== */ + +/* Screen reader only */ +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} + +/* Container classes - responsive */ +.container { + width: 100%; + padding: 0 var(--space-md); + margin: 0 auto; + max-width: var(--container-sm); +} + +/* Flexbox utilities */ +.flex { + display: flex; +} + +.flex-col { + flex-direction: column; +} + +.items-center { + align-items: center; +} + +.justify-center { + justify-content: center; +} + +.justify-between { + justify-content: space-between; +} + +.justify-around { + justify-content: space-around; +} + +/* Text utilities */ +.text-center { + text-align: center; +} + +/* ========================================================================== + MOBILE BASE STYLES (320px and up) + ========================================================================== */ + +/* Typography */ +h1, h2, h3, h4, h5, h6 { + font-weight: var(--font-weight-semibold); + line-height: var(--line-height-tight); + margin-bottom: var(--space-md); +} + +h1 { font-size: var(--font-size-2xl); } +h2 { font-size: var(--font-size-xl); } +h3 { font-size: var(--font-size-lg); } +h4 { font-size: var(--font-size-base); } +h5 { font-size: var(--font-size-sm); } +h6 { font-size: var(--font-size-xs); } + +p { + margin-bottom: var(--space-md); + line-height: var(--line-height-normal); +} + +/* Links */ +a { + color: var(--color-primary); + transition: color var(--transition-fast); +} + +a:hover, +a:focus { + color: var(--color-primary-dark); +} + +/* ========================================================================== + GLASS CARD SYSTEM + ========================================================================== */ + +.glass-card { + @extend .flex, .flex-col, .items-center; + border-radius: var(--border-radius-lg); + background-color: var(--glass-bg); + backdrop-filter: var(--glass-backdrop); + border: solid 1px var(--glass-border); + padding: var(--space-lg); + box-shadow: var(--shadow-lg); + width: 100%; +} + +.card-row { + width: 100%; + margin-bottom: var(--space-md); +} + +.card-multi-fields-row { + @extend .card-row, .flex, .justify-between; + justify-content: space-between !important; +} + +.glass-dropdown-option { + color: black; + background-color: var(--glass-bg); + border: solid 1px var(--glass-border); +} + +/* ========================================================================== + FORM SYSTEM + ========================================================================== */ + +/* Hide labels */ +label { + display: none; +} + +h1 { + text-align: center; +} + +/* Shared glassmorphism input styling */ +.glass-input { + background-color: var(--glass-bg); + border: solid 1px var(--glass-border); + border-radius: var(--border-radius-md); + height: var(--input-height); + padding: 0 18px; + transition: all var(--transition-fast); + width: var(--input-width); +} + +.glass-input:focus { + background-color: rgba(255, 255, 255, 0.3); + border-color: rgba(255, 255, 255, 0.5); + box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.1); +} + +.glass-input::placeholder { + color: rgba(255, 255, 255, 0.7); +} + +/* Half-width inputs */ +.half-input { + width: var(--input-width-half); +} + +/* Dropdown styling */ +.glass-dropdown { + @extend .glass-input; + //padding-right: 35px; + transition: all var(--transition-fast); + width: var(--input-width-dropdown); + //appearance: none; + //background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3e%3c/svg%3e"); + //background-position: right 12px center; + //background-repeat: no-repeat; + //background-size: 16px; +} + +/* Submit button styling */ +.glass-button { + background-color: var(--glass-bg); + border: solid 1px var(--glass-border); + border-radius: var(--border-radius-md); + height: var(--input-height); + transition: all var(--transition-fast); + width: 100%; + max-width: var(--input-width); + font-weight: var(--font-weight-medium); + cursor: pointer; + font-size: var(--font-size-base); + padding: 0; /* Override input padding for buttons */ +} + +.glass-button:hover, +.glass-button:focus { + background-color: rgba(255, 255, 255, 0.3); + transform: translateY(-1px); + box-shadow: var(--shadow-md); +} + +.glass-button:active { + transform: translateY(0); +} + +/* ========================================================================== + GRID SYSTEM - Mobile First + ========================================================================== */ + +.grid { + display: grid; + gap: var(--space-md); + grid-template-columns: 1fr; +} + +/* ========================================================================== + RESPONSIVE BREAKPOINTS + ========================================================================== */ + +/* TABLET (768px and up) */ +@media (min-width: 768px) { + .container { + max-width: var(--container-md); + } + + .grid { + grid-template-columns: repeat(2, 1fr); + } +} + +/* DESKTOP (1024px and up) */ +@media (min-width: 1024px) { + .container { + max-width: var(--container-lg); + } + + .grid { + grid-template-columns: repeat(3, 1fr); + } +} + +/* LARGE DESKTOP (1280px and up) */ +@media (min-width: 1280px) { + .container { + max-width: var(--container-xl); + } + + .grid { + grid-template-columns: repeat(4, 1fr); + } +} \ No newline at end of file From c45ce301312ef38907679ab03043a9fdd091c646 Mon Sep 17 00:00:00 2001 From: IlP4rAd0xlI Date: Thu, 25 Sep 2025 22:16:01 +0200 Subject: [PATCH 30/77] feature/signup Update CSS --- React/src/components/forms/signup/BirthdateField.tsx | 8 +++----- React/src/styles/signup.scss | 4 ++-- package.json | 5 +++++ 3 files changed, 10 insertions(+), 7 deletions(-) create mode 100644 package.json diff --git a/React/src/components/forms/signup/BirthdateField.tsx b/React/src/components/forms/signup/BirthdateField.tsx index fa9ede8..485c98b 100644 --- a/React/src/components/forms/signup/BirthdateField.tsx +++ b/React/src/components/forms/signup/BirthdateField.tsx @@ -125,9 +125,8 @@ export default function BirthdateField({ value, onChange, label = "Date of Birth }; return ( -
+
-
-
); } \ No newline at end of file diff --git a/React/src/styles/signup.scss b/React/src/styles/signup.scss index 5952e8f..26d640c 100644 --- a/React/src/styles/signup.scss +++ b/React/src/styles/signup.scss @@ -119,8 +119,8 @@ input, textarea, select { /* Input dimensions */ --input-width: min(37vh, 400px); /* Responsive with fallback */ - --input-width-half: min(17vh, 200px); /* Responsive with fallback */ - --input-width-dropdown: min(11vh, 150px); /* Responsive with fallback */ + --input-width-half: min(17.8vh, 200px); /* Responsive with fallback */ + --input-width-dropdown: min(11.5vh, 150px); /* Responsive with fallback */ --input-height: 45px; /* Breakpoints (for reference) */ diff --git a/package.json b/package.json new file mode 100644 index 0000000..787e445 --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "sass": "^1.93.2" + } +} From 99543cb40e71a0d90b6f6a2837ce242dd891fb15 Mon Sep 17 00:00:00 2001 From: Mattis Date: Fri, 26 Sep 2025 11:20:50 +0200 Subject: [PATCH 31/77] Azure link --- .github/workflows/SameApi.yml | 75 ++++++++++ SameApi/SameApi.App/Program.cs | 4 - .../SameApi/apis1.arm.json | 132 ++++++++++++++++++ .../serviceDependencies.SameApi.json | 8 ++ .../Properties/serviceDependencies.json | 7 + .../20250923173100_1.0.0.Designer.cs | 101 -------------- .../Migrations/20250923173100_1.0.0.cs | 79 ----------- .../SameApiDbContextModelSnapshot.cs | 98 ------------- SameApi/SameApi.Model/PostDao.cs | 12 ++ SameApi/SameApi.Model/UserDao.cs | 12 +- 10 files changed, 244 insertions(+), 284 deletions(-) create mode 100644 .github/workflows/SameApi.yml create mode 100644 SameApi/SameApi.App/Properties/ServiceDependencies/SameApi/apis1.arm.json create mode 100644 SameApi/SameApi.App/Properties/serviceDependencies.SameApi.json create mode 100644 SameApi/SameApi.App/Properties/serviceDependencies.json delete mode 100644 SameApi/SameApi.Db/Migrations/20250923173100_1.0.0.Designer.cs delete mode 100644 SameApi/SameApi.Db/Migrations/20250923173100_1.0.0.cs delete mode 100644 SameApi/SameApi.Db/Migrations/SameApiDbContextModelSnapshot.cs create mode 100644 SameApi/SameApi.Model/PostDao.cs diff --git a/.github/workflows/SameApi.yml b/.github/workflows/SameApi.yml new file mode 100644 index 0000000..7bd8249 --- /dev/null +++ b/.github/workflows/SameApi.yml @@ -0,0 +1,75 @@ +name: Générer et déployer une application .NET Core sur l'application web SameApi avec le service Gestion des API SameApi-SameApiApp +on: + push: + branches: + - dev +env: + AZURE_WEBAPP_NAME: SameApi + AZURE_WEBAPP_PACKAGE_PATH: SameApi.App\publish + AZURE_APIM_RESOURCE_PATH: / + AZURE_APIM_RESOURCEGROUP: SameApi_group + AZURE_APIM_SERVICENAME: SameApi + AZURE_APIM_API_ID: SameApiApp + AZURE_APIM_APPSERVICEURL: https://sameapi-g7bbcfcnhchtfydq.francecentral-01.azurewebsites.net + SWASHBUCLE_ASPNET_CORE_CLI_PACKAGE_VERSION: 5.6.3 + SWASHBUCKLE_DOTNET_CORE_VERSION: 3.1.x + API_IMPORT_SPECIFICATION_PATH: SameApi.App\publish\swagger.json + API_IMPORT_DLL: SameApi.App\bin\Release\net9.0\SameApi.App.dll + API_IMPORT_VERSION: v1 + CONFIGURATION: Release + DOTNET_CORE_VERSION: 9.0.x + WORKING_DIRECTORY: SameApi.App +jobs: + build: + runs-on: windows-latest + steps: + - uses: actions/checkout@v4 + - name: Setup .NET SDK + uses: actions/setup-dotnet@v4 + with: + dotnet-version: ${{ env.DOTNET_CORE_VERSION }} + - name: Setup SwashBuckle .NET Core + uses: actions/setup-dotnet@v4 + with: + dotnet-version: ${{ env.SWASHBUCKLE_DOTNET_CORE_VERSION }} + - name: Restore + run: dotnet restore ${{ env.WORKING_DIRECTORY }} + - name: Build + run: dotnet build ${{ env.WORKING_DIRECTORY }} --configuration ${{ env.CONFIGURATION }} --no-restore + - name: Test + run: dotnet test ${{ env.WORKING_DIRECTORY }} --no-build + - name: Publish + run: dotnet publish ${{ env.WORKING_DIRECTORY }} --configuration ${{ env.CONFIGURATION }} --no-build --output ${{ env.AZURE_WEBAPP_PACKAGE_PATH }} + - name: Install Swashbuckle CLI .NET Global Tool + run: dotnet tool install --global Swashbuckle.AspNetCore.Cli --version ${{ env.SWASHBUCLE_ASPNET_CORE_CLI_PACKAGE_VERSION }} + working-directory: ${{ env.WORKING_DIRECTORY }} + - name: Generate Open API Specification Document + run: swagger tofile --output "${{ env.API_IMPORT_SPECIFICATION_PATH }}" "${{ env.API_IMPORT_DLL }}" "${{ env.API_IMPORT_VERSION }}" + - name: Publish Artifacts + uses: actions/upload-artifact@v4 + with: + name: webapp + path: ${{ env.AZURE_WEBAPP_PACKAGE_PATH }} + deploy: + runs-on: windows-latest + needs: build + steps: + - name: Download artifact from build job + uses: actions/download-artifact@v4 + with: + name: webapp + path: ${{ env.AZURE_WEBAPP_PACKAGE_PATH }} + - name: Azure Login + uses: azure/login@v2 + with: + creds: ${{ secrets.SameApi_SPN }} + - name: Deploy to Azure WebApp + uses: azure/webapps-deploy@v2 + with: + app-name: ${{ env.AZURE_WEBAPP_NAME }} + package: ${{ env.AZURE_WEBAPP_PACKAGE_PATH }} + - name: Import API into Azure API Management + run: az apim api import --path "${{ env.AZURE_APIM_RESOURCE_PATH }}" --resource-group "${{ env.AZURE_APIM_RESOURCEGROUP }}" --service-name "${{ env.AZURE_APIM_SERVICENAME }}" --api-id "${{ env.AZURE_APIM_API_ID }}" --service-url "${{ env.AZURE_APIM_APPSERVICEURL }}" --specification-path "${{ env.API_IMPORT_SPECIFICATION_PATH }}" --specification-format OpenApi --subscription-required false + - name: logout + run: > + az logout diff --git a/SameApi/SameApi.App/Program.cs b/SameApi/SameApi.App/Program.cs index 892effc..4fa3ce3 100644 --- a/SameApi/SameApi.App/Program.cs +++ b/SameApi/SameApi.App/Program.cs @@ -1,10 +1,6 @@ -using Microsoft.Extensions.DependencyInjection; using Microsoft.OpenApi.Models; using SameApi.Business; using SameApi.Db; -using Swashbuckle.AspNetCore.SwaggerGen; -using Swashbuckle.AspNetCore.SwaggerUI; -using AutoMapper; var builder = WebApplication.CreateBuilder(args); // -------------------- CORS -------------------- diff --git a/SameApi/SameApi.App/Properties/ServiceDependencies/SameApi/apis1.arm.json b/SameApi/SameApi.App/Properties/ServiceDependencies/SameApi/apis1.arm.json new file mode 100644 index 0000000..08bb202 --- /dev/null +++ b/SameApi/SameApi.App/Properties/ServiceDependencies/SameApi/apis1.arm.json @@ -0,0 +1,132 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "parameters": { + "resourceGroupName": { + "type": "string", + "defaultValue": "SameApi_group", + "metadata": { + "_parameterType": "resourceGroup", + "description": "Nom du groupe de ressources de la ressource. Il est recommandé de placer les ressources sous le même groupe de ressources pour un meilleur suivi." + } + }, + "resourceGroupLocation": { + "type": "string", + "defaultValue": "francecentral", + "metadata": { + "_parameterType": "location", + "description": "Emplacement du groupe de ressources. Les groupes de ressources peuvent avoir un emplacement différent de celui des ressources." + } + }, + "resourceLocation": { + "type": "string", + "defaultValue": "[parameters('resourceGroupLocation')]", + "metadata": { + "_parameterType": "location", + "description": "Emplacement de la ressource. Par défaut, utilisez l'emplacement du groupe de ressources, sauf s'il ne prend pas en charge le fournisseur de ressources." + } + } + }, + "resources": [ + { + "type": "Microsoft.Resources/resourceGroups", + "name": "[parameters('resourceGroupName')]", + "location": "[parameters('resourceGroupLocation')]", + "apiVersion": "2019-10-01" + }, + { + "type": "Microsoft.Resources/deployments", + "name": "[concat(parameters('resourceGroupName'), 'Deployment', uniqueString(concat('SameApiApp', subscription().subscriptionId)))]", + "resourceGroup": "[parameters('resourceGroupName')]", + "apiVersion": "2019-10-01", + "dependsOn": [ + "[parameters('resourceGroupName')]" + ], + "properties": { + "mode": "Incremental", + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "resources": [ + { + "name": "SameApi", + "type": "Microsoft.ApiManagement/service", + "location": "[parameters('resourceLocation')]", + "properties": { + "publisherEmail": "same@same.school", + "publisherName": "Same", + "notificationSenderEmail": "apimgmt-noreply@mail.windowsazure.com", + "hostnameConfigurations": [ + { + "type": "Proxy", + "hostName": "sameapi.azure-api.net", + "encodedCertificate": null, + "keyVaultId": null, + "certificatePassword": null, + "negotiateClientCertificate": false, + "certificate": null, + "defaultSslBinding": true + } + ], + "publicIPAddresses": null, + "privateIPAddresses": null, + "additionalLocations": null, + "virtualNetworkConfiguration": null, + "customProperties": { + "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Protocols.Tls10": "False", + "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Protocols.Tls11": "False", + "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Backend.Protocols.Tls10": "False", + "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Backend.Protocols.Tls11": "False", + "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Backend.Protocols.Ssl30": "False", + "Microsoft.WindowsAzure.ApiManagement.Gateway.Protocols.Server.Http2": "False" + }, + "virtualNetworkType": "None", + "certificates": null, + "disableGateway": false, + "apiVersionConstraint": { + "minApiVersion": null + } + }, + "sku": { + "name": "Consumption", + "capacity": 0 + }, + "apiVersion": "2019-12-01" + }, + { + "type": "Microsoft.ApiManagement/service/apis", + "name": "SameApi/SameApiApp", + "properties": { + "displayName": "SameApiApp", + "apiRevision": "1", + "description": null, + "subscriptionRequired": true, + "serviceUrl": null, + "path": "", + "protocols": [ + "https" + ], + "authenticationSettings": { + "oAuth2": null, + "openid": null + }, + "subscriptionKeyParameterNames": { + "header": "Ocp-Apim-Subscription-Key", + "query": "subscription-key" + }, + "isCurrent": true + }, + "apiVersion": "2019-12-01", + "dependsOn": [ + "SameApi" + ] + } + ] + } + } + } + ], + "metadata": { + "_dependencyType": "apis.azure" + } +} \ No newline at end of file diff --git a/SameApi/SameApi.App/Properties/serviceDependencies.SameApi.json b/SameApi/SameApi.App/Properties/serviceDependencies.SameApi.json new file mode 100644 index 0000000..fd8de4d --- /dev/null +++ b/SameApi/SameApi.App/Properties/serviceDependencies.SameApi.json @@ -0,0 +1,8 @@ +{ + "dependencies": { + "apis1": { + "resourceId": "/subscriptions/[parameters('subscriptionId')]/resourceGroups/[parameters('resourceGroupName')]/providers/Microsoft.ApiManagement/service/SameApi/apis/SameApiApp", + "type": "apis.azure" + } + } +} \ No newline at end of file diff --git a/SameApi/SameApi.App/Properties/serviceDependencies.json b/SameApi/SameApi.App/Properties/serviceDependencies.json new file mode 100644 index 0000000..e32266d --- /dev/null +++ b/SameApi/SameApi.App/Properties/serviceDependencies.json @@ -0,0 +1,7 @@ +{ + "dependencies": { + "apis1": { + "type": "apis" + } + } +} \ No newline at end of file diff --git a/SameApi/SameApi.Db/Migrations/20250923173100_1.0.0.Designer.cs b/SameApi/SameApi.Db/Migrations/20250923173100_1.0.0.Designer.cs deleted file mode 100644 index 6eb1c27..0000000 --- a/SameApi/SameApi.Db/Migrations/20250923173100_1.0.0.Designer.cs +++ /dev/null @@ -1,101 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using SameApi.Db.DbContexts; - -#nullable disable - -namespace SameApi.Db.Migrations -{ - [DbContext(typeof(SameApiDbContext))] - [Migration("20250923173100_1.0.0")] - partial class _100 - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "9.0.9") - .HasAnnotation("Relational:MaxIdentifierLength", 64); - - MySqlModelBuilderExtensions.AutoIncrementColumns(modelBuilder); - - modelBuilder.Entity("SameApi.Model.LKP.LKP_GenderDao", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); - - b.Property("Name") - .IsRequired() - .HasColumnType("longtext"); - - b.HasKey("Id"); - - b.ToTable("LKP_SameApi_Gender"); - }); - - modelBuilder.Entity("SameApi.Model.UserDao", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); - - b.Property("Age") - .HasColumnType("int"); - - b.Property("CreateAt") - .HasColumnType("datetime(6)"); - - b.Property("Email") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("GenderDaoId") - .HasColumnType("int"); - - b.Property("GenderId") - .HasColumnType("int"); - - b.Property("IsAdmin") - .HasColumnType("tinyint(1)"); - - b.Property("NumberFollowers") - .HasColumnType("int"); - - b.Property("Password") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("Pseudo") - .IsRequired() - .HasColumnType("longtext"); - - b.HasKey("Id"); - - b.HasIndex("GenderDaoId"); - - b.ToTable("SameApi_User"); - }); - - modelBuilder.Entity("SameApi.Model.UserDao", b => - { - b.HasOne("SameApi.Model.LKP.LKP_GenderDao", "GenderDao") - .WithMany() - .HasForeignKey("GenderDaoId"); - - b.Navigation("GenderDao"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/SameApi/SameApi.Db/Migrations/20250923173100_1.0.0.cs b/SameApi/SameApi.Db/Migrations/20250923173100_1.0.0.cs deleted file mode 100644 index 8255d14..0000000 --- a/SameApi/SameApi.Db/Migrations/20250923173100_1.0.0.cs +++ /dev/null @@ -1,79 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace SameApi.Db.Migrations -{ - /// - public partial class _100 : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AlterDatabase() - .Annotation("MySql:CharSet", "utf8mb4"); - - migrationBuilder.CreateTable( - name: "LKP_SameApi_Gender", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), - Name = table.Column(type: "longtext", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4") - }, - constraints: table => - { - table.PrimaryKey("PK_LKP_SameApi_Gender", x => x.Id); - }) - .Annotation("MySql:CharSet", "utf8mb4"); - - migrationBuilder.CreateTable( - name: "SameApi_User", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), - IsAdmin = table.Column(type: "tinyint(1)", nullable: false), - Age = table.Column(type: "int", nullable: false), - Pseudo = table.Column(type: "longtext", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - Email = table.Column(type: "longtext", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - Password = table.Column(type: "longtext", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - NumberFollowers = table.Column(type: "int", nullable: false), - CreateAt = table.Column(type: "datetime(6)", nullable: false), - GenderId = table.Column(type: "int", nullable: false), - GenderDaoId = table.Column(type: "int", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_SameApi_User", x => x.Id); - table.ForeignKey( - name: "FK_SameApi_User_LKP_SameApi_Gender_GenderDaoId", - column: x => x.GenderDaoId, - principalTable: "LKP_SameApi_Gender", - principalColumn: "Id"); - }) - .Annotation("MySql:CharSet", "utf8mb4"); - - migrationBuilder.CreateIndex( - name: "IX_SameApi_User_GenderDaoId", - table: "SameApi_User", - column: "GenderDaoId"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "SameApi_User"); - - migrationBuilder.DropTable( - name: "LKP_SameApi_Gender"); - } - } -} diff --git a/SameApi/SameApi.Db/Migrations/SameApiDbContextModelSnapshot.cs b/SameApi/SameApi.Db/Migrations/SameApiDbContextModelSnapshot.cs deleted file mode 100644 index e164067..0000000 --- a/SameApi/SameApi.Db/Migrations/SameApiDbContextModelSnapshot.cs +++ /dev/null @@ -1,98 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using SameApi.Db.DbContexts; - -#nullable disable - -namespace SameApi.Db.Migrations -{ - [DbContext(typeof(SameApiDbContext))] - partial class SameApiDbContextModelSnapshot : ModelSnapshot - { - protected override void BuildModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "9.0.9") - .HasAnnotation("Relational:MaxIdentifierLength", 64); - - MySqlModelBuilderExtensions.AutoIncrementColumns(modelBuilder); - - modelBuilder.Entity("SameApi.Model.LKP.LKP_GenderDao", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); - - b.Property("Name") - .IsRequired() - .HasColumnType("longtext"); - - b.HasKey("Id"); - - b.ToTable("LKP_SameApi_Gender"); - }); - - modelBuilder.Entity("SameApi.Model.UserDao", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); - - b.Property("Age") - .HasColumnType("int"); - - b.Property("CreateAt") - .HasColumnType("datetime(6)"); - - b.Property("Email") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("GenderDaoId") - .HasColumnType("int"); - - b.Property("GenderId") - .HasColumnType("int"); - - b.Property("IsAdmin") - .HasColumnType("tinyint(1)"); - - b.Property("NumberFollowers") - .HasColumnType("int"); - - b.Property("Password") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("Pseudo") - .IsRequired() - .HasColumnType("longtext"); - - b.HasKey("Id"); - - b.HasIndex("GenderDaoId"); - - b.ToTable("SameApi_User"); - }); - - modelBuilder.Entity("SameApi.Model.UserDao", b => - { - b.HasOne("SameApi.Model.LKP.LKP_GenderDao", "GenderDao") - .WithMany() - .HasForeignKey("GenderDaoId"); - - b.Navigation("GenderDao"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/SameApi/SameApi.Model/PostDao.cs b/SameApi/SameApi.Model/PostDao.cs new file mode 100644 index 0000000..0d2f0a2 --- /dev/null +++ b/SameApi/SameApi.Model/PostDao.cs @@ -0,0 +1,12 @@ +using SameApi.Data.Model; +using System.ComponentModel.DataAnnotations.Schema; + +namespace SameApi.Model +{ + [Table("SameApi_Post")] + public class PostDao : IModelDao + { + public int Id { get; set; } + + } +} diff --git a/SameApi/SameApi.Model/UserDao.cs b/SameApi/SameApi.Model/UserDao.cs index b970009..8533164 100644 --- a/SameApi/SameApi.Model/UserDao.cs +++ b/SameApi/SameApi.Model/UserDao.cs @@ -15,12 +15,20 @@ public class UserDao : IModelDao public required string Pseudo { get; set; } public required string Email { get; set; } public required string Password { get; set; } - public int NumberFollowers { get; set; } + public int Number_follow { get; set; } public DateTime CreateAt { get; set; } [ForeignKey("Same_Api_User_Gender")] - public int GenderId { get; set; } + public int id_gender_fk { get; set; } public LKP_GenderDao? GenderDao { get; set; } + + [ForeignKey("Same_Api_User_School")] + public int id_school_fk { get; set; } + public LKP_School? SchoolDao { get; set; } + + [ForeignKey("Same_Api_User_Post")] + public int id_post_fk { get; set; } + public PostDao? PostDao { get; set; } } } \ No newline at end of file From c06be61f8436235fb67a8a2dcc4b8b0d24060324 Mon Sep 17 00:00:00 2001 From: Mattis Date: Fri, 26 Sep 2025 12:19:21 +0200 Subject: [PATCH 32/77] Azure deploy 2 --- SameApi/SameApi.App/.config/dotnet-tools.json | 13 +++++++++++++ SameApi/SameApi.App/Program.cs | 2 ++ .../Properties/serviceDependencies.local.json | 3 +++ SameApi/SameApi.App/SameApi.App.csproj | 4 ++++ 4 files changed, 22 insertions(+) create mode 100644 SameApi/SameApi.App/.config/dotnet-tools.json create mode 100644 SameApi/SameApi.App/Properties/serviceDependencies.local.json diff --git a/SameApi/SameApi.App/.config/dotnet-tools.json b/SameApi/SameApi.App/.config/dotnet-tools.json new file mode 100644 index 0000000..ef95326 --- /dev/null +++ b/SameApi/SameApi.App/.config/dotnet-tools.json @@ -0,0 +1,13 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "dotnet-ef": { + "version": "9.0.9", + "commands": [ + "dotnet-ef" + ], + "rollForward": false + } + } +} \ No newline at end of file diff --git a/SameApi/SameApi.App/Program.cs b/SameApi/SameApi.App/Program.cs index 4fa3ce3..802bd06 100644 --- a/SameApi/SameApi.App/Program.cs +++ b/SameApi/SameApi.App/Program.cs @@ -58,5 +58,7 @@ app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); +app.MapGet("/health", () => Results.Ok(new { ok = true, dotnet = Environment.Version.ToString() })); + app.Run(); \ No newline at end of file diff --git a/SameApi/SameApi.App/Properties/serviceDependencies.local.json b/SameApi/SameApi.App/Properties/serviceDependencies.local.json new file mode 100644 index 0000000..33703d5 --- /dev/null +++ b/SameApi/SameApi.App/Properties/serviceDependencies.local.json @@ -0,0 +1,3 @@ +{ + "dependencies": {} +} \ No newline at end of file diff --git a/SameApi/SameApi.App/SameApi.App.csproj b/SameApi/SameApi.App/SameApi.App.csproj index 793d740..8c5ccf5 100644 --- a/SameApi/SameApi.App/SameApi.App.csproj +++ b/SameApi/SameApi.App/SameApi.App.csproj @@ -20,6 +20,10 @@ runtime; build; native; contentfiles; analyzers; buildtransitive + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + From 5967b5643725a24b2513ca43832942fb66c4d654 Mon Sep 17 00:00:00 2001 From: Tisa_48 <130873934+Tisa40486@users.noreply.github.com> Date: Fri, 26 Sep 2025 12:26:29 +0200 Subject: [PATCH 33/77] Add or update the Azure App Service build and deployment workflow config --- .github/workflows/dev_sameapi.yml | 65 +++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 .github/workflows/dev_sameapi.yml diff --git a/.github/workflows/dev_sameapi.yml b/.github/workflows/dev_sameapi.yml new file mode 100644 index 0000000..48fca39 --- /dev/null +++ b/.github/workflows/dev_sameapi.yml @@ -0,0 +1,65 @@ +# Docs for the Azure Web Apps Deploy action: https://github.com/Azure/webapps-deploy +# More GitHub Actions for Azure: https://github.com/Azure/actions + +name: Build and deploy ASP.Net Core app to Azure Web App - SameApi + +on: + push: + branches: + - dev + workflow_dispatch: + +jobs: + build: + runs-on: windows-latest + permissions: + contents: read #This is required for actions/checkout + + steps: + - uses: actions/checkout@v4 + + - name: Set up .NET Core + uses: actions/setup-dotnet@v4 + with: + dotnet-version: '9.x' + + - name: Build with dotnet + run: dotnet build --configuration Release + + - name: dotnet publish + run: dotnet publish -c Release -o "${{env.DOTNET_ROOT}}/myapp" + + - name: Upload artifact for deployment job + uses: actions/upload-artifact@v4 + with: + name: .net-app + path: ${{env.DOTNET_ROOT}}/myapp + + deploy: + runs-on: windows-latest + needs: build + permissions: + id-token: write #This is required for requesting the JWT + contents: read #This is required for actions/checkout + + steps: + - name: Download artifact from build job + uses: actions/download-artifact@v4 + with: + name: .net-app + + - name: Login to Azure + uses: azure/login@v2 + with: + client-id: ${{ secrets.AZUREAPPSERVICE_CLIENTID_7532D2BA3F0B4806A4A1CBF64821E21C }} + tenant-id: ${{ secrets.AZUREAPPSERVICE_TENANTID_99D3B1FED422474FBC922D21AF89B6C6 }} + subscription-id: ${{ secrets.AZUREAPPSERVICE_SUBSCRIPTIONID_CCFB6879FAB3433182EA31F9BD5B41AA }} + + - name: Deploy to Azure Web App + id: deploy-to-webapp + uses: azure/webapps-deploy@v3 + with: + app-name: 'SameApi' + slot-name: 'Production' + package: . + \ No newline at end of file From a33de0488d9e5f2ed1c5a7619407f750b8f67885 Mon Sep 17 00:00:00 2001 From: P4rAd0x Date: Fri, 26 Sep 2025 13:20:43 +0200 Subject: [PATCH 34/77] signup-frontend Update : style --- .../forms/signup/BirthdateField.tsx | 22 ++--- React/src/styles/signup.scss | 99 +++++++++---------- 2 files changed, 59 insertions(+), 62 deletions(-) diff --git a/React/src/components/forms/signup/BirthdateField.tsx b/React/src/components/forms/signup/BirthdateField.tsx index 485c98b..09e29b8 100644 --- a/React/src/components/forms/signup/BirthdateField.tsx +++ b/React/src/components/forms/signup/BirthdateField.tsx @@ -5,18 +5,18 @@ interface BirthdateFieldProps { } const months = [ - { value: '1', label: 'January' }, - { value: '2', label: 'February' }, - { value: '3', label: 'March' }, - { value: '4', label: 'April' }, + { value: '1', label: 'Jan' }, + { value: '2', label: 'Feb' }, + { value: '3', label: 'Mar' }, + { value: '4', label: 'Apr' }, { value: '5', label: 'May' }, - { value: '6', label: 'June' }, - { value: '7', label: 'July' }, - { value: '8', label: 'August' }, - { value: '9', label: 'September' }, - { value: '10', label: 'October' }, - { value: '11', label: 'November' }, - { value: '12', label: 'December' } + { value: '6', label: 'Jun' }, + { value: '7', label: 'Jul' }, + { value: '8', label: 'Aug' }, + { value: '9', label: 'Sep' }, + { value: '10', label: 'Oct' }, + { value: '11', label: 'Nov' }, + { value: '12', label: 'Dec' } ]; const getDaysInMonth = (month: number, year: number): number => { diff --git a/React/src/styles/signup.scss b/React/src/styles/signup.scss index 26d640c..aae1d6a 100644 --- a/React/src/styles/signup.scss +++ b/React/src/styles/signup.scss @@ -1,9 +1,3 @@ - -/* ========================================================================== - MOBILE-FIRST CSS TEMPLATE - CLEANED GLASSMORPHISM DESIGN - Universal template with contradictions and duplications resolved - ========================================================================== */ - /* ========================================================================== CSS RESET & BASE STYLES ========================================================================== */ @@ -81,35 +75,38 @@ input, textarea, select { --glass-backdrop: blur(10px); /* Colors */ - --color-primary: #3498db; - --color-primary-dark: #2980b9; - --color-text-white: #ffffff; + //--color-primary: #3498db; + //--color-primary-dark: #2980b9; + --color-text-white: #fffafa; /* Typography */ - --font-size-xs: 0.78rem; /* 14px */ - --font-size-sm: 0.89rem; /* 16px */ - --font-size-base: 1rem; /* 18px */ - --font-size-lg: 1.22rem; /* 22px */ - --font-size-xl: 1.33rem; /* 24px */ - --font-size-2xl: 1.67rem; /* 30px */ - --font-size-3xl: 2.11rem; /* 38px */ - --font-size-4xl: 2.56rem; /* 46px */ - - --font-weight-normal: 400; - --font-weight-medium: 500; - --font-weight-semibold: 600; - --font-weight-bold: 700; - - --line-height-tight: 1.25; - --line-height-normal: 1.5; + --font-size-xs: 0.89rem; /* 16px - minimum readable */ + --font-size-sm: 0.94rem; /* 17px - comfortable minimum */ + --font-size-base: 1rem; /* 18px - ideal body text */ + --font-size-lg: 1.22rem; /* 22px - subheadings */ + --font-size-xl: 1.33rem; /* 24px - small headings */ + --font-size-2xl: 1.67rem; /* 30px - medium headings */ + --font-size-3xl: 2.11rem; /* 38px - large headings */ + + --font-weight-light: 300; /* Use sparingly, only for large text */ + --font-weight-normal: 400; /* Body text minimum */ + --font-weight-medium: 500; /* Subtle emphasis, navigation */ + --font-weight-semibold: 600; /* Subheadings, buttons */ + --font-weight-bold: 700; /* Main headings */ + --font-weight-extrabold: 800; /* Hero text, major CTAs */ + + --line-height-tight: 1.25; /* Headings, UI elements */ + --line-height-normal: 1.5; /* Body text, comfortable reading */ + --line-height-relaxed: 1.6; /* Long-form content */ + --line-height-loose: 1.75; /* Accessibility, dense content */ /* Spacing */ - --space-xs: 0.28rem; /* 5px */ - --space-sm: 0.56rem; /* 10px */ - --space-md: 1rem; /* 18px */ - --space-lg: 1.44rem; /* 26px */ - --space-xl: 2rem; /* 36px */ - --space-2xl: 3rem; /* 54px */ + --space-xs: 0.28rem; + --space-sm: 0.56rem; + --space-md: 1rem; + --space-lg: 1.44rem; + --space-xl: 2rem; + --space-2xl: 3rem; /* Layout - Responsive containers */ --container-sm: 90vw; @@ -119,8 +116,8 @@ input, textarea, select { /* Input dimensions */ --input-width: min(37vh, 400px); /* Responsive with fallback */ - --input-width-half: min(17.8vh, 200px); /* Responsive with fallback */ - --input-width-dropdown: min(11.5vh, 150px); /* Responsive with fallback */ + --input-width-half: min(17.5vh, 200px); /* Responsive with fallback */ + --input-width-third: min(11vh, 150px); /* Responsive with fallback */ --input-height: 45px; /* Breakpoints (for reference) */ @@ -208,17 +205,25 @@ input, textarea, select { /* Typography */ h1, h2, h3, h4, h5, h6 { - font-weight: var(--font-weight-semibold); line-height: var(--line-height-tight); margin-bottom: var(--space-md); } +h1, h2 { font-weight: var(--font-weight-bold); } /* 700 for major headings */ +h3, h4 { font-weight: var(--font-weight-semibold); } /* 600 for minor headings */ +h5, h6 { font-weight: var(--font-weight-medium); } /* 500 for smallest headings */ + h1 { font-size: var(--font-size-2xl); } h2 { font-size: var(--font-size-xl); } h3 { font-size: var(--font-size-lg); } h4 { font-size: var(--font-size-base); } h5 { font-size: var(--font-size-sm); } -h6 { font-size: var(--font-size-xs); } +h6 { font-size: var(--font-size-sm); } + +body { + font-size: var(--font-size-base); /* 18px */ + line-height: var(--line-height-normal); /* 1.5 */ +} p { margin-bottom: var(--space-md); @@ -309,29 +314,21 @@ h1 { /* Dropdown styling */ .glass-dropdown { @extend .glass-input; - //padding-right: 35px; + padding-right: 30px; transition: all var(--transition-fast); - width: var(--input-width-dropdown); - //appearance: none; - //background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3e%3c/svg%3e"); - //background-position: right 12px center; - //background-repeat: no-repeat; - //background-size: 16px; + width: var(--input-width-third); + appearance: none; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3e%3c/svg%3e"); + background-position: right 12px center; + background-repeat: no-repeat; + background-size: 16px; } /* Submit button styling */ .glass-button { - background-color: var(--glass-bg); - border: solid 1px var(--glass-border); - border-radius: var(--border-radius-md); - height: var(--input-height); + @extend .glass-input; transition: all var(--transition-fast); - width: 100%; - max-width: var(--input-width); font-weight: var(--font-weight-medium); - cursor: pointer; - font-size: var(--font-size-base); - padding: 0; /* Override input padding for buttons */ } .glass-button:hover, From f1d9087ec069a0f6241b3afd0db19921891d9bd8 Mon Sep 17 00:00:00 2001 From: Tisa_48 <130873934+Tisa40486@users.noreply.github.com> Date: Sun, 28 Sep 2025 23:41:48 +0200 Subject: [PATCH 35/77] Create Profession cr and link to azure database, --- .../Controllers/AdminController.cs | 24 ++- .../SameApi.App/Controllers/UserController.cs | 6 +- SameApi/SameApi.App/Program.cs | 2 +- SameApi/SameApi.App/libman.json | 5 + .../Admin/Command/CreateProfessionCommand.cs | 30 +++ .../Admin/Command/DeleteGenderCommand.cs | 32 +++ .../Admin/Query/GetAllProfessionQuery.cs | 29 +++ SameApi/SameApi.Business/SameApiProfile.cs | 4 +- .../SameApi.Db/DbConfigurationExtension.cs | 20 +- SameApi/SameApi.Db/DbRegisterExtension.cs | 4 +- .../20250928204928_1.0.0.Designer.cs | 193 ++++++++++++++++++ .../Migrations/20250928204928_1.0.0.cs | 152 ++++++++++++++ .../SameApiDbContextModelSnapshot.cs | 190 +++++++++++++++++ .../Repository/IProfessionRepository.cs | 13 ++ .../Implementation/ProfessionRepository.cs | 22 ++ SameApi/SameApi.Db/SameApi.Db.csproj | 2 +- .../UnitOfWork/IApiSameUnitOfWork.cs | 1 + .../UnitOfWork/SameApiUnitOfWork.cs | 11 +- SameApi/SameApi.Dto/ProfessionInput.cs | 8 + SameApi/SameApi.Dto/ProfessionResponse.cs | 8 + ...LKP_Profession.cs => LKP_ProfessionDao.cs} | 7 +- .../LKP/{LKP_School.cs => LKP_SchoolDao.cs} | 6 +- SameApi/SameApi.Model/UserDao.cs | 2 +- 23 files changed, 744 insertions(+), 27 deletions(-) create mode 100644 SameApi/SameApi.App/libman.json create mode 100644 SameApi/SameApi.Business/Admin/Command/CreateProfessionCommand.cs create mode 100644 SameApi/SameApi.Business/Admin/Command/DeleteGenderCommand.cs create mode 100644 SameApi/SameApi.Business/Admin/Query/GetAllProfessionQuery.cs create mode 100644 SameApi/SameApi.Db/Migrations/20250928204928_1.0.0.Designer.cs create mode 100644 SameApi/SameApi.Db/Migrations/20250928204928_1.0.0.cs create mode 100644 SameApi/SameApi.Db/Migrations/SameApiDbContextModelSnapshot.cs create mode 100644 SameApi/SameApi.Db/Repository/IProfessionRepository.cs create mode 100644 SameApi/SameApi.Db/Repository/Implementation/ProfessionRepository.cs create mode 100644 SameApi/SameApi.Dto/ProfessionInput.cs create mode 100644 SameApi/SameApi.Dto/ProfessionResponse.cs rename SameApi/SameApi.Model/LKP/{LKP_Profession.cs => LKP_ProfessionDao.cs} (55%) rename SameApi/SameApi.Model/LKP/{LKP_School.cs => LKP_SchoolDao.cs} (73%) diff --git a/SameApi/SameApi.App/Controllers/AdminController.cs b/SameApi/SameApi.App/Controllers/AdminController.cs index fdea7dc..9e45a4d 100644 --- a/SameApi/SameApi.App/Controllers/AdminController.cs +++ b/SameApi/SameApi.App/Controllers/AdminController.cs @@ -16,18 +16,34 @@ public AdminController(IMediator mediator) { _mediator = mediator; } - - [HttpGet("/Gender")] - public async Task>> GetAllAsync() + + [HttpGet("gender")] + public async Task>> GetAllGenderAsync() { var result = await _mediator.Send(new GetAllGenderQuery()); return Ok(result); } + [HttpGet("profession")] + public async Task>> GetAllProfessionAsync() + { + var result = await _mediator.Send(new GetAllProfessionQuery()); + return Ok(result); + } - [HttpPost("/CreateGender")] + [HttpPost("Gender")] public async Task CreateGenderAsync([FromBody] CreateGenderCommand command) { await _mediator.Send(command); } + [HttpDelete("Gender")] + public async Task DeleteGenderAsync([FromQuery] int id) + { + await _mediator.Send(new DeleteGenderCommand { Id = id }); + } + [HttpPost("profession")] + public async Task CreateProfessionAsync([FromBody] CreateProfessionCommand command) + { + await _mediator.Send(command); + } } } \ No newline at end of file diff --git a/SameApi/SameApi.App/Controllers/UserController.cs b/SameApi/SameApi.App/Controllers/UserController.cs index 54381ca..ba44e8d 100644 --- a/SameApi/SameApi.App/Controllers/UserController.cs +++ b/SameApi/SameApi.App/Controllers/UserController.cs @@ -19,7 +19,7 @@ public UserController(IMediator mediator, IMapper mapper) _mapper = mapper; } - [HttpGet("/GetAll")] + [HttpGet("getAll")] public async Task>> GetAllAsync() { var result = await _mediator.Send(new GetAllUserQuery()); @@ -33,14 +33,14 @@ public async Task CreateUserAsync([FromBody] CreateUserCommand co return Ok(); } - [HttpDelete("/User")] + [HttpDelete("user")] public async Task DeleteUserAsync([FromQuery] int id) { await _mediator.Send(new DeleteUserCommand { Id = id}); return Ok(); } - [HttpPut("/Update")] + [HttpPut("update/user")] public async Task UpdateUserAsync([FromBody] UpdateUserCommand command) { var result = await _mediator.Send(command); diff --git a/SameApi/SameApi.App/Program.cs b/SameApi/SameApi.App/Program.cs index 802bd06..eabde25 100644 --- a/SameApi/SameApi.App/Program.cs +++ b/SameApi/SameApi.App/Program.cs @@ -8,7 +8,7 @@ { options.AddPolicy("AllowReactDevClient", policy => { - policy.WithOrigins("http://localhost:3000") + policy.WithOrigins("http://localhost:3000", "https://localhost:7171") .AllowAnyHeader() .AllowAnyMethod(); }); diff --git a/SameApi/SameApi.App/libman.json b/SameApi/SameApi.App/libman.json new file mode 100644 index 0000000..8ed1410 --- /dev/null +++ b/SameApi/SameApi.App/libman.json @@ -0,0 +1,5 @@ +{ + "version": "3.0", + "defaultProvider": "cdnjs", + "libraries": [] +} \ No newline at end of file diff --git a/SameApi/SameApi.Business/Admin/Command/CreateProfessionCommand.cs b/SameApi/SameApi.Business/Admin/Command/CreateProfessionCommand.cs new file mode 100644 index 0000000..2f4a604 --- /dev/null +++ b/SameApi/SameApi.Business/Admin/Command/CreateProfessionCommand.cs @@ -0,0 +1,30 @@ +using AutoMapper; +using MediatR; +using SameApi.Db.UnitOfWork; +using SameApi.Dto; +using SameApi.Model.LKP; + +namespace SameApi.Business.Admin.Command +{ + public class CreateProfessionCommand : ProfessionInput, IRequest + { + } + public class CreateProfessionCommandHandler : IRequestHandler + { + private readonly IMapper _mapper; + private readonly IApiSameUnitOfWork _uow; + + public CreateProfessionCommandHandler(IMapper mapper, IApiSameUnitOfWork uow) + { + _mapper = mapper; + _uow = uow; + } + + public async Task Handle(CreateProfessionCommand command, CancellationToken cancellationToken) + { + var dao = _mapper.Map(command); + + await _uow.ProfessionRepository.AddAndSaveAsync(dao); + } + } +} diff --git a/SameApi/SameApi.Business/Admin/Command/DeleteGenderCommand.cs b/SameApi/SameApi.Business/Admin/Command/DeleteGenderCommand.cs new file mode 100644 index 0000000..ebebc35 --- /dev/null +++ b/SameApi/SameApi.Business/Admin/Command/DeleteGenderCommand.cs @@ -0,0 +1,32 @@ +using AutoMapper; +using MediatR; +using SameApi.Db.UnitOfWork; +using SameApi.Dto; +using SameApi.Model.LKP; + +namespace SameApi.Business.Admin.Command +{ + public class DeleteGenderCommand : GenderInput, IRequest + { + + } + public class DeleteGenderCommandHandler : IRequestHandler + { + private readonly IMapper _mapper; + private readonly IApiSameUnitOfWork _uow; + + public DeleteGenderCommandHandler(IMapper mapper, IApiSameUnitOfWork uow) + { + _mapper = mapper; + _uow = uow; + } + + public async Task Handle(DeleteGenderCommand command, CancellationToken cancellationToken) + { + var dao = _mapper.Map(command); + await _uow.GenderRepository.RemoveByIdAsync(dao.Id); + + return dao.Id; + } + } +} \ No newline at end of file diff --git a/SameApi/SameApi.Business/Admin/Query/GetAllProfessionQuery.cs b/SameApi/SameApi.Business/Admin/Query/GetAllProfessionQuery.cs new file mode 100644 index 0000000..59d7d56 --- /dev/null +++ b/SameApi/SameApi.Business/Admin/Query/GetAllProfessionQuery.cs @@ -0,0 +1,29 @@ +using AutoMapper; +using MediatR; +using SameApi.Db.UnitOfWork; +using SameApi.Dto; + +namespace SameApi.Business.Admin.Query +{ + public class GetAllProfessionQuery : IRequest> + { + } + public class GetAllProfessionQueryHandler : IRequestHandler> + { + readonly IApiSameUnitOfWork _uow; + readonly IMapper _mapper; + + public GetAllProfessionQueryHandler( + IApiSameUnitOfWork ISameApiUnitOfWork, IMapper mapper) + { + _uow = ISameApiUnitOfWork; + _mapper = mapper; + } + public async Task> Handle(GetAllProfessionQuery request, CancellationToken cancellationToken) + { + var data = await _uow.ProfessionRepository.GetAllAsync(); + + return _mapper.Map>(data); + } + } +} \ No newline at end of file diff --git a/SameApi/SameApi.Business/SameApiProfile.cs b/SameApi/SameApi.Business/SameApiProfile.cs index f72570e..46383ae 100644 --- a/SameApi/SameApi.Business/SameApiProfile.cs +++ b/SameApi/SameApi.Business/SameApiProfile.cs @@ -7,12 +7,14 @@ namespace SameApi.Business { public class SameApiProfile : Profile { - public SameApiProfile() + public SameApiProfile() { CreateMap(); CreateMap(); CreateMap(); CreateMap(); + CreateMap(); + CreateMap(); } } } \ No newline at end of file diff --git a/SameApi/SameApi.Db/DbConfigurationExtension.cs b/SameApi/SameApi.Db/DbConfigurationExtension.cs index 93a344d..6739cac 100644 --- a/SameApi/SameApi.Db/DbConfigurationExtension.cs +++ b/SameApi/SameApi.Db/DbConfigurationExtension.cs @@ -1,7 +1,7 @@ -using Microsoft.Extensions.Configuration; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using SameApi.Db.DbContexts; -using Microsoft.EntityFrameworkCore; namespace SameApi.Db { @@ -12,11 +12,17 @@ public static void AddSameApibContext(this IServiceCollection services, IConfigu var connectionString = configuration.GetConnectionString("DefaultConnection"); services.AddDbContext(options => - options.UseMySql(connectionString, ServerVersion.AutoDetect(connectionString), o => - { - o.UseQuerySplittingBehavior(QuerySplittingBehavior.SplitQuery).UseRelationalNulls(); - o.CommandTimeout((int)TimeSpan.FromMinutes(10).TotalSeconds); - })); + options.UseSqlServer(connectionString, sqlOptions => + { + sqlOptions.UseQuerySplittingBehavior(QuerySplittingBehavior.SplitQuery) + .UseRelationalNulls() + .EnableRetryOnFailure( + maxRetryCount: 5, // combien de fois on réessaye + maxRetryDelay: TimeSpan.FromSeconds(30), // délai max entre 2 tentatives + errorNumbersToAdd: null // erreurs SQL spécifiques (null = toutes par défaut) + ); + sqlOptions.CommandTimeout((int)TimeSpan.FromMinutes(2).TotalSeconds); + })); } } } \ No newline at end of file diff --git a/SameApi/SameApi.Db/DbRegisterExtension.cs b/SameApi/SameApi.Db/DbRegisterExtension.cs index b57fb5f..52084a8 100644 --- a/SameApi/SameApi.Db/DbRegisterExtension.cs +++ b/SameApi/SameApi.Db/DbRegisterExtension.cs @@ -11,9 +11,11 @@ public static class DbRegisterExtension public static void RegisterSameApiDbContainer(this IServiceCollection services) { services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); services.AddScoped(); - services.AddScoped(); } } } \ No newline at end of file diff --git a/SameApi/SameApi.Db/Migrations/20250928204928_1.0.0.Designer.cs b/SameApi/SameApi.Db/Migrations/20250928204928_1.0.0.Designer.cs new file mode 100644 index 0000000..00cccb6 --- /dev/null +++ b/SameApi/SameApi.Db/Migrations/20250928204928_1.0.0.Designer.cs @@ -0,0 +1,193 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using SameApi.Db.DbContexts; + +#nullable disable + +namespace SameApi.Db.Migrations +{ + [DbContext(typeof(SameApiDbContext))] + [Migration("20250928204928_1.0.0")] + partial class _100 + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "9.0.9") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("SameApi.Model.LKP.LKP_GenderDao", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("LKP_SameApi_Gender"); + }); + + modelBuilder.Entity("SameApi.Model.LKP.LKP_Profession", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("LKP_SameApi_Profession"); + }); + + modelBuilder.Entity("SameApi.Model.LKP.LKP_School", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("IdProfession") + .HasColumnType("int"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("ProfessionId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("ProfessionId"); + + b.ToTable("LKP_SameApi_School"); + }); + + modelBuilder.Entity("SameApi.Model.PostDao", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.HasKey("Id"); + + b.ToTable("SameApi_Post"); + }); + + modelBuilder.Entity("SameApi.Model.UserDao", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Age") + .HasColumnType("int"); + + b.Property("CreateAt") + .HasColumnType("datetime2"); + + b.Property("Email") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("GenderDaoId") + .HasColumnType("int"); + + b.Property("IsAdmin") + .HasColumnType("bit"); + + b.Property("Number_follow") + .HasColumnType("int"); + + b.Property("Password") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("PostDaoId") + .HasColumnType("int"); + + b.Property("Pseudo") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("SchoolDaoId") + .HasColumnType("int"); + + b.Property("id_gender_fk") + .HasColumnType("int"); + + b.Property("id_post_fk") + .HasColumnType("int"); + + b.Property("id_school_fk") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("GenderDaoId"); + + b.HasIndex("PostDaoId"); + + b.HasIndex("SchoolDaoId"); + + b.ToTable("SameApi_User"); + }); + + modelBuilder.Entity("SameApi.Model.LKP.LKP_School", b => + { + b.HasOne("SameApi.Model.LKP.LKP_Profession", "Profession") + .WithMany() + .HasForeignKey("ProfessionId"); + + b.Navigation("Profession"); + }); + + modelBuilder.Entity("SameApi.Model.UserDao", b => + { + b.HasOne("SameApi.Model.LKP.LKP_GenderDao", "GenderDao") + .WithMany() + .HasForeignKey("GenderDaoId"); + + b.HasOne("SameApi.Model.PostDao", "PostDao") + .WithMany() + .HasForeignKey("PostDaoId"); + + b.HasOne("SameApi.Model.LKP.LKP_School", "SchoolDao") + .WithMany() + .HasForeignKey("SchoolDaoId"); + + b.Navigation("GenderDao"); + + b.Navigation("PostDao"); + + b.Navigation("SchoolDao"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/SameApi/SameApi.Db/Migrations/20250928204928_1.0.0.cs b/SameApi/SameApi.Db/Migrations/20250928204928_1.0.0.cs new file mode 100644 index 0000000..ca310b5 --- /dev/null +++ b/SameApi/SameApi.Db/Migrations/20250928204928_1.0.0.cs @@ -0,0 +1,152 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace SameApi.Db.Migrations +{ + /// + public partial class _100 : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "LKP_SameApi_Gender", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + Name = table.Column(type: "nvarchar(max)", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_LKP_SameApi_Gender", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "LKP_SameApi_Profession", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + Name = table.Column(type: "nvarchar(max)", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_LKP_SameApi_Profession", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "SameApi_Post", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1") + }, + constraints: table => + { + table.PrimaryKey("PK_SameApi_Post", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "LKP_SameApi_School", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + Name = table.Column(type: "nvarchar(max)", nullable: false), + IdProfession = table.Column(type: "int", nullable: false), + ProfessionId = table.Column(type: "int", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_LKP_SameApi_School", x => x.Id); + table.ForeignKey( + name: "FK_LKP_SameApi_School_LKP_SameApi_Profession_ProfessionId", + column: x => x.ProfessionId, + principalTable: "LKP_SameApi_Profession", + principalColumn: "Id"); + }); + + migrationBuilder.CreateTable( + name: "SameApi_User", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + IsAdmin = table.Column(type: "bit", nullable: false), + Age = table.Column(type: "int", nullable: false), + Pseudo = table.Column(type: "nvarchar(max)", nullable: false), + Email = table.Column(type: "nvarchar(max)", nullable: false), + Password = table.Column(type: "nvarchar(max)", nullable: false), + Number_follow = table.Column(type: "int", nullable: false), + CreateAt = table.Column(type: "datetime2", nullable: false), + id_gender_fk = table.Column(type: "int", nullable: false), + GenderDaoId = table.Column(type: "int", nullable: true), + id_school_fk = table.Column(type: "int", nullable: false), + SchoolDaoId = table.Column(type: "int", nullable: true), + id_post_fk = table.Column(type: "int", nullable: false), + PostDaoId = table.Column(type: "int", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_SameApi_User", x => x.Id); + table.ForeignKey( + name: "FK_SameApi_User_LKP_SameApi_Gender_GenderDaoId", + column: x => x.GenderDaoId, + principalTable: "LKP_SameApi_Gender", + principalColumn: "Id"); + table.ForeignKey( + name: "FK_SameApi_User_LKP_SameApi_School_SchoolDaoId", + column: x => x.SchoolDaoId, + principalTable: "LKP_SameApi_School", + principalColumn: "Id"); + table.ForeignKey( + name: "FK_SameApi_User_SameApi_Post_PostDaoId", + column: x => x.PostDaoId, + principalTable: "SameApi_Post", + principalColumn: "Id"); + }); + + migrationBuilder.CreateIndex( + name: "IX_LKP_SameApi_School_ProfessionId", + table: "LKP_SameApi_School", + column: "ProfessionId"); + + migrationBuilder.CreateIndex( + name: "IX_SameApi_User_GenderDaoId", + table: "SameApi_User", + column: "GenderDaoId"); + + migrationBuilder.CreateIndex( + name: "IX_SameApi_User_PostDaoId", + table: "SameApi_User", + column: "PostDaoId"); + + migrationBuilder.CreateIndex( + name: "IX_SameApi_User_SchoolDaoId", + table: "SameApi_User", + column: "SchoolDaoId"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "SameApi_User"); + + migrationBuilder.DropTable( + name: "LKP_SameApi_Gender"); + + migrationBuilder.DropTable( + name: "LKP_SameApi_School"); + + migrationBuilder.DropTable( + name: "SameApi_Post"); + + migrationBuilder.DropTable( + name: "LKP_SameApi_Profession"); + } + } +} diff --git a/SameApi/SameApi.Db/Migrations/SameApiDbContextModelSnapshot.cs b/SameApi/SameApi.Db/Migrations/SameApiDbContextModelSnapshot.cs new file mode 100644 index 0000000..69f0fcc --- /dev/null +++ b/SameApi/SameApi.Db/Migrations/SameApiDbContextModelSnapshot.cs @@ -0,0 +1,190 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using SameApi.Db.DbContexts; + +#nullable disable + +namespace SameApi.Db.Migrations +{ + [DbContext(typeof(SameApiDbContext))] + partial class SameApiDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "9.0.9") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("SameApi.Model.LKP.LKP_GenderDao", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("LKP_SameApi_Gender", (string)null); + }); + + modelBuilder.Entity("SameApi.Model.LKP.LKP_Profession", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("LKP_SameApi_Profession", (string)null); + }); + + modelBuilder.Entity("SameApi.Model.LKP.LKP_School", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("IdProfession") + .HasColumnType("int"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("ProfessionId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("ProfessionId"); + + b.ToTable("LKP_SameApi_School", (string)null); + }); + + modelBuilder.Entity("SameApi.Model.PostDao", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.HasKey("Id"); + + b.ToTable("SameApi_Post", (string)null); + }); + + modelBuilder.Entity("SameApi.Model.UserDao", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Age") + .HasColumnType("int"); + + b.Property("CreateAt") + .HasColumnType("datetime2"); + + b.Property("Email") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("GenderDaoId") + .HasColumnType("int"); + + b.Property("IsAdmin") + .HasColumnType("bit"); + + b.Property("Number_follow") + .HasColumnType("int"); + + b.Property("Password") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("PostDaoId") + .HasColumnType("int"); + + b.Property("Pseudo") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("SchoolDaoId") + .HasColumnType("int"); + + b.Property("id_gender_fk") + .HasColumnType("int"); + + b.Property("id_post_fk") + .HasColumnType("int"); + + b.Property("id_school_fk") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("GenderDaoId"); + + b.HasIndex("PostDaoId"); + + b.HasIndex("SchoolDaoId"); + + b.ToTable("SameApi_User", (string)null); + }); + + modelBuilder.Entity("SameApi.Model.LKP.LKP_School", b => + { + b.HasOne("SameApi.Model.LKP.LKP_Profession", "Profession") + .WithMany() + .HasForeignKey("ProfessionId"); + + b.Navigation("Profession"); + }); + + modelBuilder.Entity("SameApi.Model.UserDao", b => + { + b.HasOne("SameApi.Model.LKP.LKP_GenderDao", "GenderDao") + .WithMany() + .HasForeignKey("GenderDaoId"); + + b.HasOne("SameApi.Model.PostDao", "PostDao") + .WithMany() + .HasForeignKey("PostDaoId"); + + b.HasOne("SameApi.Model.LKP.LKP_School", "SchoolDao") + .WithMany() + .HasForeignKey("SchoolDaoId"); + + b.Navigation("GenderDao"); + + b.Navigation("PostDao"); + + b.Navigation("SchoolDao"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/SameApi/SameApi.Db/Repository/IProfessionRepository.cs b/SameApi/SameApi.Db/Repository/IProfessionRepository.cs new file mode 100644 index 0000000..68a710c --- /dev/null +++ b/SameApi/SameApi.Db/Repository/IProfessionRepository.cs @@ -0,0 +1,13 @@ +using SameApi.Data.Repository; +using SameApi.Db.DbContexts; +using SameApi.Model.LKP; + +namespace SameApi.Db.Repository +{ + + public interface IProfessionRepository : IBaseRepository + { + + + } +} diff --git a/SameApi/SameApi.Db/Repository/Implementation/ProfessionRepository.cs b/SameApi/SameApi.Db/Repository/Implementation/ProfessionRepository.cs new file mode 100644 index 0000000..cea09d4 --- /dev/null +++ b/SameApi/SameApi.Db/Repository/Implementation/ProfessionRepository.cs @@ -0,0 +1,22 @@ +using SameApi.Data.Repository; +using SameApi.Db.DbContexts; +using SameApi.Model.LKP; + +namespace SameApi.Db.Repository.Implementation +{ + public class ProfessionRepository : BaseRepository, IProfessionRepository + { + private readonly IApiSameDbContext _dbContext; + + public ProfessionRepository(IApiSameDbContext dbContext) : base(dbContext) + { + _dbContext = dbContext; + } + + public async Task AddAndSaveAsync(LKP_GenderDao entity) + { + _dbContext.Set().Add(entity); + await _dbContext.SaveChangesAsync(); + } + } +} \ No newline at end of file diff --git a/SameApi/SameApi.Db/SameApi.Db.csproj b/SameApi/SameApi.Db/SameApi.Db.csproj index 5ae8b9c..f0f6694 100644 --- a/SameApi/SameApi.Db/SameApi.Db.csproj +++ b/SameApi/SameApi.Db/SameApi.Db.csproj @@ -12,12 +12,12 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive + all runtime; build; native; contentfiles; analyzers; buildtransitive - diff --git a/SameApi/SameApi.Db/UnitOfWork/IApiSameUnitOfWork.cs b/SameApi/SameApi.Db/UnitOfWork/IApiSameUnitOfWork.cs index a2701c5..edc9d8b 100644 --- a/SameApi/SameApi.Db/UnitOfWork/IApiSameUnitOfWork.cs +++ b/SameApi/SameApi.Db/UnitOfWork/IApiSameUnitOfWork.cs @@ -8,6 +8,7 @@ public interface IApiSameUnitOfWork IApiSameDbContext Context { get; } IUserRepository UserRepository { get; } IGenderRepository GenderRepository { get; } + IProfessionRepository ProfessionRepository { get; } Task SaveChangesAsync(); } diff --git a/SameApi/SameApi.Db/UnitOfWork/SameApiUnitOfWork.cs b/SameApi/SameApi.Db/UnitOfWork/SameApiUnitOfWork.cs index db13f4f..a10fc14 100644 --- a/SameApi/SameApi.Db/UnitOfWork/SameApiUnitOfWork.cs +++ b/SameApi/SameApi.Db/UnitOfWork/SameApiUnitOfWork.cs @@ -8,12 +8,19 @@ public class SameApiUnitOfWork : IApiSameUnitOfWork public IApiSameDbContext Context { get; } public IUserRepository UserRepository { get; } public IGenderRepository GenderRepository { get; } + public IProfessionRepository ProfessionRepository { get; } - public SameApiUnitOfWork(IApiSameDbContext context , IUserRepository repository, IGenderRepository genderRepository) + public SameApiUnitOfWork( + IApiSameDbContext context, + IUserRepository repository, + IGenderRepository genderRepository, + IProfessionRepository professionRepository + ) { Context = context; UserRepository = repository; GenderRepository = genderRepository; + ProfessionRepository = professionRepository; } public async Task SaveChangesAsync() @@ -22,4 +29,4 @@ public async Task SaveChangesAsync() } } -} +} \ No newline at end of file diff --git a/SameApi/SameApi.Dto/ProfessionInput.cs b/SameApi/SameApi.Dto/ProfessionInput.cs new file mode 100644 index 0000000..154e50b --- /dev/null +++ b/SameApi/SameApi.Dto/ProfessionInput.cs @@ -0,0 +1,8 @@ +namespace SameApi.Dto +{ + public class ProfessionInput + { + public int Id { get; set; } + public string Name { get; set; } + } +} diff --git a/SameApi/SameApi.Dto/ProfessionResponse.cs b/SameApi/SameApi.Dto/ProfessionResponse.cs new file mode 100644 index 0000000..a3a23b4 --- /dev/null +++ b/SameApi/SameApi.Dto/ProfessionResponse.cs @@ -0,0 +1,8 @@ +namespace SameApi.Dto +{ + public class ProfessionResponse + { + public int Id { get; set; } + public string? Name { get; set; } + } +} diff --git a/SameApi/SameApi.Model/LKP/LKP_Profession.cs b/SameApi/SameApi.Model/LKP/LKP_ProfessionDao.cs similarity index 55% rename from SameApi/SameApi.Model/LKP/LKP_Profession.cs rename to SameApi/SameApi.Model/LKP/LKP_ProfessionDao.cs index 7b9b7c4..e144419 100644 --- a/SameApi/SameApi.Model/LKP/LKP_Profession.cs +++ b/SameApi/SameApi.Model/LKP/LKP_ProfessionDao.cs @@ -1,10 +1,11 @@ -using System.ComponentModel.DataAnnotations; +using SameApi.Data.Model; +using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace SameApi.Model.LKP { - [Table("LKP_SameApi_Gender")] - public class LKP_Profession + [Table("LKP_SameApi_Profession")] + public class LKP_ProfessionDao : IModelDao { [Key] public int Id { get; set; } diff --git a/SameApi/SameApi.Model/LKP/LKP_School.cs b/SameApi/SameApi.Model/LKP/LKP_SchoolDao.cs similarity index 73% rename from SameApi/SameApi.Model/LKP/LKP_School.cs rename to SameApi/SameApi.Model/LKP/LKP_SchoolDao.cs index 865a8f6..e6cc323 100644 --- a/SameApi/SameApi.Model/LKP/LKP_School.cs +++ b/SameApi/SameApi.Model/LKP/LKP_SchoolDao.cs @@ -4,8 +4,8 @@ namespace SameApi.Model.LKP { - [Table("LKP_SameApi_Gender")] - public class LKP_School : IModelDao + [Table("LKP_SameApi_School")] + public class LKP_SchoolDao : IModelDao { [Key] public int Id { get; set; } @@ -13,7 +13,7 @@ public class LKP_School : IModelDao [ForeignKey("Same_Api_School_Profession")] public int IdProfession { get; set; } - public LKP_Profession? Profession { get; set; } + public LKP_ProfessionDao? Profession { get; set; } } } diff --git a/SameApi/SameApi.Model/UserDao.cs b/SameApi/SameApi.Model/UserDao.cs index 8533164..a2f2d3d 100644 --- a/SameApi/SameApi.Model/UserDao.cs +++ b/SameApi/SameApi.Model/UserDao.cs @@ -25,7 +25,7 @@ public class UserDao : IModelDao [ForeignKey("Same_Api_User_School")] public int id_school_fk { get; set; } - public LKP_School? SchoolDao { get; set; } + public LKP_SchoolDao? SchoolDao { get; set; } [ForeignKey("Same_Api_User_Post")] public int id_post_fk { get; set; } From 2289a811d36074a6df72a33be47838180cae8919 Mon Sep 17 00:00:00 2001 From: IlP4rAd0xlI Date: Mon, 29 Sep 2025 15:01:05 +0200 Subject: [PATCH 36/77] feature/signup Update : style => good mobile devices responsivity --- React/package.json | 6 ++---- React/postcss.config.js | 6 ------ React/src/index.css | 3 --- React/src/styles/signup.scss | 35 +++++++++++++++++++++++++---------- React/tailwind.config.js | 15 --------------- 5 files changed, 27 insertions(+), 38 deletions(-) delete mode 100644 React/postcss.config.js delete mode 100644 React/tailwind.config.js diff --git a/React/package.json b/React/package.json index 270c1dd..26ba0b2 100644 --- a/React/package.json +++ b/React/package.json @@ -12,20 +12,18 @@ "dependencies": { "react": "^19.1.1", "react-dom": "^19.1.1", - "react-router-dom": "^7.8.2" + "react-router-dom": "^7.8.2", + "sass": "^1.93.2" }, "devDependencies": { "@eslint/js": "^9.33.0", "@types/react": "^19.1.10", "@types/react-dom": "^19.1.7", "@vitejs/plugin-react": "^5.0.0", - "autoprefixer": "^10.4.21", "eslint": "^9.33.0", "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.20", "globals": "^16.3.0", - "postcss": "^8.5.6", - "tailwindcss": "^3.4.17", "typescript": "~5.8.3", "typescript-eslint": "^8.39.1", "vite": "^7.1.2" diff --git a/React/postcss.config.js b/React/postcss.config.js deleted file mode 100644 index 2e7af2b..0000000 --- a/React/postcss.config.js +++ /dev/null @@ -1,6 +0,0 @@ -export default { - plugins: { - tailwindcss: {}, - autoprefixer: {}, - }, -} diff --git a/React/src/index.css b/React/src/index.css index bd6213e..e69de29 100644 --- a/React/src/index.css +++ b/React/src/index.css @@ -1,3 +0,0 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; \ No newline at end of file diff --git a/React/src/styles/signup.scss b/React/src/styles/signup.scss index aae1d6a..0102df3 100644 --- a/React/src/styles/signup.scss +++ b/React/src/styles/signup.scss @@ -27,6 +27,7 @@ body { -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; color: var(--color-text-white); + font-family: system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif; } /* Remove default button styles */ @@ -45,6 +46,10 @@ a { text-decoration: none; } +fieldset { + border: none; +} + /* Remove list styles */ ul, ol { list-style: none; @@ -82,7 +87,7 @@ input, textarea, select { /* Typography */ --font-size-xs: 0.89rem; /* 16px - minimum readable */ --font-size-sm: 0.94rem; /* 17px - comfortable minimum */ - --font-size-base: 1rem; /* 18px - ideal body text */ + --font-size-base: 0.9rem; /* 18px - ideal body text */ --font-size-lg: 1.22rem; /* 22px - subheadings */ --font-size-xl: 1.33rem; /* 24px - small headings */ --font-size-2xl: 1.67rem; /* 30px - medium headings */ @@ -115,9 +120,10 @@ input, textarea, select { --container-xl: 60vw; /* Input dimensions */ - --input-width: min(37vh, 400px); /* Responsive with fallback */ - --input-width-half: min(17.5vh, 200px); /* Responsive with fallback */ - --input-width-third: min(11vh, 150px); /* Responsive with fallback */ + --input-width: min(80vw, 500px); + --input-gap: 2vw; + --input-width-half: min(calc((var(--input-width) - var(--input-gap)) / 2), 250px); + --input-width-third: min(calc((var(--input-width) - (var(--input-gap) * 2)) / 3), 160px); --input-height: 45px; /* Breakpoints (for reference) */ @@ -266,10 +272,9 @@ a:focus { justify-content: space-between !important; } -.glass-dropdown-option { - color: black; - background-color: var(--glass-bg); - border: solid 1px var(--glass-border); +.glass-dropdown option { + //background-color: #999999; + color: #333; } /* ========================================================================== @@ -294,6 +299,7 @@ h1 { padding: 0 18px; transition: all var(--transition-fast); width: var(--input-width); + color: var(--color-text-white); } .glass-input:focus { @@ -314,7 +320,6 @@ h1 { /* Dropdown styling */ .glass-dropdown { @extend .glass-input; - padding-right: 30px; transition: all var(--transition-fast); width: var(--input-width-third); appearance: none; @@ -322,13 +327,23 @@ h1 { background-position: right 12px center; background-repeat: no-repeat; background-size: 16px; + color: var(--color-text-white); + cursor: pointer; } +.glass-button:hover, +.glass-dropdown:focus { + background-color: rgba(255, 255, 255, 0.3); + border-color: rgba(255, 255, 255, 0.5); + box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.1); +} + + /* Submit button styling */ .glass-button { @extend .glass-input; transition: all var(--transition-fast); - font-weight: var(--font-weight-medium); + font-weight: var(--font-weight-semibold); } .glass-button:hover, diff --git a/React/tailwind.config.js b/React/tailwind.config.js deleted file mode 100644 index 39291f0..0000000 --- a/React/tailwind.config.js +++ /dev/null @@ -1,15 +0,0 @@ -/** @type {import('tailwindcss').Config} */ -export default { - content: [ - "./index.html", - "./src/**/*.{js,jsx,ts,tsx}", - ], - theme: { - extend: { - colors: { - }, - }, - }, - plugins: [], -} - From 44225adf7dd1d8e5610ace96685651fd5e55bb9e Mon Sep 17 00:00:00 2001 From: IlP4rAd0xlI Date: Mon, 29 Sep 2025 16:52:06 +0200 Subject: [PATCH 37/77] feature/signup Add : error display for username field --- .../src/components/forms/signup/Username.tsx | 58 +-- React/src/styles/signup-old.css | 440 ------------------ React/src/styles/signup.scss | 15 + 3 files changed, 46 insertions(+), 467 deletions(-) delete mode 100644 React/src/styles/signup-old.css diff --git a/React/src/components/forms/signup/Username.tsx b/React/src/components/forms/signup/Username.tsx index 298700f..6fd7db1 100644 --- a/React/src/components/forms/signup/Username.tsx +++ b/React/src/components/forms/signup/Username.tsx @@ -1,3 +1,5 @@ +import {useState} from "react"; + const reservedWords = [ 'admin', 'root', @@ -21,75 +23,77 @@ interface UsernameFieldProps { export default function Username({ value, onChange }: UsernameFieldProps) { - const handleBlur = () => - { + const [errors, setErrors] = useState([]); + + const handleBlur = () => { const trimmedValue = value.trim(); + const newErrors: string[] = []; // Check if empty first if (trimmedValue === "") { - console.log("Username is required"); + newErrors.push("Username is required"); + setErrors(newErrors); return; } - // Collect all validation errors - const errors: string[] = []; - if (!/[a-zA-Z]/.test(value)) { - errors.push("Username must contain at least one letter"); + newErrors.push("Username must contain at least one letter"); } if (trimmedValue.length < 3 || trimmedValue.length > 19) { if (trimmedValue.length === 20) { - errors.push("You can't input more char for you username (20 is the max)"); + newErrors.push("You can't input more char for your username (20 is the max)"); } else { - errors.push('Username must have between 3 and 20 characters'); + newErrors.push("Username must have between 3 and 20 characters"); } } if (reservedWords.includes(trimmedValue.toLowerCase())) { - errors.push("Username can not be reserved words (like admin, root,...)"); + newErrors.push("Username cannot be a reserved word (like admin, root, …)"); } if (specialCharsRegex.test(value)) { if (/\s/.test(value)) { - errors.push("Username cannot contain spaces"); + newErrors.push("Username cannot contain spaces"); } else { - errors.push("Username cannot contains others special char then - and _"); + newErrors.push("Username cannot contain other special chars than - and _"); } } if (/[-_]{2,}/.test(trimmedValue)) { - errors.push("Username cannot contain successive hyphens or underscores"); + newErrors.push("Username cannot contain successive hyphens or underscores"); } - // Log results - if (errors.length === 0) { - console.log("Username is valid"); - } else { - errors.forEach(error => console.log(error)); - } - } + setErrors(newErrors); + }; - const handleChange = (e: React.ChangeEvent) => - { + const handleChange = (e: React.ChangeEvent) => { onChange(e.target.value); - console.clear(); + setErrors([]); }; return ( -
- {/*Hide label*/} +
+ 0 ? "glass-wrong-input" : ""}`} /> + {errors.length > 0 && ( + + {errors.map((err, i) => ( +
{err}
+ ))} +
+ )}
); } \ No newline at end of file diff --git a/React/src/styles/signup-old.css b/React/src/styles/signup-old.css deleted file mode 100644 index b966032..0000000 --- a/React/src/styles/signup-old.css +++ /dev/null @@ -1,440 +0,0 @@ -/* ========================================================================== - CSS RESET & BASE STYLES - ========================================================================== */ - -/* Modern CSS Reset */ -*, -*::before, -*::after { - box-sizing: border-box; - margin: 0; - padding: 0; -} - -html { - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} - -body { - margin: 0; - min-height: 100dvh; /* Your preference - modern viewport height */ - display: grid; - place-items: center; - background: url('../assets/img/same-register-login-background.png') left top / cover no-repeat fixed; - backdrop-filter: blur(4px); /* Your glassmorphism effect */ - overflow: hidden; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -/* Remove default button styles */ -button { - background: none; - border: none; - padding: 0; - margin: 0; - cursor: pointer; - font: inherit; -} - -/* Remove default link styles */ -a { - color: inherit; - text-decoration: none; -} - -/* Remove list styles */ -ul, ol { - list-style: none; -} - -/* Images and media */ -img, video, iframe { - max-width: 100%; - height: auto; - display: block; -} - -/* Form elements */ -input, textarea, select { - font: inherit; - border: none; - outline: none; -} - -/* ========================================================================== - CSS CUSTOM PROPERTIES (CSS VARIABLES) - Adapted to match your glassmorphism design - ========================================================================== */ - -:root { - /* Glass Effect Colors */ - --glass-bg: rgba(255, 255, 255, 0.20); - --glass-border: rgba(255, 255, 255, 0.20); - --glass-backdrop: blur(10px); - - /* Colors */ - --color-primary: #3498db; - --color-primary-dark: #2980b9; - --color-secondary: #2ecc71; - --color-accent: #e74c3c; - - --color-text: #333333; - --color-text-light: #666666; - --color-text-lighter: #999999; - --color-text-white: #ffffff; - - --color-bg: transparent; - --color-bg-light: rgba(255, 255, 255, 0.1); - --color-bg-dark: #2c3e50; - - --color-border: var(--glass-border); - --color-border-dark: #ddd; - - /* Typography - Adapted to your 18px base */ - --font-size-xs: 0.78rem; /* 14px */ - --font-size-sm: 0.89rem; /* 16px */ - --font-size-base: 1rem; /* 18px - your base */ - --font-size-lg: 1.22rem; /* 22px */ - --font-size-xl: 1.33rem; /* 24px */ - --font-size-2xl: 1.67rem; /* 30px - matches your card-title */ - --font-size-3xl: 2.11rem; /* 38px */ - --font-size-4xl: 2.56rem; /* 46px */ - - --font-weight-light: 300; - --font-weight-normal: 400; - --font-weight-medium: 500; - --font-weight-semibold: 600; - --font-weight-bold: 700; /* Your card-title weight */ - - --line-height-tight: 1.25; - --line-height-normal: 1.5; - --line-height-loose: 1.75; - - /* Spacing - Adapted to your measurements */ - --space-xs: 0.28rem; /* 5px */ - --space-sm: 0.56rem; /* 10px */ - --space-md: 1rem; /* 18px - matches your card-line margin */ - --space-lg: 1.44rem; /* 26px - matches your glass-card padding */ - --space-xl: 2rem; /* 36px */ - --space-2xl: 3rem; /* 54px */ - --space-3xl: 4rem; /* 72px */ - - /* Layout - Adapted to your vh-based sizing */ - --container-sm: 90vw; - --container-md: 80vw; - --container-lg: 70vw; - --container-xl: 60vw; - - /* Input dimensions - Based on your field-input */ - --input-width: 50vh; /* Your preference */ - --input-width-half: 25vh; /* Your demi-input */ - --input-width-dropdown: 10vh; /* Your dropdown */ - --input-height: 45px; /* Your field-input height */ - - /* Breakpoints (for reference in media queries) */ - --breakpoint-sm: 640px; /* Small tablets/large phones */ - --breakpoint-md: 768px; /* Tablets */ - --breakpoint-lg: 1024px; /* Desktop */ - --breakpoint-xl: 1280px; /* Large desktop */ - - /* Borders & Radius - Matches your design */ - --border-width: 1px; - --border-radius-sm: 8px; /* Your submit button */ - --border-radius-md: 9px; /* Your field-input */ - --border-radius-lg: 20px; /* Your glass-card */ - --border-radius-xl: 24px; - --border-radius-full: 9999px; - - /* Shadows */ - --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05); - --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.07); - --shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1); - --shadow-xl: 0 25px 50px rgba(0, 0, 0, 0.15); - - /* Transitions */ - --transition-fast: 0.15s ease; - --transition-normal: 0.3s ease; - --transition-slow: 0.5s ease; - - /* Z-index scale */ - --z-dropdown: 1000; - --z-modal: 1050; - --z-popover: 1060; - --z-tooltip: 1070; - --z-fixed: 1080; -} - -/* ========================================================================== - UTILITY CLASSES - Common patterns used across projects - ========================================================================== */ - -/* Screen reader only - for accessibility */ -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - white-space: nowrap; - border: 0; -} - -/* Container classes */ -.container { - width: 100%; - padding: 0 var(--space-md); - margin: 0 auto; - max-width: var(--container-sm); -} - -/* Flexbox utilities */ -.flex { - display: flex; -} - -.flex-col { - flex-direction: column; -} - -.items-center { - align-items: center; -} - -.justify-center { - justify-content: center; -} - -.justify-between { - justify-content: space-between; -} - -.justify-around { - justify-content: space-around; -} - -/* Text utilities */ -.text-center { - text-align: center; -} - -.text-left { - text-align: left; -} - -.text-right { - text-align: right; -} - -/* ========================================================================== - MOBILE BASE STYLES (320px and up) - Start here - mobile first approach - -> no media query needed for base styles - ========================================================================== */ - -/* Typography */ -h1, h2, h3, h4, h5, h6 { - font-weight: var(--font-weight-semibold); - line-height: var(--line-height-tight); - margin-bottom: var(--space-md); - color: var(--color-text-white); -} - -h1 { font-size: var(--font-size-2xl); } -h2 { font-size: var(--font-size-xl); } -h3 { font-size: var(--font-size-lg); } -h4 { font-size: var(--font-size-base); } -h5 { font-size: var(--font-size-sm); } -h6 { font-size: var(--font-size-xs); } - -p { - margin-bottom: var(--space-md); - line-height: var(--line-height-normal); - color: var(--color-text-white); -} - -/* Links */ -a { - color: var(--color-primary); - transition: color var(--transition-fast); -} - -a:hover, -a:focus { - color: var(--color-primary-dark); -} - -/* ========================================================================== - GLASS CARD SYSTEM - Your Core Component - ========================================================================== */ - -.glass-card { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - border-radius: var(--border-radius-lg); /* 20px */ - background-color: var(--glass-bg); - backdrop-filter: var(--glass-backdrop); - border: solid 1px var(--glass-border); - padding: var(--space-lg); /* 26px */ - box-shadow: var(--shadow-lg); - width: 100%; -} - -.card-title { - font-weight: var(--font-weight-bold); - color: var(--color-text-white); - margin-bottom: var(--space-lg); - text-align: center; -} - -.card-line { - margin-bottom: var(--space-md); /* 18px */ - width: 100%; - display: flex; - flex-direction: row; - justify-content: space-around !important; -} - -/* ========================================================================== - FORM SYSTEM - Adapted to Your Glassmorphism Style - ========================================================================== */ - -/* Hide labels as per your design */ -label { - display: none; -} - -/* Base input styling - matches your field-input */ -.field-input { - border-radius: var(--border-radius-md); /* 9px */ - height: var(--input-height); /* 45px */ - width: 100%; /* Responsive instead of fixed vh */ - max-width: var(--input-width); /* 50vh on larger screens */ - background-color: var(--glass-bg); - border: solid 1px var(--glass-border); - padding: 0 18px; - color: var(--color-text-white); - transition: all var(--transition-fast); -} - -.field-input:focus { - background-color: rgba(255, 255, 255, 0.3); - border-color: rgba(255, 255, 255, 0.5); - box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.1); -} - -.field-input::placeholder { - color: rgba(255, 255, 255, 0.7); -} - -/* Half-width inputs - your demi-input */ -.demi-input { - width: 100%; - max-width: var(--input-width-half); /* 25vh on larger screens */ -} - -/* Dropdown styling */ -.dropdown { - width: 100%; - max-width: var(--input-width-dropdown); /* 15vh on larger screens */ - appearance: none; - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3e%3c/svg%3e"); - background-position: right 12px center; - background-repeat: no-repeat; - background-size: 16px; - padding-right: 40px; -} - -/* Fieldset for grouping - matches your birthdate-field */ -fieldset { - display: flex; - gap: var(--space-sm); - border: none; - padding: 0; - margin: 0; - width: 100%; -} - -#birthdate-field .dropdown { - flex: 1; - margin: 10px; -} - -/* Submit button styling */ -button[type='submit'] { - background-color: var(--glass-bg); - border: solid 1px var(--glass-border); - border-radius: var(--border-radius-sm); /* 8px */ - width: 100%; - max-width: var(--input-width); /* 50vh on larger screens */ - height: var(--input-height); /* 45px */ - color: var(--color-text-white); - font-weight: var(--font-weight-medium); - cursor: pointer; - transition: all var(--transition-fast); - font-size: var(--font-size-base); -} - -button[type='submit']:hover, -button[type='submit']:focus { - background-color: rgba(255, 255, 255, 0.3); - transform: translateY(-1px); - box-shadow: var(--shadow-md); -} - -button[type='submit']:active { - transform: translateY(0); -} - -/* ========================================================================== - GRID SYSTEM - Mobile First - ========================================================================== */ - -.grid { - display: grid; - gap: var(--space-md); - grid-template-columns: 1fr; /* Single column on mobile */ -} - -/* ========================================================================== - SMALL MOBILE LANDSCAPE (640px and up) - ========================================================================== */ - -@media (min-width: var(--breakpoint-sm)) { - -} - -/* ========================================================================== - TABLET (768px and up) - ========================================================================== */ - -@media (min-width: var(--breakpoint-md)) { - -} - -/* ========================================================================== - DESKTOP (1024px and up) - ========================================================================== */ - -@media (min-width: var(--breakpoint-lg)) { - -} - -/* ========================================================================== - LARGE DESKTOP (1280px and up) - ========================================================================== */ - -@media (min-width: var(--breakpoint-xl)) { - -} - -/* ========================================================================== - COMPONENT EXTENSIONS - Additional components in your glassmorphism style - ========================================================================== */ \ No newline at end of file diff --git a/React/src/styles/signup.scss b/React/src/styles/signup.scss index 0102df3..dde77ad 100644 --- a/React/src/styles/signup.scss +++ b/React/src/styles/signup.scss @@ -83,6 +83,10 @@ input, textarea, select { //--color-primary: #3498db; //--color-primary-dark: #2980b9; --color-text-white: #fffafa; + --color-border-error: rgba(255,103,0,0.7); + --color-text-error: rgba(255,103,0,0.7); + --color-bg-error: rgba(255,103,1, 0.5); + --color-error-box-shadow: rgba(255,103,1, 0.2); /* Typography */ --font-size-xs: 0.89rem; /* 16px - minimum readable */ @@ -302,6 +306,17 @@ h1 { color: var(--color-text-white); } +.glass-wrong-input { + border: solid 1px var(--color-border-error) !important; + background-color: var(--color-bg-error) !important; + box-shadow: 0 0 0 5px var(--color-error-box-shadow) !important; +} + +.error-messages { + color: var(--color-text-error) !important; + font-weight: var(--font-weight-semibold) !important; +} + .glass-input:focus { background-color: rgba(255, 255, 255, 0.3); border-color: rgba(255, 255, 255, 0.5); From 545989466276269e4e5ceea167e73e14d6048a53 Mon Sep 17 00:00:00 2001 From: IlP4rAd0xlI Date: Wed, 1 Oct 2025 14:59:58 +0200 Subject: [PATCH 38/77] feature/signup Add : error display --- .../forms/signup/BirthdateField.tsx | 6 +- .../components/forms/signup/EmailField.tsx | 51 +++++++------ .../forms/signup/FirstNameField.tsx | 55 +++++++------- .../components/forms/signup/LastNameField.tsx | 52 ++++++------- .../forms/signup/PasswordFields.tsx | 75 ++++++++++--------- .../src/components/forms/signup/Username.tsx | 39 ++++------ React/src/styles/signup.scss | 15 +++- 7 files changed, 150 insertions(+), 143 deletions(-) diff --git a/React/src/components/forms/signup/BirthdateField.tsx b/React/src/components/forms/signup/BirthdateField.tsx index 09e29b8..48cf265 100644 --- a/React/src/components/forms/signup/BirthdateField.tsx +++ b/React/src/components/forms/signup/BirthdateField.tsx @@ -55,14 +55,14 @@ export default function BirthdateField({ value, onChange, label = "Date of Birth errors.push("Invalid day for the selected month and year"); } - // Age validation (must be 13+ years old) + // Age validation (must be 14+ years old) const birthDate = new Date(yearNum, monthNum - 1, dayNum); const today = new Date(); const age = today.getFullYear() - birthDate.getFullYear() - (today < new Date(today.getFullYear(), birthDate.getMonth(), birthDate.getDate()) ? 1 : 0); - if (age < 13) { - errors.push("You must be at least 13 years old to register"); + if (age < 14) { + errors.push("You must be at least 14 years old to register"); } // Future date validation diff --git a/React/src/components/forms/signup/EmailField.tsx b/React/src/components/forms/signup/EmailField.tsx index 9181d1f..42a313d 100644 --- a/React/src/components/forms/signup/EmailField.tsx +++ b/React/src/components/forms/signup/EmailField.tsx @@ -1,4 +1,6 @@ -const edugeEmailRegex = /^[a-zA-Z]+\.[a-zA-Z]+@eduge\.ch$/ +import {useState} from "react"; + +const edugeEmailRegex = /^[a-zA-Z]+\.[a-zA-Z]+@eduge\.ch$/; interface EmailFieldProps { value: string; @@ -7,40 +9,34 @@ interface EmailFieldProps { export default function EmailField({ value, onChange }: EmailFieldProps) { - // const [error, setError] = useState(''); - const handleBlur = () => - { + const [errors, setErrors] = useState([]); + + const handleBlur = () => { const trimmedValue = value.trim(); + const newErrors: string[] = []; // Check if empty first if (trimmedValue === "") { - console.log("Email is required"); + newErrors.push("Required"); + setErrors(newErrors); return; } - // Collect all validation errors - const errors: string[] = []; - - if (!edugeEmailRegex.test(value)) { - errors.push("Please enter a valid eduge email") + if (!edugeEmailRegex.test(trimmedValue)) { + newErrors.push("Please enter a valid eduge email"); } - // Log results - if (errors.length === 0) { - console.log("Email is valid"); - } else { - errors.forEach(error => console.log(error)); - } - } + setErrors(newErrors); + }; - const handleChange = (e: React.ChangeEvent) => - { - onChange(e.target.value); - console.clear(); + const handleChange = (e: React.ChangeEvent) => { + const valueNoSpaces = e.target.value.replace(/\s/g, ''); + onChange(valueNoSpaces); + setErrors([]); }; return ( -
+
0 ? "glass-wrong-input" : ""}`} /> + {errors.length > 0 && ( + + {errors.map((err, i) => ( +
{err}
+ ))} +
+ )}
); } \ No newline at end of file diff --git a/React/src/components/forms/signup/FirstNameField.tsx b/React/src/components/forms/signup/FirstNameField.tsx index a9a7605..daf5417 100644 --- a/React/src/components/forms/signup/FirstNameField.tsx +++ b/React/src/components/forms/signup/FirstNameField.tsx @@ -1,3 +1,5 @@ +import {useState} from "react"; + interface FirstNameFieldProps { value: string; onChange: (value: string) => void; @@ -5,44 +7,36 @@ interface FirstNameFieldProps { export default function FirstNameField({ value, onChange }: FirstNameFieldProps) { - // const [error, setError] = useState(''); - const handleBlur = () => - { + const [errors, setErrors] = useState([]); + + const handleBlur = () => { const trimmedValue = value.trim(); + const newErrors: string[] = []; // Check if empty first if (trimmedValue === "") { - console.log("First name is required"); + newErrors.push("Required"); + setErrors(newErrors); return; } - // Collect all validation errors - const errors: string[] = []; - - if (trimmedValue.length < 2 || trimmedValue.length > 49) { - if (trimmedValue.length === 20) { - errors.push("You can't input more char for you first name (50 is the max)"); - } else { - errors.push('First name must have between 2 and 50 characters'); - } - } - - if (!/^[a-zA-Z]+$/.test(value) && !(value.trim() == null || value.trim() == "")) { - errors.push("First name can only contain letters") + if (trimmedValue.length < 2 || trimmedValue.length > 50) { + newErrors.push("2-50 characters"); } + setErrors(newErrors); + }; - // Log results - if (errors.length === 0) { - console.log("First name is valid"); - } else { - errors.forEach(error => console.log(error)); - } - } + const capitalizeFirstLetter = (str: string): string => { + if (str.length === 0) return str; + return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase(); + }; const handleChange = (e: React.ChangeEvent) => { - onChange(e.target.value); - console.clear(); + const valueOnlyLetters = e.target.value.replace(/[^a-zA-ZÀ-ÿ\u0100-\u017F\u0180-\u024F'-]/g, ''); + const capitalizedValue = capitalizeFirstLetter(valueOnlyLetters); + onChange(capitalizedValue); + setErrors([]); }; return ( @@ -55,8 +49,15 @@ export default function FirstNameField({ value, onChange }: FirstNameFieldProps) onBlur={handleBlur} maxLength={50} placeholder={"First Name"} - className={"glass-input half-input"} + className={`glass-input half-input ${errors.length > 0 ? "glass-wrong-input" : ""}`} /> + {errors.length > 0 && ( + + {errors.map((err, i) => ( +
{err}
+ ))} +
+ )}
); } \ No newline at end of file diff --git a/React/src/components/forms/signup/LastNameField.tsx b/React/src/components/forms/signup/LastNameField.tsx index e32d4fe..f98d348 100644 --- a/React/src/components/forms/signup/LastNameField.tsx +++ b/React/src/components/forms/signup/LastNameField.tsx @@ -1,3 +1,5 @@ +import {useState} from "react"; + interface LastNameFieldProps { value: string; onChange: (value: string) => void; @@ -5,44 +7,31 @@ interface LastNameFieldProps { export default function LastNameField({ value, onChange }: LastNameFieldProps) { - // const [error, setError] = useState(''); - const handleBlur = () => - { + const [errors, setErrors] = useState([]); + + const handleBlur = () => { const trimmedValue = value.trim(); + const newErrors: string[] = []; // Check if empty first if (trimmedValue === "") { - console.log("Last name is required"); + newErrors.push("Required"); + setErrors(newErrors); return; } - // Collect all validation errors - const errors: string[] = []; - - if (trimmedValue.length < 2 || trimmedValue.length > 49) { - if (trimmedValue.length === 20) { - errors.push("You can't input more char for you last name (50 is the max)"); - } else { - errors.push('Last name must have between 2 and 50 characters'); - } + if (trimmedValue.length < 2 || trimmedValue.length > 50) { + newErrors.push("2-50 characters"); } - - if (!/^[a-zA-Z]+$/.test(value) && !(value.trim() == null || value.trim() == "")) { - errors.push("Last name can only contain letters") - } - - // Log results - if (errors.length === 0) { - console.log("Last name is valid"); - } else { - errors.forEach(error => console.log(error)); - } - } + setErrors(newErrors); + }; const handleChange = (e: React.ChangeEvent) => { - onChange(e.target.value); - console.clear(); + const valueOnlyLetters = e.target.value.replace(/[^a-zA-ZÀ-ÿ\u0100-\u017F\u0180-\u024F'-]/g, ''); + const uppercaseValue = valueOnlyLetters.toUpperCase(); + onChange(uppercaseValue); + setErrors([]); }; return ( @@ -55,8 +44,15 @@ export default function LastNameField({ value, onChange }: LastNameFieldProps) onBlur={handleBlur} maxLength={50} placeholder={"Last Name"} - className={"glass-input half-input"} + className={`glass-input half-input ${errors.length > 0 ? "glass-wrong-input" : ""}`} /> + {errors.length > 0 && ( + + {errors.map((err, i) => ( +
{err}
+ ))} +
+ )}
); } \ No newline at end of file diff --git a/React/src/components/forms/signup/PasswordFields.tsx b/React/src/components/forms/signup/PasswordFields.tsx index 7a1cf17..5349246 100644 --- a/React/src/components/forms/signup/PasswordFields.tsx +++ b/React/src/components/forms/signup/PasswordFields.tsx @@ -1,3 +1,5 @@ +import {useState} from "react"; + const sequences = [ 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', @@ -33,6 +35,9 @@ export default function PasswordFields({ birthdate = { month: '', day: '', year: '' } }: PasswordFieldsProps) { + const [passwordErrors, setPasswordErrors] = useState([]); + const [confirmErrors, setConfirmErrors] = useState([]); + const checkConsecutiveRepeated = (password: string): boolean => { for (let i = 0; i < password.length - 2; i++) { @@ -93,96 +98,84 @@ export default function PasswordFields({ const handlePasswordBlur = () => { const trimmedValue = passwordValue.trim(); + const newErrors: string[] = []; // Check if empty first if (trimmedValue === "") { - console.log("Password is required"); + newErrors.push("Required"); + setPasswordErrors(newErrors); return; } - // Collect all validation errors - const errors: string[] = []; - if (trimmedValue.length < 16) { - errors.push('Password must be at least 16 characters long'); + newErrors.push('Min. 16 characters'); } if (!/[a-z]/.test(passwordValue)) { - errors.push("Password must contain at least one lowercase letter"); + newErrors.push("Must include lowercase"); } if (!/[A-Z]/.test(passwordValue)) { - errors.push("Password must contain at least one uppercase letter"); + newErrors.push("Must include uppercase"); } if (!/[0-9]/.test(passwordValue)) { - errors.push("Password must contain at least one number"); + newErrors.push("Must include number"); } if (!specialCharsRegex.test(passwordValue)) { - errors.push("Password must contain at least one special character"); + newErrors.push("Must include special character"); } if (/\s/.test(passwordValue)) { - errors.push("Password cannot contain spaces"); + newErrors.push("No spaces allowed"); } if (checkConsecutiveRepeated(passwordValue)) { - errors.push("Password cannot contain 3 or more consecutive repeated characters (like 'aaa' or '111')"); + newErrors.push("No 3+ repeated characters"); } if (checkSequentialChars(passwordValue)) { - errors.push("Password cannot contain sequential characters (like 'abc', '123', or 'qwerty')"); + newErrors.push("No sequential characters"); } const personalInfoViolations = checkContainsPersonalInfo(passwordValue); if (personalInfoViolations.length > 0) { - errors.push(`Password cannot contain your ${personalInfoViolations.join(', ')}`); + newErrors.push(`No personal info (${personalInfoViolations.join(', ')})`); } - // Log results - if (errors.length === 0) { - console.log("Password is valid"); - } else { - errors.forEach(error => console.log(error)); - } + setPasswordErrors(newErrors); } const handleConfirmBlur = () => { const trimmedValue = confirmValue.trim(); + const newErrors: string[] = []; // Check if empty first if (trimmedValue === "" && passwordValue.trim().length > 0) { - console.log('Please confirm your password'); + newErrors.push('Required'); + setConfirmErrors(newErrors); return; } - // Collect all validation errors - const errors: string[] = []; - if (trimmedValue.length > 0 && trimmedValue !== passwordValue) { - errors.push('Passwords do not match - the two passwords must be identical'); + newErrors.push('Passwords must match'); } - // Log results - if (errors.length === 0 && trimmedValue.length > 0) { - console.log("Password confirmation is valid"); - } else if (errors.length > 0) { - errors.forEach(error => console.log(error)); - } + setConfirmErrors(newErrors); } const handlePasswordChange = (e: React.ChangeEvent) => { onPasswordChange(e.target.value); - console.clear(); + setPasswordErrors([]); }; const handleConfirmChange = (e: React.ChangeEvent) => { onConfirmChange(e.target.value); - console.clear(); + setConfirmErrors([]); }; return ( @@ -195,8 +188,15 @@ export default function PasswordFields({ onChange={handlePasswordChange} onBlur={handlePasswordBlur} placeholder="Enter your password (min. 16 characters)" - className={"glass-input"} + className={`glass-input ${passwordErrors.length > 0 ? "glass-wrong-input" : ""}`} /> + {passwordErrors.length > 0 && ( + + {passwordErrors.map((err, i) => ( +
{err}
+ ))} +
+ )}
@@ -207,8 +207,15 @@ export default function PasswordFields({ onChange={handleConfirmChange} onBlur={handleConfirmBlur} placeholder="Confirm your password" - className={"glass-input"} + className={`glass-input ${confirmErrors.length > 0 ? "glass-wrong-input" : ""}`} /> + {confirmErrors.length > 0 && ( + + {confirmErrors.map((err, i) => ( +
{err}
+ ))} +
+ )}
); diff --git a/React/src/components/forms/signup/Username.tsx b/React/src/components/forms/signup/Username.tsx index 6fd7db1..b9fc279 100644 --- a/React/src/components/forms/signup/Username.tsx +++ b/React/src/components/forms/signup/Username.tsx @@ -11,7 +11,6 @@ const reservedWords = [ 'system', 'null', 'undefined' - // Add more ]; const specialCharsRegex = /[^a-zA-Z0-9_-]/; @@ -31,44 +30,36 @@ export default function Username({ value, onChange }: UsernameFieldProps) // Check if empty first if (trimmedValue === "") { - newErrors.push("Username is required"); + newErrors.push("Required"); setErrors(newErrors); return; } if (!/[a-zA-Z]/.test(value)) { - newErrors.push("Username must contain at least one letter"); + newErrors.push("Must include a letter"); } - if (trimmedValue.length < 3 || trimmedValue.length > 19) { - if (trimmedValue.length === 20) { - newErrors.push("You can't input more char for your username (20 is the max)"); - } else { - newErrors.push("Username must have between 3 and 20 characters"); - } + if (trimmedValue.length < 3 || trimmedValue.length > 20) { + newErrors.push("3-20 characters"); } if (reservedWords.includes(trimmedValue.toLowerCase())) { - newErrors.push("Username cannot be a reserved word (like admin, root, …)"); + newErrors.push("Reserved by system"); } if (specialCharsRegex.test(value)) { - if (/\s/.test(value)) { - newErrors.push("Username cannot contain spaces"); - } else { - newErrors.push("Username cannot contain other special chars than - and _"); - } + newErrors.push("Letters, numbers, - and _ only"); } - if (/[-_]{2,}/.test(trimmedValue)) { - newErrors.push("Username cannot contain successive hyphens or underscores"); + if (/-{2,}/.test(trimmedValue) || /_{2,}/.test(trimmedValue)) { + newErrors.push("No consecutive - or _"); } - setErrors(newErrors); }; const handleChange = (e: React.ChangeEvent) => { - onChange(e.target.value); + const valueNoSpaces = e.target.value.replace(/\s/g, ''); + onChange(valueNoSpaces); setErrors([]); }; @@ -88,11 +79,11 @@ export default function Username({ value, onChange }: UsernameFieldProps) className={`glass-input ${errors.length > 0 ? "glass-wrong-input" : ""}`} /> {errors.length > 0 && ( - - {errors.map((err, i) => ( -
{err}
- ))} -
+ + {errors.map((err, i) => ( +
{err}
+ ))} +
)}
); diff --git a/React/src/styles/signup.scss b/React/src/styles/signup.scss index dde77ad..9106ca3 100644 --- a/React/src/styles/signup.scss +++ b/React/src/styles/signup.scss @@ -21,7 +21,8 @@ body { min-height: 100dvh; display: grid; place-items: center; - background: url('../assets/img/same-register-login-background.png') left top / cover no-repeat fixed; + //background: url('../assets/img/same-register-login-background.png') left top / cover no-repeat fixed; + background-color: #013251; backdrop-filter: blur(4px); overflow: hidden; -webkit-font-smoothing: antialiased; @@ -304,6 +305,7 @@ h1 { transition: all var(--transition-fast); width: var(--input-width); color: var(--color-text-white); + margin-bottom: var(--space-xs); } .glass-wrong-input { @@ -313,8 +315,14 @@ h1 { } .error-messages { - color: var(--color-text-error) !important; - font-weight: var(--font-weight-semibold) !important; + color: var(--color-text-error); + font-weight: var(--font-weight-semibold); + width: var(--input-width); + padding-left: 5px; +} + +.error-messages-half { + width: var(--input-width-half) !important; } .glass-input:focus { @@ -359,6 +367,7 @@ h1 { @extend .glass-input; transition: all var(--transition-fast); font-weight: var(--font-weight-semibold); + margin-bottom: var(--space-md); } .glass-button:hover, From 897e8ef7a5f472f4fb6736b674b3985cb78a59fa Mon Sep 17 00:00:00 2001 From: Mattis Date: Fri, 3 Oct 2025 09:30:48 +0200 Subject: [PATCH 39/77] user dao change columnname --- .../20251003070443_1.0.1.Designer.cs | 193 ++++++++++++++++++ .../Migrations/20251003070443_1.0.1.cs | 28 +++ .../SameApiDbContextModelSnapshot.cs | 22 +- SameApi/SameApi.Model/UserDao.cs | 2 +- 4 files changed, 233 insertions(+), 12 deletions(-) create mode 100644 SameApi/SameApi.Db/Migrations/20251003070443_1.0.1.Designer.cs create mode 100644 SameApi/SameApi.Db/Migrations/20251003070443_1.0.1.cs diff --git a/SameApi/SameApi.Db/Migrations/20251003070443_1.0.1.Designer.cs b/SameApi/SameApi.Db/Migrations/20251003070443_1.0.1.Designer.cs new file mode 100644 index 0000000..a3f07cb --- /dev/null +++ b/SameApi/SameApi.Db/Migrations/20251003070443_1.0.1.Designer.cs @@ -0,0 +1,193 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using SameApi.Db.DbContexts; + +#nullable disable + +namespace SameApi.Db.Migrations +{ + [DbContext(typeof(SameApiDbContext))] + [Migration("20251003070443_1.0.1")] + partial class _101 + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "9.0.9") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("SameApi.Model.LKP.LKP_GenderDao", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("LKP_SameApi_Gender"); + }); + + modelBuilder.Entity("SameApi.Model.LKP.LKP_ProfessionDao", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("LKP_SameApi_Profession"); + }); + + modelBuilder.Entity("SameApi.Model.LKP.LKP_SchoolDao", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("IdProfession") + .HasColumnType("int"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("ProfessionId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("ProfessionId"); + + b.ToTable("LKP_SameApi_School"); + }); + + modelBuilder.Entity("SameApi.Model.PostDao", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.HasKey("Id"); + + b.ToTable("SameApi_Post"); + }); + + modelBuilder.Entity("SameApi.Model.UserDao", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Age") + .HasColumnType("int"); + + b.Property("CreateAt") + .HasColumnType("datetime2"); + + b.Property("Email") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("GenderDaoId") + .HasColumnType("int"); + + b.Property("IsAdmin") + .HasColumnType("bit"); + + b.Property("NumberFollowers") + .HasColumnType("int"); + + b.Property("Password") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("PostDaoId") + .HasColumnType("int"); + + b.Property("Pseudo") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("SchoolDaoId") + .HasColumnType("int"); + + b.Property("id_gender_fk") + .HasColumnType("int"); + + b.Property("id_post_fk") + .HasColumnType("int"); + + b.Property("id_school_fk") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("GenderDaoId"); + + b.HasIndex("PostDaoId"); + + b.HasIndex("SchoolDaoId"); + + b.ToTable("SameApi_User"); + }); + + modelBuilder.Entity("SameApi.Model.LKP.LKP_SchoolDao", b => + { + b.HasOne("SameApi.Model.LKP.LKP_ProfessionDao", "Profession") + .WithMany() + .HasForeignKey("ProfessionId"); + + b.Navigation("Profession"); + }); + + modelBuilder.Entity("SameApi.Model.UserDao", b => + { + b.HasOne("SameApi.Model.LKP.LKP_GenderDao", "GenderDao") + .WithMany() + .HasForeignKey("GenderDaoId"); + + b.HasOne("SameApi.Model.PostDao", "PostDao") + .WithMany() + .HasForeignKey("PostDaoId"); + + b.HasOne("SameApi.Model.LKP.LKP_SchoolDao", "SchoolDao") + .WithMany() + .HasForeignKey("SchoolDaoId"); + + b.Navigation("GenderDao"); + + b.Navigation("PostDao"); + + b.Navigation("SchoolDao"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/SameApi/SameApi.Db/Migrations/20251003070443_1.0.1.cs b/SameApi/SameApi.Db/Migrations/20251003070443_1.0.1.cs new file mode 100644 index 0000000..877f0c1 --- /dev/null +++ b/SameApi/SameApi.Db/Migrations/20251003070443_1.0.1.cs @@ -0,0 +1,28 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace SameApi.Db.Migrations +{ + /// + public partial class _101 : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.RenameColumn( + name: "Number_follow", + table: "SameApi_User", + newName: "NumberFollowers"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.RenameColumn( + name: "NumberFollowers", + table: "SameApi_User", + newName: "Number_follow"); + } + } +} diff --git a/SameApi/SameApi.Db/Migrations/SameApiDbContextModelSnapshot.cs b/SameApi/SameApi.Db/Migrations/SameApiDbContextModelSnapshot.cs index 69f0fcc..969e993 100644 --- a/SameApi/SameApi.Db/Migrations/SameApiDbContextModelSnapshot.cs +++ b/SameApi/SameApi.Db/Migrations/SameApiDbContextModelSnapshot.cs @@ -36,10 +36,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.ToTable("LKP_SameApi_Gender", (string)null); + b.ToTable("LKP_SameApi_Gender"); }); - modelBuilder.Entity("SameApi.Model.LKP.LKP_Profession", b => + modelBuilder.Entity("SameApi.Model.LKP.LKP_ProfessionDao", b => { b.Property("Id") .ValueGeneratedOnAdd() @@ -53,10 +53,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.ToTable("LKP_SameApi_Profession", (string)null); + b.ToTable("LKP_SameApi_Profession"); }); - modelBuilder.Entity("SameApi.Model.LKP.LKP_School", b => + modelBuilder.Entity("SameApi.Model.LKP.LKP_SchoolDao", b => { b.Property("Id") .ValueGeneratedOnAdd() @@ -78,7 +78,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasIndex("ProfessionId"); - b.ToTable("LKP_SameApi_School", (string)null); + b.ToTable("LKP_SameApi_School"); }); modelBuilder.Entity("SameApi.Model.PostDao", b => @@ -91,7 +91,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.ToTable("SameApi_Post", (string)null); + b.ToTable("SameApi_Post"); }); modelBuilder.Entity("SameApi.Model.UserDao", b => @@ -118,7 +118,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("IsAdmin") .HasColumnType("bit"); - b.Property("Number_follow") + b.Property("NumberFollowers") .HasColumnType("int"); b.Property("Password") @@ -152,12 +152,12 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasIndex("SchoolDaoId"); - b.ToTable("SameApi_User", (string)null); + b.ToTable("SameApi_User"); }); - modelBuilder.Entity("SameApi.Model.LKP.LKP_School", b => + modelBuilder.Entity("SameApi.Model.LKP.LKP_SchoolDao", b => { - b.HasOne("SameApi.Model.LKP.LKP_Profession", "Profession") + b.HasOne("SameApi.Model.LKP.LKP_ProfessionDao", "Profession") .WithMany() .HasForeignKey("ProfessionId"); @@ -174,7 +174,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) .WithMany() .HasForeignKey("PostDaoId"); - b.HasOne("SameApi.Model.LKP.LKP_School", "SchoolDao") + b.HasOne("SameApi.Model.LKP.LKP_SchoolDao", "SchoolDao") .WithMany() .HasForeignKey("SchoolDaoId"); diff --git a/SameApi/SameApi.Model/UserDao.cs b/SameApi/SameApi.Model/UserDao.cs index a2f2d3d..4a73eb1 100644 --- a/SameApi/SameApi.Model/UserDao.cs +++ b/SameApi/SameApi.Model/UserDao.cs @@ -15,7 +15,7 @@ public class UserDao : IModelDao public required string Pseudo { get; set; } public required string Email { get; set; } public required string Password { get; set; } - public int Number_follow { get; set; } + public int NumberFollowers { get; set; } public DateTime CreateAt { get; set; } From 66e89e253888612cf3a27dfe100e713323afa873 Mon Sep 17 00:00:00 2001 From: IlP4rAd0xlI Date: Fri, 3 Oct 2025 09:32:23 +0200 Subject: [PATCH 40/77] signup-frontend Add : AppRoutes / emotion Remove : sass --- React/package.json | 4 +- React/src/App.tsx | 15 +- React/src/pages/{Home.tsx => HomeView.tsx} | 2 +- React/src/pages/{Login.tsx => LoginView.tsx} | 2 +- React/src/pages/NotFoundView.tsx | 10 + .../src/pages/{Signup.tsx => SignupView.tsx} | 2 +- React/src/styles/globalStyle.tsx | 50 ++ React/src/styles/signup.scss | 484 ++++++------------ 8 files changed, 214 insertions(+), 355 deletions(-) rename React/src/pages/{Home.tsx => HomeView.tsx} (82%) rename React/src/pages/{Login.tsx => LoginView.tsx} (65%) create mode 100644 React/src/pages/NotFoundView.tsx rename React/src/pages/{Signup.tsx => SignupView.tsx} (81%) create mode 100644 React/src/styles/globalStyle.tsx diff --git a/React/package.json b/React/package.json index 26ba0b2..d96ceea 100644 --- a/React/package.json +++ b/React/package.json @@ -10,10 +10,10 @@ "preview": "vite preview" }, "dependencies": { + "@emotion/react": "^11.14.0", "react": "^19.1.1", "react-dom": "^19.1.1", - "react-router-dom": "^7.8.2", - "sass": "^1.93.2" + "react-router-dom": "^7.8.2" }, "devDependencies": { "@eslint/js": "^9.33.0", diff --git a/React/src/App.tsx b/React/src/App.tsx index fdedc37..eef1987 100644 --- a/React/src/App.tsx +++ b/React/src/App.tsx @@ -1,17 +1,12 @@ -import { Routes, Route } from 'react-router-dom' -import Signup from './pages/Signup.tsx' -import Home from './pages/Home.tsx' -import Login from './pages/Login.tsx' +import { Global } from '@emotion/react' +import { globalStyle } from './styles/globalStyle' +import AppRoutes from './AppRoutes' function App() { return ( <> - - } /> - } /> - } /> - } /> - + + ) } diff --git a/React/src/pages/Home.tsx b/React/src/pages/HomeView.tsx similarity index 82% rename from React/src/pages/Home.tsx rename to React/src/pages/HomeView.tsx index e2d2ac8..ba5bd64 100644 --- a/React/src/pages/Home.tsx +++ b/React/src/pages/HomeView.tsx @@ -1,6 +1,6 @@ import { Link } from 'react-router-dom' -export default function Home() { +export default function HomeView() { return ( <>

Home

diff --git a/React/src/pages/Login.tsx b/React/src/pages/LoginView.tsx similarity index 65% rename from React/src/pages/Login.tsx rename to React/src/pages/LoginView.tsx index 4dffd13..404ff50 100644 --- a/React/src/pages/Login.tsx +++ b/React/src/pages/LoginView.tsx @@ -1,4 +1,4 @@ -export default function Login(){ +export default function LoginView(){ return ( <>

Login

diff --git a/React/src/pages/NotFoundView.tsx b/React/src/pages/NotFoundView.tsx new file mode 100644 index 0000000..399db61 --- /dev/null +++ b/React/src/pages/NotFoundView.tsx @@ -0,0 +1,10 @@ +import { Link } from 'react-router-dom' + +export default function NotFoundView() { + return ( + <> +

404 not found

+ Link to home + + ); +} \ No newline at end of file diff --git a/React/src/pages/Signup.tsx b/React/src/pages/SignupView.tsx similarity index 81% rename from React/src/pages/Signup.tsx rename to React/src/pages/SignupView.tsx index d320884..22be9a3 100644 --- a/React/src/pages/Signup.tsx +++ b/React/src/pages/SignupView.tsx @@ -1,7 +1,7 @@ import SignupCard from '../components/forms/signup/SignupCard' import '../styles/signup.scss' -export default function Signup() { +export default function SignupView() { return (
diff --git a/React/src/styles/globalStyle.tsx b/React/src/styles/globalStyle.tsx new file mode 100644 index 0000000..7c1b816 --- /dev/null +++ b/React/src/styles/globalStyle.tsx @@ -0,0 +1,50 @@ +import { css } from '@emotion/react' + +export const globalStyle = css` + /* Reset */ + *, *::before, *::after { + box-sizing: border-box; + margin: 0; + padding: 0; + } + + html { + -webkit-text-size-adjust: 100%; + } + + body { + min-height: 100dvh; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif; + color: #fffafa; + background-color: #013251; + } + + button { + background: none; + border: none; + cursor: pointer; + font: inherit; + } + + a { + color: inherit; + text-decoration: none; + } + + fieldset { border: none; } + ul, ol { list-style: none; } + + img, video, iframe { + max-width: 100%; + height: auto; + display: block; + } + + input, textarea, select { + font: inherit; + border: none; + outline: none; + } +` \ No newline at end of file diff --git a/React/src/styles/signup.scss b/React/src/styles/signup.scss index 9106ca3..0a4d376 100644 --- a/React/src/styles/signup.scss +++ b/React/src/styles/signup.scss @@ -1,255 +1,95 @@ -/* ========================================================================== - CSS RESET & BASE STYLES - ========================================================================== */ - -/* Modern CSS Reset */ -*, -*::before, -*::after { - box-sizing: border-box; - margin: 0; - padding: 0; -} - -html { - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} - -body { - margin: 0; - min-height: 100dvh; - display: grid; - place-items: center; - //background: url('../assets/img/same-register-login-background.png') left top / cover no-repeat fixed; - background-color: #013251; - backdrop-filter: blur(4px); - overflow: hidden; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - color: var(--color-text-white); - font-family: system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif; -} - -/* Remove default button styles */ -button { - background: none; - border: none; - padding: 0; - margin: 0; - cursor: pointer; - font: inherit; -} - -/* Remove default link styles */ -a { - color: inherit; - text-decoration: none; -} - -fieldset { - border: none; -} - -/* Remove list styles */ -ul, ol { - list-style: none; -} - -/* Images and media */ -img, video, iframe { - max-width: 100%; - height: auto; - display: block; -} - -/* Form elements */ -input, textarea, select { - font: inherit; - border: none; - outline: none; -} - /* ========================================================================== CSS CUSTOM PROPERTIES (CSS VARIABLES) ========================================================================== */ :root { - /* Glass Effect Colors */ - --glass-bg: rgba(255, 255, 255, 0.20); - --glass-border: rgba(255, 255, 255, 0.20); - --glass-backdrop: blur(10px); - - /* Colors */ - //--color-primary: #3498db; - //--color-primary-dark: #2980b9; - --color-text-white: #fffafa; - --color-border-error: rgba(255,103,0,0.7); - --color-text-error: rgba(255,103,0,0.7); - --color-bg-error: rgba(255,103,1, 0.5); - --color-error-box-shadow: rgba(255,103,1, 0.2); - - /* Typography */ - --font-size-xs: 0.89rem; /* 16px - minimum readable */ - --font-size-sm: 0.94rem; /* 17px - comfortable minimum */ - --font-size-base: 0.9rem; /* 18px - ideal body text */ - --font-size-lg: 1.22rem; /* 22px - subheadings */ - --font-size-xl: 1.33rem; /* 24px - small headings */ - --font-size-2xl: 1.67rem; /* 30px - medium headings */ - --font-size-3xl: 2.11rem; /* 38px - large headings */ - - --font-weight-light: 300; /* Use sparingly, only for large text */ - --font-weight-normal: 400; /* Body text minimum */ - --font-weight-medium: 500; /* Subtle emphasis, navigation */ - --font-weight-semibold: 600; /* Subheadings, buttons */ - --font-weight-bold: 700; /* Main headings */ - --font-weight-extrabold: 800; /* Hero text, major CTAs */ - - --line-height-tight: 1.25; /* Headings, UI elements */ - --line-height-normal: 1.5; /* Body text, comfortable reading */ - --line-height-relaxed: 1.6; /* Long-form content */ - --line-height-loose: 1.75; /* Accessibility, dense content */ - - /* Spacing */ - --space-xs: 0.28rem; - --space-sm: 0.56rem; - --space-md: 1rem; - --space-lg: 1.44rem; - --space-xl: 2rem; - --space-2xl: 3rem; - - /* Layout - Responsive containers */ - --container-sm: 90vw; - --container-md: 80vw; - --container-lg: 70vw; - --container-xl: 60vw; - - /* Input dimensions */ - --input-width: min(80vw, 500px); - --input-gap: 2vw; - --input-width-half: min(calc((var(--input-width) - var(--input-gap)) / 2), 250px); - --input-width-third: min(calc((var(--input-width) - (var(--input-gap) * 2)) / 3), 160px); - --input-height: 45px; - - /* Breakpoints (for reference) */ - --breakpoint-sm: 640px; - --breakpoint-md: 768px; - --breakpoint-lg: 1024px; - --breakpoint-xl: 1280px; - - /* Borders & Radius */ - --border-radius-sm: 8px; - --border-radius-md: 9px; - --border-radius-lg: 20px; - - /* Shadows */ - --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.07); - --shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1); - - /* Transitions */ - --transition-fast: 0.15s ease; - --transition-normal: 0.3s ease; - - /* Z-index scale */ - --z-modal: 1050; - --z-fixed: 1080; -} - -/* ========================================================================== - UTILITY CLASSES - ========================================================================== */ - -/* Screen reader only */ -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - white-space: nowrap; - border: 0; -} - -/* Container classes - responsive */ -.container { - width: 100%; - padding: 0 var(--space-md); - margin: 0 auto; - max-width: var(--container-sm); -} - -/* Flexbox utilities */ -.flex { - display: flex; -} - -.flex-col { - flex-direction: column; -} - -.items-center { - align-items: center; -} - -.justify-center { - justify-content: center; -} - -.justify-between { - justify-content: space-between; -} - -.justify-around { - justify-content: space-around; -} - -/* Text utilities */ -.text-center { - text-align: center; + /* Glass Effect Colors */ + --glass-bg: rgba(255, 255, 255, 0.20); + --glass-border: rgba(255, 255, 255, 0.20); + --glass-backdrop: blur(10px); + + /* Colors */ + --color-text-white: #fffafa; + --color-border-error: rgba(255,103,0,0.7); + --color-text-error: rgba(255,103,0,0.7); + --color-bg-error: rgba(255,103,1, 0.5); + --color-error-box-shadow: rgba(255,103,1, 0.2); + + /* Typography */ + --font-size-xs: 0.89rem; + --font-size-sm: 0.94rem; + --font-size-base: 0.9rem; + --font-size-lg: 1.22rem; + --font-size-xl: 1.33rem; + --font-size-2xl: 1.67rem; + --font-size-3xl: 2.11rem; + + --font-weight-light: 300; + --font-weight-normal: 400; + --font-weight-medium: 500; + --font-weight-semibold: 600; + --font-weight-bold: 700; + --font-weight-extrabold: 800; + + --line-height-tight: 1.25; + --line-height-normal: 1.5; + --line-height-relaxed: 1.6; + --line-height-loose: 1.75; + + /* Spacing */ + --space-xs: 0.28rem; + --space-sm: 0.56rem; + --space-md: 1rem; + --space-lg: 1.44rem; + --space-xl: 2rem; + --space-2xl: 3rem; + + /* Layout - Responsive containers */ + --container-sm: 90vw; + --container-md: 80vw; + --container-lg: 70vw; + --container-xl: 60vw; + + /* Input dimensions */ + --input-width: min(80vw, 500px); + --input-gap: 2vw; + --input-width-half: min(calc((var(--input-width) - var(--input-gap)) / 2), 250px); + --input-width-third: min(calc((var(--input-width) - (var(--input-gap) * 2)) / 3), 160px); + --input-height: 45px; + + /* Breakpoints (for reference) */ + --breakpoint-sm: 640px; + --breakpoint-md: 768px; + --breakpoint-lg: 1024px; + --breakpoint-xl: 1280px; + + /* Borders & Radius */ + --border-radius-sm: 8px; + --border-radius-md: 9px; + --border-radius-lg: 20px; + + /* Shadows */ + --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.07); + --shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1); + + /* Transitions */ + --transition-fast: 0.15s ease; + --transition-normal: 0.3s ease; + + /* Z-index scale */ + --z-modal: 1050; + --z-fixed: 1080; } /* ========================================================================== - MOBILE BASE STYLES (320px and up) + PAGE LAYOUT (Signup/Login specific) ========================================================================== */ -/* Typography */ -h1, h2, h3, h4, h5, h6 { - line-height: var(--line-height-tight); - margin-bottom: var(--space-md); -} - -h1, h2 { font-weight: var(--font-weight-bold); } /* 700 for major headings */ -h3, h4 { font-weight: var(--font-weight-semibold); } /* 600 for minor headings */ -h5, h6 { font-weight: var(--font-weight-medium); } /* 500 for smallest headings */ - -h1 { font-size: var(--font-size-2xl); } -h2 { font-size: var(--font-size-xl); } -h3 { font-size: var(--font-size-lg); } -h4 { font-size: var(--font-size-base); } -h5 { font-size: var(--font-size-sm); } -h6 { font-size: var(--font-size-sm); } - body { - font-size: var(--font-size-base); /* 18px */ - line-height: var(--line-height-normal); /* 1.5 */ -} - -p { - margin-bottom: var(--space-md); - line-height: var(--line-height-normal); -} - -/* Links */ -a { - color: var(--color-primary); - transition: color var(--transition-fast); -} - -a:hover, -a:focus { - color: var(--color-primary-dark); + display: grid; + place-items: center; + backdrop-filter: blur(4px); + overflow: hidden; } /* ========================================================================== @@ -257,28 +97,31 @@ a:focus { ========================================================================== */ .glass-card { - @extend .flex, .flex-col, .items-center; - border-radius: var(--border-radius-lg); - background-color: var(--glass-bg); - backdrop-filter: var(--glass-backdrop); - border: solid 1px var(--glass-border); - padding: var(--space-lg); - box-shadow: var(--shadow-lg); - width: 100%; + display: flex; + flex-direction: column; + align-items: center; + border-radius: var(--border-radius-lg); + background-color: var(--glass-bg); + backdrop-filter: var(--glass-backdrop); + border: solid 1px var(--glass-border); + padding: var(--space-lg); + box-shadow: var(--shadow-lg); + width: 100%; } .card-row { - width: 100%; - margin-bottom: var(--space-md); + width: 100%; + margin-bottom: var(--space-md); } .card-multi-fields-row { - @extend .card-row, .flex, .justify-between; - justify-content: space-between !important; + width: 100%; + margin-bottom: var(--space-md); + display: flex; + justify-content: space-between; } .glass-dropdown option { - //background-color: #999999; color: #333; } @@ -286,9 +129,8 @@ a:focus { FORM SYSTEM ========================================================================== */ -/* Hide labels */ label { - display: none; + display: none; } h1 { @@ -297,21 +139,21 @@ h1 { /* Shared glassmorphism input styling */ .glass-input { - background-color: var(--glass-bg); - border: solid 1px var(--glass-border); - border-radius: var(--border-radius-md); - height: var(--input-height); - padding: 0 18px; - transition: all var(--transition-fast); - width: var(--input-width); - color: var(--color-text-white); - margin-bottom: var(--space-xs); + background-color: var(--glass-bg); + border: solid 1px var(--glass-border); + border-radius: var(--border-radius-md); + height: var(--input-height); + padding: 0 18px; + transition: all var(--transition-fast); + width: var(--input-width); + color: var(--color-text-white); + margin-bottom: var(--space-xs); } .glass-wrong-input { - border: solid 1px var(--color-border-error) !important; - background-color: var(--color-bg-error) !important; - box-shadow: 0 0 0 5px var(--color-error-box-shadow) !important; + border: solid 1px var(--color-border-error); + background-color: var(--color-bg-error); + box-shadow: 0 0 0 5px var(--color-error-box-shadow); } .error-messages { @@ -322,17 +164,17 @@ h1 { } .error-messages-half { - width: var(--input-width-half) !important; + width: var(--input-width-half); } .glass-input:focus { - background-color: rgba(255, 255, 255, 0.3); - border-color: rgba(255, 255, 255, 0.5); - box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.1); + background-color: rgba(255, 255, 255, 0.3); + border-color: rgba(255, 255, 255, 0.5); + box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.1); } .glass-input::placeholder { - color: rgba(255, 255, 255, 0.7); + color: rgba(255, 255, 255, 0.7); } /* Half-width inputs */ @@ -342,88 +184,50 @@ h1 { /* Dropdown styling */ .glass-dropdown { - @extend .glass-input; - transition: all var(--transition-fast); - width: var(--input-width-third); - appearance: none; - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3e%3c/svg%3e"); - background-position: right 12px center; - background-repeat: no-repeat; - background-size: 16px; - color: var(--color-text-white); - cursor: pointer; + background-color: var(--glass-bg); + border: solid 1px var(--glass-border); + border-radius: var(--border-radius-md); + height: var(--input-height); + padding: 0 18px; + transition: all var(--transition-fast); + color: var(--color-text-white); + margin-bottom: var(--space-xs); + width: var(--input-width-third); + appearance: none; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3e%3c/svg%3e"); + background-position: right 12px center; + background-repeat: no-repeat; + background-size: 16px; + cursor: pointer; } -.glass-button:hover, .glass-dropdown:focus { background-color: rgba(255, 255, 255, 0.3); border-color: rgba(255, 255, 255, 0.5); box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.1); } - /* Submit button styling */ .glass-button { - @extend .glass-input; - transition: all var(--transition-fast); - font-weight: var(--font-weight-semibold); - margin-bottom: var(--space-md); + background-color: var(--glass-bg); + border: solid 1px var(--glass-border); + border-radius: var(--border-radius-md); + height: var(--input-height); + padding: 0 18px; + transition: all var(--transition-fast); + width: var(--input-width); + color: var(--color-text-white); + margin-bottom: var(--space-md); + font-weight: var(--font-weight-semibold); } .glass-button:hover, .glass-button:focus { - background-color: rgba(255, 255, 255, 0.3); - transform: translateY(-1px); - box-shadow: var(--shadow-md); + background-color: rgba(255, 255, 255, 0.3); + transform: translateY(-1px); + box-shadow: var(--shadow-md); } .glass-button:active { - transform: translateY(0); -} - -/* ========================================================================== - GRID SYSTEM - Mobile First - ========================================================================== */ - -.grid { - display: grid; - gap: var(--space-md); - grid-template-columns: 1fr; -} - -/* ========================================================================== - RESPONSIVE BREAKPOINTS - ========================================================================== */ - -/* TABLET (768px and up) */ -@media (min-width: 768px) { - .container { - max-width: var(--container-md); - } - - .grid { - grid-template-columns: repeat(2, 1fr); - } -} - -/* DESKTOP (1024px and up) */ -@media (min-width: 1024px) { - .container { - max-width: var(--container-lg); - } - - .grid { - grid-template-columns: repeat(3, 1fr); - } -} - -/* LARGE DESKTOP (1280px and up) */ -@media (min-width: 1280px) { - .container { - max-width: var(--container-xl); - } - - .grid { - grid-template-columns: repeat(4, 1fr); - } + transform: translateY(0); } \ No newline at end of file From 206ab69765ee7daea033503211bd1e2b3811cc04 Mon Sep 17 00:00:00 2001 From: IlP4rAd0xlI Date: Fri, 3 Oct 2025 09:32:32 +0200 Subject: [PATCH 41/77] signup-frontend Add : AppRoutes / emotion Remove : sass --- React/src/AppRoutes.tsx | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 React/src/AppRoutes.tsx diff --git a/React/src/AppRoutes.tsx b/React/src/AppRoutes.tsx new file mode 100644 index 0000000..27ec32a --- /dev/null +++ b/React/src/AppRoutes.tsx @@ -0,0 +1,40 @@ +import { Routes, Route } from 'react-router-dom' +import HomeView from './pages/HomeView.tsx' +// import NotFoundView from './pages/NotFoundView.tsx' +import SignupView from './pages/SignupView.tsx' +import LoginView from './pages/LoginView.tsx' + +export const AppRoutes = () => { + const initRoutes = () => [ + { + index: true, + element: , + path: '', + key: 'home' + }, + { + element: , + path: '*', + key: 'home' + }, + { + element: , + path: '/signup', + key: 'signup' + }, + { + element: , + path: '/login', + key: 'login' + } + ] + return ( + + {initRoutes().map(({ ...routeConfig }) => ( + + ))} + + ) +} + +export default AppRoutes \ No newline at end of file From 30e547199cf594284a08f8edc26643a39dc1cd05 Mon Sep 17 00:00:00 2001 From: IlP4rAd0xlI Date: Fri, 3 Oct 2025 12:46:12 +0200 Subject: [PATCH 42/77] signup-frontend Convert styles to emotion (in progress) --- React/package.json | 1 + .../components/forms/signup/EmailField.tsx | 97 ++++++++++----- .../components/forms/signup/SignupCard.tsx | 52 ++++++-- .../components/forms/signup/SignupForm.tsx | 75 ++++++++---- .../src/components/forms/signup/Username.tsx | 111 ++++++++++++------ React/src/emotion.d.ts | 7 ++ React/src/pages/SignupView.tsx | 2 +- React/src/styles/globalStyle.tsx | 107 +++++++++-------- React/src/styles/{signup.scss => signup.css} | 9 +- React/src/styles/theme.tsx | 76 ++++++++++++ 10 files changed, 392 insertions(+), 145 deletions(-) create mode 100644 React/src/emotion.d.ts rename React/src/styles/{signup.scss => signup.css} (97%) create mode 100644 React/src/styles/theme.tsx diff --git a/React/package.json b/React/package.json index d96ceea..82bd3fd 100644 --- a/React/package.json +++ b/React/package.json @@ -11,6 +11,7 @@ }, "dependencies": { "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.1", "react": "^19.1.1", "react-dom": "^19.1.1", "react-router-dom": "^7.8.2" diff --git a/React/src/components/forms/signup/EmailField.tsx b/React/src/components/forms/signup/EmailField.tsx index 42a313d..6520fe3 100644 --- a/React/src/components/forms/signup/EmailField.tsx +++ b/React/src/components/forms/signup/EmailField.tsx @@ -1,59 +1,100 @@ -import {useState} from "react"; +import { useState } from "react" +import styled from '@emotion/styled' -const edugeEmailRegex = /^[a-zA-Z]+\.[a-zA-Z]+@eduge\.ch$/; +const edugeEmailRegex = /^[a-zA-Z]+\.[a-zA-Z]+@eduge\.ch$/ + +const FieldWrapper = styled.div` + width: 100%; + margin-bottom: ${({ theme }) => theme.spacing.md}; +` + +const StyledInput = styled.input<{ hasError: boolean }>` + background-color: ${({ theme, hasError }) => + hasError ? theme.colors.bgError : theme.glass.bg}; + border: solid 1px ${({ theme, hasError }) => + hasError ? theme.colors.borderError : theme.glass.border}; + border-radius: ${({ theme }) => theme.borderRadius.md}; + height: ${({ theme }) => theme.input.height}; + padding: 0 18px; + transition: all ${({ theme }) => theme.transition.fast}; + width: ${({ theme }) => theme.input.width}; + color: ${({ theme }) => theme.colors.textWhite}; + margin-bottom: ${({ theme }) => theme.spacing.xs}; + box-shadow: ${({ hasError, theme }) => + hasError ? `0 0 0 5px ${theme.colors.errorBoxShadow}` : 'none'}; + + &::placeholder { + color: ${({ theme }) => theme.colors.textPlaceholder}; + } + + &:focus { + background-color: ${({ theme }) => theme.glass.bgHover}; + border-color: ${({ theme }) => theme.glass.borderHover}; + box-shadow: ${({ theme }) => theme.glass.focusShadow}; + } +` + +const ErrorContainer = styled.span` + display: block; +` + +const ErrorMessage = styled.div` + color: ${({ theme }) => theme.colors.textError}; + font-weight: ${({ theme }) => theme.fontWeight.semibold}; + width: ${({ theme }) => theme.input.width}; + padding-left: 5px; +` interface EmailFieldProps { - value: string; - onChange: (value: string) => void; + value: string + onChange: (value: string) => void } -export default function EmailField({ value, onChange }: EmailFieldProps) -{ - const [errors, setErrors] = useState([]); +export default function EmailField({ value, onChange }: EmailFieldProps) { + const [errors, setErrors] = useState([]) const handleBlur = () => { - const trimmedValue = value.trim(); - const newErrors: string[] = []; + const trimmedValue = value.trim() + const newErrors: string[] = [] - // Check if empty first if (trimmedValue === "") { - newErrors.push("Required"); - setErrors(newErrors); - return; + newErrors.push("Required") + setErrors(newErrors) + return } if (!edugeEmailRegex.test(trimmedValue)) { - newErrors.push("Please enter a valid eduge email"); + newErrors.push("Please enter a valid eduge email") } - setErrors(newErrors); - }; + setErrors(newErrors) + } const handleChange = (e: React.ChangeEvent) => { - const valueNoSpaces = e.target.value.replace(/\s/g, ''); - onChange(valueNoSpaces); - setErrors([]); - }; + const valueNoSpaces = e.target.value.replace(/\s/g, '') + onChange(valueNoSpaces) + setErrors([]) + } return ( -
+ - 0 ? "glass-wrong-input" : ""}`} + hasError={errors.length > 0} /> {errors.length > 0 && ( - + {errors.map((err, i) => ( -
{err}
+ {err} ))} -
+ )} -
- ); + + ) } \ No newline at end of file diff --git a/React/src/components/forms/signup/SignupCard.tsx b/React/src/components/forms/signup/SignupCard.tsx index 37f90fd..2fb8ce9 100644 --- a/React/src/components/forms/signup/SignupCard.tsx +++ b/React/src/components/forms/signup/SignupCard.tsx @@ -1,15 +1,47 @@ import { Link } from 'react-router-dom' -import SignupForm from './SignupForm'; +import styled from '@emotion/styled' +import SignupForm from './SignupForm' -export default function SignupCard(){ +const Card = styled.div` + display: flex; + flex-direction: column; + align-items: center; + border-radius: ${({ theme }) => theme.borderRadius.lg}; + background-color: ${({ theme }) => theme.glass.bg}; + backdrop-filter: ${({ theme }) => theme.glass.backdrop}; + border: solid 1px ${({ theme }) => theme.glass.border}; + padding: ${({ theme }) => theme.spacing.lg}; + box-shadow: ${({ theme }) => theme.shadow.lg}; + width: 100%; +` + +const Title = styled.h1` + width: 100%; + margin-bottom: ${({ theme }) => theme.spacing.md}; +` + +const FooterText = styled.span` + color: ${({ theme }) => theme.colors.textWhite}; +` + +const StyledLink = styled(Link)` + color: ${({ theme }) => theme.colors.textWhite}; + text-decoration: none; + + b { + font-weight: ${({ theme }) => theme.fontWeight.bold}; + } +` + +export default function SignupCard() { return ( -
-

Sign Up

- - + + Sign Up + + Already have an account? - Login - -
- ); + Login + + + ) } \ No newline at end of file diff --git a/React/src/components/forms/signup/SignupForm.tsx b/React/src/components/forms/signup/SignupForm.tsx index ef2d31a..846cae0 100644 --- a/React/src/components/forms/signup/SignupForm.tsx +++ b/React/src/components/forms/signup/SignupForm.tsx @@ -1,32 +1,67 @@ -import { useState } from 'react'; +import { useState } from 'react' +import styled from '@emotion/styled' // import { useForm } from 'react-hook-form' -import Username from "./Username.tsx"; -import EmailField from "./EmailField.tsx"; -import FirstNameField from "./FirstNameField.tsx"; -import LastNameField from "./LastNameField.tsx"; -import BirthdateField from "./BirthdateField.tsx"; -import PasswordFields from "./PasswordFields.tsx"; +import Username from "./Username.tsx" +import EmailField from "./EmailField.tsx" +import FirstNameField from "./FirstNameField.tsx" +import LastNameField from "./LastNameField.tsx" +import BirthdateField from "./BirthdateField.tsx" +import PasswordFields from "./PasswordFields.tsx" + +const StyledForm = styled.form` + width: 100%; +` + +const MultiFieldRow = styled.fieldset` + width: 100%; + margin-bottom: ${({ theme }) => theme.spacing.md}; + display: flex; + justify-content: space-between; +` + +const SubmitButton = styled.button` + background-color: ${({ theme }) => theme.glass.bg}; + border: solid 1px ${({ theme }) => theme.glass.border}; + border-radius: ${({ theme }) => theme.borderRadius.md}; + height: ${({ theme }) => theme.input.height}; + padding: 0 18px; + transition: all ${({ theme }) => theme.transition.fast}; + width: ${({ theme }) => theme.input.width}; + color: ${({ theme }) => theme.colors.textWhite}; + margin-bottom: ${({ theme }) => theme.spacing.md}; + font-weight: ${({ theme }) => theme.fontWeight.semibold}; + + &:hover, &:focus { + background-color: ${({ theme }) => theme.glass.bgHover}; + transform: translateY(-1px); + box-shadow: ${({ theme }) => theme.shadow.md}; + } + + &:active { + transform: translateY(0); + } +` export default function SignupForm() { // const form = useForm() // const { handleSubmit } = form - const [username, setUsername] = useState(''); - const [firstName, setFirstName] = useState(''); - const [lastName, setLastName] = useState(''); - const [email, setEmail] = useState(''); - const [birthdate, setBirthdate] = useState({ month: '', day: '', year: '' }); - const [password, setPassword] = useState(''); - const [confirmPassword, setConfirmPassword] = useState(''); + const [username, setUsername] = useState('') + const [firstName, setFirstName] = useState('') + const [lastName, setLastName] = useState('') + const [email, setEmail] = useState('') + const [birthdate, setBirthdate] = useState({ month: '', day: '', year: '' }) + const [password, setPassword] = useState('') + const [confirmPassword, setConfirmPassword] = useState('') return ( -
+ -
+ -
+ - - - ); + Submit +
+ ) } \ No newline at end of file diff --git a/React/src/components/forms/signup/Username.tsx b/React/src/components/forms/signup/Username.tsx index b9fc279..0eaf149 100644 --- a/React/src/components/forms/signup/Username.tsx +++ b/React/src/components/forms/signup/Username.tsx @@ -1,4 +1,5 @@ -import {useState} from "react"; +import { useState } from "react" +import styled from '@emotion/styled' const reservedWords = [ 'admin', @@ -11,62 +12,102 @@ const reservedWords = [ 'system', 'null', 'undefined' -]; +] -const specialCharsRegex = /[^a-zA-Z0-9_-]/; +const specialCharsRegex = /[^a-zA-Z0-9_-]/ + +const FieldWrapper = styled.div` + width: 100%; + margin-bottom: ${({ theme }) => theme.spacing.md}; +` + +const StyledInput = styled.input<{ hasError: boolean }>` + background-color: ${({ theme, hasError }) => + hasError ? theme.colors.bgError : theme.glass.bg}; + border: solid 1px ${({ theme, hasError }) => + hasError ? theme.colors.borderError : theme.glass.border}; + border-radius: ${({ theme }) => theme.borderRadius.md}; + height: ${({ theme }) => theme.input.height}; + padding: 0 18px; + transition: all ${({ theme }) => theme.transition.fast}; + width: ${({ theme }) => theme.input.width}; + color: ${({ theme }) => theme.colors.textWhite}; + margin-bottom: ${({ theme }) => theme.spacing.xs}; + box-shadow: ${({ hasError, theme }) => + hasError ? `0 0 0 5px ${theme.colors.errorBoxShadow}` : 'none'}; + + &::placeholder { + color: ${({ theme }) => theme.colors.textPlaceholder}; + } + + &:focus { + background-color: ${({ theme }) => theme.glass.bgHover}; + border-color: ${({ theme }) => theme.glass.borderHover}; + box-shadow: ${({ theme }) => theme.glass.focusShadow}; + } +` + +const ErrorContainer = styled.span` + display: block; +` + +const ErrorMessage = styled.div` + color: ${({ theme }) => theme.colors.textError}; + font-weight: ${({ theme }) => theme.fontWeight.semibold}; + width: ${({ theme }) => theme.input.width}; + padding-left: 5px; +` interface UsernameFieldProps { - value: string; - onChange: (value: string) => void; + value: string + onChange: (value: string) => void } -export default function Username({ value, onChange }: UsernameFieldProps) -{ - const [errors, setErrors] = useState([]); +export default function Username({ value, onChange }: UsernameFieldProps) { + const [errors, setErrors] = useState([]) const handleBlur = () => { - const trimmedValue = value.trim(); - const newErrors: string[] = []; + const trimmedValue = value.trim() + const newErrors: string[] = [] - // Check if empty first if (trimmedValue === "") { - newErrors.push("Required"); - setErrors(newErrors); - return; + newErrors.push("Required") + setErrors(newErrors) + return } if (!/[a-zA-Z]/.test(value)) { - newErrors.push("Must include a letter"); + newErrors.push("Must include a letter") } if (trimmedValue.length < 3 || trimmedValue.length > 20) { - newErrors.push("3-20 characters"); + newErrors.push("3-20 characters") } if (reservedWords.includes(trimmedValue.toLowerCase())) { - newErrors.push("Reserved by system"); + newErrors.push("Reserved by system") } if (specialCharsRegex.test(value)) { - newErrors.push("Letters, numbers, - and _ only"); + newErrors.push("Letters, numbers, - and _ only") } if (/-{2,}/.test(trimmedValue) || /_{2,}/.test(trimmedValue)) { - newErrors.push("No consecutive - or _"); + newErrors.push("No consecutive - or _") } - setErrors(newErrors); - }; + setErrors(newErrors) + } const handleChange = (e: React.ChangeEvent) => { - const valueNoSpaces = e.target.value.replace(/\s/g, ''); - onChange(valueNoSpaces); - setErrors([]); - }; + const valueNoSpaces = e.target.value.replace(/\s/g, '') + onChange(valueNoSpaces) + setErrors([]) + } return ( -
+ - 0 ? "glass-wrong-input" : ""}`} + hasError={errors.length > 0} /> {errors.length > 0 && ( - - {errors.map((err, i) => ( -
{err}
- ))} -
+ + {errors.map((err, i) => ( + {err} + ))} + )} -
- ); + + ) } \ No newline at end of file diff --git a/React/src/emotion.d.ts b/React/src/emotion.d.ts new file mode 100644 index 0000000..fd21def --- /dev/null +++ b/React/src/emotion.d.ts @@ -0,0 +1,7 @@ +import '@emotion/react' +import type { Theme as CustomTheme } from './styles/theme' + +declare module '@emotion/react' { + // eslint-disable-next-line @typescript-eslint/no-empty-object-type + export interface Theme extends CustomTheme {} +} \ No newline at end of file diff --git a/React/src/pages/SignupView.tsx b/React/src/pages/SignupView.tsx index 22be9a3..b9b659f 100644 --- a/React/src/pages/SignupView.tsx +++ b/React/src/pages/SignupView.tsx @@ -1,5 +1,5 @@ import SignupCard from '../components/forms/signup/SignupCard' -import '../styles/signup.scss' +import '../styles/signup.css' export default function SignupView() { return ( diff --git a/React/src/styles/globalStyle.tsx b/React/src/styles/globalStyle.tsx index 7c1b816..c63100a 100644 --- a/React/src/styles/globalStyle.tsx +++ b/React/src/styles/globalStyle.tsx @@ -1,50 +1,63 @@ import { css } from '@emotion/react' +import type {Theme} from './theme' -export const globalStyle = css` - /* Reset */ - *, *::before, *::after { - box-sizing: border-box; - margin: 0; - padding: 0; - } - - html { - -webkit-text-size-adjust: 100%; - } - - body { - min-height: 100dvh; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif; - color: #fffafa; - background-color: #013251; - } - - button { - background: none; - border: none; - cursor: pointer; - font: inherit; - } - - a { - color: inherit; - text-decoration: none; - } - - fieldset { border: none; } - ul, ol { list-style: none; } - - img, video, iframe { - max-width: 100%; - height: auto; - display: block; - } - - input, textarea, select { - font: inherit; - border: none; - outline: none; - } +export const globalStyles = (theme: Theme) => css` + *, *::before, *::after { + box-sizing: border-box; + margin: 0; + padding: 0; + } + + html { + -webkit-text-size-adjust: 100%; + } + + body { + min-height: 100dvh; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif; + color: ${theme.colors.textWhite}; + background-color: ${theme.colors.bgPrimary}; + font-size: ${theme.fontSize.sm}; + display: grid; + place-items: center; + backdrop-filter: blur(4px); + overflow: hidden; + } + + h1 { + text-align: center; + } + + button { + background: none; + border: none; + cursor: pointer; + font: inherit; + } + + a { + color: inherit; + text-decoration: none; + } + + fieldset { border: none; } + ul, ol { list-style: none; } + + img, video, iframe { + max-width: 100%; + height: auto; + display: block; + } + + input, textarea, select { + font: inherit; + border: none; + outline: none; + } + + label { + display: none; + } ` \ No newline at end of file diff --git a/React/src/styles/signup.scss b/React/src/styles/signup.css similarity index 97% rename from React/src/styles/signup.scss rename to React/src/styles/signup.css index 0a4d376..62e4975 100644 --- a/React/src/styles/signup.scss +++ b/React/src/styles/signup.css @@ -86,10 +86,11 @@ ========================================================================== */ body { - display: grid; - place-items: center; - backdrop-filter: blur(4px); - overflow: hidden; + display: grid; + place-items: center; + backdrop-filter: blur(4px); + overflow: hidden; +font-size: var(--font-size-sm); } /* ========================================================================== diff --git a/React/src/styles/theme.tsx b/React/src/styles/theme.tsx new file mode 100644 index 0000000..ffbdd80 --- /dev/null +++ b/React/src/styles/theme.tsx @@ -0,0 +1,76 @@ +export const theme = { + glass: { + bg: 'rgba(255, 255, 255, 0.20)', + bgHover: 'rgba(255, 255, 255, 0.3)', + border: 'rgba(255, 255, 255, 0.20)', + borderHover: 'rgba(255, 255, 255, 0.5)', + backdrop: 'blur(10px)', + focusShadow: '0 0 0 3px rgba(255, 255, 255, 0.1)', + }, + colors: { + textWhite: '#fffafa', + textPlaceholder: 'rgba(255, 255, 255, 0.7)', + bgPrimary: '#013251', + borderError: 'rgba(255,103,0,0.7)', + textError: 'rgba(255,103,0,0.7)', + bgError: 'rgba(255,103,1, 0.5)', + errorBoxShadow: 'rgba(255,103,1, 0.2)', + }, + fontSize: { + xs: '0.89rem', + sm: '0.94rem', + base: '0.9rem', + lg: '1.22rem', + xl: '1.33rem', + '2xl': '1.67rem', + '3xl': '2.11rem', + }, + fontWeight: { + light: 300, + normal: 400, + medium: 500, + semibold: 600, + bold: 700, + extrabold: 800, + }, + lineHeight: { + tight: 1.25, + normal: 1.5, + relaxed: 1.6, + loose: 1.75, + }, + spacing: { + xs: '0.28rem', + sm: '0.56rem', + md: '1rem', + lg: '1.44rem', + xl: '2rem', + '2xl': '3rem', + }, + input: { + width: 'min(80vw, 500px)', + gap: '2vw', + widthHalf: 'min(calc((min(80vw, 500px) - 2vw) / 2), 250px)', + widthThird: 'min(calc((min(80vw, 500px) - (2vw * 2)) / 3), 160px)', + height: '45px', + }, + borderRadius: { + sm: '8px', + md: '9px', + lg: '20px', + }, + shadow: { + md: '0 4px 6px rgba(0, 0, 0, 0.07)', + lg: '0 10px 15px rgba(0, 0, 0, 0.1)', + }, + transition: { + fast: '0.15s ease', + normal: '0.3s ease', + }, + zIndex: { + modal: 1050, + fixed: 1080, + }, +} + +export type Theme = typeof theme \ No newline at end of file From 20fd035c228244394c1786141e17cfd9d970b0b7 Mon Sep 17 00:00:00 2001 From: IlP4rAd0xlI Date: Fri, 3 Oct 2025 18:33:09 +0200 Subject: [PATCH 43/77] feature/signup Convert all to emotion style --- React/src/App.tsx | 9 +- React/src/AppRoutes.tsx | 7 +- .../forms/signup/BirthdateField.tsx | 228 +++++++++-------- .../components/forms/signup/EmailField.tsx | 4 +- .../forms/signup/FirstNameField.tsx | 114 ++++++--- .../components/forms/signup/LastNameField.tsx | 106 +++++--- .../forms/signup/PasswordFields.tsx | 230 ++++++++++-------- React/src/styles/globalStyle.tsx | 2 +- 8 files changed, 421 insertions(+), 279 deletions(-) diff --git a/React/src/App.tsx b/React/src/App.tsx index eef1987..0c1db8b 100644 --- a/React/src/App.tsx +++ b/React/src/App.tsx @@ -1,12 +1,15 @@ -import { Global } from '@emotion/react' +import { ThemeProvider, Global } from '@emotion/react' +import { theme } from './styles/theme' import { globalStyle } from './styles/globalStyle' import AppRoutes from './AppRoutes' function App() { return ( <> - - + + + + ) } diff --git a/React/src/AppRoutes.tsx b/React/src/AppRoutes.tsx index 27ec32a..2d64536 100644 --- a/React/src/AppRoutes.tsx +++ b/React/src/AppRoutes.tsx @@ -1,6 +1,5 @@ import { Routes, Route } from 'react-router-dom' import HomeView from './pages/HomeView.tsx' -// import NotFoundView from './pages/NotFoundView.tsx' import SignupView from './pages/SignupView.tsx' import LoginView from './pages/LoginView.tsx' @@ -15,7 +14,7 @@ export const AppRoutes = () => { { element: , path: '*', - key: 'home' + key: 'notfound' }, { element: , @@ -30,8 +29,8 @@ export const AppRoutes = () => { ] return ( - {initRoutes().map(({ ...routeConfig }) => ( - + {initRoutes().map(({ key, ...routeConfig }) => ( + ))} ) diff --git a/React/src/components/forms/signup/BirthdateField.tsx b/React/src/components/forms/signup/BirthdateField.tsx index 48cf265..2572337 100644 --- a/React/src/components/forms/signup/BirthdateField.tsx +++ b/React/src/components/forms/signup/BirthdateField.tsx @@ -1,7 +1,44 @@ +import styled from '@emotion/styled' + +const FieldRow = styled.div` + width: 100%; + margin-bottom: ${({ theme }) => theme.spacing.md}; + display: flex; + justify-content: space-between; +` + +const StyledSelect = styled.select` + background-color: ${({ theme }) => theme.glass.bg}; + border: solid 1px ${({ theme }) => theme.glass.border}; + border-radius: ${({ theme }) => theme.borderRadius.md}; + height: ${({ theme }) => theme.input.height}; + padding: 0 18px; + transition: all ${({ theme }) => theme.transition.fast}; + color: ${({ theme }) => theme.colors.textWhite}; + margin-bottom: ${({ theme }) => theme.spacing.xs}; + width: ${({ theme }) => theme.input.widthThird}; + appearance: none; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3e%3c/svg%3e"); + background-position: right 12px center; + background-repeat: no-repeat; + background-size: 16px; + cursor: pointer; + + option { + color: #333; + } + + &:focus { + background-color: ${({ theme }) => theme.glass.bgHover}; + border-color: ${({ theme }) => theme.glass.borderHover}; + box-shadow: ${({ theme }) => theme.glass.focusShadow}; + } +` + interface BirthdateFieldProps { - value: { month: string; day: string; year: string }; - onChange: (value: { month: string; day: string; year: string }) => void; - label?: string; + value: { month: string; day: string; year: string } + onChange: (value: { month: string; day: string; year: string }) => void + label?: string } const months = [ @@ -17,157 +54,146 @@ const months = [ { value: '10', label: 'Oct' }, { value: '11', label: 'Nov' }, { value: '12', label: 'Dec' } -]; +] const getDaysInMonth = (month: number, year: number): number => { if (month === 2) { - return (year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0)) ? 29 : 28; + return (year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0)) ? 29 : 28 } - return [4, 6, 9, 11].includes(month) ? 30 : 31; -}; + return [4, 6, 9, 11].includes(month) ? 30 : 31 +} const generateYears = (): number[] => { - const currentYear = new Date().getFullYear(); - const years: number[] = []; + const currentYear = new Date().getFullYear() + const years: number[] = [] for (let year = currentYear - 100; year <= currentYear - 13; year++) { - years.push(year); + years.push(year) } - return years.reverse(); -}; + return years.reverse() +} export default function BirthdateField({ value, onChange, label = "Date of Birth" }: BirthdateFieldProps) { const handleBlur = () => { - const { month, day, year } = value; + const { month, day, year } = value - // Check if all fields are filled if (!month || !day || !year) { - console.log("All date fields are required"); - return; + console.log("All date fields are required") + return } - const errors: string[] = []; - const monthNum = parseInt(month); - const dayNum = parseInt(day); - const yearNum = parseInt(year); + const errors: string[] = [] + const monthNum = parseInt(month) + const dayNum = parseInt(day) + const yearNum = parseInt(year) - // Validate date logic if (dayNum > getDaysInMonth(monthNum, yearNum)) { - errors.push("Invalid day for the selected month and year"); + errors.push("Invalid day for the selected month and year") } - // Age validation (must be 14+ years old) - const birthDate = new Date(yearNum, monthNum - 1, dayNum); - const today = new Date(); + const birthDate = new Date(yearNum, monthNum - 1, dayNum) + const today = new Date() const age = today.getFullYear() - birthDate.getFullYear() - - (today < new Date(today.getFullYear(), birthDate.getMonth(), birthDate.getDate()) ? 1 : 0); + (today < new Date(today.getFullYear(), birthDate.getMonth(), birthDate.getDate()) ? 1 : 0) if (age < 14) { - errors.push("You must be at least 14 years old to register"); + errors.push("You must be at least 14 years old to register") } - // Future date validation if (birthDate > today) { - errors.push("Birth date cannot be in the future"); + errors.push("Birth date cannot be in the future") } - // Log results if (errors.length === 0) { - console.log("Date is valid"); + console.log("Date is valid") } else { - errors.forEach(error => console.log(error)); + errors.forEach(error => console.log(error)) } - }; + } const handleMonthChange = (e: React.ChangeEvent) => { - const newMonth = e.target.value; - let newDay = value.day; + const newMonth = e.target.value + let newDay = value.day - // Adjust day if current day is invalid for new month if (value.year && newDay) { - const maxDays = getDaysInMonth(parseInt(newMonth), parseInt(value.year)); + const maxDays = getDaysInMonth(parseInt(newMonth), parseInt(value.year)) if (parseInt(newDay) > maxDays) { - newDay = maxDays.toString(); + newDay = maxDays.toString() } } - onChange({ ...value, month: newMonth, day: newDay }); - console.clear(); - }; + onChange({ ...value, month: newMonth, day: newDay }) + console.clear() + } const handleDayChange = (e: React.ChangeEvent) => { - onChange({ ...value, day: e.target.value }); - console.clear(); - }; + onChange({ ...value, day: e.target.value }) + console.clear() + } const handleYearChange = (e: React.ChangeEvent) => { - const newYear = e.target.value; - let newDay = value.day; + const newYear = e.target.value + let newDay = value.day - // Adjust day if current day is invalid for new year (leap year logic) if (value.month && newDay) { - const maxDays = getDaysInMonth(parseInt(value.month), parseInt(newYear)); + const maxDays = getDaysInMonth(parseInt(value.month), parseInt(newYear)) if (parseInt(newDay) > maxDays) { - newDay = maxDays.toString(); + newDay = maxDays.toString() } } - onChange({ ...value, year: newYear, day: newDay }); - console.clear(); - }; + onChange({ ...value, year: newYear, day: newDay }) + console.clear() + } - // Generate days based on selected month/year const getDayOptions = () => { if (!value.month || !value.year) { - return Array.from({ length: 31 }, (_, i) => i + 1); + return Array.from({ length: 31 }, (_, i) => i + 1) } - const maxDays = getDaysInMonth(parseInt(value.month), parseInt(value.year)); - return Array.from({ length: maxDays }, (_, i) => i + 1); - }; + const maxDays = getDaysInMonth(parseInt(value.month), parseInt(value.year)) + return Array.from({ length: maxDays }, (_, i) => i + 1) + } return ( -
+ - - - - - -
- ); + + + {months.map(month => ( + + ))} + + + + + {getDayOptions().map(day => ( + + ))} + + + + + {generateYears().map(year => ( + + ))} + + + ) } \ No newline at end of file diff --git a/React/src/components/forms/signup/EmailField.tsx b/React/src/components/forms/signup/EmailField.tsx index 6520fe3..10d3dc2 100644 --- a/React/src/components/forms/signup/EmailField.tsx +++ b/React/src/components/forms/signup/EmailField.tsx @@ -5,7 +5,9 @@ const edugeEmailRegex = /^[a-zA-Z]+\.[a-zA-Z]+@eduge\.ch$/ const FieldWrapper = styled.div` width: 100%; - margin-bottom: ${({ theme }) => theme.spacing.md}; + margin-bottom: ${({ theme }) => { + return theme.spacing.md; + }}; ` const StyledInput = styled.input<{ hasError: boolean }>` diff --git a/React/src/components/forms/signup/FirstNameField.tsx b/React/src/components/forms/signup/FirstNameField.tsx index daf5417..6ab14fe 100644 --- a/React/src/components/forms/signup/FirstNameField.tsx +++ b/React/src/components/forms/signup/FirstNameField.tsx @@ -1,63 +1,103 @@ -import {useState} from "react"; +import { useState } from "react" +import styled from '@emotion/styled' + +const FieldWrapper = styled.div` + display: flex; + flex-direction: column; +` + +const StyledInput = styled.input<{ hasError: boolean }>` + background-color: ${({ theme, hasError }) => + hasError ? theme.colors.bgError : theme.glass.bg}; + border: solid 1px ${({ theme, hasError }) => + hasError ? theme.colors.borderError : theme.glass.border}; + border-radius: ${({ theme }) => theme.borderRadius.md}; + height: ${({ theme }) => theme.input.height}; + padding: 0 18px; + transition: all ${({ theme }) => theme.transition.fast}; + width: ${({ theme }) => theme.input.widthHalf}; + color: ${({ theme }) => theme.colors.textWhite}; + margin-bottom: ${({ theme }) => theme.spacing.xs}; + box-shadow: ${({ hasError, theme }) => + hasError ? `0 0 0 5px ${theme.colors.errorBoxShadow}` : 'none'}; + + &::placeholder { + color: ${({ theme }) => theme.colors.textPlaceholder}; + } + + &:focus { + background-color: ${({ theme }) => theme.glass.bgHover}; + border-color: ${({ theme }) => theme.glass.borderHover}; + box-shadow: ${({ theme }) => theme.glass.focusShadow}; + } +` + +const ErrorContainer = styled.span` + display: block; +` + +const ErrorMessage = styled.div` + color: ${({ theme }) => theme.colors.textError}; + font-weight: ${({ theme }) => theme.fontWeight.semibold}; + width: ${({ theme }) => theme.input.widthHalf}; + padding-left: 5px; +` interface FirstNameFieldProps { - value: string; - onChange: (value: string) => void; + value: string + onChange: (value: string) => void } -export default function FirstNameField({ value, onChange }: FirstNameFieldProps) -{ - const [errors, setErrors] = useState([]); +export default function FirstNameField({ value, onChange }: FirstNameFieldProps) { + const [errors, setErrors] = useState([]) const handleBlur = () => { - const trimmedValue = value.trim(); - const newErrors: string[] = []; + const trimmedValue = value.trim() + const newErrors: string[] = [] - // Check if empty first if (trimmedValue === "") { - newErrors.push("Required"); - setErrors(newErrors); - return; + newErrors.push("Required") + setErrors(newErrors) + return } if (trimmedValue.length < 2 || trimmedValue.length > 50) { - newErrors.push("2-50 characters"); + newErrors.push("2-50 characters") } - setErrors(newErrors); - }; + setErrors(newErrors) + } const capitalizeFirstLetter = (str: string): string => { - if (str.length === 0) return str; - return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase(); - }; - - const handleChange = (e: React.ChangeEvent) => - { - const valueOnlyLetters = e.target.value.replace(/[^a-zA-ZÀ-ÿ\u0100-\u017F\u0180-\u024F'-]/g, ''); - const capitalizedValue = capitalizeFirstLetter(valueOnlyLetters); - onChange(capitalizedValue); - setErrors([]); - }; + if (str.length === 0) return str + return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase() + } + + const handleChange = (e: React.ChangeEvent) => { + const valueOnlyLetters = e.target.value.replace(/[^a-zA-ZÀ-ÿ\u0100-\u017F\u0180-\u024F'-]/g, '') + const capitalizedValue = capitalizeFirstLetter(valueOnlyLetters) + onChange(capitalizedValue) + setErrors([]) + } return ( -
+ - 0 ? "glass-wrong-input" : ""}`} + placeholder="First Name" + hasError={errors.length > 0} /> {errors.length > 0 && ( - - {errors.map((err, i) => ( -
{err}
- ))} -
+ + {errors.map((err, i) => ( + {err} + ))} + )} -
- ); + + ) } \ No newline at end of file diff --git a/React/src/components/forms/signup/LastNameField.tsx b/React/src/components/forms/signup/LastNameField.tsx index f98d348..7031f55 100644 --- a/React/src/components/forms/signup/LastNameField.tsx +++ b/React/src/components/forms/signup/LastNameField.tsx @@ -1,58 +1,98 @@ -import {useState} from "react"; +import { useState } from "react" +import styled from '@emotion/styled' + +const FieldWrapper = styled.div` + display: flex; + flex-direction: column; +` + +const StyledInput = styled.input<{ hasError: boolean }>` + background-color: ${({ theme, hasError }) => + hasError ? theme.colors.bgError : theme.glass.bg}; + border: solid 1px ${({ theme, hasError }) => + hasError ? theme.colors.borderError : theme.glass.border}; + border-radius: ${({ theme }) => theme.borderRadius.md}; + height: ${({ theme }) => theme.input.height}; + padding: 0 18px; + transition: all ${({ theme }) => theme.transition.fast}; + width: ${({ theme }) => theme.input.widthHalf}; + color: ${({ theme }) => theme.colors.textWhite}; + margin-bottom: ${({ theme }) => theme.spacing.xs}; + box-shadow: ${({ hasError, theme }) => + hasError ? `0 0 0 5px ${theme.colors.errorBoxShadow}` : 'none'}; + + &::placeholder { + color: ${({ theme }) => theme.colors.textPlaceholder}; + } + + &:focus { + background-color: ${({ theme }) => theme.glass.bgHover}; + border-color: ${({ theme }) => theme.glass.borderHover}; + box-shadow: ${({ theme }) => theme.glass.focusShadow}; + } +` + +const ErrorContainer = styled.span` + display: block; +` + +const ErrorMessage = styled.div` + color: ${({ theme }) => theme.colors.textError}; + font-weight: ${({ theme }) => theme.fontWeight.semibold}; + width: ${({ theme }) => theme.input.widthHalf}; + padding-left: 5px; +` interface LastNameFieldProps { - value: string; - onChange: (value: string) => void; + value: string + onChange: (value: string) => void } -export default function LastNameField({ value, onChange }: LastNameFieldProps) -{ - const [errors, setErrors] = useState([]); +export default function LastNameField({ value, onChange }: LastNameFieldProps) { + const [errors, setErrors] = useState([]) const handleBlur = () => { - const trimmedValue = value.trim(); - const newErrors: string[] = []; + const trimmedValue = value.trim() + const newErrors: string[] = [] - // Check if empty first if (trimmedValue === "") { - newErrors.push("Required"); - setErrors(newErrors); - return; + newErrors.push("Required") + setErrors(newErrors) + return } if (trimmedValue.length < 2 || trimmedValue.length > 50) { - newErrors.push("2-50 characters"); + newErrors.push("2-50 characters") } - setErrors(newErrors); - }; + setErrors(newErrors) + } - const handleChange = (e: React.ChangeEvent) => - { - const valueOnlyLetters = e.target.value.replace(/[^a-zA-ZÀ-ÿ\u0100-\u017F\u0180-\u024F'-]/g, ''); - const uppercaseValue = valueOnlyLetters.toUpperCase(); - onChange(uppercaseValue); - setErrors([]); - }; + const handleChange = (e: React.ChangeEvent) => { + const valueOnlyLetters = e.target.value.replace(/[^a-zA-ZÀ-ÿ\u0100-\u017F\u0180-\u024F'-]/g, '') + const uppercaseValue = valueOnlyLetters.toUpperCase() + onChange(uppercaseValue) + setErrors([]) + } return ( -
+ - 0 ? "glass-wrong-input" : ""}`} + placeholder="Last Name" + hasError={errors.length > 0} /> {errors.length > 0 && ( - - {errors.map((err, i) => ( -
{err}
- ))} -
+ + {errors.map((err, i) => ( + {err} + ))} + )} -
- ); + + ) } \ No newline at end of file diff --git a/React/src/components/forms/signup/PasswordFields.tsx b/React/src/components/forms/signup/PasswordFields.tsx index 5349246..ea9b483 100644 --- a/React/src/components/forms/signup/PasswordFields.tsx +++ b/React/src/components/forms/signup/PasswordFields.tsx @@ -1,26 +1,68 @@ -import {useState} from "react"; +import { useState } from "react" +import styled from '@emotion/styled' + +const FieldWrapper = styled.div` + width: 100%; + margin-bottom: ${({ theme }) => theme.spacing.md}; +` + +const StyledInput = styled.input<{ hasError: boolean }>` + background-color: ${({ theme, hasError }) => + hasError ? theme.colors.bgError : theme.glass.bg}; + border: solid 1px ${({ theme, hasError }) => + hasError ? theme.colors.borderError : theme.glass.border}; + border-radius: ${({ theme }) => theme.borderRadius.md}; + height: ${({ theme }) => theme.input.height}; + padding: 0 18px; + transition: all ${({ theme }) => theme.transition.fast}; + width: ${({ theme }) => theme.input.width}; + color: ${({ theme }) => theme.colors.textWhite}; + margin-bottom: ${({ theme }) => theme.spacing.xs}; + box-shadow: ${({ hasError, theme }) => + hasError ? `0 0 0 5px ${theme.colors.errorBoxShadow}` : 'none'}; + + &::placeholder { + color: ${({ theme }) => theme.colors.textPlaceholder}; + } + + &:focus { + background-color: ${({ theme }) => theme.glass.bgHover}; + border-color: ${({ theme }) => theme.glass.borderHover}; + box-shadow: ${({ theme }) => theme.glass.focusShadow}; + } +` + +const ErrorContainer = styled.span` + display: block; +` + +const ErrorMessage = styled.div` + color: ${({ theme }) => theme.colors.textError}; + font-weight: ${({ theme }) => theme.fontWeight.semibold}; + width: ${({ theme }) => theme.input.width}; + padding-left: 5px; +` const sequences = [ 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', '0123456789', - 'qwertyuiopasdfghjklzxcvbnm', // QWERTY keyboard layout + 'qwertyuiopasdfghjklzxcvbnm', 'QWERTYUIOPASDFGHJKLZXCVBNM' -]; +] -const specialCharsRegex = /[!@#$%^&*()_+\-=[\]{};':"\\|,.<>/?~`]/; +const specialCharsRegex = /[!@#$%^&*()_+\-=[\]{};':"\\|,.<>/?~`]/ interface PasswordFieldsProps { - passwordValue: string; - confirmValue: string; - onPasswordChange: (value: string) => void; - onConfirmChange: (value: string) => void; - // User context for validation - username?: string; - firstName?: string; - lastName?: string; - email?: string; - birthdate?: { month: string; day: string; year: string }; + passwordValue: string + confirmValue: string + onPasswordChange: (value: string) => void + onConfirmChange: (value: string) => void + username?: string + firstName?: string + lastName?: string + email?: string + birthdate?: { month: string; day: string; year: string } } export default function PasswordFields({ @@ -33,190 +75,180 @@ export default function PasswordFields({ lastName = '', email = '', birthdate = { month: '', day: '', year: '' } - }: PasswordFieldsProps) -{ - const [passwordErrors, setPasswordErrors] = useState([]); - const [confirmErrors, setConfirmErrors] = useState([]); + }: PasswordFieldsProps) { + const [passwordErrors, setPasswordErrors] = useState([]) + const [confirmErrors, setConfirmErrors] = useState([]) - const checkConsecutiveRepeated = (password: string): boolean => - { + const checkConsecutiveRepeated = (password: string): boolean => { for (let i = 0; i < password.length - 2; i++) { if (password[i] === password[i + 1] && password[i] === password[i + 2]) { - return true; + return true } } - return false; - }; + return false + } - const checkSequentialChars = (password: string): boolean => - { + const checkSequentialChars = (password: string): boolean => { for (const sequence of sequences) { for (let i = 0; i < sequence.length - 2; i++) { - const subSeq = sequence.substring(i, i + 3); - const reverseSeq = subSeq.split('').reverse().join(''); + const subSeq = sequence.substring(i, i + 3) + const reverseSeq = subSeq.split('').reverse().join('') if (password.toLowerCase().includes(subSeq.toLowerCase()) || password.toLowerCase().includes(reverseSeq.toLowerCase())) { - return true; + return true } } } - return false; - }; + return false + } - const checkContainsPersonalInfo = (password: string): string[] => - { - const violations = []; - const lowerPassword = password.toLowerCase(); + const checkContainsPersonalInfo = (password: string): string[] => { + const violations = [] + const lowerPassword = password.toLowerCase() if (username && username.length >= 3 && lowerPassword.includes(username.toLowerCase())) { - violations.push("user's name"); + violations.push("user's name") } if (firstName && firstName.length >= 3 && lowerPassword.includes(firstName.toLowerCase())) { - violations.push("firstName"); + violations.push("firstName") } if (lastName && lastName.length >= 3 && lowerPassword.includes(lastName.toLowerCase())) { - violations.push("lastName"); + violations.push("lastName") } if (email && email.length >= 3) { - const emailParts = email.toLowerCase().split('@'); + const emailParts = email.toLowerCase().split('@') if (emailParts[0].length >= 3 && lowerPassword.includes(emailParts[0])) { - violations.push("email address"); + violations.push("email address") } } if (birthdate && (birthdate.year || birthdate.month || birthdate.day)) { - const { year, month, day } = birthdate; + const { year, month, day } = birthdate if (year && month && day) { - if (year && lowerPassword.includes(year)) violations.push("birthdate (year)"); - if (month && lowerPassword.includes(month.padStart(2, '0'))) violations.push("birthdate (month)"); - if (day && lowerPassword.includes(day.padStart(2, '0'))) violations.push("birthdate (day)"); + if (year && lowerPassword.includes(year)) violations.push("birthdate (year)") + if (month && lowerPassword.includes(month.padStart(2, '0'))) violations.push("birthdate (month)") + if (day && lowerPassword.includes(day.padStart(2, '0'))) violations.push("birthdate (day)") } } - return violations; - }; + return violations + } - const handlePasswordBlur = () => - { - const trimmedValue = passwordValue.trim(); - const newErrors: string[] = []; + const handlePasswordBlur = () => { + const trimmedValue = passwordValue.trim() + const newErrors: string[] = [] - // Check if empty first if (trimmedValue === "") { - newErrors.push("Required"); - setPasswordErrors(newErrors); - return; + newErrors.push("Required") + setPasswordErrors(newErrors) + return } if (trimmedValue.length < 16) { - newErrors.push('Min. 16 characters'); + newErrors.push('Min. 16 characters') } if (!/[a-z]/.test(passwordValue)) { - newErrors.push("Must include lowercase"); + newErrors.push("Must include lowercase") } if (!/[A-Z]/.test(passwordValue)) { - newErrors.push("Must include uppercase"); + newErrors.push("Must include uppercase") } if (!/[0-9]/.test(passwordValue)) { - newErrors.push("Must include number"); + newErrors.push("Must include number") } if (!specialCharsRegex.test(passwordValue)) { - newErrors.push("Must include special character"); + newErrors.push("Must include special character") } if (/\s/.test(passwordValue)) { - newErrors.push("No spaces allowed"); + newErrors.push("No spaces allowed") } if (checkConsecutiveRepeated(passwordValue)) { - newErrors.push("No 3+ repeated characters"); + newErrors.push("No 3+ repeated characters") } if (checkSequentialChars(passwordValue)) { - newErrors.push("No sequential characters"); + newErrors.push("No sequential characters") } - const personalInfoViolations = checkContainsPersonalInfo(passwordValue); + const personalInfoViolations = checkContainsPersonalInfo(passwordValue) if (personalInfoViolations.length > 0) { - newErrors.push(`No personal info (${personalInfoViolations.join(', ')})`); + newErrors.push(`No personal info (${personalInfoViolations.join(', ')})`) } - setPasswordErrors(newErrors); + setPasswordErrors(newErrors) } - const handleConfirmBlur = () => - { - const trimmedValue = confirmValue.trim(); - const newErrors: string[] = []; + const handleConfirmBlur = () => { + const trimmedValue = confirmValue.trim() + const newErrors: string[] = [] - // Check if empty first if (trimmedValue === "" && passwordValue.trim().length > 0) { - newErrors.push('Required'); - setConfirmErrors(newErrors); - return; + newErrors.push('Required') + setConfirmErrors(newErrors) + return } if (trimmedValue.length > 0 && trimmedValue !== passwordValue) { - newErrors.push('Passwords must match'); + newErrors.push('Passwords must match') } - setConfirmErrors(newErrors); + setConfirmErrors(newErrors) } - const handlePasswordChange = (e: React.ChangeEvent) => - { - onPasswordChange(e.target.value); - setPasswordErrors([]); - }; + const handlePasswordChange = (e: React.ChangeEvent) => { + onPasswordChange(e.target.value) + setPasswordErrors([]) + } - const handleConfirmChange = (e: React.ChangeEvent) => - { - onConfirmChange(e.target.value); - setConfirmErrors([]); - }; + const handleConfirmChange = (e: React.ChangeEvent) => { + onConfirmChange(e.target.value) + setConfirmErrors([]) + } return ( <> -
+ - 0 ? "glass-wrong-input" : ""}`} + hasError={passwordErrors.length > 0} /> {passwordErrors.length > 0 && ( - + {passwordErrors.map((err, i) => ( -
{err}
+ {err} ))} -
+ )} -
+ -
+ - 0 ? "glass-wrong-input" : ""}`} + hasError={confirmErrors.length > 0} /> {confirmErrors.length > 0 && ( - + {confirmErrors.map((err, i) => ( -
{err}
+ {err} ))} -
+ )} -
+ - ); + ) } \ No newline at end of file diff --git a/React/src/styles/globalStyle.tsx b/React/src/styles/globalStyle.tsx index c63100a..0f5dff3 100644 --- a/React/src/styles/globalStyle.tsx +++ b/React/src/styles/globalStyle.tsx @@ -1,7 +1,7 @@ import { css } from '@emotion/react' import type {Theme} from './theme' -export const globalStyles = (theme: Theme) => css` +export const globalStyle = (theme: Theme) => css` *, *::before, *::after { box-sizing: border-box; margin: 0; From ba2648ce1bebcffe240386914e1284f8328f894a Mon Sep 17 00:00:00 2001 From: IlP4rAd0xlI Date: Fri, 3 Oct 2025 18:37:42 +0200 Subject: [PATCH 44/77] feature/signup Remove : signup.css --- React/src/pages/SignupView.tsx | 1 - React/src/styles/signup.css | 234 --------------------------------- 2 files changed, 235 deletions(-) delete mode 100644 React/src/styles/signup.css diff --git a/React/src/pages/SignupView.tsx b/React/src/pages/SignupView.tsx index b9b659f..a52dabe 100644 --- a/React/src/pages/SignupView.tsx +++ b/React/src/pages/SignupView.tsx @@ -1,5 +1,4 @@ import SignupCard from '../components/forms/signup/SignupCard' -import '../styles/signup.css' export default function SignupView() { return ( diff --git a/React/src/styles/signup.css b/React/src/styles/signup.css deleted file mode 100644 index 62e4975..0000000 --- a/React/src/styles/signup.css +++ /dev/null @@ -1,234 +0,0 @@ -/* ========================================================================== - CSS CUSTOM PROPERTIES (CSS VARIABLES) - ========================================================================== */ - -:root { - /* Glass Effect Colors */ - --glass-bg: rgba(255, 255, 255, 0.20); - --glass-border: rgba(255, 255, 255, 0.20); - --glass-backdrop: blur(10px); - - /* Colors */ - --color-text-white: #fffafa; - --color-border-error: rgba(255,103,0,0.7); - --color-text-error: rgba(255,103,0,0.7); - --color-bg-error: rgba(255,103,1, 0.5); - --color-error-box-shadow: rgba(255,103,1, 0.2); - - /* Typography */ - --font-size-xs: 0.89rem; - --font-size-sm: 0.94rem; - --font-size-base: 0.9rem; - --font-size-lg: 1.22rem; - --font-size-xl: 1.33rem; - --font-size-2xl: 1.67rem; - --font-size-3xl: 2.11rem; - - --font-weight-light: 300; - --font-weight-normal: 400; - --font-weight-medium: 500; - --font-weight-semibold: 600; - --font-weight-bold: 700; - --font-weight-extrabold: 800; - - --line-height-tight: 1.25; - --line-height-normal: 1.5; - --line-height-relaxed: 1.6; - --line-height-loose: 1.75; - - /* Spacing */ - --space-xs: 0.28rem; - --space-sm: 0.56rem; - --space-md: 1rem; - --space-lg: 1.44rem; - --space-xl: 2rem; - --space-2xl: 3rem; - - /* Layout - Responsive containers */ - --container-sm: 90vw; - --container-md: 80vw; - --container-lg: 70vw; - --container-xl: 60vw; - - /* Input dimensions */ - --input-width: min(80vw, 500px); - --input-gap: 2vw; - --input-width-half: min(calc((var(--input-width) - var(--input-gap)) / 2), 250px); - --input-width-third: min(calc((var(--input-width) - (var(--input-gap) * 2)) / 3), 160px); - --input-height: 45px; - - /* Breakpoints (for reference) */ - --breakpoint-sm: 640px; - --breakpoint-md: 768px; - --breakpoint-lg: 1024px; - --breakpoint-xl: 1280px; - - /* Borders & Radius */ - --border-radius-sm: 8px; - --border-radius-md: 9px; - --border-radius-lg: 20px; - - /* Shadows */ - --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.07); - --shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1); - - /* Transitions */ - --transition-fast: 0.15s ease; - --transition-normal: 0.3s ease; - - /* Z-index scale */ - --z-modal: 1050; - --z-fixed: 1080; -} - -/* ========================================================================== - PAGE LAYOUT (Signup/Login specific) - ========================================================================== */ - -body { - display: grid; - place-items: center; - backdrop-filter: blur(4px); - overflow: hidden; -font-size: var(--font-size-sm); -} - -/* ========================================================================== - GLASS CARD SYSTEM - ========================================================================== */ - -.glass-card { - display: flex; - flex-direction: column; - align-items: center; - border-radius: var(--border-radius-lg); - background-color: var(--glass-bg); - backdrop-filter: var(--glass-backdrop); - border: solid 1px var(--glass-border); - padding: var(--space-lg); - box-shadow: var(--shadow-lg); - width: 100%; -} - -.card-row { - width: 100%; - margin-bottom: var(--space-md); -} - -.card-multi-fields-row { - width: 100%; - margin-bottom: var(--space-md); - display: flex; - justify-content: space-between; -} - -.glass-dropdown option { - color: #333; -} - -/* ========================================================================== - FORM SYSTEM - ========================================================================== */ - -label { - display: none; -} - -h1 { - text-align: center; -} - -/* Shared glassmorphism input styling */ -.glass-input { - background-color: var(--glass-bg); - border: solid 1px var(--glass-border); - border-radius: var(--border-radius-md); - height: var(--input-height); - padding: 0 18px; - transition: all var(--transition-fast); - width: var(--input-width); - color: var(--color-text-white); - margin-bottom: var(--space-xs); -} - -.glass-wrong-input { - border: solid 1px var(--color-border-error); - background-color: var(--color-bg-error); - box-shadow: 0 0 0 5px var(--color-error-box-shadow); -} - -.error-messages { - color: var(--color-text-error); - font-weight: var(--font-weight-semibold); - width: var(--input-width); - padding-left: 5px; -} - -.error-messages-half { - width: var(--input-width-half); -} - -.glass-input:focus { - background-color: rgba(255, 255, 255, 0.3); - border-color: rgba(255, 255, 255, 0.5); - box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.1); -} - -.glass-input::placeholder { - color: rgba(255, 255, 255, 0.7); -} - -/* Half-width inputs */ -.half-input { - width: var(--input-width-half); -} - -/* Dropdown styling */ -.glass-dropdown { - background-color: var(--glass-bg); - border: solid 1px var(--glass-border); - border-radius: var(--border-radius-md); - height: var(--input-height); - padding: 0 18px; - transition: all var(--transition-fast); - color: var(--color-text-white); - margin-bottom: var(--space-xs); - width: var(--input-width-third); - appearance: none; - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3e%3c/svg%3e"); - background-position: right 12px center; - background-repeat: no-repeat; - background-size: 16px; - cursor: pointer; -} - -.glass-dropdown:focus { - background-color: rgba(255, 255, 255, 0.3); - border-color: rgba(255, 255, 255, 0.5); - box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.1); -} - -/* Submit button styling */ -.glass-button { - background-color: var(--glass-bg); - border: solid 1px var(--glass-border); - border-radius: var(--border-radius-md); - height: var(--input-height); - padding: 0 18px; - transition: all var(--transition-fast); - width: var(--input-width); - color: var(--color-text-white); - margin-bottom: var(--space-md); - font-weight: var(--font-weight-semibold); -} - -.glass-button:hover, -.glass-button:focus { - background-color: rgba(255, 255, 255, 0.3); - transform: translateY(-1px); - box-shadow: var(--shadow-md); -} - -.glass-button:active { - transform: translateY(0); -} \ No newline at end of file From 8c60ef07098a284423668b557cba23d3ebb4b944 Mon Sep 17 00:00:00 2001 From: IlP4rAd0xlI Date: Fri, 3 Oct 2025 23:35:37 +0200 Subject: [PATCH 45/77] feature/signup Add : UserPost onclick --- React/.env | 1 + React/src/api/User.ts | 19 +++++++++++++++++++ React/src/api/apiConfig.ts | 10 ++++++++++ .../components/forms/signup/SignupForm.tsx | 18 +++++++++++++++++- package.json | 1 + 5 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 React/.env create mode 100644 React/src/api/User.ts create mode 100644 React/src/api/apiConfig.ts diff --git a/React/.env b/React/.env new file mode 100644 index 0000000..cdb8f3f --- /dev/null +++ b/React/.env @@ -0,0 +1 @@ +API_URL \ No newline at end of file diff --git a/React/src/api/User.ts b/React/src/api/User.ts new file mode 100644 index 0000000..278a144 --- /dev/null +++ b/React/src/api/User.ts @@ -0,0 +1,19 @@ +import {apiConfig, getHeaders} from "./apiConfig.ts"; + +export type PostUserProps = { + "pseudo": string, // TODO : rename to username + "email": string, + // TODO : first name + // TODO : last name + "age": 0, // TODO : age => date of birth + "password": string, +} + +export const PostUser = async (param:PostUserProps) => { + const headers = getHeaders() + const response = await fetch(apiConfig.apiUrl + "/user", { + method: "POST", + headers: {...headers}, + body: JSON.stringify(param), + }); +} \ No newline at end of file diff --git a/React/src/api/apiConfig.ts b/React/src/api/apiConfig.ts new file mode 100644 index 0000000..b9f98ee --- /dev/null +++ b/React/src/api/apiConfig.ts @@ -0,0 +1,10 @@ +export const apiConfig = { + apiUrl: import.meta.env.API_URL, +} + +// header of the request => indicate body will be in json +export const getHeaders = () => { + return { + 'Content-Type': 'application/json', + } +} \ No newline at end of file diff --git a/React/src/components/forms/signup/SignupForm.tsx b/React/src/components/forms/signup/SignupForm.tsx index 846cae0..1d50981 100644 --- a/React/src/components/forms/signup/SignupForm.tsx +++ b/React/src/components/forms/signup/SignupForm.tsx @@ -7,6 +7,7 @@ import FirstNameField from "./FirstNameField.tsx" import LastNameField from "./LastNameField.tsx" import BirthdateField from "./BirthdateField.tsx" import PasswordFields from "./PasswordFields.tsx" +import {PostUser, type PostUserProps} from '../../../api/User.ts' const StyledForm = styled.form` width: 100%; @@ -54,6 +55,21 @@ export default function SignupForm() { const [password, setPassword] = useState('') const [confirmPassword, setConfirmPassword] = useState('') + const HandleSubmit = () => { + const User:PostUserProps = { + pseudo : username, + email : email, + age: 0, + password: password, + } + try { + await PostUser(User) + } + catch (e) { + console.error(e) + } + } + return ( @@ -74,7 +90,7 @@ export default function SignupForm() { email={email} birthdate={birthdate} /> - Submit + HandleSubmit} type="submit">Submit ) } \ No newline at end of file diff --git a/package.json b/package.json index 787e445..dffa07e 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,6 @@ { "dependencies": { + "dotenv": "^17.2.3", "sass": "^1.93.2" } } From 534bbff642f3f47690658b16553f014e7ab3ae59 Mon Sep 17 00:00:00 2001 From: Tisa_48 <130873934+Tisa40486@users.noreply.github.com> Date: Sun, 5 Oct 2025 03:52:18 +0200 Subject: [PATCH 46/77] major edit, need to find why gender response is null when a i call get by all request --- .../SameApi.App/Controllers/UserController.cs | 14 +++-- .../Admin/Command/DeleteGenderCommand.cs | 1 + SameApi/SameApi.Business/SameApiProfile.cs | 11 +++- .../User/Command/CreateUserCommand.cs | 10 ++++ .../User/Command/UpdateUserCommand.cs | 9 ++- .../User/Query/GetAllUserQuery.cs | 15 ++--- .../User/Query/GetUserByIdQuery.cs | 37 +++++++++++++ .../SameApi.Data/Repository/BaseRepository.cs | 22 ++++---- .../DbContexts/IApiSameDbContext.cs | 6 +- .../SameApi.Db/DbContexts/SameApiDbContext.cs | 9 +++ .../Migrations/20251003070443_1.0.1.cs | 28 ---------- ...er.cs => 20251005003003_1.0.0.Designer.cs} | 50 ++++++----------- ...04928_1.0.0.cs => 20251005003003_1.0.0.cs} | 34 ++---------- ...er.cs => 20251005003732_1.0.1.Designer.cs} | 55 +++++++++---------- .../Migrations/20251005003732_1.0.1.cs | 45 +++++++++++++++ .../SameApiDbContextModelSnapshot.cs | 53 +++++++++--------- .../SameApi.Db/Repository/IUserRepository.cs | 4 +- .../Implementation/GenderRepository.cs | 2 +- .../Implementation/UserRepository.cs | 14 ++++- SameApi/SameApi.Dto/GenderInput.cs | 2 +- SameApi/SameApi.Dto/ProfessionInput.cs | 2 +- SameApi/SameApi.Dto/UserInput.cs | 4 +- SameApi/SameApi.Dto/UserResponse.cs | 4 +- SameApi/SameApi.Model/LKP/LKP_GenderDao.cs | 2 +- SameApi/SameApi.Model/UserDao.cs | 7 +-- 25 files changed, 251 insertions(+), 189 deletions(-) create mode 100644 SameApi/SameApi.Business/User/Query/GetUserByIdQuery.cs delete mode 100644 SameApi/SameApi.Db/Migrations/20251003070443_1.0.1.cs rename SameApi/SameApi.Db/Migrations/{20250928204928_1.0.0.Designer.cs => 20251005003003_1.0.0.Designer.cs} (80%) rename SameApi/SameApi.Db/Migrations/{20250928204928_1.0.0.cs => 20251005003003_1.0.0.cs} (81%) rename SameApi/SameApi.Db/Migrations/{20251003070443_1.0.1.Designer.cs => 20251005003732_1.0.1.Designer.cs} (85%) create mode 100644 SameApi/SameApi.Db/Migrations/20251005003732_1.0.1.cs diff --git a/SameApi/SameApi.App/Controllers/UserController.cs b/SameApi/SameApi.App/Controllers/UserController.cs index ba44e8d..47257b9 100644 --- a/SameApi/SameApi.App/Controllers/UserController.cs +++ b/SameApi/SameApi.App/Controllers/UserController.cs @@ -2,6 +2,8 @@ using MediatR; using Microsoft.AspNetCore.Mvc; using SameApi.Business.User.Command; +using SameApi.Business.User.Query; +using SameApi.Db.Repository.Implementation; using SameApi.Dto; namespace SameApi.App.Controllers @@ -11,14 +13,18 @@ namespace SameApi.App.Controllers public class UserController : ControllerBase { private readonly IMediator _mediator; - private readonly IMapper _mapper; - - public UserController(IMediator mediator, IMapper mapper) + + public UserController(IMediator mediator) { _mediator = mediator; - _mapper = mapper; } + [HttpGet("{id}")] + public async Task> GetByIdAsync(int id) + { + var result = await _mediator.Send(new GetUserByIdQuery { Id = id }); + return Ok(result); + } [HttpGet("getAll")] public async Task>> GetAllAsync() { diff --git a/SameApi/SameApi.Business/Admin/Command/DeleteGenderCommand.cs b/SameApi/SameApi.Business/Admin/Command/DeleteGenderCommand.cs index ebebc35..205f0a8 100644 --- a/SameApi/SameApi.Business/Admin/Command/DeleteGenderCommand.cs +++ b/SameApi/SameApi.Business/Admin/Command/DeleteGenderCommand.cs @@ -24,6 +24,7 @@ public DeleteGenderCommandHandler(IMapper mapper, IApiSameUnitOfWork uow) public async Task Handle(DeleteGenderCommand command, CancellationToken cancellationToken) { var dao = _mapper.Map(command); + await _uow.GenderRepository.RemoveByIdAsync(dao.Id); return dao.Id; diff --git a/SameApi/SameApi.Business/SameApiProfile.cs b/SameApi/SameApi.Business/SameApiProfile.cs index 46383ae..892f0d7 100644 --- a/SameApi/SameApi.Business/SameApiProfile.cs +++ b/SameApi/SameApi.Business/SameApiProfile.cs @@ -9,12 +9,21 @@ public class SameApiProfile : Profile { public SameApiProfile() { - CreateMap(); + + //User + CreateMap() + .ForMember(dest => dest.id_gender_fk, opt => opt.MapFrom(src => src.GenderId)); CreateMap(); + + //Gender CreateMap(); CreateMap(); + + //Profession CreateMap(); CreateMap(); + + } } } \ No newline at end of file diff --git a/SameApi/SameApi.Business/User/Command/CreateUserCommand.cs b/SameApi/SameApi.Business/User/Command/CreateUserCommand.cs index 6304a02..cf1c5f2 100644 --- a/SameApi/SameApi.Business/User/Command/CreateUserCommand.cs +++ b/SameApi/SameApi.Business/User/Command/CreateUserCommand.cs @@ -22,6 +22,16 @@ public CreateUserCommandHandler( public async Task Handle(CreateUserCommand request, CancellationToken cancellationToken) { var dao = _mapper.Map(request); + + var today = DateTime.Now; + + var age = today.Year - dao.Birthday!.Value.Year; + + if (dao.Birthday.Value.Date> today.AddYears(-age)) + age--; + + dao.Age = age; + await _uow.UserRepository.AddAndSaveAsync(dao); } } diff --git a/SameApi/SameApi.Business/User/Command/UpdateUserCommand.cs b/SameApi/SameApi.Business/User/Command/UpdateUserCommand.cs index 087de76..2b2bde3 100644 --- a/SameApi/SameApi.Business/User/Command/UpdateUserCommand.cs +++ b/SameApi/SameApi.Business/User/Command/UpdateUserCommand.cs @@ -6,11 +6,11 @@ namespace SameApi.Business.User.Command { - public class UpdateUserCommand : UserInput, IRequest + public class UpdateUserCommand : UserInput, IRequest { } - public class UpdateUserCommandHandler : IRequestHandler + public class UpdateUserCommandHandler : IRequestHandler { readonly IApiSameUnitOfWork _apiSameUnitOfWork; readonly IMapper _mapper; @@ -23,10 +23,13 @@ public UpdateUserCommandHandler( _mapper = mapper; } - public async Task Handle(UpdateUserCommand request, CancellationToken cancellationToken) + public async Task Handle(UpdateUserCommand request, CancellationToken cancellationToken) { var data = await _apiSameUnitOfWork.UserRepository.GetByIdAsync(request.Id, false); + if (data == null) + return null; + _mapper.Map(request, data); await _apiSameUnitOfWork.SaveChangesAsync(); diff --git a/SameApi/SameApi.Business/User/Query/GetAllUserQuery.cs b/SameApi/SameApi.Business/User/Query/GetAllUserQuery.cs index 94a366c..be3f9dc 100644 --- a/SameApi/SameApi.Business/User/Query/GetAllUserQuery.cs +++ b/SameApi/SameApi.Business/User/Query/GetAllUserQuery.cs @@ -1,7 +1,7 @@ -using SameApi.Db.UnitOfWork; -using AutoMapper; -using SameApi.Dto; +using AutoMapper; using MediatR; +using SameApi.Db.Repository; +using SameApi.Dto; namespace SameApi.Business.User.Command { @@ -10,20 +10,21 @@ public class GetAllUserQuery : IRequest> } public class GetAllUserQueryHandler : IRequestHandler> { - readonly IApiSameUnitOfWork _apiTestUnitOfWork; + readonly IUserRepository _userRepository; readonly IMapper _mapper; public GetAllUserQueryHandler( - IApiSameUnitOfWork apiTestUnitOfWork, IMapper mapper) + IUserRepository userRepository, + IMapper mapper) { - _apiTestUnitOfWork = apiTestUnitOfWork; + _userRepository = userRepository; _mapper = mapper; } public async Task> Handle(GetAllUserQuery request, CancellationToken cancellationToken) { - var data = await _apiTestUnitOfWork.UserRepository.GetAllAsync(); + var data = await _userRepository.GetAllUsersAsync(); var result = _mapper.Map>(data); return result; diff --git a/SameApi/SameApi.Business/User/Query/GetUserByIdQuery.cs b/SameApi/SameApi.Business/User/Query/GetUserByIdQuery.cs new file mode 100644 index 0000000..d376c52 --- /dev/null +++ b/SameApi/SameApi.Business/User/Query/GetUserByIdQuery.cs @@ -0,0 +1,37 @@ +using AutoMapper; +using MediatR; +using SameApi.Db.UnitOfWork; +using SameApi.Dto; + +namespace SameApi.Business.User.Query +{ + public class GetUserByIdQuery : IRequest + { + public int Id { get; set; } + } + + public class GetUserByIdQueryHandler : IRequestHandler + { + readonly IApiSameUnitOfWork _uow; + readonly IMapper _mapper; + + public GetUserByIdQueryHandler( + IApiSameUnitOfWork uow, + IMapper mapper) + { + _uow = uow; + _mapper = mapper; + } + + public async Task Handle(GetUserByIdQuery request, CancellationToken cancellationToken) + { + var data = await _uow.UserRepository.GetByIdAsync(request.Id); + + if (data == null) + return null; + + var result = _mapper.Map(data); + return result; + } + } +} \ No newline at end of file diff --git a/SameApi/SameApi.Data/Repository/BaseRepository.cs b/SameApi/SameApi.Data/Repository/BaseRepository.cs index 6bc5389..b092ccf 100644 --- a/SameApi/SameApi.Data/Repository/BaseRepository.cs +++ b/SameApi/SameApi.Data/Repository/BaseRepository.cs @@ -15,7 +15,15 @@ public BaseRepository(TContext context) _context = context; } + public async Task> GetAllAsync(bool withNoTracking = true) + { + IQueryable query = _context.Set(); + if (withNoTracking) + query = query.AsNoTracking(); + + return await query.ToListAsync(); + } public async Task AddAndSaveAsync(TModelDao entity) { await _context.Set().AddAsync(entity); @@ -23,7 +31,7 @@ public async Task AddAndSaveAsync(TModelDao entity) } - public async Task GetByIdAsync(int id, bool withNoTracking = true) + public async Task GetByIdAsync(int id, bool withNoTracking = true) { IQueryable query = _context.Set(); @@ -32,20 +40,12 @@ public async Task GetByIdAsync(int id, bool withNoTracking = true) return await query.FirstOrDefaultAsync(x => x.Id == id); } - public async Task> GetAllAsync(bool withNoTracking = true) - { - IQueryable query = _context.Set(); - - if (withNoTracking) - query = query.AsNoTracking(); - - return await query.ToListAsync(); - } public async Task RemoveByIdAsync(int id, bool withNoTracking = true) { var entity = await _context.Set().FindAsync(id); - await RemoveAsync(entity); + if (entity != null) + await RemoveAsync(entity); } public async Task RemoveAsync(TModelDao entity) { diff --git a/SameApi/SameApi.Db/DbContexts/IApiSameDbContext.cs b/SameApi/SameApi.Db/DbContexts/IApiSameDbContext.cs index dfa3c54..20d9d72 100644 --- a/SameApi/SameApi.Db/DbContexts/IApiSameDbContext.cs +++ b/SameApi/SameApi.Db/DbContexts/IApiSameDbContext.cs @@ -1,9 +1,11 @@ -using SameApi.Data.DbContexts; +using Microsoft.EntityFrameworkCore; +using SameApi.Data.DbContexts; +using SameApi.Model; namespace SameApi.Db.DbContexts { public interface IApiSameDbContext : IBaseDbContext { - + public DbSet Users { get; set; } } } \ No newline at end of file diff --git a/SameApi/SameApi.Db/DbContexts/SameApiDbContext.cs b/SameApi/SameApi.Db/DbContexts/SameApiDbContext.cs index 28fce22..b75e483 100644 --- a/SameApi/SameApi.Db/DbContexts/SameApiDbContext.cs +++ b/SameApi/SameApi.Db/DbContexts/SameApiDbContext.cs @@ -12,6 +12,15 @@ public SameApiDbContext(DbContextOptions options) : base(optio } public DbSet Users { get; set; } public DbSet Genders { get; set; } + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + // ... autre configuration ... + modelBuilder.Entity().HasData( + new LKP_GenderDao { Id = 1, Name = "Male" }, + new LKP_GenderDao { Id = 2, Name = "Female" }, + new LKP_GenderDao { Id = 3, Name = "Other" } + ); + } } } \ No newline at end of file diff --git a/SameApi/SameApi.Db/Migrations/20251003070443_1.0.1.cs b/SameApi/SameApi.Db/Migrations/20251003070443_1.0.1.cs deleted file mode 100644 index 877f0c1..0000000 --- a/SameApi/SameApi.Db/Migrations/20251003070443_1.0.1.cs +++ /dev/null @@ -1,28 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace SameApi.Db.Migrations -{ - /// - public partial class _101 : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.RenameColumn( - name: "Number_follow", - table: "SameApi_User", - newName: "NumberFollowers"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.RenameColumn( - name: "NumberFollowers", - table: "SameApi_User", - newName: "Number_follow"); - } - } -} diff --git a/SameApi/SameApi.Db/Migrations/20250928204928_1.0.0.Designer.cs b/SameApi/SameApi.Db/Migrations/20251005003003_1.0.0.Designer.cs similarity index 80% rename from SameApi/SameApi.Db/Migrations/20250928204928_1.0.0.Designer.cs rename to SameApi/SameApi.Db/Migrations/20251005003003_1.0.0.Designer.cs index 00cccb6..650193c 100644 --- a/SameApi/SameApi.Db/Migrations/20250928204928_1.0.0.Designer.cs +++ b/SameApi/SameApi.Db/Migrations/20251005003003_1.0.0.Designer.cs @@ -12,7 +12,7 @@ namespace SameApi.Db.Migrations { [DbContext(typeof(SameApiDbContext))] - [Migration("20250928204928_1.0.0")] + [Migration("20251005003003_1.0.0")] partial class _100 { /// @@ -42,7 +42,7 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b.ToTable("LKP_SameApi_Gender"); }); - modelBuilder.Entity("SameApi.Model.LKP.LKP_Profession", b => + modelBuilder.Entity("SameApi.Model.LKP.LKP_ProfessionDao", b => { b.Property("Id") .ValueGeneratedOnAdd() @@ -59,7 +59,7 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b.ToTable("LKP_SameApi_Profession"); }); - modelBuilder.Entity("SameApi.Model.LKP.LKP_School", b => + modelBuilder.Entity("SameApi.Model.LKP.LKP_SchoolDao", b => { b.Property("Id") .ValueGeneratedOnAdd() @@ -84,19 +84,6 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b.ToTable("LKP_SameApi_School"); }); - modelBuilder.Entity("SameApi.Model.PostDao", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.HasKey("Id"); - - b.ToTable("SameApi_Post"); - }); - modelBuilder.Entity("SameApi.Model.UserDao", b => { b.Property("Id") @@ -108,6 +95,9 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b.Property("Age") .HasColumnType("int"); + b.Property("Birthday") + .HasColumnType("datetime2"); + b.Property("CreateAt") .HasColumnType("datetime2"); @@ -115,22 +105,25 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) .IsRequired() .HasColumnType("nvarchar(max)"); + b.Property("FirstName") + .HasColumnType("nvarchar(max)"); + b.Property("GenderDaoId") .HasColumnType("int"); b.Property("IsAdmin") .HasColumnType("bit"); - b.Property("Number_follow") + b.Property("LastName") + .HasColumnType("nvarchar(max)"); + + b.Property("NumberFollowers") .HasColumnType("int"); b.Property("Password") .IsRequired() .HasColumnType("nvarchar(max)"); - b.Property("PostDaoId") - .HasColumnType("int"); - b.Property("Pseudo") .IsRequired() .HasColumnType("nvarchar(max)"); @@ -141,9 +134,6 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b.Property("id_gender_fk") .HasColumnType("int"); - b.Property("id_post_fk") - .HasColumnType("int"); - b.Property("id_school_fk") .HasColumnType("int"); @@ -151,16 +141,14 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b.HasIndex("GenderDaoId"); - b.HasIndex("PostDaoId"); - b.HasIndex("SchoolDaoId"); b.ToTable("SameApi_User"); }); - modelBuilder.Entity("SameApi.Model.LKP.LKP_School", b => + modelBuilder.Entity("SameApi.Model.LKP.LKP_SchoolDao", b => { - b.HasOne("SameApi.Model.LKP.LKP_Profession", "Profession") + b.HasOne("SameApi.Model.LKP.LKP_ProfessionDao", "Profession") .WithMany() .HasForeignKey("ProfessionId"); @@ -173,18 +161,12 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) .WithMany() .HasForeignKey("GenderDaoId"); - b.HasOne("SameApi.Model.PostDao", "PostDao") - .WithMany() - .HasForeignKey("PostDaoId"); - - b.HasOne("SameApi.Model.LKP.LKP_School", "SchoolDao") + b.HasOne("SameApi.Model.LKP.LKP_SchoolDao", "SchoolDao") .WithMany() .HasForeignKey("SchoolDaoId"); b.Navigation("GenderDao"); - b.Navigation("PostDao"); - b.Navigation("SchoolDao"); }); #pragma warning restore 612, 618 diff --git a/SameApi/SameApi.Db/Migrations/20250928204928_1.0.0.cs b/SameApi/SameApi.Db/Migrations/20251005003003_1.0.0.cs similarity index 81% rename from SameApi/SameApi.Db/Migrations/20250928204928_1.0.0.cs rename to SameApi/SameApi.Db/Migrations/20251005003003_1.0.0.cs index ca310b5..1721405 100644 --- a/SameApi/SameApi.Db/Migrations/20250928204928_1.0.0.cs +++ b/SameApi/SameApi.Db/Migrations/20251005003003_1.0.0.cs @@ -37,18 +37,6 @@ protected override void Up(MigrationBuilder migrationBuilder) table.PrimaryKey("PK_LKP_SameApi_Profession", x => x.Id); }); - migrationBuilder.CreateTable( - name: "SameApi_Post", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("SqlServer:Identity", "1, 1") - }, - constraints: table => - { - table.PrimaryKey("PK_SameApi_Post", x => x.Id); - }); - migrationBuilder.CreateTable( name: "LKP_SameApi_School", columns: table => new @@ -77,17 +65,18 @@ protected override void Up(MigrationBuilder migrationBuilder) .Annotation("SqlServer:Identity", "1, 1"), IsAdmin = table.Column(type: "bit", nullable: false), Age = table.Column(type: "int", nullable: false), + Birthday = table.Column(type: "datetime2", nullable: true), Pseudo = table.Column(type: "nvarchar(max)", nullable: false), + FirstName = table.Column(type: "nvarchar(max)", nullable: true), + LastName = table.Column(type: "nvarchar(max)", nullable: true), Email = table.Column(type: "nvarchar(max)", nullable: false), Password = table.Column(type: "nvarchar(max)", nullable: false), - Number_follow = table.Column(type: "int", nullable: false), + NumberFollowers = table.Column(type: "int", nullable: false), CreateAt = table.Column(type: "datetime2", nullable: false), id_gender_fk = table.Column(type: "int", nullable: false), GenderDaoId = table.Column(type: "int", nullable: true), id_school_fk = table.Column(type: "int", nullable: false), - SchoolDaoId = table.Column(type: "int", nullable: true), - id_post_fk = table.Column(type: "int", nullable: false), - PostDaoId = table.Column(type: "int", nullable: true) + SchoolDaoId = table.Column(type: "int", nullable: true) }, constraints: table => { @@ -102,11 +91,6 @@ protected override void Up(MigrationBuilder migrationBuilder) column: x => x.SchoolDaoId, principalTable: "LKP_SameApi_School", principalColumn: "Id"); - table.ForeignKey( - name: "FK_SameApi_User_SameApi_Post_PostDaoId", - column: x => x.PostDaoId, - principalTable: "SameApi_Post", - principalColumn: "Id"); }); migrationBuilder.CreateIndex( @@ -119,11 +103,6 @@ protected override void Up(MigrationBuilder migrationBuilder) table: "SameApi_User", column: "GenderDaoId"); - migrationBuilder.CreateIndex( - name: "IX_SameApi_User_PostDaoId", - table: "SameApi_User", - column: "PostDaoId"); - migrationBuilder.CreateIndex( name: "IX_SameApi_User_SchoolDaoId", table: "SameApi_User", @@ -142,9 +121,6 @@ protected override void Down(MigrationBuilder migrationBuilder) migrationBuilder.DropTable( name: "LKP_SameApi_School"); - migrationBuilder.DropTable( - name: "SameApi_Post"); - migrationBuilder.DropTable( name: "LKP_SameApi_Profession"); } diff --git a/SameApi/SameApi.Db/Migrations/20251003070443_1.0.1.Designer.cs b/SameApi/SameApi.Db/Migrations/20251005003732_1.0.1.Designer.cs similarity index 85% rename from SameApi/SameApi.Db/Migrations/20251003070443_1.0.1.Designer.cs rename to SameApi/SameApi.Db/Migrations/20251005003732_1.0.1.Designer.cs index a3f07cb..3901548 100644 --- a/SameApi/SameApi.Db/Migrations/20251003070443_1.0.1.Designer.cs +++ b/SameApi/SameApi.Db/Migrations/20251005003732_1.0.1.Designer.cs @@ -12,7 +12,7 @@ namespace SameApi.Db.Migrations { [DbContext(typeof(SameApiDbContext))] - [Migration("20251003070443_1.0.1")] + [Migration("20251005003732_1.0.1")] partial class _101 { /// @@ -40,6 +40,23 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b.HasKey("Id"); b.ToTable("LKP_SameApi_Gender"); + + b.HasData( + new + { + Id = 1, + Name = "Male" + }, + new + { + Id = 2, + Name = "Female" + }, + new + { + Id = 3, + Name = "Other" + }); }); modelBuilder.Entity("SameApi.Model.LKP.LKP_ProfessionDao", b => @@ -84,19 +101,6 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b.ToTable("LKP_SameApi_School"); }); - modelBuilder.Entity("SameApi.Model.PostDao", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.HasKey("Id"); - - b.ToTable("SameApi_Post"); - }); - modelBuilder.Entity("SameApi.Model.UserDao", b => { b.Property("Id") @@ -108,6 +112,9 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b.Property("Age") .HasColumnType("int"); + b.Property("Birthday") + .HasColumnType("datetime2"); + b.Property("CreateAt") .HasColumnType("datetime2"); @@ -115,12 +122,18 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) .IsRequired() .HasColumnType("nvarchar(max)"); + b.Property("FirstName") + .HasColumnType("nvarchar(max)"); + b.Property("GenderDaoId") .HasColumnType("int"); b.Property("IsAdmin") .HasColumnType("bit"); + b.Property("LastName") + .HasColumnType("nvarchar(max)"); + b.Property("NumberFollowers") .HasColumnType("int"); @@ -128,9 +141,6 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) .IsRequired() .HasColumnType("nvarchar(max)"); - b.Property("PostDaoId") - .HasColumnType("int"); - b.Property("Pseudo") .IsRequired() .HasColumnType("nvarchar(max)"); @@ -141,9 +151,6 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b.Property("id_gender_fk") .HasColumnType("int"); - b.Property("id_post_fk") - .HasColumnType("int"); - b.Property("id_school_fk") .HasColumnType("int"); @@ -151,8 +158,6 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b.HasIndex("GenderDaoId"); - b.HasIndex("PostDaoId"); - b.HasIndex("SchoolDaoId"); b.ToTable("SameApi_User"); @@ -173,18 +178,12 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) .WithMany() .HasForeignKey("GenderDaoId"); - b.HasOne("SameApi.Model.PostDao", "PostDao") - .WithMany() - .HasForeignKey("PostDaoId"); - b.HasOne("SameApi.Model.LKP.LKP_SchoolDao", "SchoolDao") .WithMany() .HasForeignKey("SchoolDaoId"); b.Navigation("GenderDao"); - b.Navigation("PostDao"); - b.Navigation("SchoolDao"); }); #pragma warning restore 612, 618 diff --git a/SameApi/SameApi.Db/Migrations/20251005003732_1.0.1.cs b/SameApi/SameApi.Db/Migrations/20251005003732_1.0.1.cs new file mode 100644 index 0000000..cec1bfc --- /dev/null +++ b/SameApi/SameApi.Db/Migrations/20251005003732_1.0.1.cs @@ -0,0 +1,45 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +#pragma warning disable CA1814 // Prefer jagged arrays over multidimensional + +namespace SameApi.Db.Migrations +{ + /// + public partial class _101 : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.InsertData( + table: "LKP_SameApi_Gender", + columns: new[] { "Id", "Name" }, + values: new object[,] + { + { 1, "Male" }, + { 2, "Female" }, + { 3, "Other" } + }); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DeleteData( + table: "LKP_SameApi_Gender", + keyColumn: "Id", + keyValue: 1); + + migrationBuilder.DeleteData( + table: "LKP_SameApi_Gender", + keyColumn: "Id", + keyValue: 2); + + migrationBuilder.DeleteData( + table: "LKP_SameApi_Gender", + keyColumn: "Id", + keyValue: 3); + } + } +} diff --git a/SameApi/SameApi.Db/Migrations/SameApiDbContextModelSnapshot.cs b/SameApi/SameApi.Db/Migrations/SameApiDbContextModelSnapshot.cs index 969e993..1584b32 100644 --- a/SameApi/SameApi.Db/Migrations/SameApiDbContextModelSnapshot.cs +++ b/SameApi/SameApi.Db/Migrations/SameApiDbContextModelSnapshot.cs @@ -37,6 +37,23 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); b.ToTable("LKP_SameApi_Gender"); + + b.HasData( + new + { + Id = 1, + Name = "Male" + }, + new + { + Id = 2, + Name = "Female" + }, + new + { + Id = 3, + Name = "Other" + }); }); modelBuilder.Entity("SameApi.Model.LKP.LKP_ProfessionDao", b => @@ -81,19 +98,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("LKP_SameApi_School"); }); - modelBuilder.Entity("SameApi.Model.PostDao", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.HasKey("Id"); - - b.ToTable("SameApi_Post"); - }); - modelBuilder.Entity("SameApi.Model.UserDao", b => { b.Property("Id") @@ -105,6 +109,9 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("Age") .HasColumnType("int"); + b.Property("Birthday") + .HasColumnType("datetime2"); + b.Property("CreateAt") .HasColumnType("datetime2"); @@ -112,12 +119,18 @@ protected override void BuildModel(ModelBuilder modelBuilder) .IsRequired() .HasColumnType("nvarchar(max)"); + b.Property("FirstName") + .HasColumnType("nvarchar(max)"); + b.Property("GenderDaoId") .HasColumnType("int"); b.Property("IsAdmin") .HasColumnType("bit"); + b.Property("LastName") + .HasColumnType("nvarchar(max)"); + b.Property("NumberFollowers") .HasColumnType("int"); @@ -125,9 +138,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) .IsRequired() .HasColumnType("nvarchar(max)"); - b.Property("PostDaoId") - .HasColumnType("int"); - b.Property("Pseudo") .IsRequired() .HasColumnType("nvarchar(max)"); @@ -138,9 +148,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("id_gender_fk") .HasColumnType("int"); - b.Property("id_post_fk") - .HasColumnType("int"); - b.Property("id_school_fk") .HasColumnType("int"); @@ -148,8 +155,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasIndex("GenderDaoId"); - b.HasIndex("PostDaoId"); - b.HasIndex("SchoolDaoId"); b.ToTable("SameApi_User"); @@ -170,18 +175,12 @@ protected override void BuildModel(ModelBuilder modelBuilder) .WithMany() .HasForeignKey("GenderDaoId"); - b.HasOne("SameApi.Model.PostDao", "PostDao") - .WithMany() - .HasForeignKey("PostDaoId"); - b.HasOne("SameApi.Model.LKP.LKP_SchoolDao", "SchoolDao") .WithMany() .HasForeignKey("SchoolDaoId"); b.Navigation("GenderDao"); - b.Navigation("PostDao"); - b.Navigation("SchoolDao"); }); #pragma warning restore 612, 618 diff --git a/SameApi/SameApi.Db/Repository/IUserRepository.cs b/SameApi/SameApi.Db/Repository/IUserRepository.cs index 9b2a7e2..b732a98 100644 --- a/SameApi/SameApi.Db/Repository/IUserRepository.cs +++ b/SameApi/SameApi.Db/Repository/IUserRepository.cs @@ -1,4 +1,5 @@ -using SameApi.Data.Repository; +using Microsoft.EntityFrameworkCore; +using SameApi.Data.Repository; using SameApi.Db.DbContexts; using SameApi.Model; @@ -6,5 +7,6 @@ namespace SameApi.Db.Repository { public interface IUserRepository : IBaseRepository { + Task> GetAllUsersAsync(); } } \ No newline at end of file diff --git a/SameApi/SameApi.Db/Repository/Implementation/GenderRepository.cs b/SameApi/SameApi.Db/Repository/Implementation/GenderRepository.cs index 7f3d89a..1c6f6b5 100644 --- a/SameApi/SameApi.Db/Repository/Implementation/GenderRepository.cs +++ b/SameApi/SameApi.Db/Repository/Implementation/GenderRepository.cs @@ -13,7 +13,7 @@ public GenderRepository(IApiSameDbContext dbContext): base(dbContext) _dbContext = dbContext; } - public async Task AddAndSaveAsync(LKP_GenderDao entity) + public new async Task AddAndSaveAsync(LKP_GenderDao entity) { _dbContext.Set().Add(entity); await _dbContext.SaveChangesAsync(); diff --git a/SameApi/SameApi.Db/Repository/Implementation/UserRepository.cs b/SameApi/SameApi.Db/Repository/Implementation/UserRepository.cs index c381a88..c331eb0 100644 --- a/SameApi/SameApi.Db/Repository/Implementation/UserRepository.cs +++ b/SameApi/SameApi.Db/Repository/Implementation/UserRepository.cs @@ -1,13 +1,23 @@ -using SameApi.Data.Repository; +using Microsoft.EntityFrameworkCore; +using SameApi.Data.Repository; using SameApi.Db.DbContexts; using SameApi.Model; namespace SameApi.Db.Repository.Implementation { - class UserRepository : BaseRepository, IUserRepository + public class UserRepository : BaseRepository, IUserRepository { public UserRepository(IApiSameDbContext context) : base(context) + { } + public async Task> GetAllUsersAsync() { + + return await _context.Users + .Include(user => user.GenderDao) + .Include(user => user.SchoolDao) + .AsNoTracking() + .ToListAsync(); } } + } \ No newline at end of file diff --git a/SameApi/SameApi.Dto/GenderInput.cs b/SameApi/SameApi.Dto/GenderInput.cs index d0e14b9..0dabf33 100644 --- a/SameApi/SameApi.Dto/GenderInput.cs +++ b/SameApi/SameApi.Dto/GenderInput.cs @@ -3,6 +3,6 @@ public class GenderInput { public int Id { get; set; } - public string Name { get; set; } + public string? Name { get; set; } } } diff --git a/SameApi/SameApi.Dto/ProfessionInput.cs b/SameApi/SameApi.Dto/ProfessionInput.cs index 154e50b..9c07e98 100644 --- a/SameApi/SameApi.Dto/ProfessionInput.cs +++ b/SameApi/SameApi.Dto/ProfessionInput.cs @@ -3,6 +3,6 @@ public class ProfessionInput { public int Id { get; set; } - public string Name { get; set; } + public required string Name { get; set; } } } diff --git a/SameApi/SameApi.Dto/UserInput.cs b/SameApi/SameApi.Dto/UserInput.cs index e9ec804..f15d2cd 100644 --- a/SameApi/SameApi.Dto/UserInput.cs +++ b/SameApi/SameApi.Dto/UserInput.cs @@ -4,7 +4,9 @@ public class UserInput { public int Id { get; set; } public bool IsAdmin { get; set; } - public int Age { get; set; } + public DateTime? Birthday { get; set; } + public string? FirstName { get; set; } + public string? LastName { get; set; } public string? Pseudo { get; set; } public string? Email { get; set; } public string? Password { get; set; } diff --git a/SameApi/SameApi.Dto/UserResponse.cs b/SameApi/SameApi.Dto/UserResponse.cs index 836ba5a..81eed78 100644 --- a/SameApi/SameApi.Dto/UserResponse.cs +++ b/SameApi/SameApi.Dto/UserResponse.cs @@ -7,10 +7,8 @@ public class UserResponse public int Age { get; set; } public required string Pseudo { get; set; } public required string Email { get; set; } - public required string Password { get; set; } public int NumberFollowers { get; set; } public DateTime CreateAt { get; set; } - public int GenderId { get; set; } - public int? GenderDao { get; set; } + public GenderResponse? Gender { get; set; } } } \ No newline at end of file diff --git a/SameApi/SameApi.Model/LKP/LKP_GenderDao.cs b/SameApi/SameApi.Model/LKP/LKP_GenderDao.cs index f9353cd..9fc1551 100644 --- a/SameApi/SameApi.Model/LKP/LKP_GenderDao.cs +++ b/SameApi/SameApi.Model/LKP/LKP_GenderDao.cs @@ -9,6 +9,6 @@ public class LKP_GenderDao : IModelDao { [Key] public int Id { get; set; } - public string Name { get; set; } + public required string Name { get; set; } } } diff --git a/SameApi/SameApi.Model/UserDao.cs b/SameApi/SameApi.Model/UserDao.cs index 4a73eb1..b01fa14 100644 --- a/SameApi/SameApi.Model/UserDao.cs +++ b/SameApi/SameApi.Model/UserDao.cs @@ -12,7 +12,10 @@ public class UserDao : IModelDao public int Id { get; set; } public bool IsAdmin { get; set; } public int Age { get ; set; } + public DateTime? Birthday { get; set; } public required string Pseudo { get; set; } + public required string? FirstName { get; set; } + public required string? LastName { get; set; } public required string Email { get; set; } public required string Password { get; set; } public int NumberFollowers { get; set; } @@ -26,9 +29,5 @@ public class UserDao : IModelDao [ForeignKey("Same_Api_User_School")] public int id_school_fk { get; set; } public LKP_SchoolDao? SchoolDao { get; set; } - - [ForeignKey("Same_Api_User_Post")] - public int id_post_fk { get; set; } - public PostDao? PostDao { get; set; } } } \ No newline at end of file From 511103aa77e7295b86fe5f67697ef7e7ea2fdd1f Mon Sep 17 00:00:00 2001 From: Tisa_48 <130873934+Tisa40486@users.noreply.github.com> Date: Fri, 10 Oct 2025 09:57:46 +0200 Subject: [PATCH 47/77] update USER mld.md --- SameApi/MLD.md | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/SameApi/MLD.md b/SameApi/MLD.md index 320c90c..3a98533 100644 --- a/SameApi/MLD.md +++ b/SameApi/MLD.md @@ -2,25 +2,27 @@ ```mermaid erDiagram - USER || --o{ POST : "Make some" + USER || --o{ POST : "Make some"} - USER ||--o{ LKP_SCHOOL : "Be At" - POST ||--o{ TAGS : "Had" - POST ||--o{ COMMENT : "Comment" - LKP_SCHOOL ||--o{ LKP_PROFESSION : "Have Professions" - USER ||--o{ LKP_Gender : "Be" - TAGS ||--o{ LKP_TAG_REQUIRED : "Contain" - TAGS ||--o{ TAG_OPTIONAL : "Contain" - TAGS ||--o{ POST : "On" + USER ||--o{ LKP_SCHOOL : "Be At"} + POST ||--o{ TAGS : "Had"} + POST ||--o{ COMMENT : "Comment"} + LKP_SCHOOL ||--o{ LKP_PROFESSION : "Have Professions"} + USER ||--o{ LKP_Gender : "Be"} + TAGS ||--o{ LKP_TAG_REQUIRED : "Contain"} + TAGS ||--o{ TAG_OPTIONAL : "Contain"} + TAGS ||--o{ POST : "On"} USER { - int id_user + int id bool isadmin - int age + Datetime birthday + string firstName + string lastName string pseudo string email string password - int number_follow + int NumberFollowers datetime createAt int id_gender_fk int id_school_fk From 1b9f60c56193e21fd34b0ebeab7ae7c1254989db Mon Sep 17 00:00:00 2001 From: Tisa_48 <130873934+Tisa40486@users.noreply.github.com> Date: Fri, 10 Oct 2025 10:05:53 +0200 Subject: [PATCH 48/77] Update MLD.md --- SameApi/MLD.md | 117 ++++++++++++++++++++++++------------------------- 1 file changed, 57 insertions(+), 60 deletions(-) diff --git a/SameApi/MLD.md b/SameApi/MLD.md index 3a98533..72bba5b 100644 --- a/SameApi/MLD.md +++ b/SameApi/MLD.md @@ -1,84 +1,81 @@ -## Database Model - -```mermaid erDiagram - USER || --o{ POST : "Make some"} - - USER ||--o{ LKP_SCHOOL : "Be At"} - POST ||--o{ TAGS : "Had"} - POST ||--o{ COMMENT : "Comment"} - LKP_SCHOOL ||--o{ LKP_PROFESSION : "Have Professions"} - USER ||--o{ LKP_Gender : "Be"} - TAGS ||--o{ LKP_TAG_REQUIRED : "Contain"} - TAGS ||--o{ TAG_OPTIONAL : "Contain"} - TAGS ||--o{ POST : "On"} - USER { - int id - bool isadmin - Datetime birthday - string firstName - string lastName + int id PK string pseudo string email string password - int NumberFollowers - datetime createAt - int id_gender_fk - int id_school_fk - int id_post_fk + datetime birthday + datetime createdAt + int id_gender_fk FK + int id_school_fk FK } - LKP_Gender { - int id_gender - string gender + POST { + int id_post PK + string content + string img_url + datetime createdAt + int id_user_fk FK } - POST { - int id_post - string post - int id_comment - int like - string img - datetime createAt - int id_user - int id_tag_fk + COMMENT { + int id PK + string content + datetime createdAt + int id_user_fk FK + int id_post_fk FK } - TAGS { - int id_tag - datetime createAt - int id_post_fk - int id_tag_required_fk - int id_tag_optional_fk + POST_LIKE { + int id_user_fk PK,FK + int id_post_fk PK,FK } - LKP_TAG_REQUIRED{ - int id_tag_required - string tag_required + LKP_TAG { + int id_tag PK + string name + bool is_required } - TAG_OPTIONAL{ - int id_tag_optional - string tag_optional + POST_TAGS { + int id_post_fk PK,FK + int id_tag_fk PK,FK } LKP_SCHOOL { - int id_school + int id_school PK string name - int id_profession_fk } LKP_PROFESSION { - int id_profession - string name_profession + int id_profession PK + string name } - COMMENT { - int id - int postId - int id_user - string title - string content - datetime createdAt - } \ No newline at end of file + SCHOOL_PROFESSIONS { + int id_school_fk PK,FK + int id_profession_fk PK,FK + } + + LKP_Gender { + int id_gender PK + string name + } + + %% --- Relations --- + USER ||--|{ POST : "creates" + USER ||--|{ COMMENT : "writes" + USER ||--o{ LKP_Gender : "is of" + USER ||--o{ LKP_SCHOOL : "attends" + USER ||--o{ POST_LIKE : "likes" + + POST ||--|{ COMMENT : "has" + POST ||--o{ POST_LIKE : "is liked by" + + %% Many-to-many relationship for Tags + POST }o--|| POST_TAGS : "is tagged with" + POST_TAGS ||--o{ LKP_TAG : "uses tag" + + %% Many-to-many relationship for Professions + LKP_SCHOOL }o--|| SCHOOL_PROFESSIONS : "offers" + SCHOOL_PROFESSIONS ||--o{ LKP_PROFESSION : "is taught in" \ No newline at end of file From f2ed3a3ceb02d0a185cc09a55e73bc5d8cfa6d80 Mon Sep 17 00:00:00 2001 From: Tisa_48 <130873934+Tisa40486@users.noreply.github.com> Date: Fri, 10 Oct 2025 10:16:00 +0200 Subject: [PATCH 49/77] Update MLD.md --- SameApi/MLD.md | 115 ++++++++++++++++++++++++++----------------------- 1 file changed, 60 insertions(+), 55 deletions(-) diff --git a/SameApi/MLD.md b/SameApi/MLD.md index 72bba5b..1d48db4 100644 --- a/SameApi/MLD.md +++ b/SameApi/MLD.md @@ -1,81 +1,86 @@ -erDiagram +# Same Model DB + + USER || --o{ POST : "Make some" + + USER ||--o{ LKP_SCHOOL : "Be At" + POST ||--o{ TAGS : "Had" + POST ||--o{ COMMENT : "Comment" + LKP_SCHOOL ||--o{ LKP_PROFESSION : "Have Professions" + USER ||--o{ LKP_Gender : "Be" + TAGS ||--o{ LKP_TAG_REQUIRED : "Contain" + TAGS ||--o{ TAG_OPTIONAL : "Contain" + TAGS ||--o{ POST : "On" + USER { - int id PK + int id_user + bool isadmin + int age string pseudo string email string password - datetime birthday - datetime createdAt - int id_gender_fk FK - int id_school_fk FK + int number_follow + datetime createAt + int id_gender_fk + int id_school_fk + int id_post_fk } - POST { - int id_post PK - string content - string img_url - datetime createdAt - int id_user_fk FK + LKP_Gender { + int id_gender + string gender } - COMMENT { - int id PK - string content - datetime createdAt - int id_user_fk FK - int id_post_fk FK + POST { + int id_post + string post + int id_comment + int like + string img + datetime createAt + int id_user + int id_tag_fk } - POST_LIKE { - int id_user_fk PK,FK - int id_post_fk PK,FK + TAGS { + int id_tag + datetime createAt + int id_post_fk + int id_tag_required_fk + int id_tag_optional_fk } - LKP_TAG { - int id_tag PK - string name - bool is_required + LKP_TAG_REQUIRED{ + int id_tag_required + string tag_required } - POST_TAGS { - int id_post_fk PK,FK - int id_tag_fk PK,FK + TAG_OPTIONAL{ + int id_tag_optional + string tag_optional } LKP_SCHOOL { - int id_school PK + int id_school string name + int id_profession_fk } LKP_PROFESSION { - int id_profession PK - string name - } - - SCHOOL_PROFESSIONS { - int id_school_fk PK,FK - int id_profession_fk PK,FK + int id_profession + string name_profession } - LKP_Gender { - int id_gender PK - string name + COMMENT { + int id + int postId + int id_user + string title + string content + datetime createdAt } - %% --- Relations --- - USER ||--|{ POST : "creates" - USER ||--|{ COMMENT : "writes" - USER ||--o{ LKP_Gender : "is of" - USER ||--o{ LKP_SCHOOL : "attends" - USER ||--o{ POST_LIKE : "likes" - POST ||--|{ COMMENT : "has" - POST ||--o{ POST_LIKE : "is liked by" - - %% Many-to-many relationship for Tags - POST }o--|| POST_TAGS : "is tagged with" - POST_TAGS ||--o{ LKP_TAG : "uses tag" - - %% Many-to-many relationship for Professions - LKP_SCHOOL }o--|| SCHOOL_PROFESSIONS : "offers" - SCHOOL_PROFESSIONS ||--o{ LKP_PROFESSION : "is taught in" \ No newline at end of file +erDiagram + CUSTOMER ||--o{ ORDER : places + ORDER ||--|{ LINE-ITEM : contains + CUSTOMER }|..|{ DELIVERY-ADDRESS : uses From a5d9e2ffddd13bd13318f1330535f1fe98af68ea Mon Sep 17 00:00:00 2001 From: Tisa_48 <130873934+Tisa40486@users.noreply.github.com> Date: Fri, 10 Oct 2025 10:17:40 +0200 Subject: [PATCH 50/77] Update MLD.md --- SameApi/MLD.md | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/SameApi/MLD.md b/SameApi/MLD.md index 1d48db4..f0dd7f3 100644 --- a/SameApi/MLD.md +++ b/SameApi/MLD.md @@ -1,4 +1,5 @@ # Same Model DB +```mermaid USER || --o{ POST : "Make some" @@ -78,9 +79,4 @@ string content datetime createdAt } - - -erDiagram - CUSTOMER ||--o{ ORDER : places - ORDER ||--|{ LINE-ITEM : contains - CUSTOMER }|..|{ DELIVERY-ADDRESS : uses +``` From b2811c1d535caee88c4df39147a005dd42d880be Mon Sep 17 00:00:00 2001 From: Tisa_48 <130873934+Tisa40486@users.noreply.github.com> Date: Fri, 10 Oct 2025 10:19:03 +0200 Subject: [PATCH 51/77] Update MLD.md --- SameApi/MLD.md | 1 - 1 file changed, 1 deletion(-) diff --git a/SameApi/MLD.md b/SameApi/MLD.md index f0dd7f3..fc02955 100644 --- a/SameApi/MLD.md +++ b/SameApi/MLD.md @@ -2,7 +2,6 @@ ```mermaid USER || --o{ POST : "Make some" - USER ||--o{ LKP_SCHOOL : "Be At" POST ||--o{ TAGS : "Had" POST ||--o{ COMMENT : "Comment" From ef3d68664cdb846a439fd277f0998c2a971aeea0 Mon Sep 17 00:00:00 2001 From: Tisa_48 <130873934+Tisa40486@users.noreply.github.com> Date: Fri, 10 Oct 2025 10:20:46 +0200 Subject: [PATCH 52/77] Update MLD.md --- SameApi/MLD.md | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/SameApi/MLD.md b/SameApi/MLD.md index fc02955..84abdcf 100644 --- a/SameApi/MLD.md +++ b/SameApi/MLD.md @@ -1,6 +1,4 @@ -# Same Model DB -```mermaid - +erDiagram USER || --o{ POST : "Make some" USER ||--o{ LKP_SCHOOL : "Be At" POST ||--o{ TAGS : "Had" @@ -49,12 +47,12 @@ int id_tag_optional_fk } - LKP_TAG_REQUIRED{ + LKP_TAG_REQUIRED { int id_tag_required string tag_required } - TAG_OPTIONAL{ + TAG_OPTIONAL { int id_tag_optional string tag_optional } @@ -77,5 +75,4 @@ string title string content datetime createdAt - } -``` + } \ No newline at end of file From b9973eac0c87e90730c2161d6f21faf74838f137 Mon Sep 17 00:00:00 2001 From: Tisa_48 <130873934+Tisa40486@users.noreply.github.com> Date: Fri, 10 Oct 2025 10:22:44 +0200 Subject: [PATCH 53/77] Update MLD.md --- SameApi/MLD.md | 80 ++++---------------------------------------------- 1 file changed, 6 insertions(+), 74 deletions(-) diff --git a/SameApi/MLD.md b/SameApi/MLD.md index 84abdcf..3973098 100644 --- a/SameApi/MLD.md +++ b/SameApi/MLD.md @@ -1,78 +1,10 @@ erDiagram - USER || --o{ POST : "Make some" - USER ||--o{ LKP_SCHOOL : "Be At" - POST ||--o{ TAGS : "Had" - POST ||--o{ COMMENT : "Comment" - LKP_SCHOOL ||--o{ LKP_PROFESSION : "Have Professions" - USER ||--o{ LKP_Gender : "Be" - TAGS ||--o{ LKP_TAG_REQUIRED : "Contain" - TAGS ||--o{ TAG_OPTIONAL : "Contain" - TAGS ||--o{ POST : "On" - - USER { - int id_user - bool isadmin - int age - string pseudo - string email - string password - int number_follow - datetime createAt - int id_gender_fk - int id_school_fk - int id_post_fk - } - - LKP_Gender { - int id_gender - string gender - } - - POST { - int id_post - string post - int id_comment - int like - string img - datetime createAt - int id_user - int id_tag_fk - } - - TAGS { - int id_tag - datetime createAt - int id_post_fk - int id_tag_required_fk - int id_tag_optional_fk - } - - LKP_TAG_REQUIRED { - int id_tag_required - string tag_required - } - - TAG_OPTIONAL { - int id_tag_optional - string tag_optional - } - - LKP_SCHOOL { - int id_school - string name - int id_profession_fk - } - - LKP_PROFESSION { - int id_profession - string name_profession + CLIENT ||--o{ COMMANDE : passe + CLIENT { + int id + string nom } - - COMMENT { + COMMANDE { int id - int postId - int id_user - string title - string content - datetime createdAt + string date } \ No newline at end of file From 8efa690f46d7477d11ddbf39812027c9741bca81 Mon Sep 17 00:00:00 2001 From: Tisa_48 <130873934+Tisa40486@users.noreply.github.com> Date: Fri, 10 Oct 2025 10:23:53 +0200 Subject: [PATCH 54/77] Update MLD.md --- SameApi/MLD.md | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/SameApi/MLD.md b/SameApi/MLD.md index 3973098..ad9e6bf 100644 --- a/SameApi/MLD.md +++ b/SameApi/MLD.md @@ -1,10 +1,15 @@ +```mermaid erDiagram - CLIENT ||--o{ COMMANDE : passe - CLIENT { - int id + UTILISATEUR { + int id_utilisateur PK string nom + string email } COMMANDE { - int id - string date - } \ No newline at end of file + int id_commande PK + date date_commande + float total + int id_utilisateur FK + } + + UTILISATEUR ||--o{ COMMANDE : "passe" From 73bf68cc7ade30efe181eb5049446f992440681f Mon Sep 17 00:00:00 2001 From: Tisa_48 <130873934+Tisa40486@users.noreply.github.com> Date: Fri, 10 Oct 2025 10:26:29 +0200 Subject: [PATCH 55/77] Create User model MLD --- SameApi/MLD.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/SameApi/MLD.md b/SameApi/MLD.md index ad9e6bf..2372c98 100644 --- a/SameApi/MLD.md +++ b/SameApi/MLD.md @@ -1,15 +1,15 @@ ```mermaid erDiagram - UTILISATEUR { - int id_utilisateur PK - string nom - string email + User { + int id PK + bool isAdmin + DateTime Birthday + string firstName + string lastName + string Pseudo + string Email + string password + int NumberFollowers + DateTime CreateAt + int genderId FK } - COMMANDE { - int id_commande PK - date date_commande - float total - int id_utilisateur FK - } - - UTILISATEUR ||--o{ COMMANDE : "passe" From abecd6147a22bd6bbae18d3d3ed73c7e3ac59928 Mon Sep 17 00:00:00 2001 From: Tisa_48 <130873934+Tisa40486@users.noreply.github.com> Date: Fri, 10 Oct 2025 10:28:18 +0200 Subject: [PATCH 56/77] Update MLD.md --- SameApi/MLD.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/SameApi/MLD.md b/SameApi/MLD.md index 2372c98..cc22725 100644 --- a/SameApi/MLD.md +++ b/SameApi/MLD.md @@ -13,3 +13,11 @@ erDiagram DateTime CreateAt int genderId FK } + + Gender { + int id PK + string Name + } + + User ||--o{ Gender : "identify" + From 72e1c6334f218abb2f97072f0b7bb75b70086e50 Mon Sep 17 00:00:00 2001 From: Tisa_48 <130873934+Tisa40486@users.noreply.github.com> Date: Fri, 10 Oct 2025 10:30:31 +0200 Subject: [PATCH 57/77] Add profession and school --- SameApi/MLD.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/SameApi/MLD.md b/SameApi/MLD.md index cc22725..5cd4c61 100644 --- a/SameApi/MLD.md +++ b/SameApi/MLD.md @@ -19,5 +19,17 @@ erDiagram string Name } + School { + int id PK + string Name + int professionId FK + } + Profession { + int id PK + string Name + } + + User ||--o{ Gender : "identify" + School ||--o{ Profession : "Get Profession" From f2f68da075c03527a4a50ba2b49b77c4650d45b5 Mon Sep 17 00:00:00 2001 From: Tisa_48 <130873934+Tisa40486@users.noreply.github.com> Date: Fri, 10 Oct 2025 10:31:03 +0200 Subject: [PATCH 58/77] remove comment (im fucking stupid) --- SameApi/MLD.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SameApi/MLD.md b/SameApi/MLD.md index 5cd4c61..3e0b396 100644 --- a/SameApi/MLD.md +++ b/SameApi/MLD.md @@ -29,7 +29,7 @@ erDiagram string Name } - + User ||--o{ Gender : "identify" School ||--o{ Profession : "Get Profession" From 717df461e0dcd3e8a6bef32eb777bbe89233a064 Mon Sep 17 00:00:00 2001 From: Tisa_48 <130873934+Tisa40486@users.noreply.github.com> Date: Fri, 10 Oct 2025 10:33:40 +0200 Subject: [PATCH 59/77] add School to user --- SameApi/MLD.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/SameApi/MLD.md b/SameApi/MLD.md index 3e0b396..58b5ef5 100644 --- a/SameApi/MLD.md +++ b/SameApi/MLD.md @@ -12,6 +12,7 @@ erDiagram int NumberFollowers DateTime CreateAt int genderId FK + int schoolId FK } Gender { @@ -31,5 +32,6 @@ erDiagram User ||--o{ Gender : "identify" + User ||--o{ School : "at" School ||--o{ Profession : "Get Profession" From b02e2c3ea97ac04ed66c053f34c44533bd7324ff Mon Sep 17 00:00:00 2001 From: Tisa_48 <130873934+Tisa40486@users.noreply.github.com> Date: Fri, 10 Oct 2025 10:38:29 +0200 Subject: [PATCH 60/77] add Post --- SameApi/MLD.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/SameApi/MLD.md b/SameApi/MLD.md index 58b5ef5..b4c2042 100644 --- a/SameApi/MLD.md +++ b/SameApi/MLD.md @@ -14,6 +14,9 @@ erDiagram int genderId FK int schoolId FK } + Post { + int id PK + } Gender { int id PK @@ -25,6 +28,7 @@ erDiagram string Name int professionId FK } + Profession { int id PK string Name From f32fca3d5c66b6312e0a7c24166f514a0a967b48 Mon Sep 17 00:00:00 2001 From: aleksa Date: Fri, 10 Oct 2025 11:12:22 +0200 Subject: [PATCH 61/77] Add files via upload --- use-case-same.uxf | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 use-case-same.uxf diff --git a/use-case-same.uxf b/use-case-same.uxf new file mode 100644 index 0000000..b22406b --- /dev/null +++ b/use-case-same.uxf @@ -0,0 +1,29 @@ +10UMLActor15627060110ActorUMLGeneric246160680730System +halign=leftUMLUseCase24618012040Sign UpUMLUseCase25623012040School configUMLUseCase26628012040loginUMLUseCase26635012040read postUMLUseCase26640013050interactif with postsUMLUseCase26649013050create postsUMLUseCase466170320130- username +- first name +- last name +- email +- birthdate +- password +- passoword confirmationRelation35619013060lt=.> +<<includes>>10;10;110;40UMLUseCase45635012040Filter by tagsRelation37635010040lt=.> +<<extends>>10;20;80;20UMLUseCase45641012040- like +- commentRelation3864009050lt=.> +<<extends>>10;20;70;30UMLUseCase67642015040- identify people (@) +- imgRelation55642014040lt=.> +<<extends>>10;20;120;20UMLUseCase66637015040- body (text)Relation56638012060lt=.> +<<includes>>10;40;100;10UMLUseCase43646015060- title +- option tags +- imgRelation3864807050lt=.> +<<extends>>10;30;50;10UMLUseCase53651023070- required tag (ex: advise, story, ..) +- auto tags ( username, school )Relation36651019050lt=.> +<<includes>>10;20;170;30Relation176290904010;20;70;20UMLUseCase27655012040customise profilUMLUseCase50658012040- change user ppRelation38656014060lt=.> +<<includes>>10;10;120;40UMLUseCase26663025070- make first / last name public +( look by everybody ) +- add pronouns +- add bioRelation3365809070lt=.> +<<extends>>10;10;10;50UMLUseCase26671012040email vérificationUMLUseCase47671012040- recive a tokkenRelation37671012040lt=.> +<<includes>>10;20;100;20UMLActor115620060110AdminUMLUseCase139620021080post regulationRelation11762202404010;20;220;20UMLUseCase171617015040- manuel regulationRelation158618015060lt=.> +<<extends>>10;40;130;10UMLUseCase172623014050- AI regulation +- API regulationRelation159022016050lt=.> +<<includes>>10;20;140;30 \ No newline at end of file From 65bb5600637266cc019755a4096120811aa57465 Mon Sep 17 00:00:00 2001 From: Tisa_48 <130873934+Tisa40486@users.noreply.github.com> Date: Fri, 10 Oct 2025 15:00:26 +0200 Subject: [PATCH 62/77] Add or update the Azure App Service build and deployment workflow config --- .github/workflows/dev_sameapi.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/dev_sameapi.yml b/.github/workflows/dev_sameapi.yml index 48fca39..ad5cabe 100644 --- a/.github/workflows/dev_sameapi.yml +++ b/.github/workflows/dev_sameapi.yml @@ -1,7 +1,7 @@ # Docs for the Azure Web Apps Deploy action: https://github.com/Azure/webapps-deploy # More GitHub Actions for Azure: https://github.com/Azure/actions -name: Build and deploy ASP.Net Core app to Azure Web App - SameApi +name: Build and deploy ASP.Net Core app to Azure Web App - SameAPi on: push: @@ -51,15 +51,15 @@ jobs: - name: Login to Azure uses: azure/login@v2 with: - client-id: ${{ secrets.AZUREAPPSERVICE_CLIENTID_7532D2BA3F0B4806A4A1CBF64821E21C }} - tenant-id: ${{ secrets.AZUREAPPSERVICE_TENANTID_99D3B1FED422474FBC922D21AF89B6C6 }} - subscription-id: ${{ secrets.AZUREAPPSERVICE_SUBSCRIPTIONID_CCFB6879FAB3433182EA31F9BD5B41AA }} + client-id: ${{ secrets.AZUREAPPSERVICE_CLIENTID_938348F187564C3B99EEAC07B33A32D3 }} + tenant-id: ${{ secrets.AZUREAPPSERVICE_TENANTID_1A1588C4745F4A6184A185515AFE4962 }} + subscription-id: ${{ secrets.AZUREAPPSERVICE_SUBSCRIPTIONID_D411945B807644A188726D8FE6F26A7A }} - name: Deploy to Azure Web App id: deploy-to-webapp uses: azure/webapps-deploy@v3 with: - app-name: 'SameApi' + app-name: 'SameAPi' slot-name: 'Production' package: . \ No newline at end of file From 78d0b3aae65f4e5cf865941ea6768048a7cd1fd6 Mon Sep 17 00:00:00 2001 From: Tisa_48 <130873934+Tisa40486@users.noreply.github.com> Date: Fri, 10 Oct 2025 15:08:22 +0200 Subject: [PATCH 63/77] deploiement test --- .../SameApiModel20251010150345.pubxml | 19 +++++++++++++++++++ SameApi/SameApi.Model/SameApi.Model.csproj | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 SameApi/SameApi.Model/Properties/PublishProfiles/SameApiModel20251010150345.pubxml diff --git a/SameApi/SameApi.Model/Properties/PublishProfiles/SameApiModel20251010150345.pubxml b/SameApi/SameApi.Model/Properties/PublishProfiles/SameApiModel20251010150345.pubxml new file mode 100644 index 0000000..c46d2b2 --- /dev/null +++ b/SameApi/SameApi.Model/Properties/PublishProfiles/SameApiModel20251010150345.pubxml @@ -0,0 +1,19 @@ + + + + + Container + ContainerRegistry + NetSdk + /subscriptions/19bef6f3-1177-40ab-b901-ca08203ef74a/resourcegroups/DefaultResourceGroup-CHN/providers/Microsoft.ContainerRegistry/registries/SameApiModel20251010150345 + SameApiModel20251010150345 + DefaultResourceGroup-CHN + Same Azure Credit + sameapimodel20251010150345.azurecr.io + latest + Release + Any CPU + linux-x64 + <_TargetId>NetSdkAzureConsoleContainerRegistry + + \ No newline at end of file diff --git a/SameApi/SameApi.Model/SameApi.Model.csproj b/SameApi/SameApi.Model/SameApi.Model.csproj index 776ab7f..e33df25 100644 --- a/SameApi/SameApi.Model/SameApi.Model.csproj +++ b/SameApi/SameApi.Model/SameApi.Model.csproj @@ -1,4 +1,4 @@ - + net9.0 From 9db98e332540a1dd7b28868284e1d20aaae8976b Mon Sep 17 00:00:00 2001 From: Tisa_48 <130873934+Tisa40486@users.noreply.github.com> Date: Fri, 10 Oct 2025 15:31:35 +0200 Subject: [PATCH 64/77] depoliement test 1 --- .github/workflows/SameApi.yml | 75 ---------- .github/workflows/dev_sameapi.yml | 65 --------- .../SameApi/apis1.arm.json | 132 ------------------ .../serviceDependencies.SameApi.json | 8 -- 4 files changed, 280 deletions(-) delete mode 100644 .github/workflows/SameApi.yml delete mode 100644 .github/workflows/dev_sameapi.yml delete mode 100644 SameApi/SameApi.App/Properties/ServiceDependencies/SameApi/apis1.arm.json delete mode 100644 SameApi/SameApi.App/Properties/serviceDependencies.SameApi.json diff --git a/.github/workflows/SameApi.yml b/.github/workflows/SameApi.yml deleted file mode 100644 index 7bd8249..0000000 --- a/.github/workflows/SameApi.yml +++ /dev/null @@ -1,75 +0,0 @@ -name: Générer et déployer une application .NET Core sur l'application web SameApi avec le service Gestion des API SameApi-SameApiApp -on: - push: - branches: - - dev -env: - AZURE_WEBAPP_NAME: SameApi - AZURE_WEBAPP_PACKAGE_PATH: SameApi.App\publish - AZURE_APIM_RESOURCE_PATH: / - AZURE_APIM_RESOURCEGROUP: SameApi_group - AZURE_APIM_SERVICENAME: SameApi - AZURE_APIM_API_ID: SameApiApp - AZURE_APIM_APPSERVICEURL: https://sameapi-g7bbcfcnhchtfydq.francecentral-01.azurewebsites.net - SWASHBUCLE_ASPNET_CORE_CLI_PACKAGE_VERSION: 5.6.3 - SWASHBUCKLE_DOTNET_CORE_VERSION: 3.1.x - API_IMPORT_SPECIFICATION_PATH: SameApi.App\publish\swagger.json - API_IMPORT_DLL: SameApi.App\bin\Release\net9.0\SameApi.App.dll - API_IMPORT_VERSION: v1 - CONFIGURATION: Release - DOTNET_CORE_VERSION: 9.0.x - WORKING_DIRECTORY: SameApi.App -jobs: - build: - runs-on: windows-latest - steps: - - uses: actions/checkout@v4 - - name: Setup .NET SDK - uses: actions/setup-dotnet@v4 - with: - dotnet-version: ${{ env.DOTNET_CORE_VERSION }} - - name: Setup SwashBuckle .NET Core - uses: actions/setup-dotnet@v4 - with: - dotnet-version: ${{ env.SWASHBUCKLE_DOTNET_CORE_VERSION }} - - name: Restore - run: dotnet restore ${{ env.WORKING_DIRECTORY }} - - name: Build - run: dotnet build ${{ env.WORKING_DIRECTORY }} --configuration ${{ env.CONFIGURATION }} --no-restore - - name: Test - run: dotnet test ${{ env.WORKING_DIRECTORY }} --no-build - - name: Publish - run: dotnet publish ${{ env.WORKING_DIRECTORY }} --configuration ${{ env.CONFIGURATION }} --no-build --output ${{ env.AZURE_WEBAPP_PACKAGE_PATH }} - - name: Install Swashbuckle CLI .NET Global Tool - run: dotnet tool install --global Swashbuckle.AspNetCore.Cli --version ${{ env.SWASHBUCLE_ASPNET_CORE_CLI_PACKAGE_VERSION }} - working-directory: ${{ env.WORKING_DIRECTORY }} - - name: Generate Open API Specification Document - run: swagger tofile --output "${{ env.API_IMPORT_SPECIFICATION_PATH }}" "${{ env.API_IMPORT_DLL }}" "${{ env.API_IMPORT_VERSION }}" - - name: Publish Artifacts - uses: actions/upload-artifact@v4 - with: - name: webapp - path: ${{ env.AZURE_WEBAPP_PACKAGE_PATH }} - deploy: - runs-on: windows-latest - needs: build - steps: - - name: Download artifact from build job - uses: actions/download-artifact@v4 - with: - name: webapp - path: ${{ env.AZURE_WEBAPP_PACKAGE_PATH }} - - name: Azure Login - uses: azure/login@v2 - with: - creds: ${{ secrets.SameApi_SPN }} - - name: Deploy to Azure WebApp - uses: azure/webapps-deploy@v2 - with: - app-name: ${{ env.AZURE_WEBAPP_NAME }} - package: ${{ env.AZURE_WEBAPP_PACKAGE_PATH }} - - name: Import API into Azure API Management - run: az apim api import --path "${{ env.AZURE_APIM_RESOURCE_PATH }}" --resource-group "${{ env.AZURE_APIM_RESOURCEGROUP }}" --service-name "${{ env.AZURE_APIM_SERVICENAME }}" --api-id "${{ env.AZURE_APIM_API_ID }}" --service-url "${{ env.AZURE_APIM_APPSERVICEURL }}" --specification-path "${{ env.API_IMPORT_SPECIFICATION_PATH }}" --specification-format OpenApi --subscription-required false - - name: logout - run: > - az logout diff --git a/.github/workflows/dev_sameapi.yml b/.github/workflows/dev_sameapi.yml deleted file mode 100644 index ad5cabe..0000000 --- a/.github/workflows/dev_sameapi.yml +++ /dev/null @@ -1,65 +0,0 @@ -# Docs for the Azure Web Apps Deploy action: https://github.com/Azure/webapps-deploy -# More GitHub Actions for Azure: https://github.com/Azure/actions - -name: Build and deploy ASP.Net Core app to Azure Web App - SameAPi - -on: - push: - branches: - - dev - workflow_dispatch: - -jobs: - build: - runs-on: windows-latest - permissions: - contents: read #This is required for actions/checkout - - steps: - - uses: actions/checkout@v4 - - - name: Set up .NET Core - uses: actions/setup-dotnet@v4 - with: - dotnet-version: '9.x' - - - name: Build with dotnet - run: dotnet build --configuration Release - - - name: dotnet publish - run: dotnet publish -c Release -o "${{env.DOTNET_ROOT}}/myapp" - - - name: Upload artifact for deployment job - uses: actions/upload-artifact@v4 - with: - name: .net-app - path: ${{env.DOTNET_ROOT}}/myapp - - deploy: - runs-on: windows-latest - needs: build - permissions: - id-token: write #This is required for requesting the JWT - contents: read #This is required for actions/checkout - - steps: - - name: Download artifact from build job - uses: actions/download-artifact@v4 - with: - name: .net-app - - - name: Login to Azure - uses: azure/login@v2 - with: - client-id: ${{ secrets.AZUREAPPSERVICE_CLIENTID_938348F187564C3B99EEAC07B33A32D3 }} - tenant-id: ${{ secrets.AZUREAPPSERVICE_TENANTID_1A1588C4745F4A6184A185515AFE4962 }} - subscription-id: ${{ secrets.AZUREAPPSERVICE_SUBSCRIPTIONID_D411945B807644A188726D8FE6F26A7A }} - - - name: Deploy to Azure Web App - id: deploy-to-webapp - uses: azure/webapps-deploy@v3 - with: - app-name: 'SameAPi' - slot-name: 'Production' - package: . - \ No newline at end of file diff --git a/SameApi/SameApi.App/Properties/ServiceDependencies/SameApi/apis1.arm.json b/SameApi/SameApi.App/Properties/ServiceDependencies/SameApi/apis1.arm.json deleted file mode 100644 index 08bb202..0000000 --- a/SameApi/SameApi.App/Properties/ServiceDependencies/SameApi/apis1.arm.json +++ /dev/null @@ -1,132 +0,0 @@ -{ - "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#", - "contentVersion": "1.0.0.0", - "parameters": { - "resourceGroupName": { - "type": "string", - "defaultValue": "SameApi_group", - "metadata": { - "_parameterType": "resourceGroup", - "description": "Nom du groupe de ressources de la ressource. Il est recommandé de placer les ressources sous le même groupe de ressources pour un meilleur suivi." - } - }, - "resourceGroupLocation": { - "type": "string", - "defaultValue": "francecentral", - "metadata": { - "_parameterType": "location", - "description": "Emplacement du groupe de ressources. Les groupes de ressources peuvent avoir un emplacement différent de celui des ressources." - } - }, - "resourceLocation": { - "type": "string", - "defaultValue": "[parameters('resourceGroupLocation')]", - "metadata": { - "_parameterType": "location", - "description": "Emplacement de la ressource. Par défaut, utilisez l'emplacement du groupe de ressources, sauf s'il ne prend pas en charge le fournisseur de ressources." - } - } - }, - "resources": [ - { - "type": "Microsoft.Resources/resourceGroups", - "name": "[parameters('resourceGroupName')]", - "location": "[parameters('resourceGroupLocation')]", - "apiVersion": "2019-10-01" - }, - { - "type": "Microsoft.Resources/deployments", - "name": "[concat(parameters('resourceGroupName'), 'Deployment', uniqueString(concat('SameApiApp', subscription().subscriptionId)))]", - "resourceGroup": "[parameters('resourceGroupName')]", - "apiVersion": "2019-10-01", - "dependsOn": [ - "[parameters('resourceGroupName')]" - ], - "properties": { - "mode": "Incremental", - "template": { - "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", - "contentVersion": "1.0.0.0", - "resources": [ - { - "name": "SameApi", - "type": "Microsoft.ApiManagement/service", - "location": "[parameters('resourceLocation')]", - "properties": { - "publisherEmail": "same@same.school", - "publisherName": "Same", - "notificationSenderEmail": "apimgmt-noreply@mail.windowsazure.com", - "hostnameConfigurations": [ - { - "type": "Proxy", - "hostName": "sameapi.azure-api.net", - "encodedCertificate": null, - "keyVaultId": null, - "certificatePassword": null, - "negotiateClientCertificate": false, - "certificate": null, - "defaultSslBinding": true - } - ], - "publicIPAddresses": null, - "privateIPAddresses": null, - "additionalLocations": null, - "virtualNetworkConfiguration": null, - "customProperties": { - "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Protocols.Tls10": "False", - "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Protocols.Tls11": "False", - "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Backend.Protocols.Tls10": "False", - "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Backend.Protocols.Tls11": "False", - "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Backend.Protocols.Ssl30": "False", - "Microsoft.WindowsAzure.ApiManagement.Gateway.Protocols.Server.Http2": "False" - }, - "virtualNetworkType": "None", - "certificates": null, - "disableGateway": false, - "apiVersionConstraint": { - "minApiVersion": null - } - }, - "sku": { - "name": "Consumption", - "capacity": 0 - }, - "apiVersion": "2019-12-01" - }, - { - "type": "Microsoft.ApiManagement/service/apis", - "name": "SameApi/SameApiApp", - "properties": { - "displayName": "SameApiApp", - "apiRevision": "1", - "description": null, - "subscriptionRequired": true, - "serviceUrl": null, - "path": "", - "protocols": [ - "https" - ], - "authenticationSettings": { - "oAuth2": null, - "openid": null - }, - "subscriptionKeyParameterNames": { - "header": "Ocp-Apim-Subscription-Key", - "query": "subscription-key" - }, - "isCurrent": true - }, - "apiVersion": "2019-12-01", - "dependsOn": [ - "SameApi" - ] - } - ] - } - } - } - ], - "metadata": { - "_dependencyType": "apis.azure" - } -} \ No newline at end of file diff --git a/SameApi/SameApi.App/Properties/serviceDependencies.SameApi.json b/SameApi/SameApi.App/Properties/serviceDependencies.SameApi.json deleted file mode 100644 index fd8de4d..0000000 --- a/SameApi/SameApi.App/Properties/serviceDependencies.SameApi.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "dependencies": { - "apis1": { - "resourceId": "/subscriptions/[parameters('subscriptionId')]/resourceGroups/[parameters('resourceGroupName')]/providers/Microsoft.ApiManagement/service/SameApi/apis/SameApiApp", - "type": "apis.azure" - } - } -} \ No newline at end of file From d41446ac0ebd20482d1d04723917808cc66513e5 Mon Sep 17 00:00:00 2001 From: Tisa_48 <130873934+Tisa40486@users.noreply.github.com> Date: Fri, 10 Oct 2025 15:42:52 +0200 Subject: [PATCH 65/77] Create Apibuild.yml --- .github/workflows/Apibuild.yml | 37 ++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 .github/workflows/Apibuild.yml diff --git a/.github/workflows/Apibuild.yml b/.github/workflows/Apibuild.yml new file mode 100644 index 0000000..196571b --- /dev/null +++ b/.github/workflows/Apibuild.yml @@ -0,0 +1,37 @@ +name: Build and Publish .NET API + +on: + push: + branches: [ "dev" ] # Se déclenche quand vous poussez sur la branche 'dev' + workflow_dispatch: + +jobs: + build-and-publish: + runs-on: ubuntu-latest + + steps: + # 1. Récupère le code de votre dépôt + - name: Checkout repository + uses: actions/checkout@v3 + + # 2. Installe la bonne version de .NET + - name: Setup .NET + uses: actions/setup-dotnet@v3 + with: + # IMPORTANT : Modifiez cette ligne pour correspondre à la version de votre projet ! + # (Ex: '6.0.x', '7.0.x', '8.0.x') + dotnet-version: '6.0.x' + + # 3. Restaure les dépendances en ciblant votre fichier .sln + - name: Restore dependencies + run: dotnet restore SameApi.sln + + # 4. Compile le projet en mode Release + - name: Build + run: dotnet build SameApi.sln --configuration Release --no-restore + + # 5. Publie l'API (prépare les fichiers pour le déploiement) + - name: Publish + run: dotnet publish ./SameApi/SameApi.App/SameApi.App.csproj -c Release -o ./publish + # ATTENTION : Vérifiez que le chemin vers votre projet API (.csproj) est correct. + # D'après votre screenshot, il s'agit probablement de "SameApi.App". \ No newline at end of file From 6df91af2242e36d23c1a65812b55e10d7fc403f5 Mon Sep 17 00:00:00 2001 From: Tisa_48 <130873934+Tisa40486@users.noreply.github.com> Date: Fri, 10 Oct 2025 15:44:58 +0200 Subject: [PATCH 66/77] Update Apibuild.yml --- .github/workflows/Apibuild.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/Apibuild.yml b/.github/workflows/Apibuild.yml index 196571b..1a37689 100644 --- a/.github/workflows/Apibuild.yml +++ b/.github/workflows/Apibuild.yml @@ -14,13 +14,16 @@ jobs: - name: Checkout repository uses: actions/checkout@v3 + - name: List files in the repository + run: ls -R + # 2. Installe la bonne version de .NET - name: Setup .NET uses: actions/setup-dotnet@v3 with: # IMPORTANT : Modifiez cette ligne pour correspondre à la version de votre projet ! # (Ex: '6.0.x', '7.0.x', '8.0.x') - dotnet-version: '6.0.x' + dotnet-version: '9.0.x' # 3. Restaure les dépendances en ciblant votre fichier .sln - name: Restore dependencies From 3c038a5d8ee6b566012bf61b10c824be12c59da9 Mon Sep 17 00:00:00 2001 From: Tisa_48 <130873934+Tisa40486@users.noreply.github.com> Date: Fri, 10 Oct 2025 15:50:12 +0200 Subject: [PATCH 67/77] Create main.yml --- .github/workflows/main.yml | 63 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 .github/workflows/main.yml diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..4dc3637 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,63 @@ +# Nom du workflow qui apparaîtra dans l'onglet "Actions" de GitHub +name: Build and Deploy .NET API to Azure + +# Déclenche le workflow à chaque push sur la branche "dev" +on: + push: + branches: [ "dev" ] + workflow_dispatch: + +jobs: + # PREMIER JOB : Construit l'application + build: + runs-on: ubuntu-latest + + steps: + # Étape 1 : Récupère le code de votre dépôt + - name: Checkout repository + uses: actions/checkout@v4 + + # Étape 2 : Configure l'environnement .NET + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + # --- MODIFIEZ ICI --- + # Mettez la version de .NET de votre projet (ex: '6.0.x', '8.0.x') + dotnet-version: '9.0.x' + + # Étape 3 : Restaure les dépendances, compile et publie le projet + - name: Build and publish + run: | + dotnet restore SameApi.sln + dotnet build SameApi.sln --configuration Release --no-restore + dotnet publish ./SameApi/SameApi.App/SameApi.App.csproj -c Release -o ./publish + + # Étape 4 : Archive les fichiers publiés pour le job de déploiement + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: api-app + path: ./publish + + # DEUXIÈME JOB : Déploie l'application sur Azure + deploy: + runs-on: ubuntu-latest + needs: build # Ce job ne démarre que si le job "build" a réussi + + steps: + # Étape 1 : Télécharge les fichiers archivés par le job "build" + - name: Download a Build Artifact + uses: actions/download-artifact@v4 + with: + name: api-app + + # Étape 2 : Déploie sur Azure App Service + - name: Deploy to Azure Web App + uses: azure/webapps-deploy@v2 + with: + # --- MODIFIEZ ICI --- + # Mettez le nom de votre App Service créé sur Azure + app-name: 'SameAPi' + + # Utilise le secret que vous avez configuré dans les paramètres GitHub + publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }} \ No newline at end of file From 068f81cdcc02b222ce836a3a4dd3bf2eebfdbb2b Mon Sep 17 00:00:00 2001 From: Tisa_48 <130873934+Tisa40486@users.noreply.github.com> Date: Fri, 10 Oct 2025 15:53:03 +0200 Subject: [PATCH 68/77] Update main.yml --- .github/workflows/main.yml | 63 ++++++++------------------------------ 1 file changed, 13 insertions(+), 50 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 4dc3637..46ed735 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,63 +1,26 @@ -# Nom du workflow qui apparaîtra dans l'onglet "Actions" de GitHub -name: Build and Deploy .NET API to Azure +# Nom du workflow de débogage +name: DEBUG - Find Project File Path -# Déclenche le workflow à chaque push sur la branche "dev" on: push: branches: [ "dev" ] workflow_dispatch: jobs: - # PREMIER JOB : Construit l'application - build: + debug-file-paths: runs-on: ubuntu-latest - steps: - # Étape 1 : Récupère le code de votre dépôt + # Étape 1 : Récupère le code - name: Checkout repository uses: actions/checkout@v4 - # Étape 2 : Configure l'environnement .NET - - name: Setup .NET - uses: actions/setup-dotnet@v4 - with: - # --- MODIFIEZ ICI --- - # Mettez la version de .NET de votre projet (ex: '6.0.x', '8.0.x') - dotnet-version: '9.0.x' - - # Étape 3 : Restaure les dépendances, compile et publie le projet - - name: Build and publish + # Étape 2 : Affiche tous les fichiers et dossiers + - name: List all files to find the solution run: | - dotnet restore SameApi.sln - dotnet build SameApi.sln --configuration Release --no-restore - dotnet publish ./SameApi/SameApi.App/SameApi.App.csproj -c Release -o ./publish - - # Étape 4 : Archive les fichiers publiés pour le job de déploiement - - name: Upload artifact - uses: actions/upload-artifact@v4 - with: - name: api-app - path: ./publish - - # DEUXIÈME JOB : Déploie l'application sur Azure - deploy: - runs-on: ubuntu-latest - needs: build # Ce job ne démarre que si le job "build" a réussi - - steps: - # Étape 1 : Télécharge les fichiers archivés par le job "build" - - name: Download a Build Artifact - uses: actions/download-artifact@v4 - with: - name: api-app - - # Étape 2 : Déploie sur Azure App Service - - name: Deploy to Azure Web App - uses: azure/webapps-deploy@v2 - with: - # --- MODIFIEZ ICI --- - # Mettez le nom de votre App Service créé sur Azure - app-name: 'SameAPi' - - # Utilise le secret que vous avez configuré dans les paramètres GitHub - publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }} \ No newline at end of file + echo "=================================================" + echo "Listing all files in the repository..." + ls -R + echo "=================================================" + echo "Find the path to your 'SameApi.sln' file in the list above." + echo "The workflow will now stop intentionally for debugging." + exit 1 # Cette commande arrête le workflow exprès \ No newline at end of file From a603815f5eef1212568a5ac2a414e62230bdd14a Mon Sep 17 00:00:00 2001 From: Tisa_48 <130873934+Tisa40486@users.noreply.github.com> Date: Fri, 10 Oct 2025 15:54:16 +0200 Subject: [PATCH 69/77] Update main.yml --- .github/workflows/main.yml | 63 ++++++++++++++++++++++++++++++-------- 1 file changed, 50 insertions(+), 13 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 46ed735..2d27ce2 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,26 +1,63 @@ -# Nom du workflow de débogage -name: DEBUG - Find Project File Path +# Nom du workflow qui apparaîtra dans l'onglet "Actions" de GitHub +name: Build and Deploy .NET API to Azure +# Déclenche le workflow à chaque push sur la branche "dev" on: push: branches: [ "dev" ] workflow_dispatch: jobs: - debug-file-paths: + # PREMIER JOB : Construit l'application + build: runs-on: ubuntu-latest + steps: - # Étape 1 : Récupère le code + # Étape 1 : Récupère le code de votre dépôt - name: Checkout repository uses: actions/checkout@v4 - # Étape 2 : Affiche tous les fichiers et dossiers - - name: List all files to find the solution + # Étape 2 : Configure l'environnement .NET + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + # --- MODIFIEZ ICI --- + # Mettez la version de .NET de votre projet (ex: '6.0.x', '8.0.x') + dotnet-version: '8.0.x' + + # Étape 3 : Restaure les dépendances, compile et publie le projet + - name: Build and publish run: | - echo "=================================================" - echo "Listing all files in the repository..." - ls -R - echo "=================================================" - echo "Find the path to your 'SameApi.sln' file in the list above." - echo "The workflow will now stop intentionally for debugging." - exit 1 # Cette commande arrête le workflow exprès \ No newline at end of file + dotnet restore ./SameApi/SameApi.sln + dotnet build ./SameApi/SameApi.sln --configuration Release --no-restore + dotnet publish ./SameApi/SameApi.App/SameApi.App.csproj -c Release -o ./publish + + # Étape 4 : Archive les fichiers publiés pour le job de déploiement + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: api-app + path: ./publish + + # DEUXIÈME JOB : Déploie l'application sur Azure + deploy: + runs-on: ubuntu-latest + needs: build # Ce job ne démarre que si le job "build" a réussi + + steps: + # Étape 1 : Télécharge les fichiers archivés par le job "build" + - name: Download a Build Artifact + uses: actions/download-artifact@v4 + with: + name: api-app + + # Étape 2 : Déploie sur Azure App Service + - name: Deploy to Azure Web App + uses: azure/webapps-deploy@v2 + with: + # --- MODIFIEZ ICI --- + # Mettez le nom de votre App Service créé sur Azure + app-name: 'SameAPi' + + # Utilise le secret que vous avez configuré dans les paramètres GitHub + publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }} \ No newline at end of file From 9caaf10edf66ef869ac349acc970d6549c9f0f0a Mon Sep 17 00:00:00 2001 From: Tisa_48 <130873934+Tisa40486@users.noreply.github.com> Date: Fri, 10 Oct 2025 15:58:29 +0200 Subject: [PATCH 70/77] Update main.yml --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 2d27ce2..19b2258 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -23,7 +23,7 @@ jobs: with: # --- MODIFIEZ ICI --- # Mettez la version de .NET de votre projet (ex: '6.0.x', '8.0.x') - dotnet-version: '8.0.x' + dotnet-version: '9.0.x' # Étape 3 : Restaure les dépendances, compile et publie le projet - name: Build and publish From a2a6d67c4574842a3b3949d72b0514c1484e07aa Mon Sep 17 00:00:00 2001 From: Mattis Date: Fri, 17 Oct 2025 11:32:20 +0200 Subject: [PATCH 71/77] add school repo --- .../Controllers/AdminController.cs | 2 ++ .../SameApi.App/Controllers/UserController.cs | 4 +++- .../Repository/ISchoolRepository.cs | 11 ++++++++++ .../Implementation/SchoolRepository.cs | 22 +++++++++++++++++++ 4 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 SameApi/SameApi.Db/Repository/ISchoolRepository.cs create mode 100644 SameApi/SameApi.Db/Repository/Implementation/SchoolRepository.cs diff --git a/SameApi/SameApi.App/Controllers/AdminController.cs b/SameApi/SameApi.App/Controllers/AdminController.cs index 9e45a4d..187ae7b 100644 --- a/SameApi/SameApi.App/Controllers/AdminController.cs +++ b/SameApi/SameApi.App/Controllers/AdminController.cs @@ -35,11 +35,13 @@ public async Task CreateGenderAsync([FromBody] CreateGenderCommand command) { await _mediator.Send(command); } + [HttpDelete("Gender")] public async Task DeleteGenderAsync([FromQuery] int id) { await _mediator.Send(new DeleteGenderCommand { Id = id }); } + [HttpPost("profession")] public async Task CreateProfessionAsync([FromBody] CreateProfessionCommand command) { diff --git a/SameApi/SameApi.App/Controllers/UserController.cs b/SameApi/SameApi.App/Controllers/UserController.cs index 47257b9..898239e 100644 --- a/SameApi/SameApi.App/Controllers/UserController.cs +++ b/SameApi/SameApi.App/Controllers/UserController.cs @@ -18,6 +18,7 @@ public UserController(IMediator mediator) { _mediator = mediator; } + [HttpGet("{id}")] public async Task> GetByIdAsync(int id) { @@ -25,11 +26,12 @@ public UserController(IMediator mediator) return Ok(result); } + [HttpGet("getAll")] public async Task>> GetAllAsync() { var result = await _mediator.Send(new GetAllUserQuery()); - return Ok(result); + return Ok(result); } [HttpPost] diff --git a/SameApi/SameApi.Db/Repository/ISchoolRepository.cs b/SameApi/SameApi.Db/Repository/ISchoolRepository.cs new file mode 100644 index 0000000..8009cdb --- /dev/null +++ b/SameApi/SameApi.Db/Repository/ISchoolRepository.cs @@ -0,0 +1,11 @@ +using Microsoft.EntityFrameworkCore; +using SameApi.Data.Repository; +using SameApi.Db.DbContexts; +using SameApi.Model.LKP; + +namespace SameApi.Db.Repository +{ + public interface ISchoolRepository : IBaseRepository + { + } +} \ No newline at end of file diff --git a/SameApi/SameApi.Db/Repository/Implementation/SchoolRepository.cs b/SameApi/SameApi.Db/Repository/Implementation/SchoolRepository.cs new file mode 100644 index 0000000..f6f6f5f --- /dev/null +++ b/SameApi/SameApi.Db/Repository/Implementation/SchoolRepository.cs @@ -0,0 +1,22 @@ +using SameApi.Data.Repository; +using SameApi.Db.DbContexts; +using SameApi.Model.LKP; + +namespace SameApi.Db.Repository.Implementation +{ + public class SchoolRepository : BaseRepository, ISchoolRepository + { + private readonly IApiSameDbContext _dbContext; + + public SchoolRepository(IApiSameDbContext dbContext) : base(dbContext) + { + _dbContext = dbContext; + } + + public async Task AddAndSaveAsync(LKP_SchoolDao entity) + { + _dbContext.Set().Add(entity); + await _dbContext.SaveChangesAsync(); + } + } +} \ No newline at end of file From 49b37df2a3cd1cb70eff6f5fdbf7b5d277715ae7 Mon Sep 17 00:00:00 2001 From: IlP4rAd0xlI Date: Mon, 20 Oct 2025 21:41:24 +0200 Subject: [PATCH 72/77] signup-frontend Add : LoginForm --- .../src/components/forms/login/LoginForm.tsx | 57 +++++++++++++++ .../components/forms/login/PasswordField.tsx | 71 +++++++++++++++++++ .../components/forms/signup/SignupCard.tsx | 2 +- .../components/forms/signup/SignupForm.tsx | 12 ++-- .../src/components/forms/signup/Username.tsx | 60 ++++++++-------- React/src/pages/LoginView.tsx | 10 ++- 6 files changed, 175 insertions(+), 37 deletions(-) create mode 100644 React/src/components/forms/login/LoginForm.tsx create mode 100644 React/src/components/forms/login/PasswordField.tsx diff --git a/React/src/components/forms/login/LoginForm.tsx b/React/src/components/forms/login/LoginForm.tsx new file mode 100644 index 0000000..516a29d --- /dev/null +++ b/React/src/components/forms/login/LoginForm.tsx @@ -0,0 +1,57 @@ +import { useState } from 'react' +import styled from '@emotion/styled' +import Username from "../signup/Username.tsx" +import PasswordFields from "./PasswordField.tsx" +import {PostUser, type PostUserProps} from '../../../api/User.ts' + +const StyledForm = styled.form` + width: 100%; +` + +const SubmitButton = styled.button` + background-color: ${({ theme }) => theme.glass.bg}; + border: solid 1px ${({ theme }) => theme.glass.border}; + border-radius: ${({ theme }) => theme.borderRadius.md}; + height: ${({ theme }) => theme.input.height}; + padding: 0 18px; + transition: all ${({ theme }) => theme.transition.fast}; + width: ${({ theme }) => theme.input.width}; + color: ${({ theme }) => theme.colors.textWhite}; + margin-bottom: ${({ theme }) => theme.spacing.md}; + font-weight: ${({ theme }) => theme.fontWeight.semibold}; + + &:hover, &:focus { + background-color: ${({ theme }) => theme.glass.bgHover}; + transform: translateY(-1px); + box-shadow: ${({ theme }) => theme.shadow.md}; + } + + &:active { + transform: translateY(0); + } +` + +export default function LoginForm() { + // const form = useForm() + // const { handleSubmit } = form + + const [username, setUsername] = useState('') + const [password, setPassword] = useState('') + // try { + // await PostUser(User) + // } + // catch (e) { + // console.error(e) + // } + +return ( + + + + Submit + + ) +} \ No newline at end of file diff --git a/React/src/components/forms/login/PasswordField.tsx b/React/src/components/forms/login/PasswordField.tsx new file mode 100644 index 0000000..b8b220e --- /dev/null +++ b/React/src/components/forms/login/PasswordField.tsx @@ -0,0 +1,71 @@ +import { useState } from "react" +import styled from '@emotion/styled' + +const FieldWrapper = styled.div` + width: 100%; + margin-bottom: ${({ theme }) => theme.spacing.md}; +` + +const StyledInput = styled.input<{ hasError: boolean }>` + background-color: ${({ theme, hasError }) => + hasError ? theme.colors.bgError : theme.glass.bg}; + border: solid 1px ${({ theme, hasError }) => + hasError ? theme.colors.borderError : theme.glass.border}; + border-radius: ${({ theme }) => theme.borderRadius.md}; + height: ${({ theme }) => theme.input.height}; + padding: 0 18px; + transition: all ${({ theme }) => theme.transition.fast}; + width: ${({ theme }) => theme.input.width}; + color: ${({ theme }) => theme.colors.textWhite}; + margin-bottom: ${({ theme }) => theme.spacing.xs}; + box-shadow: ${({ hasError, theme }) => + hasError ? `0 0 0 5px ${theme.colors.errorBoxShadow}` : 'none'}; + + &::placeholder { + color: ${({ theme }) => theme.colors.textPlaceholder}; + } + + &:focus { + background-color: ${({ theme }) => theme.glass.bgHover}; + border-color: ${({ theme }) => theme.glass.borderHover}; + box-shadow: ${({ theme }) => theme.glass.focusShadow}; + } +` + +interface PasswordFieldsProps { + passwordValue: string + onPasswordChange: (value: string) => void +} + +export default function PasswordFields({ + passwordValue, + onPasswordChange, + }: PasswordFieldsProps) { + const [passwordErrors, setPasswordErrors] = useState([]) + + // const handlePasswordBlur = () => { + // const trimmedValue = passwordValue.trim() + // const newErrors: string[] = [] + // } + // + // const handlePasswordChange = (e: React.ChangeEvent) => { + // onPasswordChange(e.target.value) + // setPasswordErrors([]) + // } + + return ( + <> + + + 0} + /> + + + ) +} \ No newline at end of file diff --git a/React/src/components/forms/signup/SignupCard.tsx b/React/src/components/forms/signup/SignupCard.tsx index 2fb8ce9..0091cc6 100644 --- a/React/src/components/forms/signup/SignupCard.tsx +++ b/React/src/components/forms/signup/SignupCard.tsx @@ -2,7 +2,7 @@ import { Link } from 'react-router-dom' import styled from '@emotion/styled' import SignupForm from './SignupForm' -const Card = styled.div` +export const Card = styled.div` display: flex; flex-direction: column; align-items: center; diff --git a/React/src/components/forms/signup/SignupForm.tsx b/React/src/components/forms/signup/SignupForm.tsx index 1d50981..f57a567 100644 --- a/React/src/components/forms/signup/SignupForm.tsx +++ b/React/src/components/forms/signup/SignupForm.tsx @@ -62,12 +62,12 @@ export default function SignupForm() { age: 0, password: password, } - try { - await PostUser(User) - } - catch (e) { - console.error(e) - } + // try { + // await PostUser(User) + // } + // catch (e) { + // console.error(e) + // } } return ( diff --git a/React/src/components/forms/signup/Username.tsx b/React/src/components/forms/signup/Username.tsx index 0eaf149..06c06d6 100644 --- a/React/src/components/forms/signup/Username.tsx +++ b/React/src/components/forms/signup/Username.tsx @@ -61,43 +61,47 @@ const ErrorMessage = styled.div` interface UsernameFieldProps { value: string onChange: (value: string) => void + isLogin?: boolean } -export default function Username({ value, onChange }: UsernameFieldProps) { +export default function Username({ value, onChange, isLogin }: UsernameFieldProps) { + const [errors, setErrors] = useState([]) const handleBlur = () => { const trimmedValue = value.trim() const newErrors: string[] = [] - if (trimmedValue === "") { - newErrors.push("Required") - setErrors(newErrors) - return - } - - if (!/[a-zA-Z]/.test(value)) { - newErrors.push("Must include a letter") - } - - if (trimmedValue.length < 3 || trimmedValue.length > 20) { - newErrors.push("3-20 characters") - } - - if (reservedWords.includes(trimmedValue.toLowerCase())) { - newErrors.push("Reserved by system") - } - - if (specialCharsRegex.test(value)) { - newErrors.push("Letters, numbers, - and _ only") + if (!isLogin) { + if (trimmedValue === "") { + newErrors.push("Required") + setErrors(newErrors) + return + } + + if (!/[a-zA-Z]/.test(value)) { + newErrors.push("Must include a letter") + } + + if (trimmedValue.length < 3 || trimmedValue.length > 20) { + newErrors.push("3-20 characters") + } + + if (reservedWords.includes(trimmedValue.toLowerCase())) { + newErrors.push("Reserved by system") + } + + if (specialCharsRegex.test(value)) { + newErrors.push("Letters, numbers, - and _ only") + } + + if (/-{2,}/.test(trimmedValue) || /_{2,}/.test(trimmedValue)) { + newErrors.push("No consecutive - or _") + } + setErrors(newErrors) + } } - if (/-{2,}/.test(trimmedValue) || /_{2,}/.test(trimmedValue)) { - newErrors.push("No consecutive - or _") - } - setErrors(newErrors) - } - const handleChange = (e: React.ChangeEvent) => { const valueNoSpaces = e.target.value.replace(/\s/g, '') onChange(valueNoSpaces) @@ -119,7 +123,7 @@ export default function Username({ value, onChange }: UsernameFieldProps) { maxLength={20} hasError={errors.length > 0} /> - {errors.length > 0 && ( + {!isLogin && errors.length > 0 && ( {errors.map((err, i) => ( {err} diff --git a/React/src/pages/LoginView.tsx b/React/src/pages/LoginView.tsx index 404ff50..29c7f99 100644 --- a/React/src/pages/LoginView.tsx +++ b/React/src/pages/LoginView.tsx @@ -1,7 +1,13 @@ -export default function LoginView(){ +import {Card} from "../components/forms/signup/SignupCard.tsx"; +import LoginForm from "../components/forms/login/LoginForm.tsx" + +export default function LoginView() { return ( <> -

Login

+ +

Login

+ +
) } \ No newline at end of file From a4e8c47cd5c9bbc03b904fe29abf2d6fa48b43f0 Mon Sep 17 00:00:00 2001 From: Mattis Date: Fri, 31 Oct 2025 11:27:34 +0100 Subject: [PATCH 73/77] update readme --- SameApi/MLD.md | 16 +++--- SameApi/README.md | 133 ++++++++++++++++++++++++++++------------------ 2 files changed, 88 insertions(+), 61 deletions(-) diff --git a/SameApi/MLD.md b/SameApi/MLD.md index b4c2042..f498e85 100644 --- a/SameApi/MLD.md +++ b/SameApi/MLD.md @@ -3,14 +3,14 @@ erDiagram User { int id PK bool isAdmin - DateTime Birthday + DateTime birthday string firstName string lastName - string Pseudo - string Email + string pseudo + string email string password - int NumberFollowers - DateTime CreateAt + int numberFollowers + DateTime createAt int genderId FK int schoolId FK } @@ -20,18 +20,18 @@ erDiagram Gender { int id PK - string Name + string name } School { int id PK - string Name + string name int professionId FK } Profession { int id PK - string Name + string name } diff --git a/SameApi/README.md b/SameApi/README.md index 519429b..dbf86d8 100644 --- a/SameApi/README.md +++ b/SameApi/README.md @@ -8,14 +8,11 @@ This API allows clients to perform full CRUD operations on forum entities such a - Full CRUD for: - 🧑 Users - - 📌 Threads - 💬 Posts - - 🗨️ Comments - Entity Framework Core with database migrations - Swagger UI for interactive API documentation - DTOs and AutoMapper for clean data handling - CORS support for frontend integration -- Basic error handling and validation --- ## Database Model @@ -25,74 +22,102 @@ You can find the detailed MLD diagram [here](./MLD.md). ## 🧱 Entities Overview ### User -- `id`, `isadmin`, `age`, `pseudo`, `email`, `password`, `number_follow`, `createAt`, `id_gender_fk`, `id_school_fk`, `id_post_fk` +- `id`, `isadmin`, `birthday`, `firstName`, `lastName`, `pseudo`, `email`, `password`, `numberFollowers`, `createAt`, `id_gender_fk`, `id_school_fk` + +### Post +- `id`, ### Gender -- `id`, `gender` +- `id`, `Name` -### Tags -- `Id`, `createAt`, `tag_required`, `tag_optional` -### TAG_REQUIRED -- `Id`, `tag_required` - -### TAG_OPTIONAL -- `Id`, `tag_optional` ### SCHOOL -- `Id`, `name`, `profession` +- `Id`, `name`, `id_profession_fk` ### PROFESSION - `Id`, `name` - -### Post -- `Id`, `ThreadId`, `id_user`, `Content`, `CreatedAt` - -### Comment -- `Id`, `PostId`, `id_user`, `title`, `Content`, `CreatedAt` - --- ## 🛠️ Technologies Used -- ASP.NET Core 6 / 7 +- ASP.NET Core 9 - C# - Entity Framework Core -- SQL Server / SQLite - Swagger (Swashbuckle) - AutoMapper -## 📁 Project Structure - SameApi: - - 🗂️ SameApi.App: - - Program.cs - - - 🗂️ SameApi.Business: - - 📄 SameApiProfile.cs - - - 🗂️ SameApi.Data: - - 📁 DbContexts: - - 📄 BaseDbContext - - 📄 IBaseDbContext - - 📁 Model: - - 📄 IModelDao.cs - - 📁 Repository: - - 📄 BaseRepository - - 📄 IBaseRepository - - - 🗂️ SameApi.Db: - - 📁 DbContexts: - - 📄 SameApiDbContext.cs - - 📄 ISameApiDbContext.cs - - 📁 UnitOfWork: - - 📄 SameApiUnitOfWork.cs - - 📄 ISameApiUnitOfWork.cs - - - 🗂️ SameApi.Dto: - - - 🗂️ SameApi.Model: + - 💻 SameApi.App + - 🧭 Controller + - 🧩 AdminController.cs + - 🧩 UserController.cs + - 🚀 Program.cs + + - 🧠 SameApi.Business + - 🧱 Admin + - 🛠️ Command + - 🧩 CreateGenderCommand.cs + - 🧩 CreateProfessionCommand.cs + - 🧩 DeleteGenderCommand.cs + - 🔍 Query + - 🧩 GetAllGenderQuery.cs + - 🧩 GetAllProfessionQuery.cs + + - 👥 User + - 🛠️ Command + - 🧩 CreateUserCommand.cs + - 🧩 DeleteUserCommand.cs + - 🧩 UpdateUserCommand.cs + - 🔍 Query + - 🧩 GetAllUserQuery.cs + - 🧩 GetUserByIdQuery.cs + - 🧭 SameApiProfile.cs + + - 🗄️ SameApi.Data + - 🗃️ DbContexts + - 🧩 BaseDbContext.cs + - 🧩 IBaseDbContext.cs + - 🧠 Model + - 🧾 IModelDao.cs + - 📚 Repository + - 🧩 BaseRepository.cs + - 🧩 IBaseRepository.cs + + - 🏗️ SameApi.Db + - 🗃️ DbContexts + - 🧩 SameApiDbContext.cs + - 🧩 ISameApiDbContext.cs + - ⏱️ Migrations + - 🧾 20251005003003_1.0.0.cs + - 🧾 20251005003732_1.0.1.cs + - 📚 Repository + - 🧩 IGenderRepository.cs + - 🧩 IProfessionRepository.cs + - 🧩 ISchoolRepository.cs + - 🧩 IUserRepository.cs + - ⚙️ Implementation + - 🧩 GenderRepository.cs + - 🧩 ProfessionRepository.cs + - 🧩 SchoolRepository.cs + - 🧩 UserRepository.cs + - 🔗 UnitOfWork + - 🧩 SameApiUnitOfWork.cs + - 🧩 ISameApiUnitOfWork.cs + + - 📦 SameApi.Dto + - 🧾 GenderInput.cs + - 🧾 GenderResponse.cs + - 🧾 ProfessionInput.cs + - 🧾 UserInput.cs + + - 🧱 SameApi.Model + - 🧩 LKP + - 🧾 LKP_GenderDao.cs + - 🧾 LKP_ProfessionDao.cs + - 🧾 LKP_SchoolDao.cs + - 👤 PostDao.cs + - 👥 UserDao.cs ---- ## ⚙️ Getting Started @@ -107,7 +132,9 @@ SameApi: 1. **Clone the repository:** ```bash git clone https://github.com/Tisa40486/Same.git - + + + 2. **API Endpoints** | Method | Endpoint | Description | From aebb2b6766539e4f3c5048ad15075e598957b66e Mon Sep 17 00:00:00 2001 From: IlP4rAd0xlI Date: Wed, 12 Nov 2025 22:33:25 +0100 Subject: [PATCH 74/77] feature signup : post function --- React/.env | 2 +- React/src/AppRoutes.tsx | 8 +++-- React/src/api/User.ts | 16 +++++++--- .../components/forms/signup/SignupForm.tsx | 32 ++++++++++++------- 4 files changed, 39 insertions(+), 19 deletions(-) diff --git a/React/.env b/React/.env index cdb8f3f..ae2ef09 100644 --- a/React/.env +++ b/React/.env @@ -1 +1 @@ -API_URL \ No newline at end of file +API_URL = "https://localhost:7171/api" \ No newline at end of file diff --git a/React/src/AppRoutes.tsx b/React/src/AppRoutes.tsx index 2d64536..7d7776a 100644 --- a/React/src/AppRoutes.tsx +++ b/React/src/AppRoutes.tsx @@ -29,9 +29,11 @@ export const AppRoutes = () => { ] return ( - {initRoutes().map(({ key, ...routeConfig }) => ( - - ))} + <> + {initRoutes().map(({ key, ...routeConfig }) => ( + + ))} + ) } diff --git a/React/src/api/User.ts b/React/src/api/User.ts index 278a144..ed78d9b 100644 --- a/React/src/api/User.ts +++ b/React/src/api/User.ts @@ -1,12 +1,19 @@ import {apiConfig, getHeaders} from "./apiConfig.ts"; export type PostUserProps = { - "pseudo": string, // TODO : rename to username + "id": number, + "isAdmin": boolean, + "birthday": string, + "firstName": string, + "lastName": string, + "pseudo": string, "email": string, - // TODO : first name - // TODO : last name - "age": 0, // TODO : age => date of birth "password": string, + "numberFollowers": number, + "createAt": string, + "genderId": number, + "schoolId": number, + "professionId": number } export const PostUser = async (param:PostUserProps) => { @@ -16,4 +23,5 @@ export const PostUser = async (param:PostUserProps) => { headers: {...headers}, body: JSON.stringify(param), }); + return response; } \ No newline at end of file diff --git a/React/src/components/forms/signup/SignupForm.tsx b/React/src/components/forms/signup/SignupForm.tsx index f57a567..c03fea6 100644 --- a/React/src/components/forms/signup/SignupForm.tsx +++ b/React/src/components/forms/signup/SignupForm.tsx @@ -1,4 +1,4 @@ -import { useState } from 'react' +import {FormEvent, useState} from 'react' import styled from '@emotion/styled' // import { useForm } from 'react-hook-form' import Username from "./Username.tsx" @@ -55,19 +55,29 @@ export default function SignupForm() { const [password, setPassword] = useState('') const [confirmPassword, setConfirmPassword] = useState('') - const HandleSubmit = () => { + const HandleSubmit = async (e:FormEvent) => { + e.preventDefault(); const User:PostUserProps = { - pseudo : username, - email : email, - age: 0, + id: 0, + isAdmin: false, + birthday: birthdate.toString(), + firstName: firstName, + lastName: lastName, + pseudo: username, + email: email, password: password, + numberFollowers: 0, + createAt: "2025-11-12T20:38:12.278Z", + genderId: 0, + schoolId: 0, + professionId: 0 + } + try { + await PostUser(User) + } + catch (e) { + console.error(e) } - // try { - // await PostUser(User) - // } - // catch (e) { - // console.error(e) - // } } return ( From 41dd857e10dd11b832f148f1353c6b56539f36b4 Mon Sep 17 00:00:00 2001 From: IlP4rAd0xlI Date: Thu, 13 Nov 2025 21:53:59 +0100 Subject: [PATCH 75/77] feature signup : fix post function url setup in .env --- React/.env | 2 +- React/src/api/User.ts | 2 +- React/src/api/apiConfig.ts | 2 +- React/src/components/forms/login/LoginForm.tsx | 1 - React/src/components/forms/signup/SignupForm.tsx | 2 +- 5 files changed, 4 insertions(+), 5 deletions(-) diff --git a/React/.env b/React/.env index ae2ef09..34d489e 100644 --- a/React/.env +++ b/React/.env @@ -1 +1 @@ -API_URL = "https://localhost:7171/api" \ No newline at end of file +VITE_API_URL=https://localhost:7171/api \ No newline at end of file diff --git a/React/src/api/User.ts b/React/src/api/User.ts index ed78d9b..38c757b 100644 --- a/React/src/api/User.ts +++ b/React/src/api/User.ts @@ -18,7 +18,7 @@ export type PostUserProps = { export const PostUser = async (param:PostUserProps) => { const headers = getHeaders() - const response = await fetch(apiConfig.apiUrl + "/user", { + const response = await fetch(apiConfig.apiUrl + "/user/create", { method: "POST", headers: {...headers}, body: JSON.stringify(param), diff --git a/React/src/api/apiConfig.ts b/React/src/api/apiConfig.ts index b9f98ee..3d2e68b 100644 --- a/React/src/api/apiConfig.ts +++ b/React/src/api/apiConfig.ts @@ -1,5 +1,5 @@ export const apiConfig = { - apiUrl: import.meta.env.API_URL, + apiUrl: import.meta.env.VITE_API_URL as string, } // header of the request => indicate body will be in json diff --git a/React/src/components/forms/login/LoginForm.tsx b/React/src/components/forms/login/LoginForm.tsx index 516a29d..f5293a5 100644 --- a/React/src/components/forms/login/LoginForm.tsx +++ b/React/src/components/forms/login/LoginForm.tsx @@ -2,7 +2,6 @@ import { useState } from 'react' import styled from '@emotion/styled' import Username from "../signup/Username.tsx" import PasswordFields from "./PasswordField.tsx" -import {PostUser, type PostUserProps} from '../../../api/User.ts' const StyledForm = styled.form` width: 100%; diff --git a/React/src/components/forms/signup/SignupForm.tsx b/React/src/components/forms/signup/SignupForm.tsx index c03fea6..b244fc4 100644 --- a/React/src/components/forms/signup/SignupForm.tsx +++ b/React/src/components/forms/signup/SignupForm.tsx @@ -81,7 +81,7 @@ export default function SignupForm() { } return ( - + From 036e5c11a7fa36370d5d305b230206f2f4eaa081 Mon Sep 17 00:00:00 2001 From: IlP4rAd0xlI Date: Fri, 14 Nov 2025 14:07:16 +0100 Subject: [PATCH 76/77] Remove API project folder => this repo is now only for Same frontend --- React/.env => .env | 0 React/README.md => README.md | 0 React/package.json | 32 --- SameApi/.gitignore | 72 ------- SameApi/MLD.md | 41 ---- SameApi/README.md | 154 -------------- SameApi/SameApi.App/.config/dotnet-tools.json | 13 -- .../Controllers/AdminController.cs | 51 ----- .../SameApi.App/Controllers/UserController.cs | 58 ------ SameApi/SameApi.App/Program.cs | 64 ------ .../Properties/launchSettings.json | 24 --- .../Properties/serviceDependencies.json | 7 - .../Properties/serviceDependencies.local.json | 3 - SameApi/SameApi.App/SameApi.App.csproj | 35 ---- SameApi/SameApi.App/SameApi.App.http | 6 - .../SameApi.App/appsettings.Development.json | 8 - SameApi/SameApi.App/appsettings.json | 9 - SameApi/SameApi.App/libman.json | 5 - .../Admin/Command/CreateGenderCommand.cs | 32 --- .../Admin/Command/CreateProfessionCommand.cs | 30 --- .../Admin/Command/DeleteGenderCommand.cs | 33 --- .../Admin/Query/GetAllGenderQuery.cs | 29 --- .../Admin/Query/GetAllProfessionQuery.cs | 29 --- .../SameApi.Business/SameApi.Business.csproj | 22 -- SameApi/SameApi.Business/SameApiProfile.cs | 29 --- .../User/Command/CreateUserCommand.cs | 38 ---- .../User/Command/DeleteUserCommand.cs | 32 --- .../User/Command/UpdateUserCommand.cs | 40 ---- .../User/Query/GetAllUserQuery.cs | 34 ---- .../User/Query/GetUserByIdQuery.cs | 37 ---- SameApi/SameApi.Data/.gitignore | 54 ----- .../SameApi.Data/DbContexts/BaseDbContext.cs | 18 -- .../SameApi.Data/DbContexts/IBaseDbContext.cs | 13 -- SameApi/SameApi.Data/Model/IModelDao.cs | 7 - .../SameApi.Data/Repository/BaseRepository.cs | 57 ------ .../Repository/IBaseRepository.cs | 22 -- SameApi/SameApi.Data/SameApi.Data.csproj | 13 -- .../SameApi.Db/DbConfigurationExtension.cs | 28 --- .../DbContexts/IApiSameDbContext.cs | 11 - .../SameApi.Db/DbContexts/SameApiDbContext.cs | 26 --- SameApi/SameApi.Db/DbRegisterExtension.cs | 21 -- .../20251005003003_1.0.0.Designer.cs | 175 ---------------- .../Migrations/20251005003003_1.0.0.cs | 128 ------------ .../20251005003732_1.0.1.Designer.cs | 192 ------------------ .../Migrations/20251005003732_1.0.1.cs | 45 ---- .../SameApiDbContextModelSnapshot.cs | 189 ----------------- .../Repository/IGenderRepository.cs | 12 -- .../Repository/IProfessionRepository.cs | 13 -- .../Repository/ISchoolRepository.cs | 11 - .../SameApi.Db/Repository/IUserRepository.cs | 12 -- .../Implementation/GenderRepository.cs | 22 -- .../Implementation/ProfessionRepository.cs | 22 -- .../Implementation/SchoolRepository.cs | 22 -- .../Implementation/UserRepository.cs | 23 --- SameApi/SameApi.Db/SameApi.Db.csproj | 28 --- .../UnitOfWork/IApiSameUnitOfWork.cs | 15 -- .../UnitOfWork/SameApiUnitOfWork.cs | 32 --- SameApi/SameApi.Dto/GenderInput.cs | 8 - SameApi/SameApi.Dto/GenderResponse.cs | 8 - SameApi/SameApi.Dto/ProfessionInput.cs | 8 - SameApi/SameApi.Dto/ProfessionResponse.cs | 8 - SameApi/SameApi.Dto/SameApi.Dto.csproj | 13 -- SameApi/SameApi.Dto/UserInput.cs | 18 -- SameApi/SameApi.Dto/UserResponse.cs | 14 -- SameApi/SameApi.Model/LKP/LKP_GenderDao.cs | 14 -- .../SameApi.Model/LKP/LKP_ProfessionDao.cs | 14 -- SameApi/SameApi.Model/LKP/LKP_SchoolDao.cs | 19 -- SameApi/SameApi.Model/PostDao.cs | 12 -- .../SameApiModel20251010150345.pubxml | 19 -- SameApi/SameApi.Model/SameApi.Model.csproj | 17 -- SameApi/SameApi.Model/UserDao.cs | 33 --- SameApi/SameApi.sln | 55 ----- SameApi/Sql/insertAdmin.sql | 35 ---- React/eslint.config.js => eslint.config.js | 0 React/index.html => index.html | 0 package.json | 30 ++- {React/src => src}/App.tsx | 0 {React/src => src}/AppRoutes.tsx | 0 {React/src => src}/api/User.ts | 0 {React/src => src}/api/apiConfig.ts | 0 .../img/same-accessibility-settings-icon.png | Bin .../img/same-register-login-background.png | Bin .../components/forms/login/LoginForm.tsx | 0 .../components/forms/login/PasswordField.tsx | 0 .../forms/signup/BirthdateField.tsx | 0 .../components/forms/signup/EmailField.tsx | 0 .../forms/signup/FirstNameField.tsx | 0 .../components/forms/signup/LastNameField.tsx | 0 .../forms/signup/PasswordFields.tsx | 0 .../components/forms/signup/SignupCard.tsx | 0 .../components/forms/signup/SignupForm.tsx | 0 .../components/forms/signup/Username.tsx | 0 {React/src => src}/emotion.d.ts | 0 {React/src => src}/index.css | 0 {React/src => src}/main.tsx | 0 {React/src => src}/pages/HomeView.tsx | 0 {React/src => src}/pages/LoginView.tsx | 0 {React/src => src}/pages/NotFoundView.tsx | 0 {React/src => src}/pages/SignupView.tsx | 0 {React/src => src}/styles/globalStyle.tsx | 0 {React/src => src}/styles/theme.tsx | 0 {React/src => src}/vite-env.d.ts | 0 React/tsconfig.app.json => tsconfig.app.json | 0 React/tsconfig.json => tsconfig.json | 0 .../tsconfig.node.json => tsconfig.node.json | 0 use-case-same.uxf | 29 --- React/vite.config.ts => vite.config.ts | 0 107 files changed, 28 insertions(+), 2504 deletions(-) rename React/.env => .env (100%) rename React/README.md => README.md (100%) delete mode 100644 React/package.json delete mode 100644 SameApi/.gitignore delete mode 100644 SameApi/MLD.md delete mode 100644 SameApi/README.md delete mode 100644 SameApi/SameApi.App/.config/dotnet-tools.json delete mode 100644 SameApi/SameApi.App/Controllers/AdminController.cs delete mode 100644 SameApi/SameApi.App/Controllers/UserController.cs delete mode 100644 SameApi/SameApi.App/Program.cs delete mode 100644 SameApi/SameApi.App/Properties/launchSettings.json delete mode 100644 SameApi/SameApi.App/Properties/serviceDependencies.json delete mode 100644 SameApi/SameApi.App/Properties/serviceDependencies.local.json delete mode 100644 SameApi/SameApi.App/SameApi.App.csproj delete mode 100644 SameApi/SameApi.App/SameApi.App.http delete mode 100644 SameApi/SameApi.App/appsettings.Development.json delete mode 100644 SameApi/SameApi.App/appsettings.json delete mode 100644 SameApi/SameApi.App/libman.json delete mode 100644 SameApi/SameApi.Business/Admin/Command/CreateGenderCommand.cs delete mode 100644 SameApi/SameApi.Business/Admin/Command/CreateProfessionCommand.cs delete mode 100644 SameApi/SameApi.Business/Admin/Command/DeleteGenderCommand.cs delete mode 100644 SameApi/SameApi.Business/Admin/Query/GetAllGenderQuery.cs delete mode 100644 SameApi/SameApi.Business/Admin/Query/GetAllProfessionQuery.cs delete mode 100644 SameApi/SameApi.Business/SameApi.Business.csproj delete mode 100644 SameApi/SameApi.Business/SameApiProfile.cs delete mode 100644 SameApi/SameApi.Business/User/Command/CreateUserCommand.cs delete mode 100644 SameApi/SameApi.Business/User/Command/DeleteUserCommand.cs delete mode 100644 SameApi/SameApi.Business/User/Command/UpdateUserCommand.cs delete mode 100644 SameApi/SameApi.Business/User/Query/GetAllUserQuery.cs delete mode 100644 SameApi/SameApi.Business/User/Query/GetUserByIdQuery.cs delete mode 100644 SameApi/SameApi.Data/.gitignore delete mode 100644 SameApi/SameApi.Data/DbContexts/BaseDbContext.cs delete mode 100644 SameApi/SameApi.Data/DbContexts/IBaseDbContext.cs delete mode 100644 SameApi/SameApi.Data/Model/IModelDao.cs delete mode 100644 SameApi/SameApi.Data/Repository/BaseRepository.cs delete mode 100644 SameApi/SameApi.Data/Repository/IBaseRepository.cs delete mode 100644 SameApi/SameApi.Data/SameApi.Data.csproj delete mode 100644 SameApi/SameApi.Db/DbConfigurationExtension.cs delete mode 100644 SameApi/SameApi.Db/DbContexts/IApiSameDbContext.cs delete mode 100644 SameApi/SameApi.Db/DbContexts/SameApiDbContext.cs delete mode 100644 SameApi/SameApi.Db/DbRegisterExtension.cs delete mode 100644 SameApi/SameApi.Db/Migrations/20251005003003_1.0.0.Designer.cs delete mode 100644 SameApi/SameApi.Db/Migrations/20251005003003_1.0.0.cs delete mode 100644 SameApi/SameApi.Db/Migrations/20251005003732_1.0.1.Designer.cs delete mode 100644 SameApi/SameApi.Db/Migrations/20251005003732_1.0.1.cs delete mode 100644 SameApi/SameApi.Db/Migrations/SameApiDbContextModelSnapshot.cs delete mode 100644 SameApi/SameApi.Db/Repository/IGenderRepository.cs delete mode 100644 SameApi/SameApi.Db/Repository/IProfessionRepository.cs delete mode 100644 SameApi/SameApi.Db/Repository/ISchoolRepository.cs delete mode 100644 SameApi/SameApi.Db/Repository/IUserRepository.cs delete mode 100644 SameApi/SameApi.Db/Repository/Implementation/GenderRepository.cs delete mode 100644 SameApi/SameApi.Db/Repository/Implementation/ProfessionRepository.cs delete mode 100644 SameApi/SameApi.Db/Repository/Implementation/SchoolRepository.cs delete mode 100644 SameApi/SameApi.Db/Repository/Implementation/UserRepository.cs delete mode 100644 SameApi/SameApi.Db/SameApi.Db.csproj delete mode 100644 SameApi/SameApi.Db/UnitOfWork/IApiSameUnitOfWork.cs delete mode 100644 SameApi/SameApi.Db/UnitOfWork/SameApiUnitOfWork.cs delete mode 100644 SameApi/SameApi.Dto/GenderInput.cs delete mode 100644 SameApi/SameApi.Dto/GenderResponse.cs delete mode 100644 SameApi/SameApi.Dto/ProfessionInput.cs delete mode 100644 SameApi/SameApi.Dto/ProfessionResponse.cs delete mode 100644 SameApi/SameApi.Dto/SameApi.Dto.csproj delete mode 100644 SameApi/SameApi.Dto/UserInput.cs delete mode 100644 SameApi/SameApi.Dto/UserResponse.cs delete mode 100644 SameApi/SameApi.Model/LKP/LKP_GenderDao.cs delete mode 100644 SameApi/SameApi.Model/LKP/LKP_ProfessionDao.cs delete mode 100644 SameApi/SameApi.Model/LKP/LKP_SchoolDao.cs delete mode 100644 SameApi/SameApi.Model/PostDao.cs delete mode 100644 SameApi/SameApi.Model/Properties/PublishProfiles/SameApiModel20251010150345.pubxml delete mode 100644 SameApi/SameApi.Model/SameApi.Model.csproj delete mode 100644 SameApi/SameApi.Model/UserDao.cs delete mode 100644 SameApi/SameApi.sln delete mode 100644 SameApi/Sql/insertAdmin.sql rename React/eslint.config.js => eslint.config.js (100%) rename React/index.html => index.html (100%) rename {React/src => src}/App.tsx (100%) rename {React/src => src}/AppRoutes.tsx (100%) rename {React/src => src}/api/User.ts (100%) rename {React/src => src}/api/apiConfig.ts (100%) rename {React/src => src}/assets/img/same-accessibility-settings-icon.png (100%) rename {React/src => src}/assets/img/same-register-login-background.png (100%) rename {React/src => src}/components/forms/login/LoginForm.tsx (100%) rename {React/src => src}/components/forms/login/PasswordField.tsx (100%) rename {React/src => src}/components/forms/signup/BirthdateField.tsx (100%) rename {React/src => src}/components/forms/signup/EmailField.tsx (100%) rename {React/src => src}/components/forms/signup/FirstNameField.tsx (100%) rename {React/src => src}/components/forms/signup/LastNameField.tsx (100%) rename {React/src => src}/components/forms/signup/PasswordFields.tsx (100%) rename {React/src => src}/components/forms/signup/SignupCard.tsx (100%) rename {React/src => src}/components/forms/signup/SignupForm.tsx (100%) rename {React/src => src}/components/forms/signup/Username.tsx (100%) rename {React/src => src}/emotion.d.ts (100%) rename {React/src => src}/index.css (100%) rename {React/src => src}/main.tsx (100%) rename {React/src => src}/pages/HomeView.tsx (100%) rename {React/src => src}/pages/LoginView.tsx (100%) rename {React/src => src}/pages/NotFoundView.tsx (100%) rename {React/src => src}/pages/SignupView.tsx (100%) rename {React/src => src}/styles/globalStyle.tsx (100%) rename {React/src => src}/styles/theme.tsx (100%) rename {React/src => src}/vite-env.d.ts (100%) rename React/tsconfig.app.json => tsconfig.app.json (100%) rename React/tsconfig.json => tsconfig.json (100%) rename React/tsconfig.node.json => tsconfig.node.json (100%) delete mode 100644 use-case-same.uxf rename React/vite.config.ts => vite.config.ts (100%) diff --git a/React/.env b/.env similarity index 100% rename from React/.env rename to .env diff --git a/React/README.md b/README.md similarity index 100% rename from React/README.md rename to README.md diff --git a/React/package.json b/React/package.json deleted file mode 100644 index 82bd3fd..0000000 --- a/React/package.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "same", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "tsc -b && vite build", - "lint": "eslint .", - "preview": "vite preview" - }, - "dependencies": { - "@emotion/react": "^11.14.0", - "@emotion/styled": "^11.14.1", - "react": "^19.1.1", - "react-dom": "^19.1.1", - "react-router-dom": "^7.8.2" - }, - "devDependencies": { - "@eslint/js": "^9.33.0", - "@types/react": "^19.1.10", - "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^5.0.0", - "eslint": "^9.33.0", - "eslint-plugin-react-hooks": "^5.2.0", - "eslint-plugin-react-refresh": "^0.4.20", - "globals": "^16.3.0", - "typescript": "~5.8.3", - "typescript-eslint": "^8.39.1", - "vite": "^7.1.2" - } -} diff --git a/SameApi/.gitignore b/SameApi/.gitignore deleted file mode 100644 index 57f7080..0000000 --- a/SameApi/.gitignore +++ /dev/null @@ -1,72 +0,0 @@ -# Build -bin/ -obj/ -[Bb]uild/ -[Ll]og/ - - -# User-specific files -*.user -*.userosscache -*.suo -*.sln.docstates - -# Rider cache -.idea/ -*.iml - -# Logs -*.log - -# Environment -.env -*.env - -# Packages (restaurables depuis nuget) -packages/ -*.nupkg -*.snupkg - -# Publish -*.PublishSettings -publish/ - -# Azure -*.azurePubxml - -# macOS -.DS_Store - -# Windows -Thumbs.db -desktop.ini - -# JetBrains Rider -.idea/ - -# VS Code -.vscode/ - -# Coverage / Test -TestResult*/ -*.coverage -*.coveragexml - -# Visual Studio -.vs/ -*.suo -*.user -*.userosscache -*.sln.docstates - -# NuGet -*.nupkg -*.snupkg -*.nuspec -*.ncrunchsolution* -project.lock.json -project.fragment.lock.json -artifacts/ - -# Others -*.cache \ No newline at end of file diff --git a/SameApi/MLD.md b/SameApi/MLD.md deleted file mode 100644 index f498e85..0000000 --- a/SameApi/MLD.md +++ /dev/null @@ -1,41 +0,0 @@ -```mermaid -erDiagram - User { - int id PK - bool isAdmin - DateTime birthday - string firstName - string lastName - string pseudo - string email - string password - int numberFollowers - DateTime createAt - int genderId FK - int schoolId FK - } - Post { - int id PK - } - - Gender { - int id PK - string name - } - - School { - int id PK - string name - int professionId FK - } - - Profession { - int id PK - string name - } - - - User ||--o{ Gender : "identify" - User ||--o{ School : "at" - School ||--o{ Profession : "Get Profession" - diff --git a/SameApi/README.md b/SameApi/README.md deleted file mode 100644 index dbf86d8..0000000 --- a/SameApi/README.md +++ /dev/null @@ -1,154 +0,0 @@ -# 🗣️ SameApiUnitOfWork API - -A RESTful Web API for a Same, built with **ASP.NET Core** and **Entity Framework Core**. -This API allows clients to perform full CRUD operations on forum entities such as **Users**, **Threads**, **Posts**, and **Comments**. - ---- -## 🚀 Features - -- Full CRUD for: - - 🧑 Users - - 💬 Posts -- Entity Framework Core with database migrations -- Swagger UI for interactive API documentation -- DTOs and AutoMapper for clean data handling -- CORS support for frontend integration - ---- -## Database Model - -You can find the detailed MLD diagram [here](./MLD.md). - -## 🧱 Entities Overview - -### User -- `id`, `isadmin`, `birthday`, `firstName`, `lastName`, `pseudo`, `email`, `password`, `numberFollowers`, `createAt`, `id_gender_fk`, `id_school_fk` - -### Post -- `id`, - -### Gender -- `id`, `Name` - - -### SCHOOL -- `Id`, `name`, `id_profession_fk` - -### PROFESSION -- `Id`, `name` - ---- -## 🛠️ Technologies Used - -- ASP.NET Core 9 -- C# -- Entity Framework Core -- Swagger (Swashbuckle) -- AutoMapper - -SameApi: - - 💻 SameApi.App - - 🧭 Controller - - 🧩 AdminController.cs - - 🧩 UserController.cs - - 🚀 Program.cs - - - 🧠 SameApi.Business - - 🧱 Admin - - 🛠️ Command - - 🧩 CreateGenderCommand.cs - - 🧩 CreateProfessionCommand.cs - - 🧩 DeleteGenderCommand.cs - - 🔍 Query - - 🧩 GetAllGenderQuery.cs - - 🧩 GetAllProfessionQuery.cs - - - 👥 User - - 🛠️ Command - - 🧩 CreateUserCommand.cs - - 🧩 DeleteUserCommand.cs - - 🧩 UpdateUserCommand.cs - - 🔍 Query - - 🧩 GetAllUserQuery.cs - - 🧩 GetUserByIdQuery.cs - - 🧭 SameApiProfile.cs - - - 🗄️ SameApi.Data - - 🗃️ DbContexts - - 🧩 BaseDbContext.cs - - 🧩 IBaseDbContext.cs - - 🧠 Model - - 🧾 IModelDao.cs - - 📚 Repository - - 🧩 BaseRepository.cs - - 🧩 IBaseRepository.cs - - - 🏗️ SameApi.Db - - 🗃️ DbContexts - - 🧩 SameApiDbContext.cs - - 🧩 ISameApiDbContext.cs - - ⏱️ Migrations - - 🧾 20251005003003_1.0.0.cs - - 🧾 20251005003732_1.0.1.cs - - 📚 Repository - - 🧩 IGenderRepository.cs - - 🧩 IProfessionRepository.cs - - 🧩 ISchoolRepository.cs - - 🧩 IUserRepository.cs - - ⚙️ Implementation - - 🧩 GenderRepository.cs - - 🧩 ProfessionRepository.cs - - 🧩 SchoolRepository.cs - - 🧩 UserRepository.cs - - 🔗 UnitOfWork - - 🧩 SameApiUnitOfWork.cs - - 🧩 ISameApiUnitOfWork.cs - - - 📦 SameApi.Dto - - 🧾 GenderInput.cs - - 🧾 GenderResponse.cs - - 🧾 ProfessionInput.cs - - 🧾 UserInput.cs - - - 🧱 SameApi.Model - - 🧩 LKP - - 🧾 LKP_GenderDao.cs - - 🧾 LKP_ProfessionDao.cs - - 🧾 LKP_SchoolDao.cs - - 👤 PostDao.cs - - 👥 UserDao.cs - - -## ⚙️ Getting Started - -### Prerequisites - -- [.NET 9}(https://dotnet.microsoft.com/) -- DB Server -- Visual Studio or VS Code - -### Setup Instructions - -1. **Clone the repository:** - ```bash - git clone https://github.com/Tisa40486/Same.git - - - -2. **API Endpoints** - -| Method | Endpoint | Description | -| ------ | -------------------- | ------------------- | -| GET | `/api/threads` | Get all threads | -| POST | `/api/threads` | Create a new thread | -| GET | `/api/posts/{id}` | Get a single post | -| PUT | `/api/posts/{id}` | Update a post | -| DELETE | `/api/comments/{id}` | Delete a comment | - - --- - -- 📬 Contact - - 📧Same - same@sames.school - - 🧑‍💻GitHub - https://github.com/Tisa40486 - diff --git a/SameApi/SameApi.App/.config/dotnet-tools.json b/SameApi/SameApi.App/.config/dotnet-tools.json deleted file mode 100644 index ef95326..0000000 --- a/SameApi/SameApi.App/.config/dotnet-tools.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "version": 1, - "isRoot": true, - "tools": { - "dotnet-ef": { - "version": "9.0.9", - "commands": [ - "dotnet-ef" - ], - "rollForward": false - } - } -} \ No newline at end of file diff --git a/SameApi/SameApi.App/Controllers/AdminController.cs b/SameApi/SameApi.App/Controllers/AdminController.cs deleted file mode 100644 index 187ae7b..0000000 --- a/SameApi/SameApi.App/Controllers/AdminController.cs +++ /dev/null @@ -1,51 +0,0 @@ -using MediatR; -using Microsoft.AspNetCore.Mvc; -using SameApi.Business.Admin.Command; -using SameApi.Business.Admin.Query; -using SameApi.Dto; - -namespace SameApi.App.Controllers -{ - [ApiController] - [Route("api/admin")] - public class AdminController : Controller - { - private readonly IMediator _mediator; - - public AdminController(IMediator mediator) - { - _mediator = mediator; - } - - [HttpGet("gender")] - public async Task>> GetAllGenderAsync() - { - var result = await _mediator.Send(new GetAllGenderQuery()); - return Ok(result); - } - [HttpGet("profession")] - public async Task>> GetAllProfessionAsync() - { - var result = await _mediator.Send(new GetAllProfessionQuery()); - return Ok(result); - } - - [HttpPost("Gender")] - public async Task CreateGenderAsync([FromBody] CreateGenderCommand command) - { - await _mediator.Send(command); - } - - [HttpDelete("Gender")] - public async Task DeleteGenderAsync([FromQuery] int id) - { - await _mediator.Send(new DeleteGenderCommand { Id = id }); - } - - [HttpPost("profession")] - public async Task CreateProfessionAsync([FromBody] CreateProfessionCommand command) - { - await _mediator.Send(command); - } - } -} \ No newline at end of file diff --git a/SameApi/SameApi.App/Controllers/UserController.cs b/SameApi/SameApi.App/Controllers/UserController.cs deleted file mode 100644 index 898239e..0000000 --- a/SameApi/SameApi.App/Controllers/UserController.cs +++ /dev/null @@ -1,58 +0,0 @@ -using AutoMapper; -using MediatR; -using Microsoft.AspNetCore.Mvc; -using SameApi.Business.User.Command; -using SameApi.Business.User.Query; -using SameApi.Db.Repository.Implementation; -using SameApi.Dto; - -namespace SameApi.App.Controllers -{ - [ApiController] - [Route("api/user")] - public class UserController : ControllerBase - { - private readonly IMediator _mediator; - - public UserController(IMediator mediator) - { - _mediator = mediator; - } - - [HttpGet("{id}")] - public async Task> GetByIdAsync(int id) - { - var result = await _mediator.Send(new GetUserByIdQuery { Id = id }); - - return Ok(result); - } - - [HttpGet("getAll")] - public async Task>> GetAllAsync() - { - var result = await _mediator.Send(new GetAllUserQuery()); - return Ok(result); - } - - [HttpPost] - public async Task CreateUserAsync([FromBody] CreateUserCommand command) - { - await _mediator.Send(command); - return Ok(); - } - - [HttpDelete("user")] - public async Task DeleteUserAsync([FromQuery] int id) - { - await _mediator.Send(new DeleteUserCommand { Id = id}); - return Ok(); - } - - [HttpPut("update/user")] - public async Task UpdateUserAsync([FromBody] UpdateUserCommand command) - { - var result = await _mediator.Send(command); - return Ok(result); - } - } -} \ No newline at end of file diff --git a/SameApi/SameApi.App/Program.cs b/SameApi/SameApi.App/Program.cs deleted file mode 100644 index eabde25..0000000 --- a/SameApi/SameApi.App/Program.cs +++ /dev/null @@ -1,64 +0,0 @@ -using Microsoft.OpenApi.Models; -using SameApi.Business; -using SameApi.Db; -var builder = WebApplication.CreateBuilder(args); - -// -------------------- CORS -------------------- -builder.Services.AddCors(options => -{ - options.AddPolicy("AllowReactDevClient", policy => - { - policy.WithOrigins("http://localhost:3000", "https://localhost:7171") - .AllowAnyHeader() - .AllowAnyMethod(); - }); -}); - -// -------------------- Controllers -------------------- -builder.Services.AddControllers(); - -// -------------------- Swagger -------------------- -builder.Services.AddSwaggerGen(c => -{ - c.SwaggerDoc("v1", new OpenApiInfo - { - Title = "Api Test", - Version = "v1" - }); - - c.AddServer(new OpenApiServer - { - Url = "https://localhost:7171", - Description = "Local dev server" - }); -}); - -// -------------------- Services -------------------- -builder.Services.AddSameApibContext(builder.Configuration); -builder.Services.RegisterSameApiDbContainer(); -builder.Services.AddAutoMapper(cfg => { }, typeof(SameApiProfile).Assembly); -builder.Services.AddMediatR(x => x.RegisterServicesFromAssemblies(typeof(SameApiProfile).Assembly)); - -var app = builder.Build(); - -// -------------------- Middleware -------------------- -app.UseCors("AllowReactDevClient"); - -if (app.Environment.IsDevelopment()) -{ - // Swagger uniquement en dveloppement - app.UseSwagger(); - app.UseSwaggerUI(c => - { - c.SwaggerEndpoint("/swagger/v1/swagger.json", "Api Test v1"); - c.RoutePrefix = "swagger"; // Accessible via /swagger - }); -} - -app.UseHttpsRedirection(); -app.UseAuthorization(); -app.MapControllers(); -app.MapGet("/health", () => Results.Ok(new { ok = true, dotnet = Environment.Version.ToString() })); - - -app.Run(); \ No newline at end of file diff --git a/SameApi/SameApi.App/Properties/launchSettings.json b/SameApi/SameApi.App/Properties/launchSettings.json deleted file mode 100644 index c0fd7fb..0000000 --- a/SameApi/SameApi.App/Properties/launchSettings.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/launchsettings.json", - "profiles": { - "http": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": true, - "applicationUrl": "http://localhost:5133", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "https": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": true, - "launchUrl": "swagger", - "applicationUrl": "https://localhost:7171;http://localhost:5133", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} diff --git a/SameApi/SameApi.App/Properties/serviceDependencies.json b/SameApi/SameApi.App/Properties/serviceDependencies.json deleted file mode 100644 index e32266d..0000000 --- a/SameApi/SameApi.App/Properties/serviceDependencies.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "dependencies": { - "apis1": { - "type": "apis" - } - } -} \ No newline at end of file diff --git a/SameApi/SameApi.App/Properties/serviceDependencies.local.json b/SameApi/SameApi.App/Properties/serviceDependencies.local.json deleted file mode 100644 index 33703d5..0000000 --- a/SameApi/SameApi.App/Properties/serviceDependencies.local.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "dependencies": {} -} \ No newline at end of file diff --git a/SameApi/SameApi.App/SameApi.App.csproj b/SameApi/SameApi.App/SameApi.App.csproj deleted file mode 100644 index 8c5ccf5..0000000 --- a/SameApi/SameApi.App/SameApi.App.csproj +++ /dev/null @@ -1,35 +0,0 @@ - - - - net9.0 - enable - enable - 178caa09-02fe-4c7f-8045-380bd957697f - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - \ No newline at end of file diff --git a/SameApi/SameApi.App/SameApi.App.http b/SameApi/SameApi.App/SameApi.App.http deleted file mode 100644 index eee9431..0000000 --- a/SameApi/SameApi.App/SameApi.App.http +++ /dev/null @@ -1,6 +0,0 @@ -@SameApi.App_HostAddress = http://localhost:5288 - -GET {{SameApi.App_HostAddress}}/weatherforecast/ -Accept: application/json - -### diff --git a/SameApi/SameApi.App/appsettings.Development.json b/SameApi/SameApi.App/appsettings.Development.json deleted file mode 100644 index 0c208ae..0000000 --- a/SameApi/SameApi.App/appsettings.Development.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" - } - } -} diff --git a/SameApi/SameApi.App/appsettings.json b/SameApi/SameApi.App/appsettings.json deleted file mode 100644 index 10f68b8..0000000 --- a/SameApi/SameApi.App/appsettings.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" - } - }, - "AllowedHosts": "*" -} diff --git a/SameApi/SameApi.App/libman.json b/SameApi/SameApi.App/libman.json deleted file mode 100644 index 8ed1410..0000000 --- a/SameApi/SameApi.App/libman.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": "3.0", - "defaultProvider": "cdnjs", - "libraries": [] -} \ No newline at end of file diff --git a/SameApi/SameApi.Business/Admin/Command/CreateGenderCommand.cs b/SameApi/SameApi.Business/Admin/Command/CreateGenderCommand.cs deleted file mode 100644 index 2c9a794..0000000 --- a/SameApi/SameApi.Business/Admin/Command/CreateGenderCommand.cs +++ /dev/null @@ -1,32 +0,0 @@ -using AutoMapper; -using MediatR; -using SameApi.Db.UnitOfWork; -using SameApi.Dto; -using SameApi.Model.LKP; - -namespace SameApi.Business.Admin.Command -{ - public class CreateGenderCommand : GenderInput, IRequest - { - - public class CreateGenderCommandHandler : IRequestHandler - { - private readonly IMapper _mapper; - private readonly IApiSameUnitOfWork _uow; - - public CreateGenderCommandHandler(IMapper mapper, IApiSameUnitOfWork uow) - { - _mapper = mapper; - _uow = uow; - } - - public async Task Handle(CreateGenderCommand command, CancellationToken cancellationToken) - { - var dao = _mapper.Map(command); - - await _uow.GenderRepository.AddAndSaveAsync(dao); - } - } - - } -} \ No newline at end of file diff --git a/SameApi/SameApi.Business/Admin/Command/CreateProfessionCommand.cs b/SameApi/SameApi.Business/Admin/Command/CreateProfessionCommand.cs deleted file mode 100644 index 2f4a604..0000000 --- a/SameApi/SameApi.Business/Admin/Command/CreateProfessionCommand.cs +++ /dev/null @@ -1,30 +0,0 @@ -using AutoMapper; -using MediatR; -using SameApi.Db.UnitOfWork; -using SameApi.Dto; -using SameApi.Model.LKP; - -namespace SameApi.Business.Admin.Command -{ - public class CreateProfessionCommand : ProfessionInput, IRequest - { - } - public class CreateProfessionCommandHandler : IRequestHandler - { - private readonly IMapper _mapper; - private readonly IApiSameUnitOfWork _uow; - - public CreateProfessionCommandHandler(IMapper mapper, IApiSameUnitOfWork uow) - { - _mapper = mapper; - _uow = uow; - } - - public async Task Handle(CreateProfessionCommand command, CancellationToken cancellationToken) - { - var dao = _mapper.Map(command); - - await _uow.ProfessionRepository.AddAndSaveAsync(dao); - } - } -} diff --git a/SameApi/SameApi.Business/Admin/Command/DeleteGenderCommand.cs b/SameApi/SameApi.Business/Admin/Command/DeleteGenderCommand.cs deleted file mode 100644 index 205f0a8..0000000 --- a/SameApi/SameApi.Business/Admin/Command/DeleteGenderCommand.cs +++ /dev/null @@ -1,33 +0,0 @@ -using AutoMapper; -using MediatR; -using SameApi.Db.UnitOfWork; -using SameApi.Dto; -using SameApi.Model.LKP; - -namespace SameApi.Business.Admin.Command -{ - public class DeleteGenderCommand : GenderInput, IRequest - { - - } - public class DeleteGenderCommandHandler : IRequestHandler - { - private readonly IMapper _mapper; - private readonly IApiSameUnitOfWork _uow; - - public DeleteGenderCommandHandler(IMapper mapper, IApiSameUnitOfWork uow) - { - _mapper = mapper; - _uow = uow; - } - - public async Task Handle(DeleteGenderCommand command, CancellationToken cancellationToken) - { - var dao = _mapper.Map(command); - - await _uow.GenderRepository.RemoveByIdAsync(dao.Id); - - return dao.Id; - } - } -} \ No newline at end of file diff --git a/SameApi/SameApi.Business/Admin/Query/GetAllGenderQuery.cs b/SameApi/SameApi.Business/Admin/Query/GetAllGenderQuery.cs deleted file mode 100644 index a507189..0000000 --- a/SameApi/SameApi.Business/Admin/Query/GetAllGenderQuery.cs +++ /dev/null @@ -1,29 +0,0 @@ -using AutoMapper; -using MediatR; -using SameApi.Db.UnitOfWork; -using SameApi.Dto; - -namespace SameApi.Business.Admin.Query -{ - public class GetAllGenderQuery : IRequest> - { - public class GetAllGenderQueryHandler : IRequestHandler> - { - readonly IApiSameUnitOfWork _uow; - readonly IMapper _mapper; - - public GetAllGenderQueryHandler( - IApiSameUnitOfWork ISameApiUnitOfWork, IMapper mapper) - { - _uow = ISameApiUnitOfWork; - _mapper = mapper; - } - public async Task> Handle(GetAllGenderQuery request, CancellationToken cancellationToken) - { - var data = await _uow.GenderRepository.GetAllAsync(); - - return _mapper.Map>(data); - } - } - } -} \ No newline at end of file diff --git a/SameApi/SameApi.Business/Admin/Query/GetAllProfessionQuery.cs b/SameApi/SameApi.Business/Admin/Query/GetAllProfessionQuery.cs deleted file mode 100644 index 59d7d56..0000000 --- a/SameApi/SameApi.Business/Admin/Query/GetAllProfessionQuery.cs +++ /dev/null @@ -1,29 +0,0 @@ -using AutoMapper; -using MediatR; -using SameApi.Db.UnitOfWork; -using SameApi.Dto; - -namespace SameApi.Business.Admin.Query -{ - public class GetAllProfessionQuery : IRequest> - { - } - public class GetAllProfessionQueryHandler : IRequestHandler> - { - readonly IApiSameUnitOfWork _uow; - readonly IMapper _mapper; - - public GetAllProfessionQueryHandler( - IApiSameUnitOfWork ISameApiUnitOfWork, IMapper mapper) - { - _uow = ISameApiUnitOfWork; - _mapper = mapper; - } - public async Task> Handle(GetAllProfessionQuery request, CancellationToken cancellationToken) - { - var data = await _uow.ProfessionRepository.GetAllAsync(); - - return _mapper.Map>(data); - } - } -} \ No newline at end of file diff --git a/SameApi/SameApi.Business/SameApi.Business.csproj b/SameApi/SameApi.Business/SameApi.Business.csproj deleted file mode 100644 index 845bf3e..0000000 --- a/SameApi/SameApi.Business/SameApi.Business.csproj +++ /dev/null @@ -1,22 +0,0 @@ - - - - net9.0 - enable - enable - - - - - - - - - - - - - - - - diff --git a/SameApi/SameApi.Business/SameApiProfile.cs b/SameApi/SameApi.Business/SameApiProfile.cs deleted file mode 100644 index 892f0d7..0000000 --- a/SameApi/SameApi.Business/SameApiProfile.cs +++ /dev/null @@ -1,29 +0,0 @@ -using AutoMapper; -using SameApi.Dto; -using SameApi.Model; -using SameApi.Model.LKP; - -namespace SameApi.Business -{ - public class SameApiProfile : Profile - { - public SameApiProfile() - { - - //User - CreateMap() - .ForMember(dest => dest.id_gender_fk, opt => opt.MapFrom(src => src.GenderId)); - CreateMap(); - - //Gender - CreateMap(); - CreateMap(); - - //Profession - CreateMap(); - CreateMap(); - - - } - } -} \ No newline at end of file diff --git a/SameApi/SameApi.Business/User/Command/CreateUserCommand.cs b/SameApi/SameApi.Business/User/Command/CreateUserCommand.cs deleted file mode 100644 index cf1c5f2..0000000 --- a/SameApi/SameApi.Business/User/Command/CreateUserCommand.cs +++ /dev/null @@ -1,38 +0,0 @@ -using AutoMapper; -using MediatR; -using SameApi.Db.UnitOfWork; -using SameApi.Dto; -using SameApi.Model; - -namespace SameApi.Business.User.Command -{ - public class CreateUserCommand : UserInput, IRequest - { - } - public class CreateUserCommandHandler : IRequestHandler - { - private readonly IApiSameUnitOfWork _uow; - private readonly IMapper _mapper; - public CreateUserCommandHandler( - IApiSameUnitOfWork unitOfWork, IMapper mapper) - { - _uow = unitOfWork; - _mapper = mapper; - } - public async Task Handle(CreateUserCommand request, CancellationToken cancellationToken) - { - var dao = _mapper.Map(request); - - var today = DateTime.Now; - - var age = today.Year - dao.Birthday!.Value.Year; - - if (dao.Birthday.Value.Date> today.AddYears(-age)) - age--; - - dao.Age = age; - - await _uow.UserRepository.AddAndSaveAsync(dao); - } - } -} \ No newline at end of file diff --git a/SameApi/SameApi.Business/User/Command/DeleteUserCommand.cs b/SameApi/SameApi.Business/User/Command/DeleteUserCommand.cs deleted file mode 100644 index 80ba69c..0000000 --- a/SameApi/SameApi.Business/User/Command/DeleteUserCommand.cs +++ /dev/null @@ -1,32 +0,0 @@ -using AutoMapper; -using MediatR; -using SameApi.Db.UnitOfWork; -using SameApi.Dto; -using SameApi.Model; - -namespace SameApi.Business.User.Command -{ - public class DeleteUserCommand : UserInput, IRequest - { - } - public class DeleteUserCommandHandler : IRequestHandler - { - private readonly IMapper _mapper; - private readonly IApiSameUnitOfWork _iuow; - - public DeleteUserCommandHandler(IMapper mapper, IApiSameUnitOfWork iuow) - { - _mapper = mapper; - _iuow = iuow; - } - - public async Task Handle(DeleteUserCommand command, CancellationToken cancellationToken) - { - var dao = _mapper.Map(command); - - await _iuow.UserRepository.RemoveByIdAsync(command.Id); - - return dao.Id; - } - } -} diff --git a/SameApi/SameApi.Business/User/Command/UpdateUserCommand.cs b/SameApi/SameApi.Business/User/Command/UpdateUserCommand.cs deleted file mode 100644 index 2b2bde3..0000000 --- a/SameApi/SameApi.Business/User/Command/UpdateUserCommand.cs +++ /dev/null @@ -1,40 +0,0 @@ -using AutoMapper; -using MediatR; -using SameApi.Db.UnitOfWork; -using SameApi.Dto; -using SameApi.Model; - -namespace SameApi.Business.User.Command -{ - public class UpdateUserCommand : UserInput, IRequest - { - - } - public class UpdateUserCommandHandler : IRequestHandler - { - readonly IApiSameUnitOfWork _apiSameUnitOfWork; - readonly IMapper _mapper; - - public UpdateUserCommandHandler( - IApiSameUnitOfWork apiSameUnitOfWork, - IMapper mapper) - { - _apiSameUnitOfWork = apiSameUnitOfWork; - _mapper = mapper; - } - - public async Task Handle(UpdateUserCommand request, CancellationToken cancellationToken) - { - var data = await _apiSameUnitOfWork.UserRepository.GetByIdAsync(request.Id, false); - - if (data == null) - return null; - - _mapper.Map(request, data); - - await _apiSameUnitOfWork.SaveChangesAsync(); - - return data.Id; - } - } -} \ No newline at end of file diff --git a/SameApi/SameApi.Business/User/Query/GetAllUserQuery.cs b/SameApi/SameApi.Business/User/Query/GetAllUserQuery.cs deleted file mode 100644 index be3f9dc..0000000 --- a/SameApi/SameApi.Business/User/Query/GetAllUserQuery.cs +++ /dev/null @@ -1,34 +0,0 @@ -using AutoMapper; -using MediatR; -using SameApi.Db.Repository; -using SameApi.Dto; - -namespace SameApi.Business.User.Command -{ - public class GetAllUserQuery : IRequest> - { - } - public class GetAllUserQueryHandler : IRequestHandler> - { - readonly IUserRepository _userRepository; - readonly IMapper _mapper; - - public GetAllUserQueryHandler( - IUserRepository userRepository, - IMapper mapper) - { - _userRepository = userRepository; - _mapper = mapper; - } - - - public async Task> Handle(GetAllUserQuery request, CancellationToken cancellationToken) - { - var data = await _userRepository.GetAllUsersAsync(); - - var result = _mapper.Map>(data); - return result; - } - - } -} \ No newline at end of file diff --git a/SameApi/SameApi.Business/User/Query/GetUserByIdQuery.cs b/SameApi/SameApi.Business/User/Query/GetUserByIdQuery.cs deleted file mode 100644 index d376c52..0000000 --- a/SameApi/SameApi.Business/User/Query/GetUserByIdQuery.cs +++ /dev/null @@ -1,37 +0,0 @@ -using AutoMapper; -using MediatR; -using SameApi.Db.UnitOfWork; -using SameApi.Dto; - -namespace SameApi.Business.User.Query -{ - public class GetUserByIdQuery : IRequest - { - public int Id { get; set; } - } - - public class GetUserByIdQueryHandler : IRequestHandler - { - readonly IApiSameUnitOfWork _uow; - readonly IMapper _mapper; - - public GetUserByIdQueryHandler( - IApiSameUnitOfWork uow, - IMapper mapper) - { - _uow = uow; - _mapper = mapper; - } - - public async Task Handle(GetUserByIdQuery request, CancellationToken cancellationToken) - { - var data = await _uow.UserRepository.GetByIdAsync(request.Id); - - if (data == null) - return null; - - var result = _mapper.Map(data); - return result; - } - } -} \ No newline at end of file diff --git a/SameApi/SameApi.Data/.gitignore b/SameApi/SameApi.Data/.gitignore deleted file mode 100644 index 97dbebf..0000000 --- a/SameApi/SameApi.Data/.gitignore +++ /dev/null @@ -1,54 +0,0 @@ -# Build -bin/ -obj/ -out/ - -# User-specific files -*.user -*.userosscache -*.suo -*.sln.docstates - -# Visual Studio cache -.vs/ - -# Rider cache -.idea/ -*.iml - -# Logs -*.log - -# Environment -.env -*.env - -# Packages (restaurables depuis nuget) -packages/ -*.nupkg -*.snupkg - -# Publish -*.PublishSettings -publish/ - -# Azure -*.azurePubxml - -# macOS -.DS_Store - -# Windows -Thumbs.db -desktop.ini - -# JetBrains Rider -.idea/ - -# VS Code -.vscode/ - -# Coverage / Test -TestResult*/ -*.coverage -*.coveragexml \ No newline at end of file diff --git a/SameApi/SameApi.Data/DbContexts/BaseDbContext.cs b/SameApi/SameApi.Data/DbContexts/BaseDbContext.cs deleted file mode 100644 index f9c3887..0000000 --- a/SameApi/SameApi.Data/DbContexts/BaseDbContext.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.ChangeTracking; -using SameApi.Data.Model; - -namespace SameApi.Data.DbContexts -{ - public class BaseDbContext : DbContext, IBaseDbContext - { - public BaseDbContext(DbContextOptions options) : base(options) - { - } - public new EntityEntry Entry(TModelDao entry) where TModelDao : class, IModelDao - { - return base.Entry(entry); - } - } - -} diff --git a/SameApi/SameApi.Data/DbContexts/IBaseDbContext.cs b/SameApi/SameApi.Data/DbContexts/IBaseDbContext.cs deleted file mode 100644 index 5404092..0000000 --- a/SameApi/SameApi.Data/DbContexts/IBaseDbContext.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.ChangeTracking; -using SameApi.Data.Model; - -namespace SameApi.Data.DbContexts -{ - public interface IBaseDbContext - { - EntityEntry Entry(TModelDao entry) where TModelDao : class, IModelDao; - DbSet Set() where TEntity : class; - Task SaveChangesAsync(bool acceptAllChangesOnSuccess = true, CancellationToken cancellationToken = new CancellationToken()); - } -} diff --git a/SameApi/SameApi.Data/Model/IModelDao.cs b/SameApi/SameApi.Data/Model/IModelDao.cs deleted file mode 100644 index 95010fc..0000000 --- a/SameApi/SameApi.Data/Model/IModelDao.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace SameApi.Data.Model -{ - public interface IModelDao - { - public int Id { get; set; } - } -} diff --git a/SameApi/SameApi.Data/Repository/BaseRepository.cs b/SameApi/SameApi.Data/Repository/BaseRepository.cs deleted file mode 100644 index b092ccf..0000000 --- a/SameApi/SameApi.Data/Repository/BaseRepository.cs +++ /dev/null @@ -1,57 +0,0 @@ -using Microsoft.EntityFrameworkCore; -using SameApi.Data.DbContexts; -using SameApi.Data.Model; - -namespace SameApi.Data.Repository -{ - public class BaseRepository : IBaseRepository - where TModelDao : class, IModelDao - where TContext : IBaseDbContext - { - public TContext _context { get; } - - public BaseRepository(TContext context) - { - _context = context; - } - - public async Task> GetAllAsync(bool withNoTracking = true) - { - IQueryable query = _context.Set(); - - if (withNoTracking) - query = query.AsNoTracking(); - - return await query.ToListAsync(); - } - public async Task AddAndSaveAsync(TModelDao entity) - { - await _context.Set().AddAsync(entity); - await _context.SaveChangesAsync(); - } - - - public async Task GetByIdAsync(int id, bool withNoTracking = true) - { - IQueryable query = _context.Set(); - - if (withNoTracking) - query = query.AsNoTracking(); - - return await query.FirstOrDefaultAsync(x => x.Id == id); - } - - public async Task RemoveByIdAsync(int id, bool withNoTracking = true) - { - var entity = await _context.Set().FindAsync(id); - if (entity != null) - await RemoveAsync(entity); - } - public async Task RemoveAsync(TModelDao entity) - { - _context.Set().Remove(entity); - await _context.SaveChangesAsync(); - } - - } -} diff --git a/SameApi/SameApi.Data/Repository/IBaseRepository.cs b/SameApi/SameApi.Data/Repository/IBaseRepository.cs deleted file mode 100644 index 8b9e4a4..0000000 --- a/SameApi/SameApi.Data/Repository/IBaseRepository.cs +++ /dev/null @@ -1,22 +0,0 @@ -using SameApi.Data.DbContexts; -using SameApi.Data.Model; - -namespace SameApi.Data.Repository -{ - public interface IBaseRepository - where TModelDao : class, IModelDao - where TContext : IBaseDbContext - { - TContext _context { get; } - - Task> GetAllAsync(bool withNoTracking = true); - Task GetByIdAsync(int id, bool withNoTracking = true); - - Task AddAndSaveAsync(TModelDao entity); - Task RemoveAsync(TModelDao entity); - Task RemoveByIdAsync(int id, bool withNoTracking = true); - - - /* all the task for crud*/ - } -} diff --git a/SameApi/SameApi.Data/SameApi.Data.csproj b/SameApi/SameApi.Data/SameApi.Data.csproj deleted file mode 100644 index 9ba7383..0000000 --- a/SameApi/SameApi.Data/SameApi.Data.csproj +++ /dev/null @@ -1,13 +0,0 @@ - - - - net9.0 - enable - enable - - - - - - - diff --git a/SameApi/SameApi.Db/DbConfigurationExtension.cs b/SameApi/SameApi.Db/DbConfigurationExtension.cs deleted file mode 100644 index 6739cac..0000000 --- a/SameApi/SameApi.Db/DbConfigurationExtension.cs +++ /dev/null @@ -1,28 +0,0 @@ -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using SameApi.Db.DbContexts; - -namespace SameApi.Db -{ - public static class DbConfigurationExtension - { - public static void AddSameApibContext(this IServiceCollection services, IConfiguration configuration) - { - var connectionString = configuration.GetConnectionString("DefaultConnection"); - - services.AddDbContext(options => - options.UseSqlServer(connectionString, sqlOptions => - { - sqlOptions.UseQuerySplittingBehavior(QuerySplittingBehavior.SplitQuery) - .UseRelationalNulls() - .EnableRetryOnFailure( - maxRetryCount: 5, // combien de fois on réessaye - maxRetryDelay: TimeSpan.FromSeconds(30), // délai max entre 2 tentatives - errorNumbersToAdd: null // erreurs SQL spécifiques (null = toutes par défaut) - ); - sqlOptions.CommandTimeout((int)TimeSpan.FromMinutes(2).TotalSeconds); - })); - } - } -} \ No newline at end of file diff --git a/SameApi/SameApi.Db/DbContexts/IApiSameDbContext.cs b/SameApi/SameApi.Db/DbContexts/IApiSameDbContext.cs deleted file mode 100644 index 20d9d72..0000000 --- a/SameApi/SameApi.Db/DbContexts/IApiSameDbContext.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Microsoft.EntityFrameworkCore; -using SameApi.Data.DbContexts; -using SameApi.Model; - -namespace SameApi.Db.DbContexts -{ - public interface IApiSameDbContext : IBaseDbContext - { - public DbSet Users { get; set; } - } -} \ No newline at end of file diff --git a/SameApi/SameApi.Db/DbContexts/SameApiDbContext.cs b/SameApi/SameApi.Db/DbContexts/SameApiDbContext.cs deleted file mode 100644 index b75e483..0000000 --- a/SameApi/SameApi.Db/DbContexts/SameApiDbContext.cs +++ /dev/null @@ -1,26 +0,0 @@ -using Microsoft.EntityFrameworkCore; -using SameApi.Data.DbContexts; -using SameApi.Model; -using SameApi.Model.LKP; - -namespace SameApi.Db.DbContexts -{ - public class SameApiDbContext : BaseDbContext, IApiSameDbContext - { - public SameApiDbContext(DbContextOptions options) : base(options) - { - } - public DbSet Users { get; set; } - public DbSet Genders { get; set; } - protected override void OnModelCreating(ModelBuilder modelBuilder) - { - // ... autre configuration ... - - modelBuilder.Entity().HasData( - new LKP_GenderDao { Id = 1, Name = "Male" }, - new LKP_GenderDao { Id = 2, Name = "Female" }, - new LKP_GenderDao { Id = 3, Name = "Other" } - ); - } - } -} \ No newline at end of file diff --git a/SameApi/SameApi.Db/DbRegisterExtension.cs b/SameApi/SameApi.Db/DbRegisterExtension.cs deleted file mode 100644 index 52084a8..0000000 --- a/SameApi/SameApi.Db/DbRegisterExtension.cs +++ /dev/null @@ -1,21 +0,0 @@ -using Microsoft.Extensions.DependencyInjection; -using SameApi.Db.DbContexts; -using SameApi.Db.Repository; -using SameApi.Db.Repository.Implementation; -using SameApi.Db.UnitOfWork; - -namespace SameApi.Db -{ - public static class DbRegisterExtension - { - public static void RegisterSameApiDbContainer(this IServiceCollection services) - { - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - - services.AddScoped(); - services.AddScoped(); - } - } -} \ No newline at end of file diff --git a/SameApi/SameApi.Db/Migrations/20251005003003_1.0.0.Designer.cs b/SameApi/SameApi.Db/Migrations/20251005003003_1.0.0.Designer.cs deleted file mode 100644 index 650193c..0000000 --- a/SameApi/SameApi.Db/Migrations/20251005003003_1.0.0.Designer.cs +++ /dev/null @@ -1,175 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using SameApi.Db.DbContexts; - -#nullable disable - -namespace SameApi.Db.Migrations -{ - [DbContext(typeof(SameApiDbContext))] - [Migration("20251005003003_1.0.0")] - partial class _100 - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "9.0.9") - .HasAnnotation("Relational:MaxIdentifierLength", 128); - - SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); - - modelBuilder.Entity("SameApi.Model.LKP.LKP_GenderDao", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("Name") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.ToTable("LKP_SameApi_Gender"); - }); - - modelBuilder.Entity("SameApi.Model.LKP.LKP_ProfessionDao", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("Name") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.ToTable("LKP_SameApi_Profession"); - }); - - modelBuilder.Entity("SameApi.Model.LKP.LKP_SchoolDao", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("IdProfession") - .HasColumnType("int"); - - b.Property("Name") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("ProfessionId") - .HasColumnType("int"); - - b.HasKey("Id"); - - b.HasIndex("ProfessionId"); - - b.ToTable("LKP_SameApi_School"); - }); - - modelBuilder.Entity("SameApi.Model.UserDao", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("Age") - .HasColumnType("int"); - - b.Property("Birthday") - .HasColumnType("datetime2"); - - b.Property("CreateAt") - .HasColumnType("datetime2"); - - b.Property("Email") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("FirstName") - .HasColumnType("nvarchar(max)"); - - b.Property("GenderDaoId") - .HasColumnType("int"); - - b.Property("IsAdmin") - .HasColumnType("bit"); - - b.Property("LastName") - .HasColumnType("nvarchar(max)"); - - b.Property("NumberFollowers") - .HasColumnType("int"); - - b.Property("Password") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("Pseudo") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("SchoolDaoId") - .HasColumnType("int"); - - b.Property("id_gender_fk") - .HasColumnType("int"); - - b.Property("id_school_fk") - .HasColumnType("int"); - - b.HasKey("Id"); - - b.HasIndex("GenderDaoId"); - - b.HasIndex("SchoolDaoId"); - - b.ToTable("SameApi_User"); - }); - - modelBuilder.Entity("SameApi.Model.LKP.LKP_SchoolDao", b => - { - b.HasOne("SameApi.Model.LKP.LKP_ProfessionDao", "Profession") - .WithMany() - .HasForeignKey("ProfessionId"); - - b.Navigation("Profession"); - }); - - modelBuilder.Entity("SameApi.Model.UserDao", b => - { - b.HasOne("SameApi.Model.LKP.LKP_GenderDao", "GenderDao") - .WithMany() - .HasForeignKey("GenderDaoId"); - - b.HasOne("SameApi.Model.LKP.LKP_SchoolDao", "SchoolDao") - .WithMany() - .HasForeignKey("SchoolDaoId"); - - b.Navigation("GenderDao"); - - b.Navigation("SchoolDao"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/SameApi/SameApi.Db/Migrations/20251005003003_1.0.0.cs b/SameApi/SameApi.Db/Migrations/20251005003003_1.0.0.cs deleted file mode 100644 index 1721405..0000000 --- a/SameApi/SameApi.Db/Migrations/20251005003003_1.0.0.cs +++ /dev/null @@ -1,128 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace SameApi.Db.Migrations -{ - /// - public partial class _100 : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "LKP_SameApi_Gender", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("SqlServer:Identity", "1, 1"), - Name = table.Column(type: "nvarchar(max)", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_LKP_SameApi_Gender", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "LKP_SameApi_Profession", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("SqlServer:Identity", "1, 1"), - Name = table.Column(type: "nvarchar(max)", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_LKP_SameApi_Profession", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "LKP_SameApi_School", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("SqlServer:Identity", "1, 1"), - Name = table.Column(type: "nvarchar(max)", nullable: false), - IdProfession = table.Column(type: "int", nullable: false), - ProfessionId = table.Column(type: "int", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_LKP_SameApi_School", x => x.Id); - table.ForeignKey( - name: "FK_LKP_SameApi_School_LKP_SameApi_Profession_ProfessionId", - column: x => x.ProfessionId, - principalTable: "LKP_SameApi_Profession", - principalColumn: "Id"); - }); - - migrationBuilder.CreateTable( - name: "SameApi_User", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("SqlServer:Identity", "1, 1"), - IsAdmin = table.Column(type: "bit", nullable: false), - Age = table.Column(type: "int", nullable: false), - Birthday = table.Column(type: "datetime2", nullable: true), - Pseudo = table.Column(type: "nvarchar(max)", nullable: false), - FirstName = table.Column(type: "nvarchar(max)", nullable: true), - LastName = table.Column(type: "nvarchar(max)", nullable: true), - Email = table.Column(type: "nvarchar(max)", nullable: false), - Password = table.Column(type: "nvarchar(max)", nullable: false), - NumberFollowers = table.Column(type: "int", nullable: false), - CreateAt = table.Column(type: "datetime2", nullable: false), - id_gender_fk = table.Column(type: "int", nullable: false), - GenderDaoId = table.Column(type: "int", nullable: true), - id_school_fk = table.Column(type: "int", nullable: false), - SchoolDaoId = table.Column(type: "int", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_SameApi_User", x => x.Id); - table.ForeignKey( - name: "FK_SameApi_User_LKP_SameApi_Gender_GenderDaoId", - column: x => x.GenderDaoId, - principalTable: "LKP_SameApi_Gender", - principalColumn: "Id"); - table.ForeignKey( - name: "FK_SameApi_User_LKP_SameApi_School_SchoolDaoId", - column: x => x.SchoolDaoId, - principalTable: "LKP_SameApi_School", - principalColumn: "Id"); - }); - - migrationBuilder.CreateIndex( - name: "IX_LKP_SameApi_School_ProfessionId", - table: "LKP_SameApi_School", - column: "ProfessionId"); - - migrationBuilder.CreateIndex( - name: "IX_SameApi_User_GenderDaoId", - table: "SameApi_User", - column: "GenderDaoId"); - - migrationBuilder.CreateIndex( - name: "IX_SameApi_User_SchoolDaoId", - table: "SameApi_User", - column: "SchoolDaoId"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "SameApi_User"); - - migrationBuilder.DropTable( - name: "LKP_SameApi_Gender"); - - migrationBuilder.DropTable( - name: "LKP_SameApi_School"); - - migrationBuilder.DropTable( - name: "LKP_SameApi_Profession"); - } - } -} diff --git a/SameApi/SameApi.Db/Migrations/20251005003732_1.0.1.Designer.cs b/SameApi/SameApi.Db/Migrations/20251005003732_1.0.1.Designer.cs deleted file mode 100644 index 3901548..0000000 --- a/SameApi/SameApi.Db/Migrations/20251005003732_1.0.1.Designer.cs +++ /dev/null @@ -1,192 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using SameApi.Db.DbContexts; - -#nullable disable - -namespace SameApi.Db.Migrations -{ - [DbContext(typeof(SameApiDbContext))] - [Migration("20251005003732_1.0.1")] - partial class _101 - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "9.0.9") - .HasAnnotation("Relational:MaxIdentifierLength", 128); - - SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); - - modelBuilder.Entity("SameApi.Model.LKP.LKP_GenderDao", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("Name") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.ToTable("LKP_SameApi_Gender"); - - b.HasData( - new - { - Id = 1, - Name = "Male" - }, - new - { - Id = 2, - Name = "Female" - }, - new - { - Id = 3, - Name = "Other" - }); - }); - - modelBuilder.Entity("SameApi.Model.LKP.LKP_ProfessionDao", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("Name") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.ToTable("LKP_SameApi_Profession"); - }); - - modelBuilder.Entity("SameApi.Model.LKP.LKP_SchoolDao", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("IdProfession") - .HasColumnType("int"); - - b.Property("Name") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("ProfessionId") - .HasColumnType("int"); - - b.HasKey("Id"); - - b.HasIndex("ProfessionId"); - - b.ToTable("LKP_SameApi_School"); - }); - - modelBuilder.Entity("SameApi.Model.UserDao", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("Age") - .HasColumnType("int"); - - b.Property("Birthday") - .HasColumnType("datetime2"); - - b.Property("CreateAt") - .HasColumnType("datetime2"); - - b.Property("Email") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("FirstName") - .HasColumnType("nvarchar(max)"); - - b.Property("GenderDaoId") - .HasColumnType("int"); - - b.Property("IsAdmin") - .HasColumnType("bit"); - - b.Property("LastName") - .HasColumnType("nvarchar(max)"); - - b.Property("NumberFollowers") - .HasColumnType("int"); - - b.Property("Password") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("Pseudo") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("SchoolDaoId") - .HasColumnType("int"); - - b.Property("id_gender_fk") - .HasColumnType("int"); - - b.Property("id_school_fk") - .HasColumnType("int"); - - b.HasKey("Id"); - - b.HasIndex("GenderDaoId"); - - b.HasIndex("SchoolDaoId"); - - b.ToTable("SameApi_User"); - }); - - modelBuilder.Entity("SameApi.Model.LKP.LKP_SchoolDao", b => - { - b.HasOne("SameApi.Model.LKP.LKP_ProfessionDao", "Profession") - .WithMany() - .HasForeignKey("ProfessionId"); - - b.Navigation("Profession"); - }); - - modelBuilder.Entity("SameApi.Model.UserDao", b => - { - b.HasOne("SameApi.Model.LKP.LKP_GenderDao", "GenderDao") - .WithMany() - .HasForeignKey("GenderDaoId"); - - b.HasOne("SameApi.Model.LKP.LKP_SchoolDao", "SchoolDao") - .WithMany() - .HasForeignKey("SchoolDaoId"); - - b.Navigation("GenderDao"); - - b.Navigation("SchoolDao"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/SameApi/SameApi.Db/Migrations/20251005003732_1.0.1.cs b/SameApi/SameApi.Db/Migrations/20251005003732_1.0.1.cs deleted file mode 100644 index cec1bfc..0000000 --- a/SameApi/SameApi.Db/Migrations/20251005003732_1.0.1.cs +++ /dev/null @@ -1,45 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -#pragma warning disable CA1814 // Prefer jagged arrays over multidimensional - -namespace SameApi.Db.Migrations -{ - /// - public partial class _101 : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.InsertData( - table: "LKP_SameApi_Gender", - columns: new[] { "Id", "Name" }, - values: new object[,] - { - { 1, "Male" }, - { 2, "Female" }, - { 3, "Other" } - }); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DeleteData( - table: "LKP_SameApi_Gender", - keyColumn: "Id", - keyValue: 1); - - migrationBuilder.DeleteData( - table: "LKP_SameApi_Gender", - keyColumn: "Id", - keyValue: 2); - - migrationBuilder.DeleteData( - table: "LKP_SameApi_Gender", - keyColumn: "Id", - keyValue: 3); - } - } -} diff --git a/SameApi/SameApi.Db/Migrations/SameApiDbContextModelSnapshot.cs b/SameApi/SameApi.Db/Migrations/SameApiDbContextModelSnapshot.cs deleted file mode 100644 index 1584b32..0000000 --- a/SameApi/SameApi.Db/Migrations/SameApiDbContextModelSnapshot.cs +++ /dev/null @@ -1,189 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using SameApi.Db.DbContexts; - -#nullable disable - -namespace SameApi.Db.Migrations -{ - [DbContext(typeof(SameApiDbContext))] - partial class SameApiDbContextModelSnapshot : ModelSnapshot - { - protected override void BuildModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "9.0.9") - .HasAnnotation("Relational:MaxIdentifierLength", 128); - - SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); - - modelBuilder.Entity("SameApi.Model.LKP.LKP_GenderDao", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("Name") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.ToTable("LKP_SameApi_Gender"); - - b.HasData( - new - { - Id = 1, - Name = "Male" - }, - new - { - Id = 2, - Name = "Female" - }, - new - { - Id = 3, - Name = "Other" - }); - }); - - modelBuilder.Entity("SameApi.Model.LKP.LKP_ProfessionDao", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("Name") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.ToTable("LKP_SameApi_Profession"); - }); - - modelBuilder.Entity("SameApi.Model.LKP.LKP_SchoolDao", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("IdProfession") - .HasColumnType("int"); - - b.Property("Name") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("ProfessionId") - .HasColumnType("int"); - - b.HasKey("Id"); - - b.HasIndex("ProfessionId"); - - b.ToTable("LKP_SameApi_School"); - }); - - modelBuilder.Entity("SameApi.Model.UserDao", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("Age") - .HasColumnType("int"); - - b.Property("Birthday") - .HasColumnType("datetime2"); - - b.Property("CreateAt") - .HasColumnType("datetime2"); - - b.Property("Email") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("FirstName") - .HasColumnType("nvarchar(max)"); - - b.Property("GenderDaoId") - .HasColumnType("int"); - - b.Property("IsAdmin") - .HasColumnType("bit"); - - b.Property("LastName") - .HasColumnType("nvarchar(max)"); - - b.Property("NumberFollowers") - .HasColumnType("int"); - - b.Property("Password") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("Pseudo") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("SchoolDaoId") - .HasColumnType("int"); - - b.Property("id_gender_fk") - .HasColumnType("int"); - - b.Property("id_school_fk") - .HasColumnType("int"); - - b.HasKey("Id"); - - b.HasIndex("GenderDaoId"); - - b.HasIndex("SchoolDaoId"); - - b.ToTable("SameApi_User"); - }); - - modelBuilder.Entity("SameApi.Model.LKP.LKP_SchoolDao", b => - { - b.HasOne("SameApi.Model.LKP.LKP_ProfessionDao", "Profession") - .WithMany() - .HasForeignKey("ProfessionId"); - - b.Navigation("Profession"); - }); - - modelBuilder.Entity("SameApi.Model.UserDao", b => - { - b.HasOne("SameApi.Model.LKP.LKP_GenderDao", "GenderDao") - .WithMany() - .HasForeignKey("GenderDaoId"); - - b.HasOne("SameApi.Model.LKP.LKP_SchoolDao", "SchoolDao") - .WithMany() - .HasForeignKey("SchoolDaoId"); - - b.Navigation("GenderDao"); - - b.Navigation("SchoolDao"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/SameApi/SameApi.Db/Repository/IGenderRepository.cs b/SameApi/SameApi.Db/Repository/IGenderRepository.cs deleted file mode 100644 index 76e733c..0000000 --- a/SameApi/SameApi.Db/Repository/IGenderRepository.cs +++ /dev/null @@ -1,12 +0,0 @@ -using SameApi.Data.Repository; -using SameApi.Db.DbContexts; -using SameApi.Model.LKP; - -namespace SameApi.Db.Repository -{ - public interface IGenderRepository : IBaseRepository - { - - - } -} diff --git a/SameApi/SameApi.Db/Repository/IProfessionRepository.cs b/SameApi/SameApi.Db/Repository/IProfessionRepository.cs deleted file mode 100644 index 68a710c..0000000 --- a/SameApi/SameApi.Db/Repository/IProfessionRepository.cs +++ /dev/null @@ -1,13 +0,0 @@ -using SameApi.Data.Repository; -using SameApi.Db.DbContexts; -using SameApi.Model.LKP; - -namespace SameApi.Db.Repository -{ - - public interface IProfessionRepository : IBaseRepository - { - - - } -} diff --git a/SameApi/SameApi.Db/Repository/ISchoolRepository.cs b/SameApi/SameApi.Db/Repository/ISchoolRepository.cs deleted file mode 100644 index 8009cdb..0000000 --- a/SameApi/SameApi.Db/Repository/ISchoolRepository.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Microsoft.EntityFrameworkCore; -using SameApi.Data.Repository; -using SameApi.Db.DbContexts; -using SameApi.Model.LKP; - -namespace SameApi.Db.Repository -{ - public interface ISchoolRepository : IBaseRepository - { - } -} \ No newline at end of file diff --git a/SameApi/SameApi.Db/Repository/IUserRepository.cs b/SameApi/SameApi.Db/Repository/IUserRepository.cs deleted file mode 100644 index b732a98..0000000 --- a/SameApi/SameApi.Db/Repository/IUserRepository.cs +++ /dev/null @@ -1,12 +0,0 @@ -using Microsoft.EntityFrameworkCore; -using SameApi.Data.Repository; -using SameApi.Db.DbContexts; -using SameApi.Model; - -namespace SameApi.Db.Repository -{ - public interface IUserRepository : IBaseRepository - { - Task> GetAllUsersAsync(); - } -} \ No newline at end of file diff --git a/SameApi/SameApi.Db/Repository/Implementation/GenderRepository.cs b/SameApi/SameApi.Db/Repository/Implementation/GenderRepository.cs deleted file mode 100644 index 1c6f6b5..0000000 --- a/SameApi/SameApi.Db/Repository/Implementation/GenderRepository.cs +++ /dev/null @@ -1,22 +0,0 @@ -using SameApi.Data.Repository; -using SameApi.Db.DbContexts; -using SameApi.Model.LKP; - -namespace SameApi.Db.Repository.Implementation -{ - public class GenderRepository : BaseRepository, IGenderRepository - { - private readonly IApiSameDbContext _dbContext; - - public GenderRepository(IApiSameDbContext dbContext): base(dbContext) - { - _dbContext = dbContext; - } - - public new async Task AddAndSaveAsync(LKP_GenderDao entity) - { - _dbContext.Set().Add(entity); - await _dbContext.SaveChangesAsync(); - } - } -} \ No newline at end of file diff --git a/SameApi/SameApi.Db/Repository/Implementation/ProfessionRepository.cs b/SameApi/SameApi.Db/Repository/Implementation/ProfessionRepository.cs deleted file mode 100644 index cea09d4..0000000 --- a/SameApi/SameApi.Db/Repository/Implementation/ProfessionRepository.cs +++ /dev/null @@ -1,22 +0,0 @@ -using SameApi.Data.Repository; -using SameApi.Db.DbContexts; -using SameApi.Model.LKP; - -namespace SameApi.Db.Repository.Implementation -{ - public class ProfessionRepository : BaseRepository, IProfessionRepository - { - private readonly IApiSameDbContext _dbContext; - - public ProfessionRepository(IApiSameDbContext dbContext) : base(dbContext) - { - _dbContext = dbContext; - } - - public async Task AddAndSaveAsync(LKP_GenderDao entity) - { - _dbContext.Set().Add(entity); - await _dbContext.SaveChangesAsync(); - } - } -} \ No newline at end of file diff --git a/SameApi/SameApi.Db/Repository/Implementation/SchoolRepository.cs b/SameApi/SameApi.Db/Repository/Implementation/SchoolRepository.cs deleted file mode 100644 index f6f6f5f..0000000 --- a/SameApi/SameApi.Db/Repository/Implementation/SchoolRepository.cs +++ /dev/null @@ -1,22 +0,0 @@ -using SameApi.Data.Repository; -using SameApi.Db.DbContexts; -using SameApi.Model.LKP; - -namespace SameApi.Db.Repository.Implementation -{ - public class SchoolRepository : BaseRepository, ISchoolRepository - { - private readonly IApiSameDbContext _dbContext; - - public SchoolRepository(IApiSameDbContext dbContext) : base(dbContext) - { - _dbContext = dbContext; - } - - public async Task AddAndSaveAsync(LKP_SchoolDao entity) - { - _dbContext.Set().Add(entity); - await _dbContext.SaveChangesAsync(); - } - } -} \ No newline at end of file diff --git a/SameApi/SameApi.Db/Repository/Implementation/UserRepository.cs b/SameApi/SameApi.Db/Repository/Implementation/UserRepository.cs deleted file mode 100644 index c331eb0..0000000 --- a/SameApi/SameApi.Db/Repository/Implementation/UserRepository.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Microsoft.EntityFrameworkCore; -using SameApi.Data.Repository; -using SameApi.Db.DbContexts; -using SameApi.Model; - -namespace SameApi.Db.Repository.Implementation -{ - public class UserRepository : BaseRepository, IUserRepository - { - public UserRepository(IApiSameDbContext context) : base(context) - { } - public async Task> GetAllUsersAsync() - { - - return await _context.Users - .Include(user => user.GenderDao) - .Include(user => user.SchoolDao) - .AsNoTracking() - .ToListAsync(); - } - } - -} \ No newline at end of file diff --git a/SameApi/SameApi.Db/SameApi.Db.csproj b/SameApi/SameApi.Db/SameApi.Db.csproj deleted file mode 100644 index f0f6694..0000000 --- a/SameApi/SameApi.Db/SameApi.Db.csproj +++ /dev/null @@ -1,28 +0,0 @@ - - - - net9.0 - enable - enable - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - diff --git a/SameApi/SameApi.Db/UnitOfWork/IApiSameUnitOfWork.cs b/SameApi/SameApi.Db/UnitOfWork/IApiSameUnitOfWork.cs deleted file mode 100644 index edc9d8b..0000000 --- a/SameApi/SameApi.Db/UnitOfWork/IApiSameUnitOfWork.cs +++ /dev/null @@ -1,15 +0,0 @@ -using SameApi.Db.DbContexts; -using SameApi.Db.Repository; - -namespace SameApi.Db.UnitOfWork -{ - public interface IApiSameUnitOfWork - { - IApiSameDbContext Context { get; } - IUserRepository UserRepository { get; } - IGenderRepository GenderRepository { get; } - IProfessionRepository ProfessionRepository { get; } - Task SaveChangesAsync(); - - } -} \ No newline at end of file diff --git a/SameApi/SameApi.Db/UnitOfWork/SameApiUnitOfWork.cs b/SameApi/SameApi.Db/UnitOfWork/SameApiUnitOfWork.cs deleted file mode 100644 index a10fc14..0000000 --- a/SameApi/SameApi.Db/UnitOfWork/SameApiUnitOfWork.cs +++ /dev/null @@ -1,32 +0,0 @@ -using SameApi.Db.DbContexts; -using SameApi.Db.Repository; - -namespace SameApi.Db.UnitOfWork -{ - public class SameApiUnitOfWork : IApiSameUnitOfWork - { - public IApiSameDbContext Context { get; } - public IUserRepository UserRepository { get; } - public IGenderRepository GenderRepository { get; } - public IProfessionRepository ProfessionRepository { get; } - - public SameApiUnitOfWork( - IApiSameDbContext context, - IUserRepository repository, - IGenderRepository genderRepository, - IProfessionRepository professionRepository - ) - { - Context = context; - UserRepository = repository; - GenderRepository = genderRepository; - ProfessionRepository = professionRepository; - } - - public async Task SaveChangesAsync() - { - return await Context.SaveChangesAsync(); - } - - } -} \ No newline at end of file diff --git a/SameApi/SameApi.Dto/GenderInput.cs b/SameApi/SameApi.Dto/GenderInput.cs deleted file mode 100644 index 0dabf33..0000000 --- a/SameApi/SameApi.Dto/GenderInput.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace SameApi.Dto -{ - public class GenderInput - { - public int Id { get; set; } - public string? Name { get; set; } - } -} diff --git a/SameApi/SameApi.Dto/GenderResponse.cs b/SameApi/SameApi.Dto/GenderResponse.cs deleted file mode 100644 index 2d936cd..0000000 --- a/SameApi/SameApi.Dto/GenderResponse.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace SameApi.Dto -{ - public class GenderResponse - { - public int Id { get; set; } - public string? Name { get; set; } - } -} \ No newline at end of file diff --git a/SameApi/SameApi.Dto/ProfessionInput.cs b/SameApi/SameApi.Dto/ProfessionInput.cs deleted file mode 100644 index 9c07e98..0000000 --- a/SameApi/SameApi.Dto/ProfessionInput.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace SameApi.Dto -{ - public class ProfessionInput - { - public int Id { get; set; } - public required string Name { get; set; } - } -} diff --git a/SameApi/SameApi.Dto/ProfessionResponse.cs b/SameApi/SameApi.Dto/ProfessionResponse.cs deleted file mode 100644 index a3a23b4..0000000 --- a/SameApi/SameApi.Dto/ProfessionResponse.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace SameApi.Dto -{ - public class ProfessionResponse - { - public int Id { get; set; } - public string? Name { get; set; } - } -} diff --git a/SameApi/SameApi.Dto/SameApi.Dto.csproj b/SameApi/SameApi.Dto/SameApi.Dto.csproj deleted file mode 100644 index 9ba7383..0000000 --- a/SameApi/SameApi.Dto/SameApi.Dto.csproj +++ /dev/null @@ -1,13 +0,0 @@ - - - - net9.0 - enable - enable - - - - - - - diff --git a/SameApi/SameApi.Dto/UserInput.cs b/SameApi/SameApi.Dto/UserInput.cs deleted file mode 100644 index f15d2cd..0000000 --- a/SameApi/SameApi.Dto/UserInput.cs +++ /dev/null @@ -1,18 +0,0 @@ -namespace SameApi.Dto -{ - public class UserInput - { - public int Id { get; set; } - public bool IsAdmin { get; set; } - public DateTime? Birthday { get; set; } - public string? FirstName { get; set; } - public string? LastName { get; set; } - public string? Pseudo { get; set; } - public string? Email { get; set; } - public string? Password { get; set; } - public int NumberFollowers { get; set; } - public DateTime CreateAt { get; set; } = DateTime.Now; - public int GenderId { get; set; } - - } -} \ No newline at end of file diff --git a/SameApi/SameApi.Dto/UserResponse.cs b/SameApi/SameApi.Dto/UserResponse.cs deleted file mode 100644 index 81eed78..0000000 --- a/SameApi/SameApi.Dto/UserResponse.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace SameApi.Dto -{ - public class UserResponse - { - public int Id { get; set; } - public bool IsAdmin { get; set; } - public int Age { get; set; } - public required string Pseudo { get; set; } - public required string Email { get; set; } - public int NumberFollowers { get; set; } - public DateTime CreateAt { get; set; } - public GenderResponse? Gender { get; set; } - } -} \ No newline at end of file diff --git a/SameApi/SameApi.Model/LKP/LKP_GenderDao.cs b/SameApi/SameApi.Model/LKP/LKP_GenderDao.cs deleted file mode 100644 index 9fc1551..0000000 --- a/SameApi/SameApi.Model/LKP/LKP_GenderDao.cs +++ /dev/null @@ -1,14 +0,0 @@ -using SameApi.Data.Model; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; - -namespace SameApi.Model.LKP -{ - [Table("LKP_SameApi_Gender")] - public class LKP_GenderDao : IModelDao - { - [Key] - public int Id { get; set; } - public required string Name { get; set; } - } -} diff --git a/SameApi/SameApi.Model/LKP/LKP_ProfessionDao.cs b/SameApi/SameApi.Model/LKP/LKP_ProfessionDao.cs deleted file mode 100644 index e144419..0000000 --- a/SameApi/SameApi.Model/LKP/LKP_ProfessionDao.cs +++ /dev/null @@ -1,14 +0,0 @@ -using SameApi.Data.Model; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; - -namespace SameApi.Model.LKP -{ - [Table("LKP_SameApi_Profession")] - public class LKP_ProfessionDao : IModelDao - { - [Key] - public int Id { get; set; } - public required string Name { get; set; } - } -} diff --git a/SameApi/SameApi.Model/LKP/LKP_SchoolDao.cs b/SameApi/SameApi.Model/LKP/LKP_SchoolDao.cs deleted file mode 100644 index e6cc323..0000000 --- a/SameApi/SameApi.Model/LKP/LKP_SchoolDao.cs +++ /dev/null @@ -1,19 +0,0 @@ -using SameApi.Data.Model; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; - -namespace SameApi.Model.LKP -{ - [Table("LKP_SameApi_School")] - public class LKP_SchoolDao : IModelDao - { - [Key] - public int Id { get; set; } - public required string Name { get; set; } - - [ForeignKey("Same_Api_School_Profession")] - public int IdProfession { get; set; } - public LKP_ProfessionDao? Profession { get; set; } - - } -} diff --git a/SameApi/SameApi.Model/PostDao.cs b/SameApi/SameApi.Model/PostDao.cs deleted file mode 100644 index 0d2f0a2..0000000 --- a/SameApi/SameApi.Model/PostDao.cs +++ /dev/null @@ -1,12 +0,0 @@ -using SameApi.Data.Model; -using System.ComponentModel.DataAnnotations.Schema; - -namespace SameApi.Model -{ - [Table("SameApi_Post")] - public class PostDao : IModelDao - { - public int Id { get; set; } - - } -} diff --git a/SameApi/SameApi.Model/Properties/PublishProfiles/SameApiModel20251010150345.pubxml b/SameApi/SameApi.Model/Properties/PublishProfiles/SameApiModel20251010150345.pubxml deleted file mode 100644 index c46d2b2..0000000 --- a/SameApi/SameApi.Model/Properties/PublishProfiles/SameApiModel20251010150345.pubxml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - Container - ContainerRegistry - NetSdk - /subscriptions/19bef6f3-1177-40ab-b901-ca08203ef74a/resourcegroups/DefaultResourceGroup-CHN/providers/Microsoft.ContainerRegistry/registries/SameApiModel20251010150345 - SameApiModel20251010150345 - DefaultResourceGroup-CHN - Same Azure Credit - sameapimodel20251010150345.azurecr.io - latest - Release - Any CPU - linux-x64 - <_TargetId>NetSdkAzureConsoleContainerRegistry - - \ No newline at end of file diff --git a/SameApi/SameApi.Model/SameApi.Model.csproj b/SameApi/SameApi.Model/SameApi.Model.csproj deleted file mode 100644 index e33df25..0000000 --- a/SameApi/SameApi.Model/SameApi.Model.csproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - net9.0 - enable - enable - - - - - - - - - - - diff --git a/SameApi/SameApi.Model/UserDao.cs b/SameApi/SameApi.Model/UserDao.cs deleted file mode 100644 index b01fa14..0000000 --- a/SameApi/SameApi.Model/UserDao.cs +++ /dev/null @@ -1,33 +0,0 @@ -using SameApi.Data.Model; -using SameApi.Model.LKP; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; - -namespace SameApi.Model -{ - [Table("SameApi_User")] - public class UserDao : IModelDao - { - [Key] - public int Id { get; set; } - public bool IsAdmin { get; set; } - public int Age { get ; set; } - public DateTime? Birthday { get; set; } - public required string Pseudo { get; set; } - public required string? FirstName { get; set; } - public required string? LastName { get; set; } - public required string Email { get; set; } - public required string Password { get; set; } - public int NumberFollowers { get; set; } - public DateTime CreateAt { get; set; } - - - [ForeignKey("Same_Api_User_Gender")] - public int id_gender_fk { get; set; } - public LKP_GenderDao? GenderDao { get; set; } - - [ForeignKey("Same_Api_User_School")] - public int id_school_fk { get; set; } - public LKP_SchoolDao? SchoolDao { get; set; } - } -} \ No newline at end of file diff --git a/SameApi/SameApi.sln b/SameApi/SameApi.sln deleted file mode 100644 index e3dd9cd..0000000 --- a/SameApi/SameApi.sln +++ /dev/null @@ -1,55 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.14.36414.22 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SameApi.Business", "SameApi.Business\SameApi.Business.csproj", "{7A6884A3-41EA-4DBD-909D-E60A8089CC7C}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SameApi.Data", "SameApi.Data\SameApi.Data.csproj", "{8952E3E2-42C3-49F8-B280-CBCD3626963D}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SameApi.Db", "SameApi.Db\SameApi.Db.csproj", "{1D3795CB-39F8-4FFD-B023-22CF0EEC1140}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SameApi.Dto", "SameApi.Dto\SameApi.Dto.csproj", "{D644C83B-08DD-4311-94B5-BFB98FAA5537}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SameApi.Model", "SameApi.Model\SameApi.Model.csproj", "{46AE2F08-6435-4248-8C9A-F4606A24CA98}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SameApi.App", "SameApi.App\SameApi.App.csproj", "{376BF37E-F49D-479B-91A3-3D7A6D33CC1E}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {7A6884A3-41EA-4DBD-909D-E60A8089CC7C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7A6884A3-41EA-4DBD-909D-E60A8089CC7C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7A6884A3-41EA-4DBD-909D-E60A8089CC7C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7A6884A3-41EA-4DBD-909D-E60A8089CC7C}.Release|Any CPU.Build.0 = Release|Any CPU - {8952E3E2-42C3-49F8-B280-CBCD3626963D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8952E3E2-42C3-49F8-B280-CBCD3626963D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8952E3E2-42C3-49F8-B280-CBCD3626963D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8952E3E2-42C3-49F8-B280-CBCD3626963D}.Release|Any CPU.Build.0 = Release|Any CPU - {1D3795CB-39F8-4FFD-B023-22CF0EEC1140}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1D3795CB-39F8-4FFD-B023-22CF0EEC1140}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1D3795CB-39F8-4FFD-B023-22CF0EEC1140}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1D3795CB-39F8-4FFD-B023-22CF0EEC1140}.Release|Any CPU.Build.0 = Release|Any CPU - {D644C83B-08DD-4311-94B5-BFB98FAA5537}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D644C83B-08DD-4311-94B5-BFB98FAA5537}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D644C83B-08DD-4311-94B5-BFB98FAA5537}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D644C83B-08DD-4311-94B5-BFB98FAA5537}.Release|Any CPU.Build.0 = Release|Any CPU - {46AE2F08-6435-4248-8C9A-F4606A24CA98}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {46AE2F08-6435-4248-8C9A-F4606A24CA98}.Debug|Any CPU.Build.0 = Debug|Any CPU - {46AE2F08-6435-4248-8C9A-F4606A24CA98}.Release|Any CPU.ActiveCfg = Release|Any CPU - {46AE2F08-6435-4248-8C9A-F4606A24CA98}.Release|Any CPU.Build.0 = Release|Any CPU - {376BF37E-F49D-479B-91A3-3D7A6D33CC1E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {376BF37E-F49D-479B-91A3-3D7A6D33CC1E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {376BF37E-F49D-479B-91A3-3D7A6D33CC1E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {376BF37E-F49D-479B-91A3-3D7A6D33CC1E}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {81B3946A-78E1-48F8-B665-E8D2DA05A96A} - EndGlobalSection -EndGlobal diff --git a/SameApi/Sql/insertAdmin.sql b/SameApi/Sql/insertAdmin.sql deleted file mode 100644 index ed3f759..0000000 --- a/SameApi/Sql/insertAdmin.sql +++ /dev/null @@ -1,35 +0,0 @@ -INSERT INTO UserDao ( - IsAdmin, - Age, - Pseudo, - Email, - Password, - NumberFollowers, - CreateAt, - GenderId -) VALUES ( - 1, -- IsAdmin: true (admin user) - 30, -- Age: example value - 'adminuser', -- Pseudo: example username - 'admin@example.com', -- Email: example email - 'hashedpassword', -- Password: store hashed password - 0, -- NumberFollowers: initial value - GETDATE(), -- CreateAt: current date/time - 1 -- GenderId: example gender id -); - -INSERT INTO LKP_SameApi_Gender ( - Id, - Name -) VALUES ( - 1, - 'Male' -); - -INSERT INTO LKP_SameApi_Gender ( - Id, - Name -) VALUES ( - 2, - 'Female' -); diff --git a/React/eslint.config.js b/eslint.config.js similarity index 100% rename from React/eslint.config.js rename to eslint.config.js diff --git a/React/index.html b/index.html similarity index 100% rename from React/index.html rename to index.html diff --git a/package.json b/package.json index dffa07e..82bd3fd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,32 @@ { + "name": "same", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, "dependencies": { - "dotenv": "^17.2.3", - "sass": "^1.93.2" + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.1", + "react": "^19.1.1", + "react-dom": "^19.1.1", + "react-router-dom": "^7.8.2" + }, + "devDependencies": { + "@eslint/js": "^9.33.0", + "@types/react": "^19.1.10", + "@types/react-dom": "^19.1.7", + "@vitejs/plugin-react": "^5.0.0", + "eslint": "^9.33.0", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.20", + "globals": "^16.3.0", + "typescript": "~5.8.3", + "typescript-eslint": "^8.39.1", + "vite": "^7.1.2" } } diff --git a/React/src/App.tsx b/src/App.tsx similarity index 100% rename from React/src/App.tsx rename to src/App.tsx diff --git a/React/src/AppRoutes.tsx b/src/AppRoutes.tsx similarity index 100% rename from React/src/AppRoutes.tsx rename to src/AppRoutes.tsx diff --git a/React/src/api/User.ts b/src/api/User.ts similarity index 100% rename from React/src/api/User.ts rename to src/api/User.ts diff --git a/React/src/api/apiConfig.ts b/src/api/apiConfig.ts similarity index 100% rename from React/src/api/apiConfig.ts rename to src/api/apiConfig.ts diff --git a/React/src/assets/img/same-accessibility-settings-icon.png b/src/assets/img/same-accessibility-settings-icon.png similarity index 100% rename from React/src/assets/img/same-accessibility-settings-icon.png rename to src/assets/img/same-accessibility-settings-icon.png diff --git a/React/src/assets/img/same-register-login-background.png b/src/assets/img/same-register-login-background.png similarity index 100% rename from React/src/assets/img/same-register-login-background.png rename to src/assets/img/same-register-login-background.png diff --git a/React/src/components/forms/login/LoginForm.tsx b/src/components/forms/login/LoginForm.tsx similarity index 100% rename from React/src/components/forms/login/LoginForm.tsx rename to src/components/forms/login/LoginForm.tsx diff --git a/React/src/components/forms/login/PasswordField.tsx b/src/components/forms/login/PasswordField.tsx similarity index 100% rename from React/src/components/forms/login/PasswordField.tsx rename to src/components/forms/login/PasswordField.tsx diff --git a/React/src/components/forms/signup/BirthdateField.tsx b/src/components/forms/signup/BirthdateField.tsx similarity index 100% rename from React/src/components/forms/signup/BirthdateField.tsx rename to src/components/forms/signup/BirthdateField.tsx diff --git a/React/src/components/forms/signup/EmailField.tsx b/src/components/forms/signup/EmailField.tsx similarity index 100% rename from React/src/components/forms/signup/EmailField.tsx rename to src/components/forms/signup/EmailField.tsx diff --git a/React/src/components/forms/signup/FirstNameField.tsx b/src/components/forms/signup/FirstNameField.tsx similarity index 100% rename from React/src/components/forms/signup/FirstNameField.tsx rename to src/components/forms/signup/FirstNameField.tsx diff --git a/React/src/components/forms/signup/LastNameField.tsx b/src/components/forms/signup/LastNameField.tsx similarity index 100% rename from React/src/components/forms/signup/LastNameField.tsx rename to src/components/forms/signup/LastNameField.tsx diff --git a/React/src/components/forms/signup/PasswordFields.tsx b/src/components/forms/signup/PasswordFields.tsx similarity index 100% rename from React/src/components/forms/signup/PasswordFields.tsx rename to src/components/forms/signup/PasswordFields.tsx diff --git a/React/src/components/forms/signup/SignupCard.tsx b/src/components/forms/signup/SignupCard.tsx similarity index 100% rename from React/src/components/forms/signup/SignupCard.tsx rename to src/components/forms/signup/SignupCard.tsx diff --git a/React/src/components/forms/signup/SignupForm.tsx b/src/components/forms/signup/SignupForm.tsx similarity index 100% rename from React/src/components/forms/signup/SignupForm.tsx rename to src/components/forms/signup/SignupForm.tsx diff --git a/React/src/components/forms/signup/Username.tsx b/src/components/forms/signup/Username.tsx similarity index 100% rename from React/src/components/forms/signup/Username.tsx rename to src/components/forms/signup/Username.tsx diff --git a/React/src/emotion.d.ts b/src/emotion.d.ts similarity index 100% rename from React/src/emotion.d.ts rename to src/emotion.d.ts diff --git a/React/src/index.css b/src/index.css similarity index 100% rename from React/src/index.css rename to src/index.css diff --git a/React/src/main.tsx b/src/main.tsx similarity index 100% rename from React/src/main.tsx rename to src/main.tsx diff --git a/React/src/pages/HomeView.tsx b/src/pages/HomeView.tsx similarity index 100% rename from React/src/pages/HomeView.tsx rename to src/pages/HomeView.tsx diff --git a/React/src/pages/LoginView.tsx b/src/pages/LoginView.tsx similarity index 100% rename from React/src/pages/LoginView.tsx rename to src/pages/LoginView.tsx diff --git a/React/src/pages/NotFoundView.tsx b/src/pages/NotFoundView.tsx similarity index 100% rename from React/src/pages/NotFoundView.tsx rename to src/pages/NotFoundView.tsx diff --git a/React/src/pages/SignupView.tsx b/src/pages/SignupView.tsx similarity index 100% rename from React/src/pages/SignupView.tsx rename to src/pages/SignupView.tsx diff --git a/React/src/styles/globalStyle.tsx b/src/styles/globalStyle.tsx similarity index 100% rename from React/src/styles/globalStyle.tsx rename to src/styles/globalStyle.tsx diff --git a/React/src/styles/theme.tsx b/src/styles/theme.tsx similarity index 100% rename from React/src/styles/theme.tsx rename to src/styles/theme.tsx diff --git a/React/src/vite-env.d.ts b/src/vite-env.d.ts similarity index 100% rename from React/src/vite-env.d.ts rename to src/vite-env.d.ts diff --git a/React/tsconfig.app.json b/tsconfig.app.json similarity index 100% rename from React/tsconfig.app.json rename to tsconfig.app.json diff --git a/React/tsconfig.json b/tsconfig.json similarity index 100% rename from React/tsconfig.json rename to tsconfig.json diff --git a/React/tsconfig.node.json b/tsconfig.node.json similarity index 100% rename from React/tsconfig.node.json rename to tsconfig.node.json diff --git a/use-case-same.uxf b/use-case-same.uxf deleted file mode 100644 index b22406b..0000000 --- a/use-case-same.uxf +++ /dev/null @@ -1,29 +0,0 @@ -10UMLActor15627060110ActorUMLGeneric246160680730System -halign=leftUMLUseCase24618012040Sign UpUMLUseCase25623012040School configUMLUseCase26628012040loginUMLUseCase26635012040read postUMLUseCase26640013050interactif with postsUMLUseCase26649013050create postsUMLUseCase466170320130- username -- first name -- last name -- email -- birthdate -- password -- passoword confirmationRelation35619013060lt=.> -<<includes>>10;10;110;40UMLUseCase45635012040Filter by tagsRelation37635010040lt=.> -<<extends>>10;20;80;20UMLUseCase45641012040- like -- commentRelation3864009050lt=.> -<<extends>>10;20;70;30UMLUseCase67642015040- identify people (@) -- imgRelation55642014040lt=.> -<<extends>>10;20;120;20UMLUseCase66637015040- body (text)Relation56638012060lt=.> -<<includes>>10;40;100;10UMLUseCase43646015060- title -- option tags -- imgRelation3864807050lt=.> -<<extends>>10;30;50;10UMLUseCase53651023070- required tag (ex: advise, story, ..) -- auto tags ( username, school )Relation36651019050lt=.> -<<includes>>10;20;170;30Relation176290904010;20;70;20UMLUseCase27655012040customise profilUMLUseCase50658012040- change user ppRelation38656014060lt=.> -<<includes>>10;10;120;40UMLUseCase26663025070- make first / last name public -( look by everybody ) -- add pronouns -- add bioRelation3365809070lt=.> -<<extends>>10;10;10;50UMLUseCase26671012040email vérificationUMLUseCase47671012040- recive a tokkenRelation37671012040lt=.> -<<includes>>10;20;100;20UMLActor115620060110AdminUMLUseCase139620021080post regulationRelation11762202404010;20;220;20UMLUseCase171617015040- manuel regulationRelation158618015060lt=.> -<<extends>>10;40;130;10UMLUseCase172623014050- AI regulation -- API regulationRelation159022016050lt=.> -<<includes>>10;20;140;30 \ No newline at end of file diff --git a/React/vite.config.ts b/vite.config.ts similarity index 100% rename from React/vite.config.ts rename to vite.config.ts From 4702af0bddf469fb7db62a63f33fec3ae54e29e9 Mon Sep 17 00:00:00 2001 From: IlP4rAd0xlI Date: Fri, 14 Nov 2025 14:13:48 +0100 Subject: [PATCH 77/77] Fix little warnings : remove unused const on passwordFields and remove duplicated var in User --- src/api/User.ts | 3 +-- src/components/forms/login/PasswordField.tsx | 16 +--------------- 2 files changed, 2 insertions(+), 17 deletions(-) diff --git a/src/api/User.ts b/src/api/User.ts index 38c757b..65b864f 100644 --- a/src/api/User.ts +++ b/src/api/User.ts @@ -18,10 +18,9 @@ export type PostUserProps = { export const PostUser = async (param:PostUserProps) => { const headers = getHeaders() - const response = await fetch(apiConfig.apiUrl + "/user/create", { + return await fetch(apiConfig.apiUrl + "/user/create", { method: "POST", headers: {...headers}, body: JSON.stringify(param), }); - return response; } \ No newline at end of file diff --git a/src/components/forms/login/PasswordField.tsx b/src/components/forms/login/PasswordField.tsx index b8b220e..ec357f6 100644 --- a/src/components/forms/login/PasswordField.tsx +++ b/src/components/forms/login/PasswordField.tsx @@ -34,24 +34,12 @@ const StyledInput = styled.input<{ hasError: boolean }>` interface PasswordFieldsProps { passwordValue: string - onPasswordChange: (value: string) => void } export default function PasswordFields({ passwordValue, - onPasswordChange, }: PasswordFieldsProps) { - const [passwordErrors, setPasswordErrors] = useState([]) - - // const handlePasswordBlur = () => { - // const trimmedValue = passwordValue.trim() - // const newErrors: string[] = [] - // } - // - // const handlePasswordChange = (e: React.ChangeEvent) => { - // onPasswordChange(e.target.value) - // setPasswordErrors([]) - // } + const [passwordErrors] = useState([]) return ( <> @@ -60,8 +48,6 @@ export default function PasswordFields({ 0} />

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