#Warenkorb
Wichtige Punkte
- In diesem Projekt werden wir funktionsorientiert arbeiten. Das bedeutet, dass wir jeweils ein Objekt wie Benutzer, Buch, Blog usw. auswählen. Wir arbeiten die Funktion durch. Die Schritte wären:
- Wir erstellen das Modell.
- Wir erstellen seine APIs.
- Wir testen diese APIs.
- Wir stellen diese APIs bereit.
- Wir integrieren diese APIs in das Frontend.
- Wir werden die Schritte von Schritt 1 bis Schritt 5 für jede Funktion in diesem Projekt wiederholen.
- Dieses Projekt ist in vier Funktionen unterteilt: Benutzer, Produkt, Warenkorb und Bestellung. Sie müssen jeweils an einer einzelnen Funktion arbeiten. Sobald dies gemäß den oben genannten Schritten abgeschlossen ist. Sie werden aufgefordert, mit der nächsten Funktion fortzufahren.
- In diesem Projekt ändern wir die Art und Weise, wie wir Token mit einer Anfrage senden. Anstatt einen benutzerdefinierten Header-Schlüssel wie x-api-key zu verwenden, müssen Sie den Autorisierungsheader verwenden und das JWT-Token als Bearer-Token senden.
- Erstellen Sie eine Gruppendatenbank
groupXDatabase
. Sie können die zuvor verwendete Datenbank bereinigen und erneut starten. - Diesmal sollte jede Gruppe einen einzelnen Git-Zweig haben. Koordinieren Sie sich untereinander, indem Sie sicherstellen, dass jede nächste Person den Code zieht, der zuletzt von einem Teamkollegen gedrückt wurde. Ihr Zweig wird im Rahmen der Demo überprüft. Der Zweigname sollte der Namenskonvention
project/productsManagementGroupX
folgen - Befolgen Sie die Namenskonventionen genau wie angegeben.
FUNKTION I – Benutzer
Modelle
{
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}
}
Benutzer-APIs
POST /Registrieren
- Erstellen Sie ein Benutzerdokument aus dem Anfragetext. Der Anfragetext muss ein Bild enthalten.
- Laden Sie das Bild in den S3-Bucket hoch und speichern Sie die öffentliche URL im Benutzerdokument.
- Passwort im verschlüsselten Format speichern. (bcrypt verwenden)
- Antwortformat
- Bei Erfolg : Geben Sie den HTTP-Status 201 zurück. Geben Sie auch das Benutzerdokument zurück. Die Antwort sollte ein JSON-Objekt wie dieses sein
- Bei Fehler – Geben Sie eine geeignete Fehlermeldung mit einem gültigen HTTP-Statuscode zurück. Die Antwort sollte ein JSON-Objekt wie dieses sein
{
" 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 /login
- Erlauben Sie einem Benutzer, sich mit seiner E-Mail-Adresse und seinem Passwort anzumelden.
- Bei einem erfolgreichen Anmeldeversuch werden die Benutzer-ID und ein JWT-Token zurückgegeben, das die Benutzer-ID, exp und iat enthält.
HINWEIS: Es gibt eine leichte Änderung im Antworttext. Sie sollten zusätzlich zum JWT-Token auch die Benutzer-ID zurückgeben.
- Antwortformat
- Bei Erfolg – HTTP-Status 200 und JWT-Token im Antworttext zurückgeben. Die Antwort sollte ein JSON-Objekt wie dieses sein
- Bei Fehler – Geben Sie eine geeignete Fehlermeldung mit einem gültigen HTTP-Statuscode zurück. Die Antwort sollte ein JSON-Objekt wie dieses sein
{
" status " : true,
" message " : " User login successfull " ,
" data " : {
" userId " : " 6165f29cfe83625cf2c10a5c " ,
" token " : " eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2MTYyODc2YWJkY2I3MGFmZWVhZjljZjUiLCJpYXQiOjE2MzM4NDczNzYsImV4cCI6MTYzMzg4MzM3Nn0.PgcBPLLg4J01Hyin-zR6BCk7JHBY-RpuWMG_oIK7aV8 "
}
}
GET /user/:userId/profile (Authentifizierung erforderlich)
- Erlauben Sie einem Benutzer, Details seines Profils abzurufen.
- Stellen Sie sicher, dass die Benutzer-ID im URL-Parameter und im Token identisch ist
- Antwortformat
- Bei Erfolg – HTTP-Status 200 zurückgeben und das Benutzerdokument zurückgeben. Die Antwort sollte ein JSON-Objekt wie dieses sein
- Bei Fehler – Geben Sie eine geeignete Fehlermeldung mit einem gültigen HTTP-Statuscode zurück. Die Antwort sollte ein JSON-Objekt wie dieses sein
{
" 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 (Authentifizierung und Autorisierung erforderlich)
- Erlauben Sie einem Benutzer, sein Profil zu aktualisieren.
- Ein Benutzer kann alle Felder aktualisieren
- Stellen Sie sicher, dass die Benutzer-ID im URL-Parameter und im Token identisch ist
- Antwortformat
- Bei Erfolg – HTTP-Status 200 zurückgeben. Außerdem das aktualisierte Benutzerdokument zurückgeben. Die Antwort sollte ein JSON-Objekt wie dieses sein
- Bei Fehler – Geben Sie eine geeignete Fehlermeldung mit einem gültigen HTTP-Statuscode zurück. Die Antwort sollte ein JSON-Objekt wie dieses sein
{
" 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
}
}
Hinweis: Bcrypt Formulardaten senden
MERKMALE II – Produkt
Modelle
{
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},
}
Produkt-API ( Keine Authentifizierung erforderlich )
POST /Produkte
- Erstellen Sie ein Produktdokument aus dem Anfragetext.
- Laden Sie das Produktbild in den S3-Bucket hoch und speichern Sie die öffentliche URL des Bildes im Dokument.
- Antwortformat
- Bei Erfolg – Geben Sie den HTTP-Status 201 zurück. Geben Sie auch das Produktdokument zurück. Die Antwort sollte ein JSON-Objekt wie dieses sein
- Bei Fehler – Geben Sie eine geeignete Fehlermeldung mit einem gültigen HTTP-Statuscode zurück. Die Antwort sollte ein JSON-Objekt wie dieses sein
GET /products
- Gibt alle Produkte in der Sammlung zurück, die nicht gelöscht wurden.
- Filter
- Größe (Der Schlüssel für diesen Filter ist „Größe“).
- Produktname (Der Schlüssel für diesen Filter ist „Name“). Sie sollten alle Produkte zurückgeben, deren Name die in diesem Filter erhaltene Teilzeichenfolge enthält
- Preis: größer oder kleiner als ein bestimmter Wert. Die Schlüssel sind „priceGreaterThan“ und „priceLessThan“.
HINWEIS: Die Preisfilteranfrage kann beide oder einen der Schlüssel enthalten. Beispielsweise könnte die Abfrage in der Anfrage wie folgt aussehen: { priceGreaterThan: 500, priceLessThan: 2000 } oder einfach nur { priceLessThan: 1000 } )
- Sortieren
- Sortiert nach Produktpreis aufsteigend oder absteigend. Das Schlüssel-Wert-Paar sieht wie folgt aus: {priceSort : 1} oder {priceSort : -1}, z. B. /products?size=XL&name=Nit%20grit
- Antwortformat
- Bei Erfolg - Geben Sie den HTTP-Status 200 zurück. Geben Sie auch die Produktdokumente zurück. Die Antwort sollte ein JSON-Objekt wie dieses sein
- Bei Fehler – Geben Sie eine geeignete Fehlermeldung mit einem gültigen HTTP-Statuscode zurück. Die Antwort sollte ein JSON-Objekt wie dieses sein
GET /products/:productId
- Gibt Produktdetails nach Produkt-ID zurück
- Antwortformat
- Bei Erfolg - Geben Sie den HTTP-Status 200 zurück. Geben Sie auch die Produktdokumente zurück. Die Antwort sollte ein JSON-Objekt wie dieses sein
- Bei Fehler – Geben Sie eine geeignete Fehlermeldung mit einem gültigen HTTP-Statuscode zurück. Die Antwort sollte ein JSON-Objekt wie dieses sein
PUT /products/:productId
- Aktualisiert ein Produkt, indem mindestens ein oder alle Felder geändert werden
- Überprüfen Sie, ob die Produkt-ID vorhanden ist (isDeleted muss den Wert „false“ haben und in der Sammlung vorhanden sein). Ist dies nicht der Fall, geben Sie einen HTTP-Status 404 mit einem Antworttext wie diesem zurück
- Antwortformat
- Bei Erfolg – Geben Sie den HTTP-Status 200 zurück. Geben Sie außerdem das aktualisierte Produktdokument zurück. Die Antwort sollte ein JSON-Objekt wie dieses sein
- Bei Fehler – Geben Sie eine geeignete Fehlermeldung mit einem gültigen HTTP-Statuscode zurück. Die Antwort sollte ein JSON-Objekt wie dieses sein
LÖSCHEN /products/:productId
- Löscht ein Produkt nach Produkt-ID, sofern es nicht bereits gelöscht wurde
- Antwortformat
- Bei Erfolg – HTTP-Status 200 zurückgeben. Die Antwort sollte ein JSON-Objekt wie dieses sein
- Bei Fehler – Geben Sie eine geeignete Fehlermeldung mit einem gültigen HTTP-Statuscode zurück. Die Antwort sollte ein JSON-Objekt wie dieses sein
FUNKTION III – Wagen
Modelle
{
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},
}
Warenkorb-APIs ( Authentifizierung als Autorisierungsheader erforderlich – Trägertoken )
POST /users/:userId/cart (Zum Warenkorb hinzufügen)
- Erstellen Sie einen Warenkorb für den Benutzer, falls dieser noch nicht vorhanden ist. Andernfalls fügen Sie Produkte zum Warenkorb hinzu.
- Warenkorb-ID im Anfragetext abrufen.
- Rufen Sie die Produkt-ID im Anforderungstext ab.
- Stellen Sie sicher, dass der Warenkorb vorhanden ist.
- Fügen Sie ein oder mehrere Produkte für einen Benutzer in den Warenkorb.
- Stellen Sie sicher, dass die Benutzer-ID in den Parametern und im JWT-Token übereinstimmt.
- Stellen Sie sicher, dass der Benutzer vorhanden ist
- Stellen Sie sicher, dass die Produkte gültig und nicht gelöscht sind.
- Erhalten Sie Produktdetails im Antworttext.
- Antwortformat
- Bei Erfolg - Geben Sie den HTTP-Status 201 zurück. Geben Sie auch das Warenkorbdokument zurück. Die Antwort sollte ein JSON-Objekt wie dieses sein
- Bei Fehler – Geben Sie eine geeignete Fehlermeldung mit einem gültigen HTTP-Statuscode zurück. Die Antwort sollte ein JSON-Objekt wie dieses sein
PUT /users/:userId/cart (Produkt entfernen/Menge eines Produkts aus dem Warenkorb reduzieren)
- Aktualisiert einen Warenkorb, indem entweder die Menge eines Produkts um 1 verringert oder ein Produkt aus dem Warenkorb gelöscht wird.
- Warenkorb-ID im Anfragetext abrufen.
- Rufen Sie die Produkt-ID im Anforderungstext ab.
- Holen Sie sich den Schlüssel „removeProduct“ im Anfragetext.
- Stellen Sie sicher, dass der Warenkorb vorhanden ist.
- Der Schlüssel 'removeProduct' gibt an, ob ein Produkt entfernt werden soll ({removeProduct: 0}) oder ob seine Menge um 1 dekrementiert werden muss ({removeProduct: 1}).
- Stellen Sie sicher, dass die Benutzer-ID in den Parametern und im JWT-Token übereinstimmt.
- Stellen Sie sicher, dass der Benutzer vorhanden ist
- Erhalten Sie Produktdetails im Antworttext.
- Überprüfen Sie, ob die Produkt-ID vorhanden ist und nicht gelöscht wurde, bevor Sie den Warenkorb aktualisieren.
- Antwortformat
- Bei Erfolg – Geben Sie den HTTP-Status 200 zurück. Geben Sie auch das aktualisierte Warenkorbdokument zurück. Die Antwort sollte ein JSON-Objekt wie dieses sein
- Bei Fehler – Geben Sie eine geeignete Fehlermeldung mit einem gültigen HTTP-Statuscode zurück. Die Antwort sollte ein JSON-Objekt wie dieses sein
GET /users/:userId/cart
- Gibt die Warenkorbzusammenfassung des Benutzers zurück.
- Stellen Sie sicher, dass der Warenkorb vorhanden ist.
- Stellen Sie sicher, dass die Benutzer-ID in den Parametern und im JWT-Token übereinstimmt.
- Stellen Sie sicher, dass der Benutzer vorhanden ist
- Erhalten Sie Produktdetails im Antworttext.
- Antwortformat
- Bei Erfolg : Geben Sie den HTTP-Status 200 zurück. Geben Sie das Warenkorbdokument zurück. Die Antwort sollte ein JSON-Objekt wie dieses sein
- Bei Fehler – Geben Sie eine geeignete Fehlermeldung mit einem gültigen HTTP-Statuscode zurück. Die Antwort sollte ein JSON-Objekt wie dieses sein
LÖSCHEN /users/:userId/cart
- Löscht den Warenkorb für den Benutzer.
- Stellen Sie sicher, dass der Warenkorb vorhanden ist.
- Stellen Sie sicher, dass die Benutzer-ID in den Parametern und im JWT-Token übereinstimmt.
- Stellen Sie sicher, dass der Benutzer vorhanden ist
- Das Löschen des Warenkorbs bedeutet, dass das Array von Artikeln leer ist, totalItems 0 ist und totalPrice 0 ist.
- Antwortformat
- Bei Erfolg – HTTP-Status 204 zurückgeben. Eine geeignete Nachricht zurückgeben. Die Antwort sollte ein JSON-Objekt wie dieses sein
- Bei Fehler – Geben Sie eine geeignete Fehlermeldung mit einem gültigen HTTP-Statuscode zurück. Die Antwort sollte ein JSON-Objekt wie dieses sein
FUNKTION IV – Bestellung
Modelle
{
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},
}
Checkout-/Bestell-APIs (Authentifizierung und Autorisierung erforderlich)
POST /users/:userId/orders
- Erstellen Sie eine Bestellung für den Benutzer
- Stellen Sie sicher, dass die Benutzer-ID in den Parametern und im JWT-Token übereinstimmt.
- Stellen Sie sicher, dass der Benutzer vorhanden ist
- Erhalten Sie Warenkorbdetails im Anfragetext
- Antwortformat
- Bei Erfolg - Geben Sie den HTTP-Status 200 zurück. Geben Sie auch das Bestelldokument zurück. Die Antwort sollte ein JSON-Objekt wie dieses sein
- Bei Fehler – Geben Sie eine geeignete Fehlermeldung mit einem gültigen HTTP-Statuscode zurück. Die Antwort sollte ein JSON-Objekt wie dieses sein
PUT /users/:userId/orders
- Aktualisiert einen Bestellstatus
- Stellen Sie sicher, dass die Benutzer-ID in den Parametern und im JWT-Token übereinstimmt.
- Stellen Sie sicher, dass der Benutzer vorhanden ist
- Bestell-ID im Anfragetext abrufen
- Stellen Sie sicher, dass die Bestellung dem Benutzer gehört
- Stellen Sie sicher, dass nur eine stornierbare Bestellung storniert werden kann. Andernfalls senden Sie eine entsprechende Fehlermeldung und Antwort.
- Antwortformat
- Bei Erfolg – Geben Sie den HTTP-Status 200 zurück. Geben Sie außerdem das aktualisierte Bestelldokument zurück. Die Antwort sollte ein JSON-Objekt wie dieses sein
- Bei Fehler – Geben Sie eine geeignete Fehlermeldung mit einem gültigen HTTP-Statuscode zurück. Die Antwort sollte ein JSON-Objekt wie dieses sein
Testen
- Um diese APIs zu testen, erstellen Sie in Postman eine neue Sammlung mit dem Namen Project 5 Shopping Cart
- Jede API sollte eine neue Anfrage in dieser Sammlung haben
- Jede Anfrage in der Sammlung sollte richtig benannt werden. ZB Benutzer erstellen, Produkt erstellen, Produkte abrufen usw
- Jedes Mitglied jedes Teams sollte seine Tests im laufenden Zustand haben
Siehe untenstehendes Beispiel
Antwort
Erfolgreiche Antwortstruktur
{
status : true,
message : ' Success ' ,
data : {
}
}
Fehlerantwortstruktur
{
status : false,
message : " "
}
Sammlungen
Benutzer
{
_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 " ,
}
Produkte
{
_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 " ,
}
Karren
{
" _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 " ,
}
Bestellungen
{
" _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 " ,
}