#panier
Points clés
- Dans ce projet, nous travaillerons sur les fonctionnalités. Cela signifie que nous choisissons un objet comme un utilisateur, un livre, un blog, etc. à la fois. Nous travaillons sur sa fonctionnalité. Les étapes seraient :
- Nous créons son modèle.
- Nous construisons ses API.
- Nous testons ces API.
- Nous déployons ces API.
- Nous intégrons ces API avec le frontend.
- Nous répéterons les étapes de l'étape 1 à l'étape 5 pour chaque fonctionnalité de ce projet.
- Ce projet est divisé en 4 fonctionnalités à savoir Utilisateur, Produit, Panier et Commande. Vous devez travailler sur une seule fonctionnalité à la fois. Une fois cela terminé selon les étapes mentionnées ci-dessus. Vous serez invité à passer à la fonctionnalité suivante.
- Dans ce projet, nous modifions la façon dont nous envoyons le jeton avec une demande. Au lieu d'utiliser une clé d'en-tête personnalisée comme x-api-key, vous devez utiliser l'en-tête Authorization et envoyer le jeton JWT en tant que jeton Bearer.
- Créez une base de données de groupe
groupXDatabase
. Vous pouvez nettoyer la base de données que vous avez utilisée précédemment et la relancer. - Cette fois, chaque groupe devrait avoir une seule branche git . Coordonnez-vous entre vous en vous assurant que chaque personne suivante extrait le dernier code poussé par un coéquipier. Votre branche sera vérifiée dans le cadre de la démo. Le nom de la branche doit suivre la convention de dénomination
project/productsManagementGroupX
- Suivez les conventions de dénomination exactement comme indiqué.
FONCTION I - Utilisateur
Modèles
{
fname : {string, mandatory},
lname : {string, mandatory},
email : {string, mandatory, valid email, unique},
profileImage : {string, mandatory}, // s3 link
phone : {string, mandatory, unique, valid Indian mobile number},
password : {string, mandatory, minLen 8, maxLen 15}, // encrypted password
address : {
shipping : {
street : {string, mandatory},
city : {string, mandatory},
pincode : {number, mandatory}
},
billing : {
street : {string, mandatory},
city : {string, mandatory},
pincode : {number, mandatory}
}
},
createdAt : {timestamp},
updatedAt : {timestamp}
}
API utilisateur
POST /s'inscrire
- Créez un document utilisateur à partir du corps de la demande. Le corps de la demande doit contenir une image.
- Téléchargez l'image dans le compartiment S3 et enregistrez son URL publique dans le document utilisateur.
- Enregistrez le mot de passe au format crypté. (utilisez bcrypt)
- Format de réponse
- En cas de succès - Renvoie le statut HTTP 201. Renvoie également le document utilisateur. La réponse doit être un objet JSON comme celui-ci
- En cas d'erreur : renvoie un message d'erreur approprié avec un code d'état HTTP valide. La réponse doit être un objet JSON comme celui-ci
{
" status " : true,
" message " : " User created successfully " ,
" data " : {
" fname " : " John " ,
" lname " : " Doe " ,
" email " : " [email protected] " ,
" profileImage " : " https://classroom-training-bucket.s3.ap-south-1.amazonaws.com/user/copernico-p_kICQCOM4s-unsplash.jpg " ,
" phone " : 9876543210,
" password " : " $2b$10$DpOSGb0B7cT0f6L95RnpWO2P/AtEoE6OF9diIiAEP7QrTMaV29Kmm " ,
" address " : {
" shipping " : {
" street " : " MG Road " ,
" city " : " Indore " ,
" pincode " : 452001
},
" billing " : {
" street " : " MG Road " ,
" city " : " Indore " ,
" pincode " : 452001
}
},
" _id " : " 6162876abdcb70afeeaf9cf5 " ,
" createdAt " : " 2021-10-10T06:25:46.051Z " ,
" updatedAt " : " 2021-10-10T06:25:46.051Z " ,
" __v " : 0
}
}
POST / connexion
- Autoriser un utilisateur à se connecter avec son email et son mot de passe.
- En cas de tentative de connexion réussie, renvoyez l'ID utilisateur et un jeton JWT contenant l'ID utilisateur, exp, iat.
REMARQUE : Il y a un léger changement dans le corps de la réponse. Vous devez également renvoyer userId en plus du jeton JWT.
- Format de réponse
- En cas de succès : renvoie le statut HTTP 200 et le jeton JWT dans le corps de la réponse. La réponse doit être un objet JSON comme celui-ci
- En cas d'erreur : renvoie un message d'erreur approprié avec un code d'état HTTP valide. La réponse doit être un objet JSON comme celui-ci
{
" status " : true,
" message " : " User login successfull " ,
" data " : {
" userId " : " 6165f29cfe83625cf2c10a5c " ,
" token " : " eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2MTYyODc2YWJkY2I3MGFmZWVhZjljZjUiLCJpYXQiOjE2MzM4NDczNzYsImV4cCI6MTYzMzg4MzM3Nn0.PgcBPLLg4J01Hyin-zR6BCk7JHBY-RpuWMG_oIK7aV8 "
}
}
GET /user/:userId/profile (Authentification requise)
- Autoriser un utilisateur à récupérer les détails de son profil.
- Assurez-vous que l'ID utilisateur dans le paramètre URL et dans le jeton est le même
- Format de réponse
- En cas de succès - Renvoie le statut HTTP 200 et renvoie le document utilisateur. La réponse doit être un objet JSON comme celui-ci
- En cas d'erreur : renvoie un message d'erreur approprié avec un code d'état HTTP valide. La réponse doit être un objet JSON comme celui-ci
{
" status " : true,
" message " : " User profile details " ,
" data " : {
" address " : {
" shipping " : {
" street " : " MG Road " ,
" city " : " Indore " ,
" pincode " : 452001
},
" billing " : {
" street " : " MG Road " ,
" city " : " Indore " ,
" pincode " : 452001
}
},
" _id " : " 6162876abdcb70afeeaf9cf5 " ,
" fname " : " John " ,
" lname " : " Doe " ,
" email " : " [email protected] " ,
" profileImage " : " https://classroom-training-bucket.s3.ap-south-1.amazonaws.com/user/copernico-p_kICQCOM4s-unsplash.jpg " ,
" phone " : 9876543210,
" password " : " $2b$10$DpOSGb0B7cT0f6L95RnpWO2P/AtEoE6OF9diIiAEP7QrTMaV29Kmm " ,
" createdAt " : " 2021-10-10T06:25:46.051Z " ,
" updatedAt " : " 2021-10-10T06:25:46.051Z " ,
" __v " : 0
}
}
PUT /user/:userId/profile (Authentification et autorisation requises)
- Autoriser un utilisateur à mettre à jour son profil.
- Un utilisateur peut mettre à jour tous les champs
- Assurez-vous que l'ID utilisateur dans le paramètre URL et dans le jeton est le même
- Format de réponse
- En cas de succès - Renvoie le statut HTTP 200. Renvoie également le document utilisateur mis à jour. La réponse doit être un objet JSON comme celui-ci
- En cas d'erreur : renvoie un message d'erreur approprié avec un code d'état HTTP valide. La réponse doit être un objet JSON comme celui-ci
{
" status " : true,
" message " : " User profile updated " ,
" data " : {
" address " : {
" shipping " : {
" street " : " MG Road " ,
" city " : " Delhi " ,
" pincode " : 110001
},
" billing " : {
" street " : " MG Road " ,
" city " : " Indore " ,
" pincode " : 452010
}
},
" _id " : " 6162876abdcb70afeeaf9cf5 " ,
" fname " : " Jane " ,
" lname " : " Austin " ,
" email " : " [email protected] " ,
" profileImage " : " https://classroom-training-bucket.s3.ap-south-1.amazonaws.com/user/laura-davidson-QBAH4IldaZY-unsplash.jpg " ,
" phone " : 9876543210,
" password " : " $2b$10$jgF/j/clYBq.3uly6Tijce4GEGJn9EIXEcw9NI3prgKwJ/6.sWT6O " ,
" createdAt " : " 2021-10-10T06:25:46.051Z " ,
" updatedAt " : " 2021-10-10T08:47:15.297Z " ,
" __v " : 0
}
}
Remarque : Bcrypt Envoyer les données du formulaire
FONCTION II - Produit
Modèles
{
title : {string, mandatory, unique},
description : {string, mandatory},
price : {number, mandatory, valid number/decimal},
currencyId : {string, mandatory, INR},
currencyFormat : {string, mandatory, Rupee symbol},
isFreeShipping : {boolean, default: false},
productImage : {string, mandatory}, // s3 link
style : {string},
availableSizes : {array of string, at least one size, enum["S", "XS","M","X", "L","XXL", "XL"]},
installments : {number},
deletedAt : {Date, when the document is deleted},
isDeleted : {boolean, default: false},
createdAt : {timestamp},
updatedAt : {timestamp},
}
API de produits ( Aucune authentification requise )
POST /produits
- Créez un document produit à partir du corps de la demande.
- Téléchargez l'image du produit dans le compartiment S3 et enregistrez l'URL publique de l'image dans le document.
- Format de réponse
- En cas de succès - Renvoyez le statut HTTP 201. Renvoyez également le document produit. La réponse doit être un objet JSON comme celui-ci
- En cas d'erreur : renvoie un message d'erreur approprié avec un code d'état HTTP valide. La réponse doit être un objet JSON comme celui-ci
OBTENIR /produits
- Renvoie tous les produits de la collection qui ne sont pas supprimés.
- Filtres
- Taille (la clé de ce filtre sera « taille »)
- Nom du produit (la clé de ce filtre sera « nom »). Vous devez renvoyer tous les produits dont le nom contient la sous-chaîne reçue dans ce filtre
- Prix : supérieur ou inférieur à une valeur précise. Les clés sont « priceGreaterThan » et « priceLessThan ».
REMARQUE : Pour la demande de filtre de prix, elle peut contenir les deux ou l'une des clés. Par exemple, la requête dans la requête pourrait ressembler à { priceGreaterThan: 500, priceLessThan: 2000 } ou simplement { priceLessThan: 1000 } )
- Trier
- Trié par prix du produit par ordre croissant ou décroissant. La paire clé-valeur ressemblera à {priceSort : 1} ou {priceSort : -1}, par exemple /products?size=XL&name=Nit%20grit
- Format de réponse
- En cas de succès - Renvoyez le statut HTTP 200. Renvoyez également les documents du produit. La réponse doit être un objet JSON comme celui-ci
- En cas d'erreur : renvoie un message d'erreur approprié avec un code d'état HTTP valide. La réponse doit être un objet JSON comme celui-ci
OBTENIR /products/:productId
- Renvoie les détails du produit par identifiant de produit
- Format de réponse
- En cas de succès - Renvoyez le statut HTTP 200. Renvoyez également les documents du produit. La réponse doit être un objet JSON comme celui-ci
- En cas d'erreur : renvoie un message d'erreur approprié avec un code d'état HTTP valide. La réponse doit être un objet JSON comme celui-ci
PUT /products/:productId
- Met à jour un produit en modifiant au moins un ou tous les champs
- Vérifiez si le productId existe (doit avoir isDeleted false et est présent dans la collection). Si ce n'est pas le cas, renvoyez un statut HTTP 404 avec un corps de réponse comme celui-ci
- Format de réponse
- En cas de succès : renvoie le statut HTTP 200. Renvoie également le document produit mis à jour. La réponse doit être un objet JSON comme celui-ci
- En cas d'erreur : renvoie un message d'erreur approprié avec un code d'état HTTP valide. La réponse doit être un objet JSON comme celui-ci
SUPPRIMER /products/:productId
- Supprime un produit par identifiant de produit s'il n'est pas déjà supprimé
- Format de réponse
- En cas de succès - Renvoie le statut HTTP 200. La réponse doit être un objet JSON comme celui-ci
- En cas d'erreur : renvoie un message d'erreur approprié avec un code d'état HTTP valide. La réponse doit être un objet JSON comme celui-ci
CARACTÉRISTIQUE III - Chariot
Modèles
{
userId : {ObjectId, refs to User, mandatory, unique},
items : [{
productId : {ObjectId, refs to Product model, mandatory},
quantity : {number, mandatory, min 1}
}],
totalPrice : {number, mandatory, comment: "Holds total price of all the items in the cart"},
totalItems : {number, mandatory, comment: "Holds total number of items in the cart"},
createdAt : {timestamp},
updatedAt : {timestamp},
}
API du panier ( authentification requise en tant que jeton d'en-tête-porteur d'autorisation )
POST /users/:userId/cart (Ajouter au panier)
- Créez un panier pour l'utilisateur s'il n'existe pas. Sinon, ajoutez des produits dans le panier.
- Obtenez l'identifiant du panier dans le corps de la demande.
- Obtenez productId dans le corps de la demande.
- Assurez-vous que ce panier existe.
- Ajoutez un ou plusieurs produits pour un utilisateur dans le panier.
- Assurez-vous que l'ID utilisateur dans les paramètres et dans le jeton JWT correspondent.
- Assurez-vous que l'utilisateur existe
- Assurez-vous que le(s) produit(s) sont valides et non supprimés.
- Obtenez les détails du ou des produits dans le corps de la réponse.
- Format de réponse
- En cas de succès - Renvoyez le statut HTTP 201. Renvoyez également le document du panier. La réponse doit être un objet JSON comme celui-ci
- En cas d'erreur : renvoie un message d'erreur approprié avec un code d'état HTTP valide. La réponse doit être un objet JSON comme celui-ci
PUT /users/:userId/cart (Supprimer un produit / Réduire la quantité d'un produit du panier)
- Met à jour un panier en diminuant la quantité d'un produit de 1 ou en supprimant un produit du panier.
- Obtenez l'identifiant du panier dans le corps de la demande.
- Obtenez productId dans le corps de la demande.
- Obtenez la clé « removeProduct » dans le corps de la demande.
- Assurez-vous que ce panier existe.
- La clé 'removeProduct' indique si un produit doit être supprimé ({removeProduct: 0}) ou si sa quantité doit être décrémentée de 1 ({removeProduct: 1}).
- Assurez-vous que l'ID utilisateur dans les paramètres et dans le jeton JWT correspondent.
- Assurez-vous que l'utilisateur existe
- Obtenez les détails du ou des produits dans le corps de la réponse.
- Vérifiez si le productId existe et n'est pas supprimé avant de mettre à jour le panier.
- Format de réponse
- En cas de succès - Renvoyez le statut HTTP 200. Renvoyez également le document de panier mis à jour. La réponse doit être un objet JSON comme celui-ci
- En cas d'erreur : renvoie un message d'erreur approprié avec un code d'état HTTP valide. La réponse doit être un objet JSON comme celui-ci
OBTENIR /users/:userId/cart
- Renvoie le résumé du panier de l’utilisateur.
- Assurez-vous que ce panier existe.
- Assurez-vous que l'ID utilisateur dans les paramètres et dans le jeton JWT correspondent.
- Assurez-vous que l'utilisateur existe
- Obtenez les détails du ou des produits dans le corps de la réponse.
- Format de réponse
- En cas de succès - Renvoyez le statut HTTP 200. Renvoyez le document du panier. La réponse doit être un objet JSON comme celui-ci
- En cas d'erreur : renvoie un message d'erreur approprié avec un code d'état HTTP valide. La réponse doit être un objet JSON comme celui-ci
SUPPRIMER /users/:userId/cart
- Supprime le panier pour l'utilisateur.
- Assurez-vous que ce panier existe.
- Assurez-vous que l'ID utilisateur dans les paramètres et dans le jeton JWT correspondent.
- Assurez-vous que l'utilisateur existe
- la suppression du panier signifie que le tableau d'articles est vide, totalItems est 0, totalPrice est 0.
- Format de réponse
- En cas de succès - Renvoie le statut HTTP 204. Renvoie un message approprié. La réponse doit être un objet JSON comme celui-ci
- En cas d'erreur : renvoie un message d'erreur approprié avec un code d'état HTTP valide. La réponse doit être un objet JSON comme celui-ci
FONCTION IV - Commande
Modèles
{
userId : {ObjectId, refs to User, mandatory},
items : [{
productId : {ObjectId, refs to Product model, mandatory},
quantity : {number, mandatory, min 1}
}],
totalPrice : {number, mandatory, comment: "Holds total price of all the items in the cart"},
totalItems : {number, mandatory, comment: "Holds total number of items in the cart"},
totalQuantity : {number, mandatory, comment: "Holds total number of quantity in the cart"},
cancellable : {boolean, default: true},
status : {string, default: 'pending', enum[pending, completed, cancled]},
deletedAt : {Date, when the document is deleted},
isDeleted : {boolean, default: false},
createdAt : {timestamp},
updatedAt : {timestamp},
}
API de paiement/commande (authentification et autorisation requises)
POST /users/:userId/orders
- Créer une commande pour l'utilisateur
- Assurez-vous que l'ID utilisateur dans les paramètres et dans le jeton JWT correspondent.
- Assurez-vous que l'utilisateur existe
- Obtenez les détails du panier dans le corps de la demande
- Format de réponse
- En cas de succès - Renvoyez le statut HTTP 200. Renvoyez également le document de commande. La réponse doit être un objet JSON comme celui-ci
- En cas d'erreur : renvoie un message d'erreur approprié avec un code d'état HTTP valide. La réponse doit être un objet JSON comme celui-ci
PUT /users/:userId/orders
- Met à jour le statut d'une commande
- Assurez-vous que l'ID utilisateur dans les paramètres et dans le jeton JWT correspondent.
- Assurez-vous que l'utilisateur existe
- Obtenir l'identifiant de la commande dans le corps de la demande
- Assurez-vous que la commande appartient à l'utilisateur
- Assurez-vous que seule une commande annulable peut être annulée. Sinon, envoyez un message d'erreur et une réponse appropriés.
- Format de réponse
- En cas de succès - Renvoyez le statut HTTP 200. Renvoyez également le document de commande mis à jour. La réponse doit être un objet JSON comme celui-ci
- En cas d'erreur : renvoie un message d'erreur approprié avec un code d'état HTTP valide. La réponse doit être un objet JSON comme celui-ci
Essai
- Pour tester ces API, créez une nouvelle collection dans Postman nommée Project 5 Shopping Cart.
- Chaque API devrait avoir une nouvelle requête dans cette collection
- Chaque requête de la collection doit être correctement nommée. Par exemple, créer un utilisateur, créer un produit, obtenir des produits, etc.
- Chaque membre de chaque équipe doit avoir ses tests en cours d'exécution
Reportez-vous à l'échantillon ci-dessous
Réponse
Structure de réponse réussie
{
status : true,
message : ' Success ' ,
data : {
}
}
Structure de réponse aux erreurs
{
status : false,
message : " "
}
Collections
utilisateurs
{
_id : ObjectId("88abc190ef0288abc190ef02"),
fname : ' John ' ,
lname : ' Doe ' ,
email : ' [email protected] ' ,
profileImage : ' http://function-up-test.s3.amazonaws.com/users/user/johndoe.jpg ' , // s3 link
phone : 9876543210,
password : ' $2b$10$O.hrbBPCioVm237nAHYQ5OZy6k15TOoQSFhTT.recHBfQpZhM55Ty ' , // encrypted password
address : {
shipping : {
street : " 110, Ridhi Sidhi Tower " ,
city : " Jaipur " ,
pincode : 400001
}, {mandatory}
billing : {
street : " 110, Ridhi Sidhi Tower " ,
city : " Jaipur " ,
pincode : 400001
}
},
createdAt : " 2021-09-17T04:25:07.803Z " ,
updatedAt : " 2021-09-17T04:25:07.803Z " ,
}
produits
{
_id : ObjectId("88abc190ef0288abc190ef55"),
title : ' Nit Grit ' ,
description : ' Dummy description ' ,
price : 23.0,
currencyId : ' INR ' ,
currencyFormat : ' ₹ ' ,
isFreeShipping : false,
productImage : ' http://function-up-test.s3.amazonaws.com/products/product/nitgrit.jpg ' , // s3 link
style : ' Colloar ' ,
availableSizes : ["S", "XS","M","X", "L","XXL", "XL"],
installments : 5,
deletedAt : null,
isDeleted : false,
createdAt : " 2021-09-17T04:25:07.803Z " ,
updatedAt : " 2021-09-17T04:25:07.803Z " ,
}
chariots
{
" _id " : ObjectId("88abc190ef0288abc190ef88"),
userId : ObjectId("88abc190ef0288abc190ef02"),
items : [{
productId : ObjectId("88abc190ef0288abc190ef55"),
quantity : 2
}, {
productId : ObjectId("88abc190ef0288abc190ef60"),
quantity : 1
}],
totalPrice : 50.99,
totalItems : 2,
createdAt : " 2021-09-17T04:25:07.803Z " ,
updatedAt : " 2021-09-17T04:25:07.803Z " ,
}
ordres
{
" _id " : ObjectId("88abc190ef0288abc190ef88"),
userId : ObjectId("88abc190ef0288abc190ef02"),
items : [{
productId : ObjectId("88abc190ef0288abc190ef55"),
quantity : 2
}, {
productId : ObjectId("88abc190ef0288abc190ef60"),
quantity : 1
}],
totalPrice : 50.99,
totalItems : 2,
totalQuantity : 3,
cancellable : true,
status : ' pending '
createdAt : " 2021-09-17T04:25:07.803Z " ,
updatedAt : " 2021-09-17T04:25:07.803Z " ,
}