diff --git a/CONVENTIONS.md b/CONVENTIONS.md new file mode 100644 index 0000000..867421a --- /dev/null +++ b/CONVENTIONS.md @@ -0,0 +1,106 @@ +# Git Convention Guide + +## Commits (Conventional Commits) + +### Format + +``` +type(scope?): description +``` + +### Types principaux + +* `feat`: nouvelle fonctionnalité +* `fix`: correction de bug +* `refactor`: modification interne sans changement fonctionnel +* `style`: formatage / UI mineur (pas de logique) +* `docs`: documentation +* `test`: ajout/modification de tests +* `chore`: maintenance (deps, config…) +* `perf`: amélioration de performance +* `build`: build / dépendances +* `ci`: intégration continue + +### Exemples + +``` +feat(auth): add login with CAS +fix(navbar): fix mobile display issue +refactor(api): simplify error handling +style(ui): adjust spacing in header +``` + +### Bonnes pratiques + +* écrire à l'impératif → `add`, `fix`, `update` +* description courte (-50 caractères) et explicite +* un commit = une seule intention + +### Breaking changes + +L'ajour d'un point d'exclamation est possible pour signifier un breaking change. +``` +feat!: remove old API +``` + +--- + +## Branches + +### Format + +``` +type/short-description +``` + +### Types + +* `feat/` +* `fix/` +* `refactor/` +* `chore/` +* `docs/` +* `perf/` +* `test/` + +### Exemples + +``` +feat/login-page +fix/navbar-mobile +refactor/auth-hooks +``` + +### Bonnes pratiques + +* utiliser kebab-case +* rester court et clair +* une branche = un objectif + +--- + +## Choisir le bon type (exemple avec le frontend) + +| Situation | Type | +| ------------------------ | -------- | +| Nouvelle feature visible | feat | +| Bug | fix | +| Refacto interne | refactor | +| Amélioration performance | perf | +| Ajustement visuel mineur | style | + +--- + +## Exemple workflow + +``` +prod + └── feat/login-page + |── fix(auth): login-error + └── style(auth): color for 2026 edition +``` + +1. créer une branche depuis prod +2. faire des commits propres +3. ouvrir une pull request +4. merge après review diff --git a/README.md b/README.md index 65e3eea..2211397 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Projet d'Intégration UTT – Environnement de Développement +# Projet d'Intégration UTT - Environnement de Développement Ce projet est une plateforme pour le site d'intégration de l'Université de Technologie de Troyes. Il utilise une architecture conteneurisée via Docker pour gérer le frontend, le backend et la base de données PostgreSQL. @@ -165,7 +165,7 @@ server { } ``` -Puis l’activer : +Puis l'activer : ```bash sudo ln -s /etc/nginx/sites-available/integration.utt.fr /etc/nginx/sites-enabled/ @@ -202,7 +202,7 @@ Ouvrir : ## 🔚 Nettoyage quand le dev est terminé -### 1. Supprimer l’entrée dans `/etc/hosts` +### 1. Supprimer l'entrée dans `/etc/hosts` ```bash sudo nano /etc/hosts diff --git a/backend/package-lock.json b/backend/package-lock.json index 42f6889..f252eba 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -219,6 +219,395 @@ "source-map-support": "^0.5.21" } }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, "node_modules/@esbuild-kit/esm-loader": { "version": "2.6.5", "resolved": "https://registry.npmjs.org/@esbuild-kit/esm-loader/-/esm-loader-2.6.5.tgz", diff --git a/backend/src/controllers/role.controller.ts b/backend/src/controllers/role.controller.ts index e53382d..e653377 100644 --- a/backend/src/controllers/role.controller.ts +++ b/backend/src/controllers/role.controller.ts @@ -9,7 +9,7 @@ export const updateUserPreferences = async (req: Request, res: Response) => { const { roleIds } = req.body; if (!userId || !Array.isArray(roleIds)) { - Error(res, { msg: "Données invalides" }); + Error(res, { msg: "Données invalides" }); } await role_service.updateUserPreferences(userId, roleIds); @@ -24,7 +24,7 @@ export const getUserPreferences = async (req: Request, res: Response) => { try { const userId = req.user?.userId; - if (!userId) Error(res, { msg: "Utilisateur non authentifié" }); + if (!userId) Error(res, { msg: "Utilisateur non authentifié" }); const preferences = await role_service.getUserPreferences(userId); const roleIds = preferences.map((pref) => pref.roleId); @@ -39,7 +39,7 @@ export const getUserPreferences = async (req: Request, res: Response) => { export const getUsersByRoleHandler = async (req: Request, res: Response) => { try { const { roleName } = req.params; - if (!roleName) Error(res, { msg: "Nom du rôle requis" }); + if (!roleName) Error(res, { msg: "Nom du rôle requis" }); const users = await role_service.getUsersByRoleName(roleName); Ok(res, { msg: "Utilisateurs récupérés", data: users }); @@ -55,7 +55,7 @@ export const addRoleToUser = async (req: Request, res: Response) => { const { userId, roleIds } = req.body; if (!userId || !Array.isArray(roleIds)) { - Error(res, { msg: "userId et roleIds requis" }); + Error(res, { msg: "userId et roleIds requis" }); } for (const roleId of roleIds) { @@ -72,13 +72,13 @@ export const addRoleToUser = async (req: Request, res: Response) => { } }; -// ❌ Supprimer rôle d’un utilisateur +// ❌ Supprimer rôle d'un utilisateur export const deleteRoleToUser = async (req: Request, res: Response) => { try { const { userId, roleId } = req.body; if (!userId || !roleId) { - Error(res, { msg: "userId et roleId requis" }); + Error(res, { msg: "userId et roleId requis" }); } await role_service.removeRoleFromUser(userId, roleId); @@ -111,11 +111,11 @@ export const getRoles = async (req: Request, res: Response) => { } }; -// 🔍 Rôles d’un utilisateur +// 🔍 Rôles d'un utilisateur export const getUserRoles = async (req: Request, res: Response) => { try { const { userId } = req.query; - if (!userId) Error(res, { msg: "userId requis" }); + if (!userId) Error(res, { msg: "userId requis" }); const roles = await role_service.getUserRoles(Number(userId)); Ok(res, { data: roles }); @@ -135,7 +135,7 @@ export const addPointsToRole = async (req: Request, res: Response) => { const { roleId, points } = req.body; if (!roleId || typeof points !== "number") { - Error(res, { msg: "roleId et points requis" }); + Error(res, { msg: "roleId et points requis" }); } await role_service.addPointsToRole(roleId, points); @@ -152,7 +152,7 @@ export const removePointsFromRole = async (req: Request, res: Response) => { const { roleId, points } = req.body; if (!roleId || typeof points !== "number") { - Error(res, { msg: "roleId et points requis" }); + Error(res, { msg: "roleId et points requis" }); } await role_service.removePointsFromRole(roleId, points); @@ -174,14 +174,14 @@ export const getAllRolePoints = async (_req: Request, res: Response) => { } }; -// 🔍 Points d’un rôle spécifique +// 🔍 Points d'un rôle spécifique export const getRolePoints = async (req: Request, res: Response) => { try { const { roleId } = req.params; - if (!roleId) Error(res, { msg: "roleId requis" }); + if (!roleId) Error(res, { msg: "roleId requis" }); const role = await role_service.getRolePoints(Number(roleId)); - if (!role) Error(res, { msg: "Rôle introuvable" }); + if (!role) Error(res, { msg: "Rôle introuvable" }); Ok(res, { data: role }); } catch (error) { diff --git a/backend/src/controllers/tent.controller.ts b/backend/src/controllers/tent.controller.ts index 9b9a55a..9fe0b39 100644 --- a/backend/src/controllers/tent.controller.ts +++ b/backend/src/controllers/tent.controller.ts @@ -85,7 +85,7 @@ export const toggleTentConfirmation = async (req: Request, res: Response) => { confirmed, }); - // Options d’email + // Options d'email const emailOptions = { from: "integration@utt.fr", to: [user1.email, user2.email], diff --git a/backend/src/database/initdb/initrole.ts b/backend/src/database/initdb/initrole.ts index 8c92ec4..c387959 100644 --- a/backend/src/database/initdb/initrole.ts +++ b/backend/src/database/initdb/initrole.ts @@ -6,57 +6,57 @@ import { eq } from "drizzle-orm"; // Liste des rôles à ajouter // Liste des rôles avec leurs descriptions const roles = [ - { name: "Animation", description: "Animer, divertir et motiver les CE et les nouveaux étudiants tout au long de la pré-inté et de l’inté." }, - { name: "Arbitre", description: "Arbitrer les différents défis pendant le semaine d'intégration." }, - { name: "Argentique", description: "Couvrir les événements de l’intégration, prendre des photos" }, - { name: "Bouffe", description: "Prévoir, organiser et coordonner tous les repas de l’inté. La bouffe c’est sacré !" }, - { name: "Bar", description: "Prévoir, organiser et coordonner toutes les boissons de l’inté !" }, - { name: "Bénévole", description: "Deviens bénévole et participe à différentes activités de l’inté !" }, - { name: "Cahier de vacances", description: "Élaborer le futur cahier de vacances des nouveaux avec des petits exercices et blagues." }, - { name: "Chasse au trésor", description: "Elaborer une chasse au trésor dans toute la capitale Troyenne." }, - { name: "Communication", description: "Préparer et gérer toute la communication de l’intégration" }, - { name: "Graphisme", description: "Créer une charte graphique incroyable pour les rendre l'inté encore plus belle !" }, - { name: "Déco", description: "Être créatif et fabriquer de quoi décorer l’UTT au thème de l’inté." }, - { name: "Défis TC", description: "Préparer un défi où les nouveaux TC doivent faire preuve d’ingéniosité pour fabriquer quelque chose." }, - { name: "Dev / Info", description: "Maintenir le site et l’application de l’inté et développer de nouveaux outils informatiques." }, - { name: "Faux amphi", description: "Créer un faux premier cours compliqué pour les TC avec des professeurs et des faux élèves." }, - { name: "Faux discours de rentrée", description: "Préparer et faire un discours de rentrée pour faire une petite frayeur aux nouveaux." }, - { name: "Logistique", description: "Préparer, organiser et mettre en place tout le matériel nécessaire pour l’intégration." }, - { name: "Lac d'Orient Express", description: "Emmener nos nouveaux voir le magnifique lac de Mesnil" }, - { name: "Média", description: "Couvrir les événements de l’intégration, prendre des photos et monter des films souvenirs." }, - { name: "Mascotte", description: "Etre juste le GOAT de l'intégration !" }, - { name: "Parrainage", description: "Attribuer des parrains/marraines aux nouveaux étudiants de manière personnalisée." }, - { name: "Partenariat", description: "Rechercher et établir des partenariats utiles pour l'intégration et les nouveaux étudiants." }, - { name: "Prévention", description: "Évaluer les risques et mettre en place des mesures préventives avant et pendant l’intégration." }, - { name: "Rallye", description: "Organiser une après-midi de jeux et d’activités sportives pour les nouveaux étudiants." }, - { name: "Respo CE", description: "Gérer le planning des CE et les guider pour qu’ils accueillent au mieux les nouveaux." }, - { name: "Respo Question", description: "Répondre au mieux aux questions des nouveaux !" }, - { name: "Sécu", description: "Gérer la sécurité des événements, notamment durant le WEI et la soirée d’intégration." }, - { name: "Soirée d'intégration", description: "Organiser une soirée sur le campus UTT durant la semaine d’inté." }, - { name: "Son et lumière", description: "Installer et gérer le son et la lumière durant les événements nécessitant une ambiance spéciale." }, - { name: "Soutenabilité", description: "Mettre en place des actions pour réduire l’impact environnemental de l’intégration." }, - { name: "SVE", description: "Mettre en place le Salon de la Vie Etudiante (SVE) lors de la deuxième semaine" }, - { name: "Traduction en anglais", description: "Traduire les contenus de l’intégration pour les étudiants étrangers." }, - { name: "Village Asso", description: "Organiser un événement pour présenter les associations UTTiennes aux nouveaux étudiants." }, - { name: "Visites", description: "Organiser les visites de l’UTT et de la ville pour les nouveaux étudiants." }, - { name: "WEI", description: "Organiser le Week-end d’intégration (transport, animation, logistique, soirée, etc.)." } - ]; - -export const initRoles = async () => { - for (const role of roles) { - await db.insert(roleSchema).values(role).onConflictDoNothing(); // Évite les doublons + { name: "Animation", description: "Animer, divertir et motiver les CE et les nouveaux étudiants tout au long de la pré-inté et de l'inté." }, + { name: "Arbitre", description: "Arbitrer les différents défis pendant le semaine d'intégration." }, + { name: "Argentique", description: "Couvrir les événements de l'intégration, prendre des photos" }, + { name: "Bouffe", description: "Prévoir, organiser et coordonner tous les repas de l'inté. La bouffe c'est sacré !" }, + { name: "Bar", description: "Prévoir, organiser et coordonner toutes les boissons de l'inté !" }, + { name: "Bénévole", description: "Deviens bénévole et participe à différentes activités de l'inté !" }, + { name: "Cahier de vacances", description: "Élaborer le futur cahier de vacances des nouveaux avec des petits exercices et blagues." }, + { name: "Chasse au trésor", description: "Elaborer une chasse au trésor dans toute la capitale Troyenne." }, + { name: "Communication", description: "Préparer et gérer toute la communication de l'intégration" }, + { name: "Graphisme", description: "Créer une charte graphique incroyable pour les rendre l'inté encore plus belle !" }, + { name: "Déco", description: "Être créatif et fabriquer de quoi décorer l'UTT au thème de l'inté." }, + { name: "Défis TC", description: "Préparer un défi où les nouveaux TC doivent faire preuve d'ingéniosité pour fabriquer quelque chose." }, + { name: "Dev / Info", description: "Maintenir le site et l'application de l'inté et développer de nouveaux outils informatiques." }, + { name: "Faux amphi", description: "Créer un faux premier cours compliqué pour les TC avec des professeurs et des faux élèves." }, + { name: "Faux discours de rentrée", description: "Préparer et faire un discours de rentrée pour faire une petite frayeur aux nouveaux." }, + { name: "Logistique", description: "Préparer, organiser et mettre en place tout le matériel nécessaire pour l'intégration." }, + { name: "Lac d'Orient Express", description: "Emmener nos nouveaux voir le magnifique lac de Mesnil" }, + { name: "Média", description: "Couvrir les événements de l'intégration, prendre des photos et monter des films souvenirs." }, + { name: "Mascotte", description: "Etre juste le GOAT de l'intégration !" }, + { name: "Parrainage", description: "Attribuer des parrains/marraines aux nouveaux étudiants de manière personnalisée." }, + { name: "Partenariat", description: "Rechercher et établir des partenariats utiles pour l'intégration et les nouveaux étudiants." }, + { name: "Prévention", description: "Évaluer les risques et mettre en place des mesures préventives avant et pendant l'intégration." }, + { name: "Rallye", description: "Organiser une après-midi de jeux et d'activités sportives pour les nouveaux étudiants." }, + { name: "Respo CE", description: "Gérer le planning des CE et les guider pour qu'ils accueillent au mieux les nouveaux." }, + { name: "Respo Question", description: "Répondre au mieux aux questions des nouveaux !" }, + { name: "Sécu", description: "Gérer la sécurité des événements, notamment durant le WEI et la soirée d'intégration." }, + { name: "Soirée d'intégration", description: "Organiser une soirée sur le campus UTT durant la semaine d'inté." }, + { name: "Son et lumière", description: "Installer et gérer le son et la lumière durant les événements nécessitant une ambiance spéciale." }, + { name: "Soutenabilité", description: "Mettre en place des actions pour réduire l'impact environnemental de l'intégration." }, + { name: "SVE", description: "Mettre en place le Salon de la Vie Etudiante (SVE) lors de la deuxième semaine" }, + { name: "Traduction en anglais", description: "Traduire les contenus de l'intégration pour les étudiants étrangers." }, + { name: "Village Asso", description: "Organiser un événement pour présenter les associations UTTiennes aux nouveaux étudiants." }, + { name: "Visites", description: "Organiser les visites de l'UTT et de la ville pour les nouveaux étudiants." }, + { name: "WEI", description: "Organiser le Week-end d'intégration (transport, animation, logistique, soirée, etc.)." } +]; - //Initier le table pour le jeux des orga - const [currentRole] = await db - .select() - .from(roleSchema) - .where(eq(roleSchema.name, role.name)) - .limit(1); +export const initRoles = async () => { + for (const role of roles) { + await db.insert(roleSchema).values(role).onConflictDoNothing(); // Évite les doublons - if (!currentRole) { - throw new Error(`Role not found: ${role.name}`); - } + //Initier le table pour le jeux des orga + const [currentRole] = await db + .select() + .from(roleSchema) + .where(eq(roleSchema.name, role.name)) + .limit(1); - await db.insert(rolePoints).values({ role_id: currentRole.id, points: 0 }).onConflictDoNothing() + if (!currentRole) { + throw new Error(`Role not found: ${role.name}`); } - }; + + await db.insert(rolePoints).values({ role_id: currentRole.id, points: 0 }).onConflictDoNothing() + } +}; diff --git a/backend/src/services/news.service.ts b/backend/src/services/news.service.ts index c65bb9d..c586056 100644 --- a/backend/src/services/news.service.ts +++ b/backend/src/services/news.service.ts @@ -3,7 +3,7 @@ import { db } from "../database/db"; import { News, newsSchema } from "../schemas/Basic/news.schema"; import { eq, desc, and } from "drizzle-orm"; // Créer une actu -export const createNews = async ( +export const createNews = async ( title: string, description: string, type: string, @@ -29,7 +29,7 @@ export const getAllNews = async () => { return await db.select().from(newsSchema).orderBy(desc(newsSchema.created_at)); }; -// Lister les actus publiées (pour l’onglet côté utilisateur) +// Lister les actus publiées (pour l'onglet côté utilisateur) export const getPublishedNews = async () => { return await db.select().from(newsSchema).where(eq(newsSchema.published, true)).orderBy(desc(newsSchema.created_at)); }; @@ -37,18 +37,18 @@ export const getPublishedNews = async () => { // Filtrer par type export const getPublishedNewsByType = async (type: string) => { return await db.select().from(newsSchema) - .where(and(eq(newsSchema.published, true),eq(newsSchema.type, type))) + .where(and(eq(newsSchema.published, true), eq(newsSchema.type, type))) .orderBy(desc(newsSchema.created_at)); }; // Publier une actu export const publishNews = async (id: number) => { - await db.update(newsSchema).set({ published : true }).where(eq(newsSchema.id, id)).returning(); + await db.update(newsSchema).set({ published: true }).where(eq(newsSchema.id, id)).returning(); }; -export const deleteNews = async(newsId: number) => { +export const deleteNews = async (newsId: number) => { await db.delete(newsSchema).where(eq(newsSchema.id, newsId)); diff --git a/backend/src/services/role.service.ts b/backend/src/services/role.service.ts index 850ecac..4c3247d 100644 --- a/backend/src/services/role.service.ts +++ b/backend/src/services/role.service.ts @@ -23,14 +23,14 @@ export const assignRoleToUser = async (userId: number, roleId: number) => { await db.insert(userRolesSchema).values(newUserRole); }; -// 2. Supprimer un rôle d’un utilisateur +// 2. Supprimer un rôle d'un utilisateur export const removeRoleFromUser = async (userId: number, roleId: number) => { await db .delete(userRolesSchema) .where(and(eq(userRolesSchema.user_id, userId), eq(userRolesSchema.role_id, roleId))); }; -// 3. Récupérer les rôles d’un utilisateur +// 3. Récupérer les rôles d'un utilisateur export const getUserRoles = async (userId: number) => { return await db .select({ @@ -83,7 +83,7 @@ export const getUsersByRoleName = async (roleName: string) => { .where(eq(userPreferencesSchema.roleId, roleId)); }; -// 6. Mettre à jour les préférences d’un utilisateur +// 6. Mettre à jour les préférences d'un utilisateur export const updateUserPreferences = async (userId: number, roleIds: number[]) => { await db.delete(userPreferencesSchema).where(eq(userPreferencesSchema.userId, userId)); @@ -91,7 +91,7 @@ export const updateUserPreferences = async (userId: number, roleIds: number[]) = await db.insert(userPreferencesSchema).values(newPreferences); }; -// 7. Récupérer les préférences d’un utilisateur +// 7. Récupérer les préférences d'un utilisateur export const getUserPreferences = async (userId: number) => { return await db .select({ @@ -158,7 +158,7 @@ export const getAllRolePoints = async () => { return await db.select().from(rolePoints); }; -// 12. Récupérer les points d’un rôle spécifique +// 12. Récupérer les points d'un rôle spécifique export const getRolePoints = async (roleId: number) => { const result = await db .select() @@ -170,35 +170,35 @@ export const getRolePoints = async (roleId: number) => { }; // 13. Checker le role d'User -export const checkRoleUser = async (userId: number, roleId: number) =>{ +export const checkRoleUser = async (userId: number, roleId: number) => { const existingRole = await db - .select() - .from(userRolesSchema) - .where(and(eq(userRolesSchema.user_id, userId), eq(userRolesSchema.role_id, roleId))); - - return existingRole; + .select() + .from(userRolesSchema) + .where(and(eq(userRolesSchema.user_id, userId), eq(userRolesSchema.role_id, roleId))); + + return existingRole; }; // 13. Ajouter un role à l'User -export const insertUserRole = async(userId: number, roleId: number) =>{ +export const insertUserRole = async (userId: number, roleId: number) => { - const newUserRole : UserRole = {user_id: userId, role_id: roleId} - await db.insert(userRolesSchema).values(newUserRole); + const newUserRole: UserRole = { user_id: userId, role_id: roleId } + await db.insert(userRolesSchema).values(newUserRole); } // 13. Recevoir tout les roles -export const getRoles = async()=>{ - try{ - const roles = await db.select({ - roleId: roleSchema.id, - name: roleSchema.name, - description: roleSchema.description - }).from(roleSchema); - return roles; - } - catch(error){ - throw new Error("Erreur lors de la récupération des rôles : " + error.message); - } +export const getRoles = async () => { + try { + const roles = await db.select({ + roleId: roleSchema.id, + name: roleSchema.name, + description: roleSchema.description + }).from(roleSchema); + return roles; + } + catch (error) { + throw new Error("Erreur lors de la récupération des rôles : " + error.message); + } } \ No newline at end of file diff --git a/backend/src/services/team.service.ts b/backend/src/services/team.service.ts index e4f3991..9e3249b 100644 --- a/backend/src/services/team.service.ts +++ b/backend/src/services/team.service.ts @@ -11,46 +11,47 @@ import { permission } from "process"; export const createTeam = async (teamName: string, members: number[]) => { - const newTeam = await db.insert(teamSchema).values({ name: teamName }).returning(); - const teamId = newTeam[0].id; - await Promise.all(members.map((userId) => - db.insert(userTeamsSchema).values({ team_id: teamId, user_id: userId }) - )); - - return newTeam; + const newTeam = await db.insert(teamSchema).values({ name: teamName }).returning(); + const teamId = newTeam[0].id; + await Promise.all(members.map((userId) => + db.insert(userTeamsSchema).values({ team_id: teamId, user_id: userId }) + )); + + return newTeam; }; export const createTeamLight = async (teamName: string, factionId: number) => { - const newTeam = await db.insert(teamSchema).values({ name: teamName }).returning({teamId : teamSchema.id}); + const newTeam = await db.insert(teamSchema).values({ name: teamName }).returning({ teamId: teamSchema.id }); - if(factionId){ - await db.insert(teamFactionSchema).values({faction_id : factionId, team_id: newTeam[0].teamId}); + if (factionId) { + await db.insert(teamFactionSchema).values({ faction_id: factionId, team_id: newTeam[0].teamId }); } return newTeam; }; -export const getUserTeam = async(userId : number) => { +export const getUserTeam = async (userId: number) => { - const userTeam = await db.select({userTeamId: userTeamsSchema.team_id}).from(userTeamsSchema).where(eq(userTeamsSchema.user_id, userId)); + const userTeam = await db.select({ userTeamId: userTeamsSchema.team_id }).from(userTeamsSchema).where(eq(userTeamsSchema.user_id, userId)); - return userTeam[0]?.userTeamId + return userTeam[0]?.userTeamId } -export const getTeams = async() => { +export const getTeams = async () => { const teams = await db.select( { - teamId : teamSchema.id, - name : teamSchema.name, - description : teamSchema.description, - type : teamSchema.type}).from(teamSchema); + teamId: teamSchema.id, + name: teamSchema.name, + description: teamSchema.description, + type: teamSchema.type + }).from(teamSchema); return teams } -export const getTeamsAll = async() => { +export const getTeamsAll = async () => { const teams = await db.select().from(teamSchema); @@ -68,26 +69,26 @@ export const getTeamsAll = async() => { } -export const modifyTeam = async ( teamID: number, teamMembers: number[], factionID:number, name? :string, type?: string) => { +export const modifyTeam = async (teamID: number, teamMembers: number[], factionID: number, name?: string, type?: string) => { // 1. Mise à jour des champs de l'équipe - + if (name !== undefined) { await db .update(teamSchema) - .set({name: name}) + .set({ name: name }) .where(eq(teamSchema.id, teamID)); } if (type !== undefined) { await db .update(teamSchema) - .set({type: type}) + .set({ type: type }) .where(eq(teamSchema.id, teamID)); } - // 2. Mise à jour des membres de l’équipe (remplace les anciens) - if(teamMembers.length !== 0){ + // 2. Mise à jour des membres de l'équipe (remplace les anciens) + if (teamMembers.length !== 0) { if (Array.isArray(teamMembers)) { // Supprimer les anciens membres await db.delete(userTeamsSchema).where(eq(userTeamsSchema.team_id, teamID)); @@ -102,13 +103,13 @@ export const modifyTeam = async ( teamID: number, teamMembers: number[], faction ); } } - }else{ + } else { await db.delete(userTeamsSchema).where(eq(userTeamsSchema.team_id, teamID)); } // 3. Mise à jour de la faction (remplace la relation précédente) if (factionID !== undefined) { - // Supprimer l’ancienne relation + // Supprimer l'ancienne relation await db.delete(teamFactionSchema).where(eq(teamFactionSchema.team_id, teamID)); // Ajouter la nouvelle @@ -150,7 +151,7 @@ export const getAllTeamsWithUsers = async () => { teamId: teamSchema.id, teamName: teamSchema.name, teamType: teamSchema.type, - teamFaction : factionSchema.name, + teamFaction: factionSchema.name, userId: userSchema.id, firstName: userSchema.first_name, lastName: userSchema.last_name, @@ -160,14 +161,14 @@ export const getAllTeamsWithUsers = async () => { .from(teamSchema) .innerJoin(userTeamsSchema, eq(teamSchema.id, userTeamsSchema.team_id)) .innerJoin(userSchema, eq(userSchema.id, userTeamsSchema.user_id)) - .innerJoin(teamFactionSchema, eq(teamSchema.id, teamFactionSchema.team_id)) - .innerJoin(factionSchema, eq(factionSchema.id, teamFactionSchema.faction_id)); + .innerJoin(teamFactionSchema, eq(teamSchema.id, teamFactionSchema.team_id)) + .innerJoin(factionSchema, eq(factionSchema.id, teamFactionSchema.faction_id)); const teamsMap = new Map { export const getTeamFaction = async (teamId: any) => { const teamFactionId = await db - .select({faction_id : teamFactionSchema.faction_id}) + .select({ faction_id: teamFactionSchema.faction_id }) .from(teamFactionSchema) .where(eq(teamFactionSchema.team_id, teamId)); @@ -253,7 +254,7 @@ export const getUsersWithTeam = async () => { teamId: userTeamsSchema.team_id, } ).from(userTeamsSchema); - return userswithteam; + return userswithteam; } catch (err) { console.error('Erreur lors de la récupération des utilisateurs possédant une team ', err); throw new Error('Erreur de base de données'); @@ -264,7 +265,7 @@ export const getTeam = async (teamId: any) => { try { const team = await db.select( { - teamId : teamSchema.id, + teamId: teamSchema.id, teamName: teamSchema.name } ).from(teamSchema).where(eq(teamSchema.id, teamId)); diff --git a/backend/src/services/tent.service.ts b/backend/src/services/tent.service.ts index 917fc24..758f1cb 100644 --- a/backend/src/services/tent.service.ts +++ b/backend/src/services/tent.service.ts @@ -43,12 +43,12 @@ export const cancelTent = async (userId1: number) => { return await db .delete(userTentSchema) .where( - or(eq(userTentSchema.user_id_1, userId1), eq(userTentSchema.user_id_2, userId1)), + or(eq(userTentSchema.user_id_1, userId1), eq(userTentSchema.user_id_2, userId1)), ); }; /** - * Récupérer la tente d’un utilisateur. + * Récupérer la tente d'un utilisateur. */ export const getTentByUser = async (userId: number) => { return await db @@ -61,7 +61,7 @@ export const getTentByUser = async (userId: number) => { * Récupérer toutes les tentes (avec infos des 2 utilisateurs). */ export const getAllTents = async () => { - + const user2 = alias(userSchema, "user2"); return await db diff --git a/backend/src/utils/emailtemplates.ts b/backend/src/utils/emailtemplates.ts index ae36d14..1f76fc3 100644 --- a/backend/src/utils/emailtemplates.ts +++ b/backend/src/utils/emailtemplates.ts @@ -69,17 +69,17 @@ export const templateNotebook = `

Salut à toi !!!!

-

Si tu reçois ce mail, c’est que tu es sur le point de rejoindre l’UTT et de vivre tes premières années en école supérieure.

+

Si tu reçois ce mail, c'est que tu es sur le point de rejoindre l'UTT et de vivre tes premières années en école supérieure.

-

Mais après toutes ces vacances, il est important de ne pas s’endormir et de vite se remettre au travail !

+

Mais après toutes ces vacances, il est important de ne pas s'endormir et de vite se remettre au travail !

-

C’est pourquoi l’intégration te propose un cahier de vacances qui te permettra de te remettre à niveau.

+

C'est pourquoi l'intégration te propose un cahier de vacances qui te permettra de te remettre à niveau.

-

Toutes les bases y sont revues, de la terminale… jusqu’au CP. À toi de nous prouver que tu en es capable ! Méthodologie et rigueur seront nécessaires pour en venir à bout (et pas mal d’humour également).

+

Toutes les bases y sont revues, de la terminale… jusqu'au CP. À toi de nous prouver que tu en es capable ! Méthodologie et rigueur seront nécessaires pour en venir à bout (et pas mal d'humour également).

-

Ce cahier sera examiné par un jury extrêmement talentueux : des ingénieurs hors pair, ayant déjà prouvé leur valeur lors d’un concours de Ricard sur la plage de Banyuls-sur-Mer.

+

Ce cahier sera examiné par un jury extrêmement talentueux : des ingénieurs hors pair, ayant déjà prouvé leur valeur lors d'un concours de Ricard sur la plage de Banyuls-sur-Mer.

-

À toi de leur montrer que tu peux égaler leurs compétences ! Ce jury n’hésitera pas à te récompenser pour tes efforts si tu nous renvoies tes réponses à cette adresse mail.

+

À toi de leur montrer que tu peux égaler leurs compétences ! Ce jury n'hésitera pas à te récompenser pour tes efforts si tu nous renvoies tes réponses à cette adresse mail.

Alors si tu veux y participer, tu peux le télécharger juste ici et le renvoyer à clement.duranson@utt.fr avant le dimanche 31 août.

@@ -97,7 +97,7 @@ export const templateNotebook = `

À très vite !

-

Toute l’équipe de l’intégration

+

Toute l'équipe de l'intégration

@@ -162,9 +162,9 @@ export const templateAttributionBus = `
  • Vêtements : changes pour 2 jours, pull, maillot de bain 👙
  • Manteau imperméable 🧥
  • Affaires salissables : change complet & chaussures (à mettre dès le départ en bus) 🚌
  • -
  • Produits d’hygiène : brosse à dent, serviette, nécessaire de toilette 🪥
  • +
  • Produits d'hygiène : brosse à dent, serviette, nécessaire de toilette 🪥
  • Tongues/crocs pour les douches 🩴
  • -
  • Papiers importants : Carte d’identité, CB & liquide, autorisation parentale (pour les mineurs) 💳
  • +
  • Papiers importants : Carte d'identité, CB & liquide, autorisation parentale (pour les mineurs) 💳
  • Ta place au WEI 📩
  • Crème solaire & anti-moustique ☀️
  • De quoi grignoter (prenez un pique-nique à manger avant de prendre le bus, pas dans le bus) 😋
  • @@ -173,7 +173,7 @@ export const templateAttributionBus = `

    🚫 Affaires interdites :