Udacity Cloud Developer Nanodegree Capstone Project
This project is a simple ecommerce online shop using AWS Lambda and Serverless framework. The main feature of application can be devided into 2 parts,
- Admin Role - as an admin can create/read/update/delete products.
- Customer Role - as a customer can visit products, create order and create payment.
- Node.js
- Typescript
- Serverless Framework
- AWS Lambda
- AWS S3
- AWS Cognito
- DynamoDB
1. Signup new user (I recommend you create the fake email using https://10minemail.com/en/)
POST - {{BASE_API_URL}}/signup
payload
{
"email": "ritaci4725@nubenews.com",
"password": "Iamxeus$$001"
}
======================================
response
{
"result": {
"statusCode": 200,
"email": "ritaci4725@nubenews.com",
"message": "User successfully registered"
}
}
POST - {{BASE_API_URL}}/confirmed
payload
{
"email": "ritaci4725@nubenews.com",
"verificationCode": "863999"
}
======================================
response
{
"result": {
"statusCode": 200,
"response": "SUCCESS"
}
}
POST - {{BASE_API_URL}}/signin
payload
{
"email": "ritaci4725@nubenews.com",
"password": "Iamxeus$$001"
}
======================================
response
{
"result": {
"statusCode": 200,
"token": {{CUSTOMER_TOKEN}},
"role": [
"Customer-develop"
]
}
}
POST - {{BASE_API_URL}}/products
authorization headers: {{Bearer ADMIN_TOKEN}}
payload
{
"name": "Kyrie 6",
"price": 169
}
======================================
response
{
"item": {
"productId": "PffnFziz93ff5e0aRF-LA",
"createdAt": "2021-10-06T07:02:03.547Z",
"updatedAt": "2021-10-06T07:02:03.547Z",
"name": "Kyrie 6",
"price": 169
}
}
POST - {{BASE_API_URL}}/products/{productId}/upload
authorization headers: {{Bearer ADMIN_TOKEN}}
======================================
response
{
"uploadUrl": "https://ecommly-images-develop.s3.ap-southeast-1.amazonaws.com/bbDBF2apS-dDEYi2R_-pu?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIA6JK756DTDGPQWY7V%2F20211003%2Fap-southeast-1%2Fs3%2Faws4_request&X-Amz-Date=20211003T042012Z&X-Amz-Expires=300&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEKz%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaDmFwLXNvdXRoZWFzdC0xIkYwRAIgdGgt17kqp2OF%2BXDBk2HkMcclNG4VsCazJO7813OdR9sCIATYsOt9sNN9wIlLkp5%2BSW%2BEiCYSgMUkG4O0nBAkoRb5KqQCCCUQABoMOTgyMTM4MDg5NzAyIgz5GdU7nxVLCmHObH8qgQIAwI4%2BJxbHRbKgXGsyiWLtC866Q7SJxgIqglDX8qryn0k5qpfaVygdssEanwwgagY3gWnoyf%2BUJ1L%2FCGlvuxF2ze97TXlhXZ0V0MW9HhvsvMncjOqWY2MOxQEEIEs2i1ijBi1c8yrD9o%2FoIRD6ZZX42PBvMs0G0KsRhTw4Mfa6ja3s2UXSDWOtHE8hKxaBEy1PDhvjTjammVT5sEEs3KIimavDYilgD20kuBmPKdo3Ul9oCB7pnJ7Bh92xWhmGTI2OWiyeNL6pq9iq5NI7g13uMucq4Uk4hzSnzz78sczw7HWThE7XWpJ52oaP7M3rW8cKrRjFudRvbCnykj4x2BigYzD73uSKBjqbAe1Naazc%2FFRpujmrF3JIBMtcRe414e8bis%2FtqxAApT1JhMrDRyE1BAhQc6H1XZVItw1p2w0UDzVh6EErqA2mAAjwQBK14jMzpjN%2FA%2BprZn8t1c5Pbb0hAWTfjS5OSx8YaJkuWorfujiOlhqYYF2BzMnIQbN9OGxUL6ccW%2Fs3PdQ2cLPwEUFQezqxKb06mAwPohO7qh9t6lQk981t&X-Amz-Signature=409984f117d54c587e312a294fb2d9a90af0bb2d24c7859488783488de529d89&X-Amz-SignedHeaders=host"
}
GET - {{BASE_API_URL}}/products
authorization headers: {{Bearer ADMIN_TOKEN or CUSTOMER_TOKEN}}
======================================
response
{
"items": [
{
"imageUrl": "https://ecommly-images-develop.s3.ap-southeast-1.amazonaws.com/51Es_c_K4zgBQJ41GmU6I",
"updatedAt": "2021-10-02T13:41:49.088Z",
"createdAt": "2021-10-02T13:41:49.088Z",
"price": "229.00",
"name": "Reebok - The Answer 1",
"productId": "51Es_c_K4zgBQJ41GmU6I"
},
{
"imageUrl": "https://ecommly-images-develop.s3.ap-southeast-1.amazonaws.com/WXLVn4Bzfxk2mKzztm9Fi",
"updatedAt": "2021-10-02T03:22:55.286Z",
"createdAt": "2021-10-02T03:22:55.286Z",
"price": "179.00",
"name": "Nike Kobe1 Re-Issue",
"productId": "WXLVn4Bzfxk2mKzztm9Fi"
},
{
"imageUrl": "https://ecommly-images-develop.s3.ap-southeast-1.amazonaws.com/kyRuH59MlG5kJFa2zkfs_",
"updatedAt": "2021-10-01T02:52:36.130Z",
"createdAt": "2021-10-01T02:52:36.130Z",
"price": "199.00",
"name": "Air Jordan",
"productId": "kyRuH59MlG5kJFa2zkfs_"
},
{
"imageUrl": "https://ecommly-images-develop.s3.ap-southeast-1.amazonaws.com/L15gT-CPWO1b80dUiqaqi",
"updatedAt": "2021-10-02T13:48:43.214Z",
"createdAt": "2021-10-02T13:48:43.214Z",
"price": "159.00",
"name": "Air Jordan Wade 2",
"productId": "L15gT-CPWO1b80dUiqaqi"
},
{
"imageUrl": "https://ecommly-images-develop.s3.ap-southeast-1.amazonaws.com/_VcgM1pLLQjatVMkRD6yK",
"updatedAt": "2021-10-02T03:33:09.722Z",
"createdAt": "2021-10-02T03:33:09.722Z",
"price": "269.00",
"name": "Nike Air Zoom Generation",
"productId": "_VcgM1pLLQjatVMkRD6yK"
}
]
}
GET - {{BASE_API_URL}}/products/{productId}
authorization headers: {{Bearer ADMIN_TOKEN or CUSTOMER_TOKEN}}
======================================
response
{
"items": {
"imageUrl": "https://ecommly-images-develop.s3.ap-southeast-1.amazonaws.com/L15gT-CPWO1b80dUiqaqi",
"updatedAt": "2021-10-02T13:48:43.214Z",
"createdAt": "2021-10-02T13:48:43.214Z",
"price": "159.00",
"name": "Air Jordan Wade 2",
"productId": "L15gT-CPWO1b80dUiqaqi"
}
}
PUT - {{BASE_API_URL}}/products/{productId}
authorization headers: {{Bearer ADMIN_TOKEN}}
payload
{
"price": 269.00,
"name": "Reebok-Answer 1 AI"
}
======================================
response
{
"items": {
"imageUrl": "https://ecommly-images-develop.s3.ap-southeast-1.amazonaws.com/51Es_c_K4zgBQJ41GmU6I",
"updatedAt": "2021-10-02T13:41:49.088Z",
"createdAt": "2021-10-02T13:41:49.088Z",
"price": 269,
"name": "Reebok-Answer 1 AI",
"productId": "51Es_c_K4zgBQJ41GmU6I"
}
}
DELETE - {{BASE_API_URL}}/products/{productId}
authorization headers: {{Bearer ADMIN_TOKEN}}
======================================
response
{
"items": {
"imageUrl": "https://ecommly-images-develop.s3.ap-southeast-1.amazonaws.com/51Es_c_K4zgBQJ41GmU6I",
"updatedAt": "2021-10-02T13:41:49.088Z",
"createdAt": "2021-10-02T13:41:49.088Z",
"price": 269,
"name": "Reebok-Answer 1 AI",
"productId": "51Es_c_K4zgBQJ41GmU6I"
}
}
POST - {{BASE_API_URL}}/orders
authorization headers: {{Bearer CUSTOMER_TOKEN}}
payload
[
{
"productId": "WXLVn4Bzfxk2mKzztm9Fi",
"quantity": 1,
"name": "Nike Kobe1 Re-Issue",
"price": 179
},
{
"productId": "51Es_c_K4zgBQJ41GmU6I",
"quantity": 1,
"name": "Reebok - The Answer 1",
"price": 229
}
]
======================================
response
{
"item": {
"userId": "fc0cba92-10b4-477a-9cdc-cc0cb861e964",
"orderId": "uW49np_-Py5vsO8hFgPtB",
"createdAt": "2021-10-06T04:40:01.851Z",
"updatedAt": "2021-10-06T04:40:01.851Z",
"orderItems": [
{
"productId": "WXLVn4Bzfxk2mKzztm9Fi",
"quantity": 1,
"name": "Nike Kobe1 Re-Issue",
"price": 179
},
{
"productId": "51Es_c_K4zgBQJ41GmU6I",
"quantity": 1,
"name": "Reebok - The Answer 1",
"price": 229
}
],
"status": "pending",
"totalPrice": 408
}
}
POST - {{BASE_API_URL}}/payment/{orderId}
authorization headers: {{Bearer CUSTOMER_TOKEN}}
payload
{
"amount": 408,
"currency": "usd",
"description": "Second payment for ecommly"
}
======================================
response
{
"result": {
"orderId": "uW49np_-Py5vsO8hFgPtB",
"userId": "fc0cba92-10b4-477a-9cdc-cc0cb861e964",
"status": "succeeded"
}
}