소스 검색

(feat) relation entre les tables et le swagger

Brin AMONKONAN 1 년 전
부모
커밋
d0649dd1c4
53개의 변경된 파일과 1206개의 추가작업 그리고 460개의 파일을 삭제
  1. 3 3
      .env
  2. 27 20
      docker-compose.yml
  3. 0 13
      monhopital-firebase-adminsdk.json
  4. 3 0
      mysql-init/01-init.sql
  5. 2 0
      node_app/.gitignore
  6. 20 0
      node_app/Dockerfile
  7. 0 14
      node_app/ormconfig.json
  8. 583 130
      node_app/package-lock.json
  9. 8 5
      node_app/package.json
  10. 91 0
      node_app/prisma/schema.prisma
  11. 2 0
      node_app/src/app.module.ts
  12. 67 25
      node_app/src/auth.config.ts
  13. 0 15
      node_app/src/companies/compagny.entity.ts
  14. 18 0
      node_app/src/companies/companies.controller.spec.ts
  15. 4 0
      node_app/src/companies/companies.controller.ts
  16. 0 2
      node_app/src/companies/companies.module.ts
  17. 18 0
      node_app/src/companies/companies.service.spec.ts
  18. 4 0
      node_app/src/companies/companies.service.ts
  19. 11 0
      node_app/src/companies/company.entity.ts
  20. 6 14
      node_app/src/drivers/driver.entity.ts
  21. 18 0
      node_app/src/drivers/drivers.controller.spec.ts
  22. 4 0
      node_app/src/drivers/drivers.controller.ts
  23. 0 3
      node_app/src/drivers/drivers.module.ts
  24. 18 0
      node_app/src/drivers/drivers.service.spec.ts
  25. 4 0
      node_app/src/drivers/drivers.service.ts
  26. 8 0
      node_app/src/prisma/prisma.module.ts
  27. 21 0
      node_app/src/prisma/prisma.service.ts
  28. 8 29
      node_app/src/reservations/place.entity.ts
  29. 11 33
      node_app/src/reservations/reservation.entity.ts
  30. 18 0
      node_app/src/reservations/reservations.controller.spec.ts
  31. 4 0
      node_app/src/reservations/reservations.controller.ts
  32. 2 3
      node_app/src/reservations/reservations.module.ts
  33. 20 27
      node_app/src/reservations/reservations.service.ts
  34. 6 33
      node_app/src/trajets/trajet.entity.ts
  35. 18 0
      node_app/src/trajets/trajets.controller.spec.ts
  36. 4 0
      node_app/src/trajets/trajets.controller.ts
  37. 4 7
      node_app/src/trajets/trajets.module.ts
  38. 18 0
      node_app/src/trajets/trajets.service.spec.ts
  39. 4 0
      node_app/src/trajets/trajets.service.ts
  40. 8 20
      node_app/src/users/user.entity.ts
  41. 18 0
      node_app/src/users/users.controller.spec.ts
  42. 4 0
      node_app/src/users/users.controller.ts
  43. 0 3
      node_app/src/users/users.module.ts
  44. 18 0
      node_app/src/users/users.service.spec.ts
  45. 38 0
      node_app/src/users/users.service.ts
  46. 11 39
      node_app/src/vehicules/vehicule.entity.ts
  47. 18 0
      node_app/src/vehicules/vehicules.controller.spec.ts
  48. 4 0
      node_app/src/vehicules/vehicules.controller.ts
  49. 4 7
      node_app/src/vehicules/vehicules.module.ts
  50. 18 0
      node_app/src/vehicules/vehicules.service.spec.ts
  51. 4 0
      node_app/src/vehicules/vehicules.service.ts
  52. 4 2
      node_app/tsconfig.json
  53. 0 13
      package-lock.json

+ 3 - 3
.env

@@ -1,3 +1,3 @@
-FIREBASE_PROJECT_ID=monhopital
-FIREBASE_CLIENT_EMAIL=firebase-adminsdk-8gixa@monhopital.iam.gserviceaccount.com
-FIREBASE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\nMIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCTmdIetvaCr9b+\n8yfmeFeL8iCaHeSVMlDicms171htwB6RtTi+66hLbEUQoPAlA7MXVDatFpwDS/pw\n/KAdZFxTKjDIO4/CmWxZn+eJZ/fD41EghWDyjVyXb+DwLmKVGAJLtW0iGxU2yyB5\nXbc5aLCxFFBcXv2nASS0RbYuL9Nk4wjTMq4MZZZ4n3oJ/Ru2Sp4ftg0NRe8lMiuy\nL+Xzzqivqha5b/AJh5JBQXTmilatORk2ZRzKtRqehtObEjWbkilEx5FS1rpSlgHS\nQKijWXzAs+IxufieOX/1Usa3KxlSbA2UqdxfYQnn2NfKg0GzXqruzOkJju5HsIAI\nDY+BSnXJAgMBAAECggEAQtw/8Ufh/KsYkd6lqWHEDpG8sPNvkyH6v8kixYjJHtYT\nQt+7d8iaMKg31OOCRNIbMysjpV6Dh37IUJwvD4FhzQ5kkJ9ibL1A9oxXvseI1YRI\nQJoKo3Tjh3nXhBUO9QiuKYtihzuLbYmwCSopkGja+SwBhwZEkn0TGlIlx2BEuwLo\nffz0nl8GL9jhY2v2JUm1zmhMIFRqXuAM/cWSYmtsgtQBlXwK9I2Drzt111ClryrP\nELC8cz7ZSibSZQi3sECAqKfenT6Pymicb6qMsUEGze4IkJyhAC55iF2eVJPc0d+J\nCQKzqrKyHf58aJ2VwOAR5bUzE1CxeqAIwCjfm08QHQKBgQC1pJrEGwSumzZvWC6r\n9VfQLqigfq1NfEJ+dm0Z4v1qK4hNKk1kR9j3MiBtgAE5N6yqK8T5oN4gZnWa3VFf\nO8F9GI/T0QQ9L334rTfQL79WtTpJVhtH3zmws1503kjMCP4IGv7xWXQliAdJaMBP\nHGbZZ1K3m4r8vgygkHcn7F4A2wKBgQDQBb/lFcw+aNKbMVDvzIoXQ7kgbNKbyPE6\n49U3FLmxzrpLp5gGqMy9+h8UVCwhR+jodkEzw3Gu+NlP4y1spyDRfAEtpMDy3w10\nzeEC6ha4aJUKcnUABZF6Fi5iDqyrjx7IW3H7LgVFkfmiQfnf99FgtC3/28rDn9ui\n9uEcPQVDKwKBgQCPG0U3tZWlvvFPHel/Xwc1JF2EPOlqv7hfjAv+tiAzcmKrcOWS\nWSyt7JcxzgSowJ1PYLaKeVwnqLGFNlKythCF70D5f5ZYYj9cGZR8d/HGbXejaayK\nnmsENPz5FFvELF1/o00yduiT3SzogBfq/BRnugioUWpaH50xL0BBeu7AuwKBgQCO\nVYDJlLKdeUexXHsOuRs7c+E1qIAqi8FTFBUNjSbJ3LNnlJLW66S70Gp3lGhllTht\n5owSiQY+PJMksEKid3BjJcAApRxIkgo5A62UOuu03gosjcg0bZruuEKgYX4QHOtp\nF/jTbte4lHsEZLQ+ZOhkjKR0zsTcOYMk7Ft24OG65QKBgQCb0Jw4ZXfy6L00Hhui\nIR1VZDL7tvX2OArhcuJLn+btGHKD/ZythWZYsyWdktXWWWO5Q28T05wQlb41QINf\nwZQ0xhUS1ESkCtcTS+GFSXbWNj2GsRiB4J84FmTLj/RX5uZbJGpZAnMcLpmzGHFw\nhxJoNoNm0XlG4hrjZzIsk0fFSg==\n-----END PRIVATE KEY-----\n"
+FIREBASE_PROJECT_ID="monhopital"
+FIREBASE_CLIENT_EMAIL="firebase-adminsdk-8gixa@monhopital.iam.gserviceaccount.com"
+FIREBASE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\nMIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCTmdIetvaCr9b+\n8yfmeFeL8iCaHeSVMlDicms171htwB6RtTi+66hLbEUQoPAlA7MXVDatFpwDS/pw\n/KAdZFxTKjDIO4/CmWxZn+eJZ/fD41EghWDyjVyXb+DwLmKVGAJLtW0iGxU2yyB5\nXbc5aLCxFFBcXv2nASS0RbYuL9Nk4wjTMq4MZZZ4n3oJ/Ru2Sp4ftg0NRe8lMiuy\nL+Xzzqivqha5b/AJh5JBQXTmilatORk2ZRzKtRqehtObEjWbkilEx5FS1rpSlgHS\nQKijWXzAs+IxufieOX/1Usa3KxlSbA2UqdxfYQnn2NfKg0GzXqruzOkJju5HsIAI\nDY+BSnXJAgMBAAECggEAQtw/8Ufh/KsYkd6lqWHEDpG8sPNvkyH6v8kixYjJHtYT\nQt+7d8iaMKg31OOCRNIbMysjpV6Dh37IUJwvD4FhzQ5kkJ9ibL1A9oxXvseI1YRI\nQJoKo3Tjh3nXhBUO9QiuKYtihzuLbYmwCSopkGja+SwBhwZEkn0TGlIlx2BEuwLo\nffz0nl8GL9jhY2v2JUm1zmhMIFRqXuAM/cWSYmtsgtQBlXwK9I2Drzt111ClryrP\nELC8cz7ZSibSZQi3sECAqKfenT6Pymicb6qMsUEGze4IkJyhAC55iF2eVJPc0d+J\nCQKzqrKyHf58aJ2VwOAR5bUzE1CxeqAIwCjfm08QHQKBgQC1pJrEGwSumzZvWC6r\n9VfQLqigfq1NfEJ+dm0Z4v1qK4hNKk1kR9j3MiBtgAE5N6yqK8T5oN4gZnWa3VFf\nO8F9GI/T0QQ9L334rTfQL79WtTpJVhtH3zmws1503kjMCP4IGv7xWXQliAdJaMBP\nHGbZZ1K3m4r8vgygkHcn7F4A2wKBgQDQBb/lFcw+aNKbMVDvzIoXQ7kgbNKbyPE6\n49U3FLmxzrpLp5gGqMy9+h8UVCwhR+jodkEzw3Gu+NlP4y1spyDRfAEtpMDy3w10\nzeEC6ha4aJUKcnUABZF6Fi5iDqyrjx7IW3H7LgVFkfmiQfnf99FgtC3/28rDn9ui\n9uEcPQVDKwKBgQCPG0U3tZWlvvFPHel/Xwc1JF2EPOlqv7hfjAv+tiAzcmKrcOWS\nWSyt7JcxzgSowJ1PYLaKeVwnqLGFNlKythCF70D5f5ZYYj9cGZR8d/HGbXejaayK\nnmsENPz5FFvELF1/o00yduiT3SzogBfq/BRnugioUWpaH50xL0BBeu7AuwKBgQCO\nVYDJlLKdeUexXHsOuRs7c+E1qIAqi8FTFBUNjSbJ3LNnlJLW66S70Gp3lGhllTht\n5owSiQY+PJMksEKid3BjJcAApRxIkgo5A62UOuu03gosjcg0bZruuEKgYX4QHOtp\nF/jTbte4lHsEZLQ+ZOhkjKR0zsTcOYMk7Ft24OG65QKBgQCb0Jw4ZXfy6L00Hhui\nIR1VZDL7tvX2OArhcuJLn+btGHKD/ZythWZYsyWdktXWWWO5Q28T05wQlb41QINf\nwZQ0xhUS1ESkCtcTS+GFSXbWNj2GsRiB4J84FmTLj/RX5uZbJGpZAnMcLpmzGHFw\nhxJoNoNm0XlG4hrjZzIsk0fFSg==\n-----END PRIVATE KEY-----\n"

+ 27 - 20
docker-compose.yml

@@ -31,6 +31,24 @@ services:
       - "/var/run/docker.sock:/var/run/docker.sock:ro"
       - "./letsencrypt:/letsencrypt"
 
+  mysql:
+    image: mysql:5.7
+    container_name: mysql
+    restart: always
+    environment:
+      MYSQL_ROOT_PASSWORD: rootpassword
+      MYSQL_DATABASE: transport
+      MYSQL_USER: user
+      MYSQL_PASSWORD: userpassword
+    ports:
+      - "3306:3306"
+    volumes:
+      - ./mysql-data:/var/lib/mysql
+      - ./mysql-init:/docker-entrypoint-initdb.d
+      - db_data:/var/lib/mysql
+    networks:
+      - gogs-network
+
   # Serveur Web Nginx
  # web:
   #  image: nginx:1.25
@@ -52,12 +70,19 @@ services:
   # Serveur Web Node.js
   node_app:
     image: node:latest
-    container_name: node_server
+    restart: always
+    container_name: node_app
     working_dir: /usr/src/app
     depends_on:
-      - postgresql
+      - mysql
     environment:
       - NODE_ENV=development
+      - DATABASE_URL=mysql://user:userpassword@mysql:3306/transport?connectTimeout=30000
+      - MYSQL_HOST=mysql
+      - MYSQL_PORT=3306
+      - MYSQL_USER=user
+      - MYSQL_PASSWORD=userpassword
+      - MYSQL_DATABASE=transport
     ports:
       - "3000:3000"
     volumes:
@@ -66,7 +91,6 @@ services:
     command: ["npm", "run", "start"]
     networks:
       - gogs-network
-      - sonarnet
 
 
   # Serveur PHP
@@ -93,23 +117,6 @@ services:
     networks:
       - sonarnet
 
-  # Serveur MySQL
-  mysql:
-
-    image: mysql:5.7
-    container_name: mysql_gogos
-    environment:
-      MYSQL_ROOT_PASSWORD: rootpassword
-      MYSQL_DATABASE: mydb
-      MYSQL_USER: user
-      MYSQL_PASSWORD: userpassword
-    ports:
-      - "3306:3306"
-    volumes:
-      - db_data:/var/lib/mysql
-    networks:
-      - gogs-network
-
   # Serveur Git auto-hébergé Gogs
   gogs:
     image: gogs/gogs:0.12.10

+ 0 - 13
monhopital-firebase-adminsdk.json

@@ -1,13 +0,0 @@
-{
-  "type": "service_account",
-  "project_id": "monhopital",
-  "private_key_id": "1002158efa1ed0f290ee1100ee9b6f73887bbf5e",
-  "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCTmdIetvaCr9b+\n8yfmeFeL8iCaHeSVMlDicms171htwB6RtTi+66hLbEUQoPAlA7MXVDatFpwDS/pw\n/KAdZFxTKjDIO4/CmWxZn+eJZ/fD41EghWDyjVyXb+DwLmKVGAJLtW0iGxU2yyB5\nXbc5aLCxFFBcXv2nASS0RbYuL9Nk4wjTMq4MZZZ4n3oJ/Ru2Sp4ftg0NRe8lMiuy\nL+Xzzqivqha5b/AJh5JBQXTmilatORk2ZRzKtRqehtObEjWbkilEx5FS1rpSlgHS\nQKijWXzAs+IxufieOX/1Usa3KxlSbA2UqdxfYQnn2NfKg0GzXqruzOkJju5HsIAI\nDY+BSnXJAgMBAAECggEAQtw/8Ufh/KsYkd6lqWHEDpG8sPNvkyH6v8kixYjJHtYT\nQt+7d8iaMKg31OOCRNIbMysjpV6Dh37IUJwvD4FhzQ5kkJ9ibL1A9oxXvseI1YRI\nQJoKo3Tjh3nXhBUO9QiuKYtihzuLbYmwCSopkGja+SwBhwZEkn0TGlIlx2BEuwLo\nffz0nl8GL9jhY2v2JUm1zmhMIFRqXuAM/cWSYmtsgtQBlXwK9I2Drzt111ClryrP\nELC8cz7ZSibSZQi3sECAqKfenT6Pymicb6qMsUEGze4IkJyhAC55iF2eVJPc0d+J\nCQKzqrKyHf58aJ2VwOAR5bUzE1CxeqAIwCjfm08QHQKBgQC1pJrEGwSumzZvWC6r\n9VfQLqigfq1NfEJ+dm0Z4v1qK4hNKk1kR9j3MiBtgAE5N6yqK8T5oN4gZnWa3VFf\nO8F9GI/T0QQ9L334rTfQL79WtTpJVhtH3zmws1503kjMCP4IGv7xWXQliAdJaMBP\nHGbZZ1K3m4r8vgygkHcn7F4A2wKBgQDQBb/lFcw+aNKbMVDvzIoXQ7kgbNKbyPE6\n49U3FLmxzrpLp5gGqMy9+h8UVCwhR+jodkEzw3Gu+NlP4y1spyDRfAEtpMDy3w10\nzeEC6ha4aJUKcnUABZF6Fi5iDqyrjx7IW3H7LgVFkfmiQfnf99FgtC3/28rDn9ui\n9uEcPQVDKwKBgQCPG0U3tZWlvvFPHel/Xwc1JF2EPOlqv7hfjAv+tiAzcmKrcOWS\nWSyt7JcxzgSowJ1PYLaKeVwnqLGFNlKythCF70D5f5ZYYj9cGZR8d/HGbXejaayK\nnmsENPz5FFvELF1/o00yduiT3SzogBfq/BRnugioUWpaH50xL0BBeu7AuwKBgQCO\nVYDJlLKdeUexXHsOuRs7c+E1qIAqi8FTFBUNjSbJ3LNnlJLW66S70Gp3lGhllTht\n5owSiQY+PJMksEKid3BjJcAApRxIkgo5A62UOuu03gosjcg0bZruuEKgYX4QHOtp\nF/jTbte4lHsEZLQ+ZOhkjKR0zsTcOYMk7Ft24OG65QKBgQCb0Jw4ZXfy6L00Hhui\nIR1VZDL7tvX2OArhcuJLn+btGHKD/ZythWZYsyWdktXWWWO5Q28T05wQlb41QINf\nwZQ0xhUS1ESkCtcTS+GFSXbWNj2GsRiB4J84FmTLj/RX5uZbJGpZAnMcLpmzGHFw\nhxJoNoNm0XlG4hrjZzIsk0fFSg==\n-----END PRIVATE KEY-----\n",
-  "client_email": "firebase-adminsdk-8gixa@monhopital.iam.gserviceaccount.com",
-  "client_id": "117273044218610720790",
-  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
-  "token_uri": "https://oauth2.googleapis.com/token",
-  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
-  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-8gixa%40monhopital.iam.gserviceaccount.com",
-  "universe_domain": "googleapis.com"
-}

+ 3 - 0
mysql-init/01-init.sql

@@ -0,0 +1,3 @@
+-- Grant all privileges to user for transport database
+GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' WITH GRANT OPTION;
+FLUSH PRIVILEGES;

+ 2 - 0
node_app/.gitignore

@@ -54,3 +54,5 @@ pids
 
 # Diagnostic reports (https://nodejs.org/api/report.html)
 report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
+
+monhopital-firebase-adminsdk.json

+ 20 - 0
node_app/Dockerfile

@@ -0,0 +1,20 @@
+# Utiliser une image de base Node.js
+FROM node:latest
+
+# Définir le répertoire de travail dans le conteneur
+WORKDIR /usr/src/app
+
+# Copier les fichiers de dépendances
+COPY package*.json ./
+
+# Installer les dépendances
+RUN npm install
+
+# Copier le reste du code de l'application
+COPY . .
+
+# Exposer le port utilisé par l'application
+EXPOSE 3000
+
+# Commande pour démarrer l'application
+CMD ["npm", "run", "start"]

+ 0 - 14
node_app/ormconfig.json

@@ -1,14 +0,0 @@
-{
-  "type": "postgres",
-  "host": "localhost",
-  "port": 5432,
-  "username": "your_db_username",
-  "password": "your_db_password",
-  "database": "your_db_name",
-  "entities": ["dist/**/*.entity{.ts,.js}"],
-  "migrations": ["dist/migrations/*{.ts,.js}"],
-  "cli": {
-    "migrationsDir": "src/migrations"
-  },
-  "synchronize": false
-}

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 583 - 130
node_app/package-lock.json


+ 8 - 5
node_app/package.json

@@ -23,20 +23,20 @@
     "@nestjs/common": "^11.0.6",
     "@nestjs/config": "^4.0.0",
     "@nestjs/core": "^11.0.6",
+    "@nestjs/jwt": "^11.0.0",
     "@nestjs/passport": "^11.0.5",
     "@nestjs/platform-express": "^11.0.6",
     "@nestjs/swagger": "^11.0.3",
-    "@nestjs/typeorm": "^11.0.0",
+    "@prisma/client": "^6.3.1",
+    "dotenv": "^16.4.7",
     "firebase-admin": "^13.0.2",
     "jsonwebtoken": "^9.0.2",
     "passport": "^0.7.0",
     "passport-firebase-jwt": "^1.2.1",
     "passport-jwt": "^4.0.1",
-    "pg": "^8.13.1",
     "reflect-metadata": "^0.2.2",
     "rxjs": "^7.8.1",
-    "swagger-ui-express": "^5.0.1",
-    "typeorm": "^0.3.20"
+    "swagger-ui-express": "^5.0.1"
   },
   "devDependencies": {
     "@eslint/eslintrc": "^3.2.0",
@@ -48,7 +48,9 @@
     "@swc/core": "^1.10.7",
     "@types/express": "^5.0.0",
     "@types/jest": "^29.5.14",
-    "@types/node": "^22.12.0",
+    "@types/node": "^22.13.1",
+    "@types/passport": "^1.0.17",
+    "@types/passport-jwt": "^4.0.1",
     "@types/supertest": "^6.0.2",
     "eslint": "^9.18.0",
     "eslint-config-prettier": "^10.0.1",
@@ -56,6 +58,7 @@
     "globals": "^15.14.0",
     "jest": "^29.7.0",
     "prettier": "^3.4.2",
+    "prisma": "^6.3.1",
     "source-map-support": "^0.5.21",
     "supertest": "^7.0.0",
     "ts-jest": "^29.2.5",

+ 91 - 0
node_app/prisma/schema.prisma

@@ -0,0 +1,91 @@
+// This is your Prisma schema file,
+// learn more about it in the docs: https://pris.ly/d/prisma-schema
+
+generator client {
+  provider = "prisma-client-js"
+}
+
+datasource db {
+  provider = "mysql"
+  url      = env("DATABASE_URL")
+}
+
+model Company {
+  id        Int         @id @default(autoincrement())
+  name      String      @unique
+  address   String
+  vehicles  Vehicule[]  @relation("CompanyVehicules")
+  drivers   Driver[]    @relation("CompanyDrivers")
+  manager   User        @relation("CompanyManager", fields: [managerId], references: [id])
+  managerId Int         @unique
+}
+
+model Driver {
+  id        Int         @id @default(autoincrement())
+  name      String      @unique
+  address   String
+  telephone String
+  company   Company?    @relation("CompanyDrivers", fields: [companyId], references: [id])
+  companyId Int?
+  user      User        @relation("UserDriver", fields: [userId], references: [id])
+  userId    Int         @unique
+  vehicles  Vehicule[]  @relation("DriverVehicules")
+}
+
+model User {
+  id             Int           @id @default(autoincrement())
+  name           String
+  otherName      String
+  address        String
+  telephone      String
+  email          String
+  password       String
+  reservations   Reservation[] @relation("UserReservations")
+  driver         Driver?       @relation("UserDriver")
+  managedCompany Company?      @relation("CompanyManager")
+}
+
+model Vehicule {
+  id              Int      @id @default(autoincrement())
+  number_places   Int
+  color           String
+  type            String
+  immatriculation String   @unique
+  model           String
+  company         Company  @relation("CompanyVehicules", fields: [companyId], references: [id])
+  companyId       Int
+  driver          Driver   @relation("DriverVehicules", fields: [driverId], references: [id])
+  driverId        Int
+  places          Place[]  @relation("VehiculePlaces")
+  trajets         Trajet[] @relation("VehiculeTrajets")
+}
+
+model Place {
+  id           Int           @id @default(autoincrement())
+  number       Int
+  vehicule     Vehicule      @relation("VehiculePlaces", fields: [vehiculeId], references: [id])
+  vehiculeId   Int
+  reservations Reservation[] @relation("PlaceReservations")
+}
+
+model Trajet {
+  id           Int           @id @default(autoincrement())
+  departAt     DateTime
+  arriveAt     DateTime
+  depart       String
+  arrive       String
+  vehicule     Vehicule      @relation("VehiculeTrajets", fields: [vehiculeId], references: [id])
+  vehiculeId   Int
+  reservations Reservation[] @relation("TrajetReservations")
+}
+
+model Reservation {
+  id       Int      @id @default(autoincrement())
+  dateAt   DateTime
+  place    Place    @relation("PlaceReservations", fields: [placeId], references: [id])
+  placeId  Int
+  user     User     @relation("UserReservations", fields: [userId], references: [id])
+  userId   Int
+  trajet   Trajet   @relation("TrajetReservations", fields: [trajetId], references: [id])
+  trajetId Int
+}

+ 2 - 0
node_app/src/app.module.ts

@@ -10,6 +10,7 @@ import { VehiculesModule } from './vehicules/vehicules.module';
 import { TrajetsModule } from './trajets/trajets.module';
 import { ReservationsModule } from './reservations/reservations.module';
 import { CommonModule } from './common/common.module';
+import { ConfigModule } from '@nestjs/config';
 
 @Module({
   imports: [
@@ -21,6 +22,7 @@ import { CommonModule } from './common/common.module';
     TrajetsModule,
     ReservationsModule,
     CommonModule,
+    ConfigModule.forRoot(),
   ],
   controllers: [AppController],
   providers: [AppService, AuthConfig],

+ 67 - 25
node_app/src/auth.config.ts

@@ -1,45 +1,87 @@
-import { Strategy as JwtStrategy, ExtractJwt } from 'passport-jwt';
-import { PassportStatic } from 'passport';
+import {
+  Strategy as JwtStrategy,
+  ExtractJwt,
+  VerifiedCallback,
+} from 'passport-jwt';
 import { Injectable } from '@nestjs/common';
 import * as admin from 'firebase-admin';
+import * as passport from 'passport';
+
+export interface ServiceAccount {
+  projectId?: string;
+  clientEmail?: string;
+  privateKey?: string;
+}
 
 @Injectable()
 export class AuthConfig {
-  constructor(private readonly passport: PassportStatic) {
+  private firebaseAdmin!: admin.app.App;
+
+  constructor() {
     this.initializeFirebase();
     this.configurePassport();
   }
 
-  private initializeFirebase() {
-    const serviceAccount = require('path/to/your/serviceAccountKey.json');
-    admin.initializeApp({
-      credential: admin.credential.cert(serviceAccount),
-    });
+  /**
+   * Initialise Firebase Admin SDK avec les informations du compte de service.
+   */
+  private initializeFirebase(): void {
+    try {
+      // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
+      const serviceAccount = {
+        projectId: 'monhopital',
+        privateKey:
+          '-----BEGIN PRIVATE KEY-----\nMIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCTmdIetvaCr9b+\n8yfmeFeL8iCaHeSVMlDicms171htwB6RtTi+66hLbEUQoPAlA7MXVDatFpwDS/pw\n/KAdZFxTKjDIO4/CmWxZn+eJZ/fD41EghWDyjVyXb+DwLmKVGAJLtW0iGxU2yyB5\nXbc5aLCxFFBcXv2nASS0RbYuL9Nk4wjTMq4MZZZ4n3oJ/Ru2Sp4ftg0NRe8lMiuy\nL+Xzzqivqha5b/AJh5JBQXTmilatORk2ZRzKtRqehtObEjWbkilEx5FS1rpSlgHS\nQKijWXzAs+IxufieOX/1Usa3KxlSbA2UqdxfYQnn2NfKg0GzXqruzOkJju5HsIAI\nDY+BSnXJAgMBAAECggEAQtw/8Ufh/KsYkd6lqWHEDpG8sPNvkyH6v8kixYjJHtYT\nQt+7d8iaMKg31OOCRNIbMysjpV6Dh37IUJwvD4FhzQ5kkJ9ibL1A9oxXvseI1YRI\nQJoKo3Tjh3nXhBUO9QiuKYtihzuLbYmwCSopkGja+SwBhwZEkn0TGlIlx2BEuwLo\nffz0nl8GL9jhY2v2JUm1zmhMIFRqXuAM/cWSYmtsgtQBlXwK9I2Drzt111ClryrP\nELC8cz7ZSibSZQi3sECAqKfenT6Pymicb6qMsUEGze4IkJyhAC55iF2eVJPc0d+J\nCQKzqrKyHf58aJ2VwOAR5bUzE1CxeqAIwCjfm08QHQKBgQC1pJrEGwSumzZvWC6r\n9VfQLqigfq1NfEJ+dm0Z4v1qK4hNKk1kR9j3MiBtgAE5N6yqK8T5oN4gZnWa3VFf\nO8F9GI/T0QQ9L334rTfQL79WtTpJVhtH3zmws1503kjMCP4IGv7xWXQliAdJaMBP\nHGbZZ1K3m4r8vgygkHcn7F4A2wKBgQDQBb/lFcw+aNKbMVDvzIoXQ7kgbNKbyPE6\n49U3FLmxzrpLp5gGqMy9+h8UVCwhR+jodkEzw3Gu+NlP4y1spyDRfAEtpMDy3w10\nzeEC6ha4aJUKcnUABZF6Fi5iDqyrjx7IW3H7LgVFkfmiQfnf99FgtC3/28rDn9ui\n9uEcPQVDKwKBgQCPG0U3tZWlvvFPHel/Xwc1JF2EPOlqv7hfjAv+tiAzcmKrcOWS\nWSyt7JcxzgSowJ1PYLaKeVwnqLGFNlKythCF70D5f5ZYYj9cGZR8d/HGbXejaayK\nnmsENPz5FFvELF1/o00yduiT3SzogBfq/BRnugioUWpaH50xL0BBeu7AuwKBgQCO\nVYDJlLKdeUexXHsOuRs7c+E1qIAqi8FTFBUNjSbJ3LNnlJLW66S70Gp3lGhllTht\n5owSiQY+PJMksEKid3BjJcAApRxIkgo5A62UOuu03gosjcg0bZruuEKgYX4QHOtp\nF/jTbte4lHsEZLQ+ZOhkjKR0zsTcOYMk7Ft24OG65QKBgQCb0Jw4ZXfy6L00Hhui\nIR1VZDL7tvX2OArhcuJLn+btGHKD/ZythWZYsyWdktXWWWO5Q28T05wQlb41QINf\nwZQ0xhUS1ESkCtcTS+GFSXbWNj2GsRiB4J84FmTLj/RX5uZbJGpZAnMcLpmzGHFw\nhxJoNoNm0XlG4hrjZzIsk0fFSg==\n-----END PRIVATE KEY-----\n',
+        clientEmail:
+          'firebase-adminsdk-8gixa@monhopital.iam.gserviceaccount.com',
+      };
+
+      this.firebaseAdmin = admin.initializeApp({
+        credential: admin.credential.cert(serviceAccount),
+      });
+    } catch (error) {
+      console.error("Erreur lors de l'initialisation de Firebase :", error);
+      throw new Error("Échec de l'initialisation de Firebase");
+    }
   }
 
-  public configurePassport() {
-    // remettre en private
-    this.passport.use(
+  /**
+   * Configure Passport.js avec la stratégie JWT.
+   */
+  public configurePassport(): void {
+    passport.use(
       new JwtStrategy(
         {
           jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
-          secretOrKeyProvider: (request, rawJwtToken, done) => {
-            admin
-              .auth()
-              .verifyIdToken(rawJwtToken)
-              .then((decodedToken) => {
-                done(null, decodedToken);
-              })
-              .catch((error) => {
-                done(error, false);
-              });
-          },
+          secretOrKey: '1002158efa1ed0f290ee1100ee9b6f73887bbf5e', // Utilisation d'une clé secrète statique
         },
-        (jwtPayload, done) => {
-          // Vérifiez le payload JWT et retournez l'utilisateur
-          return done(null, jwtPayload);
+        async (jwtPayload: any, done: VerifiedCallback) => {
+          try {
+            // Validez le payload JWT ici (par exemple, chargez l'utilisateur correspondant)
+            const user = await this.validateUser(jwtPayload.uid); // Exemple de validation utilisateur
+            if (!user) {
+              return done(null, false); // Utilisateur non trouvé
+            }
+            return done(null, user); // Utilisateur valide
+          } catch (error) {
+            return done(error, false); // Erreur lors de la validation
+          }
         },
       ),
     );
   }
+
+  /**
+   * Valide un utilisateur en fonction de son UID.
+   */
+  private async validateUser(uid: string): Promise<any> {
+    try {
+      // Récupérez les informations de l'utilisateur depuis Firebase
+      const user = await this.firebaseAdmin.auth().getUser(uid);
+      return user.toJSON(); // Retournez les données utilisateur sous forme d'objet
+    } catch (error) {
+      console.error("Erreur lors de la validation de l'utilisateur :", error);
+      return null; // Utilisateur non trouvé
+    }
+  }
 }

+ 0 - 15
node_app/src/companies/compagny.entity.ts

@@ -1,15 +0,0 @@
-import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';
-
-@Entity()
-export class Compagny {
-  @PrimaryGeneratedColumn()
-  id: number;
-
-  @Column({ unique: true })
-  name: string;
-
-  @Column()
-  address: string;
-
-  //un manager pour gérer la compagnie
-}

+ 18 - 0
node_app/src/companies/companies.controller.spec.ts

@@ -0,0 +1,18 @@
+import { Test, TestingModule } from '@nestjs/testing';
+import { CompaniesController } from './companies.controller';
+
+describe('CompaniesController', () => {
+  let controller: CompaniesController;
+
+  beforeEach(async () => {
+    const module: TestingModule = await Test.createTestingModule({
+      controllers: [CompaniesController],
+    }).compile();
+
+    controller = module.get<CompaniesController>(CompaniesController);
+  });
+
+  it('should be defined', () => {
+    expect(controller).toBeDefined();
+  });
+});

+ 4 - 0
node_app/src/companies/companies.controller.ts

@@ -0,0 +1,4 @@
+import { Controller } from '@nestjs/common';
+
+@Controller('companies')
+export class CompaniesController {}

+ 0 - 2
node_app/src/companies/companies.module.ts

@@ -1,11 +1,9 @@
 import { Module } from '@nestjs/common';
 import { CompaniesService } from './companies.service';
 import { CompaniesController } from './companies.controller';
-import { TypeOrmModule } from '@nestjs/typeorm';
 import { Company } from './company.entity';
 
 @Module({
-  imports: [TypeOrmModule.forFeature([Company])],
   providers: [CompaniesService],
   controllers: [CompaniesController],
 })

+ 18 - 0
node_app/src/companies/companies.service.spec.ts

@@ -0,0 +1,18 @@
+import { Test, TestingModule } from '@nestjs/testing';
+import { CompaniesService } from './companies.service';
+
+describe('CompaniesService', () => {
+  let service: CompaniesService;
+
+  beforeEach(async () => {
+    const module: TestingModule = await Test.createTestingModule({
+      providers: [CompaniesService],
+    }).compile();
+
+    service = module.get<CompaniesService>(CompaniesService);
+  });
+
+  it('should be defined', () => {
+    expect(service).toBeDefined();
+  });
+});

+ 4 - 0
node_app/src/companies/companies.service.ts

@@ -0,0 +1,4 @@
+import { Injectable } from '@nestjs/common';
+
+@Injectable()
+export class CompaniesService {}

+ 11 - 0
node_app/src/companies/company.entity.ts

@@ -0,0 +1,11 @@
+import { Prisma } from '@prisma/client';
+
+export class Company implements Prisma.CompanyCreateInput {
+  id?: number;
+  name: string;
+  address: string;
+  manager: Prisma.UserCreateNestedOneWithoutManagedCompanyInput;
+  vehicles?: Prisma.VehiculeCreateNestedManyWithoutCompanyInput;
+  drivers?: Prisma.DriverCreateNestedManyWithoutCompanyInput;
+  managerId?: number | null;
+}

+ 6 - 14
node_app/src/drivers/driver.entity.ts

@@ -1,19 +1,11 @@
-import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';
+import { Prisma } from '@prisma/client';
 
-@Entity()
-export class Driver {
-  @PrimaryGeneratedColumn()
-  id: number;
-
-  @Column({ unique: true })
+export class Driver implements Prisma.DriverUncheckedCreateInput {
+  id?: number;
   name: string;
-
-  @Column()
   address: string;
-
-  @Column()
   telephone: string;
-
-  // est lié à une companie ou est sa propre compagne, à un gérant (manager)
-  // est utilisateur
+  companyId?: number | null;
+  userId: number;
+  vehicles?: Prisma.VehiculeUncheckedCreateNestedManyWithoutDriverInput;
 }

+ 18 - 0
node_app/src/drivers/drivers.controller.spec.ts

@@ -0,0 +1,18 @@
+import { Test, TestingModule } from '@nestjs/testing';
+import { DriversController } from './drivers.controller';
+
+describe('DriversController', () => {
+  let controller: DriversController;
+
+  beforeEach(async () => {
+    const module: TestingModule = await Test.createTestingModule({
+      controllers: [DriversController],
+    }).compile();
+
+    controller = module.get<DriversController>(DriversController);
+  });
+
+  it('should be defined', () => {
+    expect(controller).toBeDefined();
+  });
+});

+ 4 - 0
node_app/src/drivers/drivers.controller.ts

@@ -0,0 +1,4 @@
+import { Controller } from '@nestjs/common';
+
+@Controller('drivers')
+export class DriversController {}

+ 0 - 3
node_app/src/drivers/drivers.module.ts

@@ -1,11 +1,8 @@
 import { Module } from '@nestjs/common';
 import { DriversService } from './drivers.service';
 import { DriversController } from './drivers.controller';
-import { TypeOrmModule } from '@nestjs/typeorm';
-import { Driver } from './driver.entity';
 
 @Module({
-  imports: [TypeOrmModule.forFeature([Driver])],
   providers: [DriversService],
   controllers: [DriversController],
 })

+ 18 - 0
node_app/src/drivers/drivers.service.spec.ts

@@ -0,0 +1,18 @@
+import { Test, TestingModule } from '@nestjs/testing';
+import { DriversService } from './drivers.service';
+
+describe('DriversService', () => {
+  let service: DriversService;
+
+  beforeEach(async () => {
+    const module: TestingModule = await Test.createTestingModule({
+      providers: [DriversService],
+    }).compile();
+
+    service = module.get<DriversService>(DriversService);
+  });
+
+  it('should be defined', () => {
+    expect(service).toBeDefined();
+  });
+});

+ 4 - 0
node_app/src/drivers/drivers.service.ts

@@ -0,0 +1,4 @@
+import { Injectable } from '@nestjs/common';
+
+@Injectable()
+export class DriversService {}

+ 8 - 0
node_app/src/prisma/prisma.module.ts

@@ -0,0 +1,8 @@
+import { Module } from '@nestjs/common';
+import { PrismaService } from './prisma.service';
+
+@Module({
+  providers: [PrismaService],
+  exports: [PrismaService],
+})
+export class PrismaModule {}

+ 21 - 0
node_app/src/prisma/prisma.service.ts

@@ -0,0 +1,21 @@
+/* eslint-disable @typescript-eslint/no-unsafe-call */
+import { Injectable, OnModuleInit, OnModuleDestroy } from '@nestjs/common';
+import { PrismaClient } from '@prisma/client';
+
+@Injectable()
+export class PrismaService
+  extends PrismaClient
+  implements OnModuleInit, OnModuleDestroy
+{
+  constructor() {
+    super();
+  }
+
+  async onModuleInit() {
+    await this.$connect();
+  }
+
+  async onModuleDestroy() {
+    await this.$disconnect();
+  }
+}

+ 8 - 29
node_app/src/reservations/place.entity.ts

@@ -1,30 +1,9 @@
-import { Vehicule } from 'src/vehicules/vehicule.entity';
-import {
-  Column,
-  Entity,
-  JoinColumn,
-  ManyToOne,
-  OneToMany,
-  PrimaryGeneratedColumn,
-} from 'typeorm';
-import { Reservation } from './reservation.entity';
-
-@Entity()
-export class Place {
-  @PrimaryGeneratedColumn()
-  id: number;
-
-  @Column({ type: 'integer' })
-  numbreSiege: number; // Numéro du siège (exemple : 1, 2, 3...)
-
-  // Relation ManyToOne avec Vehicle (une place appartient à une voiture)
-  @ManyToOne(() => Vehicule, (vehicule) => vehicule.places, { eager: true })
-  @JoinColumn({ name: 'vehiculeId' })
-  vehicule: Vehicule;
-
-  // Relation OneToMany avec Reservation (une place peut avoir plusieurs réservations)
-  @OneToMany(() => Reservation, (reservation) => reservation.place, {
-    cascade: true,
-  })
-  reservations: Reservation[];
+import { Prisma } from '@prisma/client';
+
+export class Place implements Prisma.PlaceUncheckedCreateInput {
+  id?: number;
+  number: number;
+  vehiculeId: number;
+  reservations?: Prisma.ReservationCreateNestedManyWithoutPlaceInput;
+  vehicule?: Prisma.VehiculeCreateNestedOneWithoutPlacesInput;
 }

+ 11 - 33
node_app/src/reservations/reservation.entity.ts

@@ -1,34 +1,12 @@
-import {
-  Column,
-  Entity,
-  JoinColumn,
-  ManyToOne,
-  PrimaryGeneratedColumn,
-} from 'typeorm';
-import { Place } from './place.entity';
-import { User } from 'src/users/user.entity';
-import { Trajet } from 'src/trajets/trajet.entity';
-
-@Entity()
-export class Reservation {
-  @PrimaryGeneratedColumn()
-  id: number;
-
-  @Column({ type: 'datetime' })
-  dateAt: Date;
-
-  // Relation ManyToOne avec Place (une réservation est associée à une place)
-  @ManyToOne(() => Place, (place) => place.reservations, { eager: true })
-  @JoinColumn({ name: 'placeId' })
-  place: Place;
-
-  // Relation ManyToOne avec User (une réservation est faite par un utilisateur)
-  @ManyToOne(() => User, (user) => user.reservations, { eager: true })
-  @JoinColumn({ name: 'userId' })
-  user: User;
-
-  // Relation ManyToOne avec Trip (une réservation est associée à un trajet)
-  @ManyToOne(() => Trajet, (trajet) => trajet.reservations, { eager: true })
-  @JoinColumn({ name: 'trajetId' })
-  trajet: Trajet;
+import { Prisma } from '@prisma/client';
+
+export class Reservation implements Prisma.ReservationUncheckedCreateInput {
+  id?: number;
+  dateAt: Date | string;
+  placeId: number;
+  userId: number;
+  trajetId: number;
+  place?: Prisma.PlaceCreateNestedOneWithoutReservationsInput;
+  user?: Prisma.UserCreateNestedOneWithoutReservationsInput;
+  trajet?: Prisma.TrajetCreateNestedOneWithoutReservationsInput;
 }

+ 18 - 0
node_app/src/reservations/reservations.controller.spec.ts

@@ -0,0 +1,18 @@
+import { Test, TestingModule } from '@nestjs/testing';
+import { ReservationsController } from './reservations.controller';
+
+describe('ReservationsController', () => {
+  let controller: ReservationsController;
+
+  beforeEach(async () => {
+    const module: TestingModule = await Test.createTestingModule({
+      controllers: [ReservationsController],
+    }).compile();
+
+    controller = module.get<ReservationsController>(ReservationsController);
+  });
+
+  it('should be defined', () => {
+    expect(controller).toBeDefined();
+  });
+});

+ 4 - 0
node_app/src/reservations/reservations.controller.ts

@@ -0,0 +1,4 @@
+import { Controller } from '@nestjs/common';
+
+@Controller('reservations')
+export class ReservationsController {}

+ 2 - 3
node_app/src/reservations/reservations.module.ts

@@ -1,11 +1,10 @@
 import { Module } from '@nestjs/common';
 import { ReservationsService } from './reservations.service';
 import { ReservationsController } from './reservations.controller';
-import { TypeOrmModule } from '@nestjs/typeorm';
-import { Reservation } from './reservation.entity';
+import { PrismaModule } from '../prisma/prisma.module';
 
 @Module({
-  imports: [TypeOrmModule.forFeature([Reservation])],
+  imports: [PrismaModule],
   providers: [ReservationsService],
   controllers: [ReservationsController],
 })

+ 20 - 27
node_app/src/reservations/reservations.service.ts

@@ -1,39 +1,32 @@
 import { Injectable } from '@nestjs/common';
-import { InjectRepository } from '@nestjs/typeorm';
-import { Repository } from 'typeorm';
-import { Reservation } from './reservation.entity';
-import { Place } from './place.entity';
-import { Trajet } from '../trajets/trajet.entity';
+import { PrismaService } from '../prisma/prisma.service';
 
 @Injectable()
 export class ReservationsService {
-  constructor(
-    @InjectRepository(Reservation)
-    private readonly reservationRepository: Repository<Reservation>,
-    @InjectRepository(Place)
-    private readonly placeRepository: Repository<Place>,
-    @InjectRepository(Trajet)
-    private readonly trajetRepository: Repository<Trajet>,
-  ) {}
+  constructor(private prisma: PrismaService) {}
 
   async isPlaceAvailable(placeId: number, trajetId: number): Promise<boolean> {
-    const reservations = await this.reservationRepository.find({
+    const reservations = await this.prisma.reservation.findMany({
       where: {
-        place: { id: placeId },
-        trajet: { id: trajetId },
+        placeId,
+        trajetId,
       },
     });
 
-    return reservations.length === 0; // Si aucune réservation n'existe pour cette place et ce trajet, elle est disponible
+    return reservations.length === 0;
   }
 
   async createReservation(
     userId: number,
     placeId: number,
     trajetId: number,
-  ): Promise<Reservation> {
-    const place = await this.placeRepository.findOne(placeId);
-    const trajet = await this.trajetRepository.findOne(trajetId);
+  ) {
+    const place = await this.prisma.place.findUnique({
+      where: { id: placeId },
+    });
+    const trajet = await this.prisma.trajet.findUnique({
+      where: { id: trajetId },
+    });
 
     if (!place || !trajet) {
       throw new Error('Place or Trip not found');
@@ -43,13 +36,13 @@ export class ReservationsService {
       throw new Error('Place is already reserved for this trip');
     }
 
-    const reservation = this.reservationRepository.create({
-      dateAt: new Date(),
-      user: { id: userId },
-      place,
-      trajet,
+    return this.prisma.reservation.create({
+      data: {
+        dateAt: new Date(),
+        userId,
+        placeId,
+        trajetId,
+      },
     });
-
-    return this.reservationRepository.save(reservation);
   }
 }

+ 6 - 33
node_app/src/trajets/trajet.entity.ts

@@ -1,39 +1,12 @@
-import { Reservation } from 'src/reservations/reservation.entity';
-import { Vehicule } from 'src/vehicules/vehicule.entity';
-import {
-  Column,
-  Entity,
-  JoinColumn,
-  ManyToOne,
-  OneToMany,
-  PrimaryGeneratedColumn,
-} from 'typeorm';
+import { Prisma } from '@prisma/client';
 
-@Entity()
-export class Trajet {
-  @PrimaryGeneratedColumn()
-  id: number;
-
-  @Column({ type: 'datetime' })
+export class Trajet implements Prisma.TrajetCreateInput {
+  id?: number;
   departAt: Date;
-
-  @Column({ type: 'datetime' })
   arriveAt: Date;
-
-  @Column()
   depart: string;
-
-  @Column()
   arrive: string;
-
-  // Relation ManyToOne avec Vehicle (un trajet est associé à une voiture)
-  @ManyToOne(() => Vehicule, (vehicule) => vehicule.trajets, { eager: true })
-  @JoinColumn({ name: 'vehiculeId' })
-  vehicule: Vehicule;
-
-  // Relation OneToMany avec Reservation (un trajet peut avoir plusieurs réservations)
-  @OneToMany(() => Reservation, (reservation) => reservation.trajet, {
-    cascade: true,
-  })
-  reservations: Reservation[];
+  vehicule: Prisma.VehiculeCreateNestedOneWithoutTrajetsInput;
+  vehiculeId: number;
+  reservations?: Prisma.ReservationCreateNestedManyWithoutTrajetInput;
 }

+ 18 - 0
node_app/src/trajets/trajets.controller.spec.ts

@@ -0,0 +1,18 @@
+import { Test, TestingModule } from '@nestjs/testing';
+import { TrajetsController } from './trajets.controller';
+
+describe('TrajetsController', () => {
+  let controller: TrajetsController;
+
+  beforeEach(async () => {
+    const module: TestingModule = await Test.createTestingModule({
+      controllers: [TrajetsController],
+    }).compile();
+
+    controller = module.get<TrajetsController>(TrajetsController);
+  });
+
+  it('should be defined', () => {
+    expect(controller).toBeDefined();
+  });
+});

+ 4 - 0
node_app/src/trajets/trajets.controller.ts

@@ -0,0 +1,4 @@
+import { Controller } from '@nestjs/common';
+
+@Controller('trajets')
+export class TrajetsController {}

+ 4 - 7
node_app/src/trajets/trajets.module.ts

@@ -1,12 +1,9 @@
 import { Module } from '@nestjs/common';
-import { TripsService } from './trips.service';
-import { TripsController } from './trips.controller';
-import { TypeOrmModule } from '@nestjs/typeorm';
-import { Trip } from './trip.entity';
+import { TrajetsController } from './trajets.controller';
+import { TrajetsService } from './trajets.service';
 
 @Module({
-  imports: [TypeOrmModule.forFeature([Trip])],
-  providers: [TripsService],
-  controllers: [TripsController],
+  providers: [TrajetsService],
+  controllers: [TrajetsController],
 })
 export class TrajetsModule {}

+ 18 - 0
node_app/src/trajets/trajets.service.spec.ts

@@ -0,0 +1,18 @@
+import { Test, TestingModule } from '@nestjs/testing';
+import { TrajetsService } from './trajets.service';
+
+describe('TrajetsService', () => {
+  let service: TrajetsService;
+
+  beforeEach(async () => {
+    const module: TestingModule = await Test.createTestingModule({
+      providers: [TrajetsService],
+    }).compile();
+
+    service = module.get<TrajetsService>(TrajetsService);
+  });
+
+  it('should be defined', () => {
+    expect(service).toBeDefined();
+  });
+});

+ 4 - 0
node_app/src/trajets/trajets.service.ts

@@ -0,0 +1,4 @@
+import { Injectable } from '@nestjs/common';
+
+@Injectable()
+export class TrajetsService {}

+ 8 - 20
node_app/src/users/user.entity.ts

@@ -1,28 +1,16 @@
-import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';
+import { Prisma } from '@prisma/client';
 
-@Entity()
-export class User {
-  @PrimaryGeneratedColumn()
-  id: number;
-
-  @Column()
+export class User implements Prisma.UserCreateInput {
+  id?: number;
   name: string;
-
-  @Column()
   otherName: string;
-
-  @Column()
   address: string;
-
-  @Column()
   telephone: string;
-
-  @Column()
   email: string;
-
-  @Column()
   password: string;
-
-  // est n'est pas un vehicule, une compagnie, une reservation, un voyage
-  // un utilisateur peut-être un chauffeur, un manager
+  reservations?: Prisma.ReservationCreateNestedManyWithoutUserInput;
+  driver?: Prisma.DriverCreateNestedOneWithoutUserInput;
+  managedCompany?: Prisma.CompanyCreateNestedOneWithoutManagerInput;
+  driverId?: number | null;
+  managedCompanyId?: number | null;
 }

+ 18 - 0
node_app/src/users/users.controller.spec.ts

@@ -0,0 +1,18 @@
+import { Test, TestingModule } from '@nestjs/testing';
+import { UsersController } from './users.controller';
+
+describe('UsersController', () => {
+  let controller: UsersController;
+
+  beforeEach(async () => {
+    const module: TestingModule = await Test.createTestingModule({
+      controllers: [UsersController],
+    }).compile();
+
+    controller = module.get<UsersController>(UsersController);
+  });
+
+  it('should be defined', () => {
+    expect(controller).toBeDefined();
+  });
+});

+ 4 - 0
node_app/src/users/users.controller.ts

@@ -0,0 +1,4 @@
+import { Controller } from '@nestjs/common';
+
+@Controller('users')
+export class UsersController {}

+ 0 - 3
node_app/src/users/users.module.ts

@@ -1,11 +1,8 @@
 import { Module } from '@nestjs/common';
 import { UsersService } from './users.service';
 import { UsersController } from './users.controller';
-import { TypeOrmModule } from '@nestjs/typeorm';
-import { User } from './user.entity';
 
 @Module({
-  imports: [TypeOrmModule.forFeature([User])],
   providers: [UsersService],
   controllers: [UsersController],
   exports: [UsersService],

+ 18 - 0
node_app/src/users/users.service.spec.ts

@@ -0,0 +1,18 @@
+import { Test, TestingModule } from '@nestjs/testing';
+import { UsersService } from './users.service';
+
+describe('UsersService', () => {
+  let service: UsersService;
+
+  beforeEach(async () => {
+    const module: TestingModule = await Test.createTestingModule({
+      providers: [UsersService],
+    }).compile();
+
+    service = module.get<UsersService>(UsersService);
+  });
+
+  it('should be defined', () => {
+    expect(service).toBeDefined();
+  });
+});

+ 38 - 0
node_app/src/users/users.service.ts

@@ -0,0 +1,38 @@
+import { Injectable } from '@nestjs/common';
+import { PrismaClient, User } from '@prisma/client';
+
+@Injectable()
+export class UsersService {
+  private prisma: PrismaClient;
+
+  constructor() {
+    this.prisma = new PrismaClient();
+  }
+
+  async findAll(): Promise<User[] | Error> {
+    try {
+      const users: User[] = await this.prisma.user.findMany();
+      return users;
+    } catch (error) {
+      console.error(error);
+      throw new Error('Failed to fetch users');
+    }
+  }
+
+  async createUser(
+    name: string,
+    email: string,
+    password: string,
+  ): Promise<User> {
+    return await this.prisma.user.create({
+      data: {
+        name,
+        email,
+        password,
+        otherName: '',
+        address: '',
+        telephone: '',
+      },
+    });
+  }
+}

+ 11 - 39
node_app/src/vehicules/vehicule.entity.ts

@@ -1,44 +1,16 @@
-import { Place } from 'src/reservations/place.entity';
-import { Trajet } from 'src/trajets/trajet.entity';
-import {
-  Column,
-  Entity,
-  JoinColumn,
-  ManyToOne,
-  OneToMany,
-  PrimaryGeneratedColumn,
-} from 'typeorm';
+import { Prisma } from '@prisma/client';
 
-@Entity()
-export class Vehicule {
-  @PrimaryGeneratedColumn()
-  id: number;
-
-  @Column({ type: 'integer' })
+export class Vehicule implements Prisma.VehiculeCreateInput {
+  id?: number;
   number_places: number;
-
-  @Column()
   color: string;
-
-  @Column()
   type: string;
-
-  @Column({ unique: true })
-  immatriculation: string; // Numéro d'immatriculation de la voiture
-
-  @Column()
-  model: string; // Modèle de la voiture
-
-  // Relation OneToMany avec Place (une voiture peut avoir plusieurs places)
-  @OneToMany(() => Place, (place) => place.vehicule, { cascade: true })
-  places: Place[];
-
-  @ManyToOne(() => Trajet, (trajet) => trajet.vehicule, { eager: true })
-  @JoinColumn({ name: 'vehiculeId' })
-  trajets: Trajet[];
-
-  // appartient à une compagnie,
-  // est gérer par un manager
-  // possède des utilisateurs (passagers)
-  // à un chauffeur ou plusieurs drivers,
+  immatriculation: string;
+  model: string;
+  company: Prisma.CompanyCreateNestedOneWithoutVehiclesInput;
+  driver: Prisma.DriverCreateNestedOneWithoutVehiclesInput;
+  companyId: number;
+  driverId: number;
+  places?: Prisma.PlaceCreateNestedManyWithoutVehiculeInput;
+  trajets?: Prisma.TrajetCreateNestedManyWithoutVehiculeInput;
 }

+ 18 - 0
node_app/src/vehicules/vehicules.controller.spec.ts

@@ -0,0 +1,18 @@
+import { Test, TestingModule } from '@nestjs/testing';
+import { VehiculesController } from './vehicules.controller';
+
+describe('VehiculesController', () => {
+  let controller: VehiculesController;
+
+  beforeEach(async () => {
+    const module: TestingModule = await Test.createTestingModule({
+      controllers: [VehiculesController],
+    }).compile();
+
+    controller = module.get<VehiculesController>(VehiculesController);
+  });
+
+  it('should be defined', () => {
+    expect(controller).toBeDefined();
+  });
+});

+ 4 - 0
node_app/src/vehicules/vehicules.controller.ts

@@ -0,0 +1,4 @@
+import { Controller } from '@nestjs/common';
+
+@Controller('vehicules')
+export class VehiculesController {}

+ 4 - 7
node_app/src/vehicules/vehicules.module.ts

@@ -1,12 +1,9 @@
 import { Module } from '@nestjs/common';
-import { VehiclesService } from './vehicles.service';
-import { VehiclesController } from './vehicles.controller';
-import { TypeOrmModule } from '@nestjs/typeorm';
-import { Vehicle } from './vehicle.entity';
+import { VehiculesService } from './vehicules.service';
+import { VehiculesController } from './vehicules.controller';
 
 @Module({
-  imports: [TypeOrmModule.forFeature([Vehicle])],
-  providers: [VehiclesService],
-  controllers: [VehiclesController],
+  providers: [VehiculesService],
+  controllers: [VehiculesController],
 })
 export class VehiculesModule {}

+ 18 - 0
node_app/src/vehicules/vehicules.service.spec.ts

@@ -0,0 +1,18 @@
+import { Test, TestingModule } from '@nestjs/testing';
+import { VehiculesService } from './vehicules.service';
+
+describe('VehiculesService', () => {
+  let service: VehiculesService;
+
+  beforeEach(async () => {
+    const module: TestingModule = await Test.createTestingModule({
+      providers: [VehiculesService],
+    }).compile();
+
+    service = module.get<VehiculesService>(VehiculesService);
+  });
+
+  it('should be defined', () => {
+    expect(service).toBeDefined();
+  });
+});

+ 4 - 0
node_app/src/vehicules/vehicules.service.ts

@@ -0,0 +1,4 @@
+import { Injectable } from '@nestjs/common';
+
+@Injectable()
+export class VehiculesService {}

+ 4 - 2
node_app/tsconfig.json

@@ -1,6 +1,7 @@
 {
   "compilerOptions": {
-    "module": "commonjs",
+    "strict": true,
+    "module": "CommonJS",
     "declaration": true,
     "removeComments": true,
     "emitDecoratorMetadata": true,
@@ -16,6 +17,7 @@
     "forceConsistentCasingInFileNames": true,
     "noImplicitAny": false,
     "strictBindCallApply": false,
-    "noFallthroughCasesInSwitch": false
+    "noFallthroughCasesInSwitch": false,
+    "strictPropertyInitialization": false
   }
 }

+ 0 - 13
package-lock.json

@@ -1,13 +0,0 @@
-{
-  "name": "back",
-  "version": "1.0.0",
-  "lockfileVersion": 3,
-  "requires": true,
-  "packages": {
-    "": {
-      "name": "back",
-      "version": "1.0.0",
-      "license": "MIT"
-    }
-  }
-}

이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.