Application de covoiturage permettant aux utilisateurs de créer des comptes, d'ajouter des voitures, de suggérer des trajets et de réserver des places. .
Liste des technologies et des outils utilisés dans le projet:
- Node.js
- Express.js
- CORS
- Morgan
- JWT
- Bcrypt
- Prisma
- Express validator
- Docker
- Node.js installed
- Database (Postgres ) installed and running
-
Clone the repository:
$ git clone $ cd your-project
-
Install dependencies:
$ npm install
$ npm install nodemon
- Lancer le Server
$ npm run start
$ npm run dev
Créez un fichier .env et configurez les variables d'environnement pour vous connecter à votre base de données PostgreSQL. Selon la template choisi Local ou bien docker
$ DATABASE_URL=postgresql://username:password@localhost:5432/carpooldb
$ npx prisma studio
Pour visualiser les different table
Créer une clé secrète pour l'authentification JWT dans le fichier .env. et sécuriser les fonctionnalite
-
URL :
/user
-
Méthode :
POST
-
Description : Créer de nouveaux utilisateurs avec le nom d'utilisateur, le mot de passe et le type d'utilisateur.
-
Connexion des utilisateurs avec vérification du nom d'utilisateur et du mot de passe.
-
Génération de jetons JWT pour une authentification sécurisée.
-
Request Body :
{ "username": "nom_utilisateur", "password": "mot_de_passe", "type": "type_utilisateur" }
-
Response Success:
{
{
"token": "",
"data": {
"id": "6df1859c-4b6a-4f12-8e9e-61cf9db8b10f",
"createdAt": "2024-11-05T08:55:07.402Z",
"username": "hanineza",
"password": "$2b$10$JWowpeyYA9L9iaKjlVEmN.SF5ya2sPtdHW2lcUCLWedUXfpg5ystG",
"type": " DRIVER"
}
}
}
-
URL :
/signin
-
Méthode :
POST
-
Description : Connexion des utilisateurs avec leur nom d'utilisateur et leur mot de passe
-
Request Body :
{ "username": "nom_utilisateur", "password": "mot_de_passe", }
-
Response Success:
{
{
"token": "",
"message": "User Signed in"
}
}
Toutes les routes de cette API nécessitent un en-tête d'authentification. Ajoutez le token dans l'en-tête Authorization
sous la forme suivante :
- URL :
/api/car
- Méthode :
GET
- Description : Récupère toutes les voitures associées à l'utilisateur connecté.
- Réponse (en cas de succès) :
{ "data": { "id": "0f0cdc2d-2cf0-4988-a72e-11fe796325b7", "make": "Toyota", "model": "Toyota Prius", "year": 2020, "seats": 4, "ownerId": "6df1859c-4b6a-4f12-8e9e-61cf9db8b10f", "isActive": true } }
- URL : /api/car/:id
- Méthode : GET
- Description : Récupère une voiture spécifique associée à l'utilisateur connecté.
- Paramètre URL : id - ID de la voiture
- Réponse (en cas de succès) :
{ "data": { "id": "0f0cdc2d-2cf0-4988-a72e-11fe796325b7", "make": "Toyota", "model": "Toyota Prius", "year": 2020, "seats": 4, "ownerId": "6df1859c-4b6a-4f12-8e9e-61cf9db8b10f", "isActive": true } }
-
URL :
/api/car
-
Méthode :
POST
-
Description : Permet à l'utilisateur connecté de créer une nouvelle voiture.
-
Request Body :
{ "model": "Toyota Prius", "make": "Toyota", "year": 2020, "seats": 4, "isActive": true }
-
Response Success:
{
{
"data": {
"id": "43c437e0-a699-40e4-a7db-bd6f2e9f9f10",
"make": "Toyoooooota",
"model": "Toyota Prius",
"year": 2020,
"seats": 4,
"ownerId": "6df1859c-4b6a-4f12-8e9e-61cf9db8b10f",
"isActive": true
}
}
}
- URL :
/api/car/id
- Méthode :
PUT
- Description : Permet à l'utilisateur connecté de mettre a jour une voiture.
- Paramètre URL : id - ID de la voiture
- Request Body :
{ "model": "Toyota Prius", "make": "Toyota", "year": 2021, "seats": 5, "isActive": false }
- Response Success:
{
{
"data": {
"id": "43c437e0-a699-40e4-a7db-bd6f2e9f9f10",
"make": "Toyoooooota",
"model": "Toyota Prius",
"year": 2020,
"seats": 5,
"ownerId": "6df1859c-4b6a-4f12-8e9e-61cf9db8b10f",
"isActive": true
}
}
}
-
URL :
/api/car/id
-
Méthode :
DELETE
-
Description : Permet à l'utilisateur connecté de supprimer une voiture.
-
Paramètre URL : id - ID de la voiture
-
Response Success:
{
{
"data": {
"id": "43c437e0-a699-40e4-a7db-bd6f2e9f9f10",
"make": "Toyoooooota",
"model": "Toyota Prius",
"year": 2020,
"seats": 5,
"ownerId": "6df1859c-4b6a-4f12-8e9e-61cf9db8b10f",
"isActive": true
}
}
}
- URL :
/api/ride
- Méthode :
POST
- Description : Permet à un utilisateur connecté de créer un nouveau trajet en spécifiant les détails du trajet et la voiture associée.
- Corps de la requête :
{ "origin": "Point de départ", "destination": "Point d'arrivée", "date": "2024-12-01", "carId": 1 }
- Response Success:
{
"data": {
"id": "33112bed-0a44-43e9-b722-cc4d6904ed30",
"createdAt": "2024-11-05T09:33:39.025Z",
"origin": "Point de départ",
"destination": "Point d'arrivée",
"date": "2024-11-10T08:00:00.000Z",
"carId": "b2c95f2d-e9a8-43d4-a40c-673dc1c14494",
"userId": "6df1859c-4b6a-4f12-8e9e-61cf9db8b10f"
}
}
- URL :
/api/ride/id
- Méthode :
PUT
- Description : Permet à un utilisateur connecté de mettre a jour un trajet en spécifiant les détails du trajet et la voiture associée.
- Corps de la requête :
{ "origin": "Nouvel point de départ", "destination": "Nouvel point d'arrivée", "date": "2024-12-02", "carId": 1 }
- Response Success:
{
"data": {
"id": "33112bed-0a44-43e9-b722-cc4d6904ed30",
"createdAt": "2024-11-05T09:33:39.025Z",
"origin": " Nouvel Point de départ",
"destination": "Nouvel Point d'arrivée",
"date": "2024-11-10T08:00:00.000Z",
"carId": "b2c95f2d-e9a8-43d4-a40c-673dc1c14494",
"userId": "6df1859c-4b6a-4f12-8e9e-61cf9db8b10f"
}
}
-
URL :
/api/ride
-
Méthode :
GET
-
Description : Récupère tous les trajets disponibles, y compris les informations sur la voiture, l'utilisateur et les réservations associées .
-
Response Success:
{
"data": [
{
"id": 1,
"origin": "Point de départ",
"destination": "Point d'arrivée",
"date": "2024-12-01",
"time": "14:00",
"carId": 1,
"userId": 1,
"car": { /* Détails de la voiture */ },
"user": { /* Détails de l'utilisateur */ },
"bookings": [ /* Liste des réservations associées */ ]
},
]
}
-
URL :
/api/bookings
-
Méthode :
POST
-
Description : Permet à un utilisateur de réserver une place pour un trajet spécifique. La réservation est acceptée si des places sont disponibles et que la voiture associée n'est pas active.
-
Corps de la requête :
{ "rideId": 1 }
-
ExplicationrideId : ID du trajet à réserver.
-
Vérifie si le trajet existe et s'il est associé à une voiture.
-
Vérifie que la voiture associée n'est pas active (condition requise pour accepter la réservation).
-
Compte le nombre de réservations existantes pour le trajet.
-
Si des places sont disponibles : La réservation est acceptée et l'état ACCEPTED est attribué.
-
Si le trajet est complet : La réservation est placée en attente avec l'état PENDING
-
Response Success:
{
"status": "ACCEPTED",
"booking": {
"id": "4a240a77-4da8-44d2-bad3-46cbc003eb15",
"createdAt": "2024-11-05T09:47:21.130Z",
"userId": "6df1859c-4b6a-4f12-8e9e-61cf9db8b10f",
"rideId": "33112bed-0a44-43e9-b722-cc4d6904ed30",
"status": "ACCEPTED"
}
}
- Response PENDING:
{
"status": "PENDING",
"booking": {
"id": "ded31a16-b043-409e-a69d-cdf5c22ddda0",
"createdAt": "2024-11-05T09:48:32.766Z",
"userId": "6df1859c-4b6a-4f12-8e9e-61cf9db8b10f",
"rideId": "0c934466-c192-4f8d-a1fc-0ebf8aaf4d23",
"status": "PENDING"
}
}
- Response Rejected:
{
"status": "REJECTED",
"message": "La voiture est active"
}
- Executer sur Docker
$ docker-compose up --build