Final Project
Requirements
Backend Engineer Track
Pelatihan intensif selama 5 bulan, setara dengan 20 SKS untuk mempersiapkan tenaga ahli digital.
Introduction
Perusahaan fashion ecommerce dengan pangsa pasar "Indonesian Young Urbans" -- pemuda-pemudi dengan rentang umur 15-35 tahun -- berdiri di Indonesia sejak awal tahun 2016 dengan nama Fashion Campus. Perusahaan ini menyajikan katalog brand-brand lokal hingga internasional yang digandrungi anak muda. Oleh karena banyak bekerja sama dengan brand lokal, setelah beroperasi selama satu tahun lebih, mereka berhasil memperoleh cukup banyak return customers dengan pengguna aktif 10.000 per Bulan Juni 2022 dan menerima lebih dari 100.000 pesanan setiap bulannya.
Sejak pandemi menyerang pada tahun 2020, Fashion Campus melihat potensi pada perkembangan belanja digital karena lebih banyak waktu bagi masyarakat dalam mengakses internet. Lisna dan Wira, sebagai salah satu Tim Marketing, diminta untuk melakukan riset pasar. Hasilnya, mereka menemukan bahwa selama pandemi ini juga muncul tren baru di kalangan target market Fashion Campus. Ternyata, "Indonesian Young Urbans" mulai banyak melakukan praktik thrifting atau jual beli pakaian bekas. Dari penemuan ini, Lisna dan Wira mengajukan usulan ke bagian Tim Business Development untuk mengembangkan bisnis model penjualan pakaian bekas yang masih layak pakai.
Pengembangan bisnis model oleh tim Business Development ini nantinya akan dibantu oleh empat tim, yaitu tim Data Science, Tim UI/UX, Tim Artificial Intelligence dan Tim Backend. Lisna dan Wira juga sudah menyampaikan ke tim yang terlibat bahwa waktu pengembangan tidak banyak. Seluruh tim diharapkan dapat mempresentasikan hasil temuannya kepada jajaran petinggi Fashion Campus sesuai dengan timeline yang diberikan.
What must the backend team do?
Assessment Criteria
Karena saat ini semua serba digital dan Fashion Campus akan menjalankan strategi dalam multichannel marketing, tim Product Fashion Campus berencana untuk mengembangkan web app baru untuk bisnisnya. Dengan berbagai pertimbangan dan permintaan dari konsumen, tim Product meminta beberapa fitur ada di web tersebut. Tim Backend bertugas membantu tim Product untuk membuat web application yang sesuai dengan fitur-fitur yang diminta. Selain itu, API yang telah dibuat oleh tim Backend nantinya akan dihubungkan dengan frontend yang telah disediakan oleh tim Frontend. Tim Backend ga sendirian! Karena dalam misi ini, tim Backend akan berkolaborasi dengan tim AI untuk memasukkan beberapa fitur tertentu.
Karena akan ada campaign yang harus segera dijalankan, tim Backend harus bergerak cepat untuk menyelesaikan misi ini! Supervisor Fashion Campus untuk tim Backend sudah menentukan timeline pengerjaan web ini sehingga pengerjaan diharapkan selesai tepat waktu.
Berikut adalah kriteria penilaian yang akan digunakan pada Final Proeject Backend Engineer Track Startup Campus batch 3 beserta dengan bobotnya:
Aspek yang dinilai saat presentasi adalah sebagai berikut:
Timeline Pengerjaan
Week 1
Pembentukan tim, info outcome, kasus, milestone, rubrik penilaian, showcase.
Week 2-3
Week 8
Finalisasi deployment dan persiapan selection to final project showcase.
Showcase
Presentasi dari best team, penyerahan hadiah, dan informasi graduation.
Week 4-6
Week 7
ENDPOINTS
UNIVERSAL
HOME
Pada menu Home, terdapat 2 (dua) endpoints yang harus dikerjakan oleh peserta, yaitu sebagai berikut.
2. Get Banner
Bobot nilai: 0.5 poin
Metode: GET
URL: /home/banner
Response:
Berikut requirements berupa API endpoints yang perlu dilengkapi oleh peserta. Terdapat total 28 endpoints yang memiliki bobot nilai bervariasi dengan total 29 poin nilai. Keberhasilan penyelesaian endpoints akan masuk ke dalam kriteria penilaian “API”.
Terdapat 1 (satu) endpoint universal yang perlu dibuat oleh peserta, yaitu endpoint untuk mengambil atau memunculkan gambar dalam platform.
For any error messages, you should return with this response.
Response:
1. Get Image
Bobot nilai: 1 poin
Metode: GET
URL: /image/{image_name.extension}
Response: image file
Key | Example |
data | { "data": [ { "id": "uuid", "image": "/something/image.png", "title": "lorem ipsum blablabla" } ] } |
Key | Example |
message | error, user already exists |
HOME
AUTHENTICATION
3. Get Category
Bobot nilai: 0.5 poin
Metode: GET
URL: /home/category
Response:
Key | Example |
data | { "data": [ { "id": "uuid", "image": "/something/image.png", "title": "Category A" } ] } |
Untuk melakukan authentication, terdapat 2 (dua) endpoints yang harus dikerjakan oleh peserta, yaitu Sign-up dan Sign-in sebagai berikut:
4. Sign-up
Bobot nilai: 1 poin
Metode: POST
URL: /sign-up
Request Body
Response
Key | Example |
name | Raihan Parlaungan |
raihan@gmail.com | |
phone_number | 081380737126 |
password | password1234 |
Key | Example |
message | success, user created |
PRODUCT LIST
5. Sign-in
Bobot nilai: 1 poin
Metode: POST
URL: /sign-in
Request Body
Response
Key | Example |
raihan@gmail.com | |
password | password1234 |
Key | Example |
user_information | { "name": "Raihan Parlaungan", "email": "raihan@gmail.com", "phone_number": "08138073126" "type:" : "buyer"( there are 2 types of user, "buyer" and "seller" } |
token | jwt_token |
message | Login success |
Pada menu Product List, terdapat 4 (empat) endpoints yang perlu diselesaikan oleh peserta, sebagai berikut:
6. Get Product List
Bobot nilai: 1 poin
Catatan: Hanya menunjukkan produk yang ‘available’ → produk belum dihapus dan ‘category’ masih available., dan total_rows adalah berapa banyak total hasil yang didapatkan dengan semua filter yang ada
Metode: GET
URL: /products
Query Params
Key | Example |
page | 1 |
page_size | 100 |
sort_by | Price a_z, Price z_a |
category | Id category a, id category b |
price | 0,10000 |
condition | used |
product_name | name |
6. Get Product List
Response
7. Get Category
Bobot nilai: 0.5 poin
Metode: GET
URL: /categories
Response
8. Search Product by Image
Bobot nilai: 1 poin
Metode: POST
URL: /products/search_image
Query params
Key | Example |
data | { "data": [ { "id": "uuid", "image": "/something/image.png", "title": "Item A", "price": 15000 } ] } |
total_rows | 10 |
Key | Example |
data | { "data": [ { "id": "uuid", "title": "Category A" } ] } |
PRODUCT DETAIL PAGE
8. Search Product by Image
Request body:
Response
Key | Example |
category_id | uuid |
Pada halaman product detail, akan ada 2 (dua) endpoints yang perlu diselesaikan oleh peserta, sebagai berikut:
9. Get Product Details
Bobot nilai: 1 poin
Metode: GET
URL: /products/{id}
Response:
Key | Example |
data | { "id": "uuid", "title":"Nama product", "size":["S", "M", "L"], "product_detail":"lorem ipsum", "price”: 1000, "images_url": ["/image/image1", "/image/image2"], "category_id": “uuid”, "category_name": “category 2”, } |
Key | Example |
image | 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABoMA…TNE3TtPdv//vf/5Kf/3P6/woKTGyoCG/UAAAAAElFTkSuQmCC' |
CART
10. Add to Cart
API untuk menambahkan produk menuju menu ‘cart’ pada user
Bobot nilai: 2 poin
Catatan:
Metode: POST
URL: /cart
Headers:
Request body
Response
Key | Example |
Authentication | Jwt token |
Key | Example |
id | item_id |
quantity | 10 |
size | M |
Key | Example |
message | Item added to cart |
Pada section Cart, terdapat 5 (lima) endpoints yang harus diselesaikan oleh peserta.
Catatan: semua request dari endpoint yang terdapat dalam section “Cart” akan memiliki headers sebagai berikut:
Headers:
Key | Example |
Authentication | Jwt token |
11. Get User’s Carts
Bobot nilai: 0.5 poin
Metode: GET
URL: /cart
Response
12. Get User’s Shipping Address
Bobot nilai: 0.5 poin
Metode: GET
URL: /user/shipping_address
Response
Key | Example |
data | [ { "id": "uuid"(cart id), "details": { "quantity": 100, "size": "M" }, "price": 10000, "image": "/url/image.jpg", "name": "Product a" } ] |
Key | Example |
data | { "id": "uuid", "name": "address name", "phone_number": "082713626", "address" : "22, ciracas, east jakarta", "city": "Jakarta } |
13. Get Shipping Price
Pada endpoint berikut, peserta perlu membuat endpoint untuk menghitung shipping price
Bobot nilai: 2 poin
Catatan:
Metode: GET
URL: /shipping_price
Headers
Response
Key | Example |
Authentication | Jwt token |
Key | Example |
data | [ { "name": "regular", "price": 30000 }, { "name": "next day", "price": 20000 } ] |
14. Create Order
Endpoint ini dibuat untuk memproses pesanan yang dilakukan user.
Bobot nilai: 1.5 poin
Catatan:
Metode: POST
URL: /order
Request body:
Response
15. Delete Cart Item
Menghapus salah satu produk dari menu “Cart”.
Bobot nilai: 1 poin
Metode: DELETE
URL: /cart/cart_id
Response
Key | Example |
shipping_method | “Same day” |
shipping_address | { "name": "address name", "phone_number": "082713626", "address" : "22, ciracas, east jakarta", "city": "Jakarta } |
Key | Example |
message | Order success |
Key | Example |
message | Cart deleted |
PROFILE PAGE
Terdapat 5 (lima) endpoints baru yang perlu diselesaikan oleh peserta, yaitu 1) User Details; 2) Change Shipping Address; 3) Top-up Balance; 4) Get User Balance; 5) User Orders.
Selain itu, pada halaman ini, peserta juga perlu memanggil kembali endpoint yang sebelumnya sudah dibuat: “Get User Shipping Address”.
�Semua endpoints dalam Profile Page harus memiliki headers berikut.
Headers
16. User Details
Bobot Nilai: 1 poin
Metode: GET
URL: /user
Response
17. Change Shipping Address
Bobot nilai: 1 poin
Metode: POST
URL: /user/shipping_address
Response
Key | Example |
Authentication | Jwt token |
Key | Example |
data | { "name": "Raihan Parlaungan", "email": "raihan@gmail.com", "phone_number": "08138073126" } |
Key | Example |
name | address_name |
phone_number | 082713626 |
address | 22, ciracas, east jakarta”, |
city | Jakarta |
18. Top-up Balance
Menambahkan balance pada akun user yang digunakan untuk pembelian.
Bobot nilai: 1 poin
Metode: POST
URL: /user/balance
Request body:
Response
19. Get User Balance
Menampilkan current balance yang dimiliki oleh user.
Bobot nilai: 1 poin
Metode: GET
URL: /user/balance
Response:
19.5 Endpoint tambahan dalam halaman Profile:
Key | Example |
amount | 10000 |
Key | Example |
message | Top Up balance success |
Key | Example |
data | { "balance”: 10000 } |
20. User Orders
Berupa informasi mengenai pesanan yang telah dilakukan oleh pengguna.
Bobot nilai: 1 poin
Catatan: “price” dari products disini adalah harga asli dari product * jumlah product yang di checkout.
Metode: GET
URL: /user/order
Response:
Key | Example |
data | [ { "id": "uuid", "created_at": "Mon, 22 august 2022", "products": [ { "id": "uuid", "details": { "quantity": 100, "size": "M" }, "price": 10000, "image": "/url/image.jpg", "name": "Product a" } ], "shipping_method": "same day", "shipping_address": { "name": "address name", "phone_number": "082713626", "address": "22, ciracas, east jakarta", "city": "Jakarta" } } ] |
ADMIN PAGE
Terdapat total 4 (empat) endpoints baru yang perlu dibuat oleh peserta dalam Admin Page beserta 2 (dua) endpoints tambahan yang telah dibuat pada section sebelumnya.
Catatan: semua yang ada di dalam admin page hanya bisa diakses oleh user dengan level admin dan memiliki headers sebagai berikut.
Headers
21. Get Orders
Bobot Nilai: 1 poin
Metode: GET
URL: /orders
Query params:
Key | Example |
Authentication | Jwt token |
Key | Example |
sort_by | Price a_z, Price z_a |
page | 1 |
page_size | 25 |
21. Get Orders
Response:
21.5 Endpoint tambahan dalam Admin Page�Get Products
Key | Example |
data | { "data": [ { "id": "order_id(uuid)", "user_name": "nama user", "created_at": "Tue, 25 august 2022", "user_id": "uuid", "user_email": "user@gmail.com", "total": 1000 } ] } |
22. Create Product
Menambahkan sebuah product melalui admin page.
Catatan: produk unique berdasarkan: name, category, condition
Bobot nilai: 2 poin
Metode: POST
URL: /products
Request Body:
Response:
23. Update Product
Melakukan perubahan pada item product yang sebelumnya telah dibuat.
Catatan: produk unique berdasarkan: name, category, condition.
Bobot nilai: 1 poin
Metode: PUT
URL: /products
Request Body
Key | Example |
product_name | Product 1 |
description | Lorem ipsum |
images | [image_1, image_2, image_3] |
condition | new |
category | category_id |
price | 10000 |
Key | Example |
message | Product added |
Key | Example |
product_name | Product 1 |
description | Lorem ipsum |
images | [image_1, image_2, image_3] |
condition | new |
category | category_id |
price | 10000 |
product_id | product_id |
23. Update Product
Response:
24. Delete Product
Menghapus item product yang sebelumnya telah dibuat.
Bobot nilai: 1 poin
Catatan: hanya berupa “soft delete” jadi semua orders/pesanan yang terdapat product tersebut tidak terhapus juga.
Metode: DELETE
URL: /products/:product_id
Response:
24.5 Endpoint tambahan dalam Admin Page
25. Create Category
Catatan: category is unique by name
Bobot nilai: 1 poin
Metode: POST
URL: /categories
Request body:
Response:
Key | Example |
category_name | Category A |
Key | Example |
message | Category added |
Key | Example |
message | Product updated |
Key | Example |
message | Product deleted |
26. Update Category
Bobot nilai: 1 poin
Catatan: category unique by name
Metode: PUT
URL: /categories/{category_id}
Request body:
Response:
27. Delete Category
Bobot nilai: 1 poin
Catatan: hanya berupa “soft delete” jadi semua orders/pesanan yang terdapat product tersebut tidak terhapus juga.
Metode: DELETE
URL: /categories/{category_id}
Response:
28. Get Total Sales
Bobot nilai: 1 poin
Metode: GET
URL: /sales
Response:
Key | Example |
data | { "data": { "total": 100000 } } |
Key | Example |
category_name | Category A |
Key | Example |
message | Category updated |
Key | Example |
message | Category deleted |