#keranjang belanja
Poin-poin penting
- Dalam proyek ini kami akan bekerja dengan bijaksana. Itu berarti kita memilih satu objek seperti pengguna, buku, blog, dll dalam satu waktu. Kami mengerjakan fiturnya. Langkah-langkahnya adalah:
- Kami membuat modelnya.
- Kami membangun API-nya.
- Kami menguji API ini.
- Kami menerapkan API ini.
- Kami mengintegrasikan API ini dengan frontend.
- Kami akan mengulangi langkah dari Langkah 1 hingga Langkah 5 untuk setiap fitur dalam proyek ini.
- Proyek ini dibagi menjadi 4 fitur yaitu Pengguna, Produk, Keranjang dan Pesanan. Anda perlu mengerjakan satu fitur dalam satu waktu. Setelah itu selesai sesuai langkah-langkah yang disebutkan di atas. Anda akan diperintahkan untuk berpindah ke Fitur berikutnya.
- Dalam proyek ini kami mengubah cara kami mengirim token dengan permintaan. Daripada menggunakan kunci header khusus seperti kunci x-api, Anda perlu menggunakan header Otorisasi dan mengirim token JWT sebagai token Pembawa.
- Buat database grup
groupXDatabase
. Anda dapat membersihkan db yang sebelumnya Anda gunakan dan melanjutkannya. - Kali ini setiap grup harus memiliki satu git Branch . Berkoordinasilah di antara Anda sendiri dengan memastikan setiap orang berikutnya mengambil kode yang terakhir kali diberikan oleh rekan satu timnya. Cabang Anda akan diperiksa sebagai bagian dari demo. Nama cabang harus mengikuti konvensi penamaan
project/productsManagementGroupX
- Ikuti konvensi penamaan persis seperti yang diinstruksikan.
FITUR I - Pengguna
Model
{
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 Pengguna
POSTING /daftar
- Buat dokumen pengguna dari badan permintaan. Badan permintaan harus berisi gambar.
- Unggah gambar ke bucket S3 dan simpan url publiknya di dokumen pengguna.
- Simpan kata sandi dalam format terenkripsi. (gunakan bcrypt)
- Format tanggapan
- Jika berhasil - Kembalikan status HTTP 201. Kembalikan juga dokumen pengguna. Responsnya harus berupa objek JSON seperti ini
- Saat terjadi kesalahan - Mengembalikan pesan kesalahan yang sesuai dengan kode status HTTP yang valid. Responsnya harus berupa objek JSON seperti ini
{
" 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
}
}
POSTING / masuk
- Izinkan pengguna untuk masuk dengan email dan kata sandinya.
- Jika upaya login berhasil, kembalikan userId dan token JWT yang berisi userId, exp, iat.
CATATAN: Ada sedikit perubahan pada isi respons. Anda juga harus mengembalikan userId selain token JWT.
- Format tanggapan
- Jika berhasil - Kembalikan status HTTP 200 dan token JWT di isi respons. Responsnya harus berupa objek JSON seperti ini
- Saat terjadi kesalahan - Mengembalikan pesan kesalahan yang sesuai dengan kode status HTTP yang valid. Responsnya harus berupa objek JSON seperti ini
{
" status " : true,
" message " : " User login successfull " ,
" data " : {
" userId " : " 6165f29cfe83625cf2c10a5c " ,
" token " : " eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2MTYyODc2YWJkY2I3MGFmZWVhZjljZjUiLCJpYXQiOjE2MzM4NDczNzYsImV4cCI6MTYzMzg4MzM3Nn0.PgcBPLLg4J01Hyin-zR6BCk7JHBY-RpuWMG_oIK7aV8 "
}
}
DAPATKAN /user/:userId/profile (Diperlukan otentikasi)
- Izinkan pengguna mengambil detail profilnya.
- Pastikan userId di parameter url dan token sama
- Format tanggapan
- Jika berhasil - Kembalikan status HTTP 200 dan kembalikan dokumen pengguna. Responsnya harus berupa objek JSON seperti ini
- Saat terjadi kesalahan - Mengembalikan pesan kesalahan yang sesuai dengan kode status HTTP yang valid. Responsnya harus berupa objek JSON seperti ini
{
" 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 (Diperlukan Otentikasi dan Otorisasi)
- Izinkan pengguna memperbarui profilnya.
- Seorang pengguna dapat memperbarui semua bidang
- Pastikan userId di parameter url dan token sama
- Format tanggapan
- Jika berhasil - Kembalikan status HTTP 200. Kembalikan juga dokumen pengguna yang diperbarui. Responsnya harus berupa objek JSON seperti ini
- Saat terjadi kesalahan - Mengembalikan pesan kesalahan yang sesuai dengan kode status HTTP yang valid. Responsnya harus berupa objek JSON seperti ini
{
" 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
}
}
Catatan: Bcrypt Kirim data formulir
FITUR II - Produk
Model
{
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 Produk ( Tidak diperlukan otentikasi )
POSTING /produk
- Buat dokumen produk dari badan permintaan.
- Unggah gambar produk ke bucket S3 dan simpan url publik gambar dalam dokumen.
- Format tanggapan
- Jika berhasil - Kembalikan status HTTP 201. Kembalikan juga dokumen produk. Responsnya harus berupa objek JSON seperti ini
- Saat terjadi kesalahan - Mengembalikan pesan kesalahan yang sesuai dengan kode status HTTP yang valid. Responsnya harus berupa objek JSON seperti ini
DAPATKAN /produk
- Mengembalikan semua produk dalam koleksi yang tidak dihapus.
- Filter
- Ukuran (Kunci untuk filter ini adalah 'ukuran')
- Nama produk (Kunci untuk filter ini adalah 'nama'). Anda harus mengembalikan semua produk dengan nama yang mengandung substring yang diterima dalam filter ini
- Harga : lebih besar atau lebih kecil dari nilai tertentu. Kuncinya adalah 'priceGreaterThan' dan 'priceLessThan'.
CATATAN: Untuk permintaan filter harga dapat berisi kedua atau salah satu kunci. Misalnya kueri dalam permintaan dapat terlihat seperti { priceGreaterThan: 500, priceLessThan: 2000 } atau hanya { priceLessThan: 1000 } )
- Menyortir
- Diurutkan berdasarkan harga produk secara menaik atau menurun. Pasangan nilai kunci akan terlihat seperti {priceSort : 1} atau {priceSort : -1} misalnya /products?size=XL&name=Nit%20grit
- Format tanggapan
- Jika berhasil - Kembalikan status HTTP 200. Kembalikan juga dokumen produk. Responsnya harus berupa objek JSON seperti ini
- Saat terjadi kesalahan - Mengembalikan pesan kesalahan yang sesuai dengan kode status HTTP yang valid. Responsnya harus berupa objek JSON seperti ini
DAPATKAN /produk/:productId
- Mengembalikan detail produk berdasarkan id produk
- Format tanggapan
- Jika berhasil - Kembalikan status HTTP 200. Kembalikan juga dokumen produk. Responsnya harus berupa objek JSON seperti ini
- Saat terjadi kesalahan - Mengembalikan pesan kesalahan yang sesuai dengan kode status HTTP yang valid. Responsnya harus berupa objek JSON seperti ini
PUT /produk/:productId
- Memperbarui produk dengan mengubah setidaknya satu atau semua bidang
- Periksa apakah productId ada (harus isDeleted salah dan ada dalam koleksi). Jika tidak, kembalikan status HTTP 404 dengan isi respons seperti ini
- Format tanggapan
- Jika berhasil - Kembalikan status HTTP 200. Kembalikan juga dokumen produk yang diperbarui. Responsnya harus berupa objek JSON seperti ini
- Saat terjadi kesalahan - Mengembalikan pesan kesalahan yang sesuai dengan kode status HTTP yang valid. Responsnya harus berupa objek JSON seperti ini
HAPUS /produk/:productId
- Menghapus produk berdasarkan id produk jika belum dihapus
- Format tanggapan
- Jika berhasil - Kembalikan status HTTP 200. Responsnya harus berupa objek JSON seperti ini
- Saat terjadi kesalahan - Mengembalikan pesan kesalahan yang sesuai dengan kode status HTTP yang valid. Responsnya harus berupa objek JSON seperti ini
FITUR III - Gerobak
Model
{
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 Keranjang ( otentikasi diperlukan sebagai header otorisasi - token pembawa )
POST /users/:userId/cart (Tambahkan ke troli)
- Buat keranjang untuk pengguna jika tidak ada. Jika tidak, tambahkan produk ke keranjang.
- Dapatkan id keranjang di badan permintaan.
- Dapatkan productId di badan permintaan.
- Pastikan keranjang itu ada.
- Tambahkan produk untuk pengguna di keranjang.
- Pastikan userId di params dan token JWT cocok.
- Pastikan pengguna ada
- Pastikan produk tersebut valid dan tidak dihapus.
- Dapatkan detail produk di badan respons.
- Format tanggapan
- Jika berhasil - Kembalikan status HTTP 201. Kembalikan juga dokumen keranjang. Responsnya harus berupa objek JSON seperti ini
- Saat terjadi kesalahan - Mengembalikan pesan kesalahan yang sesuai dengan kode status HTTP yang valid. Responsnya harus berupa objek JSON seperti ini
PUT /users/:userId/cart (Hapus produk / Kurangi jumlah produk dari keranjang)
- Memperbarui keranjang dengan mengurangi jumlah produk sebanyak 1 atau menghapus produk dari keranjang.
- Dapatkan id keranjang di badan permintaan.
- Dapatkan productId di badan permintaan.
- Dapatkan kunci 'removeProduct' di badan permintaan.
- Pastikan keranjang itu ada.
- Kunci 'removeProduct' menunjukkan apakah suatu produk akan dihapus ({removeProduct: 0}) atau jumlahnya harus dikurangi 1 ({removeProduct: 1}).
- Pastikan userId di params dan token JWT cocok.
- Pastikan pengguna ada
- Dapatkan detail produk di badan respons.
- Periksa apakah productId ada dan tidak dihapus sebelum memperbarui keranjang.
- Format tanggapan
- Jika berhasil - Kembalikan status HTTP 200. Kembalikan juga dokumen keranjang yang diperbarui. Responsnya harus berupa objek JSON seperti ini
- Saat terjadi kesalahan - Mengembalikan pesan kesalahan yang sesuai dengan kode status HTTP yang valid. Responsnya harus berupa objek JSON seperti ini
DAPATKAN /pengguna/:userId/cart
- Mengembalikan ringkasan keranjang pengguna.
- Pastikan keranjang itu ada.
- Pastikan userId di params dan token JWT cocok.
- Pastikan pengguna ada
- Dapatkan detail produk di badan respons.
- Format tanggapan
- Jika berhasil - Kembalikan status HTTP 200. Kembalikan dokumen keranjang. Responsnya harus berupa objek JSON seperti ini
- Saat terjadi kesalahan - Mengembalikan pesan kesalahan yang sesuai dengan kode status HTTP yang valid. Responsnya harus berupa objek JSON seperti ini
HAPUS /pengguna/:userId/cart
- Menghapus keranjang untuk pengguna.
- Pastikan keranjang itu ada.
- Pastikan userId di params dan token JWT cocok.
- Pastikan pengguna ada
- menghapus keranjang berarti array item kosong, totalItems adalah 0, totalPrice adalah 0.
- Format tanggapan
- Jika berhasil - Kembalikan status HTTP 204. Kembalikan pesan yang sesuai. Responsnya harus berupa objek JSON seperti ini
- Saat terjadi kesalahan - Mengembalikan pesan kesalahan yang sesuai dengan kode status HTTP yang valid. Responsnya harus berupa objek JSON seperti ini
FITUR IV - Urutan
Model
{
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 Checkout/Pesan (Diperlukan otentikasi dan otorisasi)
POST /pengguna/:userId/orders
- Buat pesanan untuk pengguna
- Pastikan userId di params dan token JWT cocok.
- Pastikan pengguna ada
- Dapatkan detail keranjang di badan permintaan
- Format tanggapan
- Jika berhasil - Kembalikan status HTTP 200. Kembalikan juga dokumen pesanan. Responsnya harus berupa objek JSON seperti ini
- Saat terjadi kesalahan - Mengembalikan pesan kesalahan yang sesuai dengan kode status HTTP yang valid. Responsnya harus berupa objek JSON seperti ini
PUT /pengguna/:userId/orders
- Memperbarui status pesanan
- Pastikan userId di params dan token JWT cocok.
- Pastikan pengguna ada
- Dapatkan id pesanan di badan permintaan
- Pastikan pesanan itu milik pengguna
- Pastikan hanya pesanan yang dapat dibatalkan yang dapat dibatalkan. Jika tidak, kirimkan pesan kesalahan dan respons yang sesuai.
- Format tanggapan
- Jika berhasil - Kembalikan status HTTP 200. Kembalikan juga dokumen pesanan yang diperbarui. Responsnya harus berupa objek JSON seperti ini
- Saat terjadi kesalahan - Mengembalikan pesan kesalahan yang sesuai dengan kode status HTTP yang valid. Responsnya harus berupa objek JSON seperti ini
Pengujian
- Untuk menguji api ini, buatlah koleksi baru di Postman bernama Project 5 Shopping Cart
- Setiap api harus memiliki permintaan baru dalam koleksi ini
- Setiap permintaan dalam koleksi harus diberi nama dengan benar. Misalnya Buat pengguna, Buat produk, Dapatkan produk, dll
- Setiap anggota dari setiap tim harus menjalani tesnya dalam kondisi berjalan
Lihat contoh di bawah ini
Tanggapan
Struktur Respons yang Berhasil
{
status : true,
message : ' Success ' ,
data : {
}
}
Struktur Respon Kesalahan
{
status : false,
message : " "
}
Koleksi
pengguna
{
_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 " ,
}
produk
{
_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 " ,
}
gerobak
{
" _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 " ,
}
pesanan
{
" _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 " ,
}