K-LINK Ecommerce Service

This is a simple e-commerce service, but its functionality is powerful.

Requirements

Project Structure

This Project use modular system, Functional Programming (FP) and Object Oriented programming (OOP) The OOP only implemented to handle Response Exeception, the rest in using FP

I also implements SOLID Prinsiple, but mostly using for:

-S (Single-Responsibilty) Good, -O (Open-Closed) Good enough, -D (Dependency Inversion) Good enough, -O (Liskov substitution) Not perfect yet,

Below is Folder Structure that maybe would help you to undestand about this project. and each modules have responsibilty base on folder name


.
├── `app`
│   ├── api
│   │   ├── v1
│   │   │   ├── auth
│   │   │   │   └── index.js
│   │   │   ├── cart
│   │   │   │   └── index.js
│   │   │   └── ..dst
│   │   │       └── ..index.js
│   │   └── index.js
│   ├── index.js
│   ├── helpers
│   │   ├── folder
│   │   └── file js
│   ├── libraries
│   │   └── folder name
│   │       └── index.js
│   └── modules
│       ├── controllers
│       │   └── sub-controllers
│       │       └── index.js
│       ├── models
│       │   └── sub-models
│       │       └── index.js
│       ├── repositoris
│       │   └── sub-repositoris
│       │       └── index.js
│       ├── schemas
│       │   └── sub-schemas
│       │       └── index.js
│       ├── services
│       │   └── sub-services
│       │       └── index.js
│       └── middleware
│           └── index.js
│               ├── midlerware A
│               └── midlerware B
├── index.sj
├── .sequelizerc
├── Dockerfile
├── docker-compose.yml
└── ..etc config files

Settings & Configuring

App config

Before running application, please take a look the file env.example and change to .env

Noted: This project using Docker and Docker Compose, if you want to run without Docker, you have to change the Configuration host for mysql and redis

NODE_ENV             = development
APP_PORT            = 3000
APP_ISSUER          = gitbub.com/mrbontor
....

This Service is using Json Web Token (JWT) and Cookie to manage user session, please take a look for details in AUTH API

Mysql & Sequelize Config

  • mysql -> ./configs/mysql.js
  • sequelize -> ./.sequelizerc

Docker Volumes

  • mysql -> ./db/mysql_data
  • sequelize -> ./db/redis_data

Prettier Config

-> ./.prettierrc.json

Deployment && Testing

Deployment && Usage

By default, you can run this service following command below:

# cloning github
$ git clone https://github.com/mrbontor/Simple-eCommerce-API-Service.git

# enter to root dir
$ cd Simple-eCommerce-API-Service

# install dependencies
$ npm install

#if your system already have Redis and Mysql,
$ npx sequelize-cli db:migrate

#please check user seeder file, need a user with role Admin
$ npx sequelize db:seed:all

$ node app.js

###
# Run with Docker Compose
#
# dont need seeder
##

#create container network, please look in docker-compose.yml if you want to change it.
$ docker network create k-link-dev

# run app and start
$ docker-compose up --build -d
#or just
$ docker-compose up

# check healt app
$ curl http://localhost:3000
# {"uptime":48.741330481,"message":"OK","timestamp":1674976023067}%


# stop
$ docker-compose down

# remove volumes
$ docker-compose down --remove-orphans --volumes


# some usefull commands

# backup db
$ docker exec -it mysqldb /usr/bin/mysqldump -u root --password=LiveIn2023 ecommerce > backup.sql

#login to container
$ docker exec -it [`container-name`] sh

Running the test

As i mentioned before, the Unit Test Code not finish yet, but already finish with documentation in /postman

Note : I dont finish the Unit Test yet, but i have provided all the API serive including test case for every endpoints and functionalities K-LINK-Ecommerce-Service

how to run:

# start
$ npm test

Running in Postman

Please follow this Postman Doc Import Api for better information

The Postman file also included documentation, environtment and Examples responses for each cases

You just need to import the file.

Endpoints


AUTH

User(s) must be authenticated before accessing any API.

The AUTH API will return accessToken, refreshToken and DID API has provided Cookies for clients with expiration time. To change the lifetime, look in the .env file. Expiration time is used to handle JWT Token and Cookie expiration

Notes:

  • accessToken will be returned in response body
  • refreshToken will be returned as Cookie with name RTOKEN
  • deviceId is the device identifier and will be returned as a Cookie with name DID

1. LOGIN

User login using method POST with paramatersusername and password.

Endpoint:

Method: POST
Type: RAW
URL: {{local}}/v1/auth/login

Body:

{
    "username": "superadmin",
    "password": "Haruslolos123!"
}

More example Requests/Responses:

I. Example Request: Success

Body:

{
    "username": "superadmin",
    "password": "Haruslolos123!"
}

I. Example Response: Success

{
    "status": true,
    "message": "Success",
    "data": {
        "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjp7ImlkVXNlciI6MSwidXNlcm5hbWUiOiJzdXBlcmFkbWluIiwiZW1haWwiOiJzdXBlcmFkbWluQGdtYWlsLmNvbSIsImlzQWN0aXZlIjp0cnVlLCJpc0FkbWluIjp0cnVlfSwiaWF0IjoxNjc0ODgwNDE0LCJleHAiOjE3MTA4ODQwMTQsImF1ZCI6ImtsaW5rLmNvLmlkIiwiaXNzIjoia2xpbmsuY28uaWQifQ.VcT-Te8oHqUXJj5HfwM1EDbPYTcbw-gEBCKwL2lq9Tk"
    }
}

Status Code: 200


II. Example Request: Validation Error

Body:

{
    "username": "superadmin"
}

II. Example Response: Validation Error

{
    "status": false,
    "message": "Validation Error!",
    "errors": [
        {
            "param": "password",
            "key": "required",
            "message": "password is required"
        }
    ]
}

Status Code: 400


III. Example Request: Wrong Username

Body:

{
    "username": "superadmins",
    "password": "Haruslolos123!"
}

III. Example Response: Wrong Username

{
    "status": false,
    "message": "Un Authorized!"
}

Status Code: 401


IV. Example Request: Wrong Password

Body:

{
    "username": "superadmin",
    "password": "Haruslolos123!!"
}

IV. Example Response: Wrong Password

{
    "status": false,
    "message": "Un Authorized!"
}

Status Code: 401


V. Example Request: Account Deactivated

Body:

{
    "username": "user",
    "password": "Haruslolos123!"
}

V. Example Response: Account Deactivated

{
    "status": false,
    "message": "Your account has been deactive, please contact your administrator!"
}

Status Code: 422


2. SIGNUP

Register user use JSON payload to create a user

fields:

  • username, required
  • email, required
  • password, required

Endpoint:

Method: POST
Type: RAW
URL: {{local}}/v1/auth/register

Body:

{
    "username": "usertest",
    "email": "usertest@gmail.com",
    "password": "Haruslolos123!"
}

More example Requests/Responses:

I. Example Request: Success

Body:

{
    "username": "user3",
    "email": "user3@gmail.com",
    "password": "Haruslolos123!"
}

I. Example Response: Success

{
    "status": true,
    "message": "Success",
    "data": {
        "username": "user3",
        "email": "user3@gmail.com",
        "isActive": true,
        "isAdmin": false
    }
}

Status Code: 200


II. Example Request: Username Exists

Body:

{
    "username": "user2",
    "email": "user2@gmail.com",
    "password": "Haruslolos123!"
}

II. Example Response: Username Exists

{
    "status": false,
    "message": "Username is already used!"
}

Status Code: 422


III. Example Request: Email Exists

Body:

{
    "username": "XXXXXXXXXXXXXXXXXXXX",
    "email": "user2@gmail.com",
    "password": "Haruslolos123!"
}

III. Example Response: Email Exists

{
    "status": false,
    "message": "Email is already used!"
}

Status Code: 422


IV. Example Request: Validation Error

Body:

{
    "username": 1,
    "email": "user2@gmail.com",
    "password": "Haruslolos123!",
    "test": "additional"
}

IV. Example Response: Validation Error

{
    "status": false,
    "message": "Validation Error!",
    "errors": [
        {
            "param": "test",
            "key": "additionalProperties",
            "message": "must NOT have additional properties"
        },
        {
            "param": "/username/undefined",
            "key": "type",
            "message": "must be string"
        }
    ]
}

Status Code: 400


3. REFRESH

Fetch new Token as a refresh token

Endpoint:

Method: GET
Type:
URL: {{local}}/v1/auth/refresh-token

More example Requests/Responses:

I. Example Request: Success

Body: None

I. Example Response: Success

{
    "status": true,
    "message": "Success",
    "data": {
        "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjp7ImlkVXNlciI6MSwidXNlcm5hbWUiOiJzdXBlcmFkbWluIiwiZW1haWwiOiJzdXBlcmFkbWluQGdtYWlsLmNvbSIsImlzQWN0aXZlIjp0cnVlLCJpc0FkbWluIjp0cnVlfSwiaWF0IjoxNjc0ODgwOTU3LCJleHAiOjE3MTA4ODQ1NTcsImF1ZCI6ImtsaW5rLmNvLmlkIiwiaXNzIjoia2xpbmsuY28uaWQifQ.II0mD_30MRG7Qp7MQ5UhtoI_JIco7dDsPTnzbXmldzQ"
    }
}

Status Code: 200


II. Example Request: Un Authorized

Body: None

II. Example Response: Un Authorized

Unauthorized

Status Code: 401


4. LOGOUT

User Logout and remove token, cookies etc

Endpoint:

Method: GET
Type:
URL: {{local}}/v1/auth/logout

Query params:

Key Value Description
allDevices true true or false

More example Requests/Responses:

I. Example Request: Success

Query:

Key Value Description
allDevices true true or false

Body: None

Status Code: 204


II. Example Request: Un Authorized

Query:

Key Value Description
allDevices true true or false

Body: None

II. Example Response: Un Authorized

Unauthorized

Status Code: 401


USER

Users directory contains all the user related APIs. For authentication these apis requrie AuthBearerToken

1. CREATE

Create user use JSON payload to create a user

fields:

  • username, required
  • email, required
  • password, required

Endpoint:

Method: POST
Type: RAW
URL: {{local}}/v1/users

Body:

{
    "username": "superadmin",
    "email": "superadmin@gmail.com",
    "password": "Haruslolos123!"
}

More example Requests/Responses:

I. Example Request: Success

Body:

{
    "username": "user3",
    "email": "user3@gmail.com",
    "password": "Haruslolos123!"
}

I. Example Response: Success

{
    "status": true,
    "message": "Success",
    "data": {
        "username": "user3",
        "email": "user3@gmail.com",
        "isActive": true,
        "isAdmin": false
    }
}

Status Code: 200


II. Example Request: Username Exists

Body:

{
    "username": "user2",
    "email": "user2@gmail.com",
    "password": "Haruslolos123!"
}

II. Example Response: Username Exists

{
    "status": false,
    "message": "Username is already used!"
}

Status Code: 422


III. Example Request: Email Exists

Body:

{
    "username": "XXXXXXXXXXXXXXXXXXXX",
    "email": "user2@gmail.com",
    "password": "Haruslolos123!"
}

III. Example Response: Email Exists

{
    "status": false,
    "message": "Email is already used!"
}

Status Code: 422


IV. Example Request: Validation Error

Body:

{
    "username": 1,
    "email": "user2@gmail.com",
    "password": "Haruslolos123!",
    "test": "additional"
}

IV. Example Response: Validation Error

{
    "status": false,
    "message": "Validation Error!",
    "errors": [
        {
            "param": "test",
            "key": "additionalProperties",
            "message": "must NOT have additional properties"
        },
        {
            "param": "/username/undefined",
            "key": "type",
            "message": "must be string"
        }
    ]
}

Status Code: 400


V. Example Request: Access Forbidden

Body:

{
    "username": "user2",
    "email": "user2@gmail.com",
    "password": "Haruslolos123!"
}

V. Example Response: Access Forbidden

Forbidden

Status Code: 403


2. UPDATE ROLE

Patch role user use JSON payload to update user role

fields:

  • isAdmin, required

Endpoint:

Method: PATCH
Type: RAW
URL: {{local}}/v1/users/role/1

Body:

{
    "isAdmin": true
}

More example Requests/Responses:

I. Example Request: Success

Body:

{
    "isAdmin": true
}

Status Code: 204


II. Example Request: Validation Error

Body:

{
    "isAdmin": "true"
}

II. Example Response: Validation Error

{
    "status": false,
    "message": "Validation Error!",
    "errors": [
        {
            "param": "isAdmin",
            "key": "type",
            "message": "isAdmin should be in boolean format"
        }
    ]
}

Status Code: 400


III. Example Request: Access Forbidden

Body:

{
    "isAdmin": true
}

III. Example Response: Access Forbidden

Forbidden

Status Code: 403


3. UPDATE STATUS

Patch status user use JSON payload to update user status

fields:

  • isActive, required

Endpoint:

Method: PATCH
Type: RAW
URL: {{local}}/v1/users/status/1

Body:

{
    "isActive": true
}

More example Requests/Responses:

I. Example Request: Success

Body:

{
    "isActive": true
}

Status Code: 204


II. Example Request: Validation Error

Body:

{
    "isActive": true
}

II. Example Response: Validation Error

{
    "status": false,
    "message": "Validation Error!",
    "errors": [
        {
            "param": "isAdmin",
            "key": "type",
            "message": "isAdmin should be in boolean format"
        }
    ]
}

Status Code: 400


III. Example Request: Access Forbidden

Body:

{
    "isActive": true
}

III. Example Response: Access Forbidden

Forbidden

Status Code: 403


4. UPDATE CREDENTIAL

Patch password user use JSON payload to update user password.

fields:

  • password, required
  • newPassword, required

Noted: Changing password will remove Token Bearer

Endpoint:

Method: PATCH
Type: RAW
URL: {{local}}/v1/users/password

Body:

{
    "password": "Haruslolos123!",
    "newPassword": "Haruslolos123!"
}

More example Requests/Responses:

I. Example Request: Success

Body:

{
    "password": "!Haruslolos123",
    "newPassword": "Haruslolos123!"
}

Status Code: 204


II. Example Request: Incorrect Password

Body:

{
    "password": "Haruslolos123!",
    "newPassword": "!Haruslolos123"
}

II. Example Response: Incorrect Password

{
    "status": false,
    "message": "Incorect Password"
}

Status Code: 400


III. Example Request: Un Authorized, password has changed

Body:

{
    "password": "!Haruslolos123",
    "newPassword": "Haruslolos123!"
}

III. Example Response: Un Authorized, password has changed

Unauthorized

Status Code: 401


5. GET ALL

Fetch all users list

Endpoint:

Method: GET
Type:
URL: {{local}}/v1/users

More example Requests/Responses:

I. Example Request: Success

Body: None

I. Example Response: Success

{
    "status": true,
    "message": "Success",
    "data": [
        {
            "id": 1,
            "username": "superadmin",
            "email": "superadmin@gmail.com",
            "isActive": true,
            "isAdmin": true
        },
        {
            "id": 2,
            "username": "user",
            "email": "user@gmail.com",
            "isActive": true,
            "isAdmin": false
        },
        {
            "id": 3,
            "username": "user2",
            "email": "user2@gmail.com",
            "isActive": true,
            "isAdmin": false
        },
        {
            "id": 4,
            "username": "user3",
            "email": "user3@gmail.com",
            "isActive": true,
            "isAdmin": false
        }
    ]
}

Status Code: 200


II. Example Request: Access Forbidden

Body: None

II. Example Response: Access Forbidden

Forbidden

Status Code: 403


6. GET ONE

Fetch a single user using idUser

Only Admin can perform this API

Endpoint:

Method: GET
Type:
URL: {{local}}/v1/users/3

More example Requests/Responses:

I. Example Request: Success

Body: None

I. Example Response: Success

{
    "status": true,
    "message": "Success",
    "data": {
        "username": "user2",
        "email": "user2@gmail.com",
        "isActive": true,
        "isAdmin": false
    }
}

Status Code: 200


II. Example Request: Access Forbidden

Body: None

II. Example Response: Access Forbidden

Forbidden

Status Code: 403


7. PROFILE

Fetch user's profile with current session

Endpoint:

Method: GET
Type:
URL: {{local}}/v1/users/profiles

More example Requests/Responses:

I. Example Request: Success

Body: None

I. Example Response: Success

{
    "status": true,
    "message": "Success",
    "data": {
        "username": "superadmin",
        "email": "superadmin@gmail.com",
        "isActive": true,
        "isAdmin": true
    }
}

Status Code: 200


II. Example Request: Wrong url

Body: None

II. Example Response: Wrong url

{
    "status": false,
    "message": "User is not found!"
}

Status Code: 404


8. PUT

Update user use JSON payload to update a user

Note: dont need update since there is only a few fields.

Endpoint:

Method: PUT
Type: RAW
URL: {{local}}/v1/users/1

Body:

{
    "username": "superadmin",
    "email": "superadmin@gmail.com"
}

9. DELETE

Delete a single user using idUser

Only Admin can perform this API

Endpoint:

Method: DELETE
Type:
URL: {{local}}/v1/users/3

More example Requests/Responses:

I. Example Request: Success

Body: None

Status Code: 204


II. Example Request: Not Found

Body: None

II. Example Response: Not Found

{
    "status": false,
    "message": "User not found!"
}

Status Code: 404


III. Example Request: Access Forbidden

Body: None

III. Example Response: Access Forbidden

Forbidden

Status Code: 403


IV. Example Request: Special access

Body: None

IV. Example Response: Special access

{
    "status": false,
    "message": "He is Zeus, you cant delete him!!!"
}

Status Code: 422


PRODUCT

To access the PRODUCT API, a Bearer Token is needed which can be obtained from the AUTH API

While creating a Product, it also will create data into Table Stock with Quantity 0 Price 0

User Admin to update Stock for Quantity and Price first.

1. CREATE

Create product use JSON payload to create a product.

fields:

  • name is required
  • description is optional

Endpoint:

Method: POST
Type: RAW
URL: {{local}}/v1/products

Body:

{
    "name": "product",
    "description": null
}

More example Requests/Responses:

I. Example Request: Success

Body:

{
    "name": "product",
    "description": "product"
}

I. Example Response: Success

{
    "status": true,
    "message": "Success",
    "data": {
        "id": 1,
        "name": "product",
        "description": "product",
        "status": true,
        "updatedAt": "2023-01-28T05:11:47.090Z",
        "createdAt": "2023-01-28T05:11:47.090Z"
    }
}

Status Code: 200


II. Example Request: Validation Error, Missing field

Body:

{
    "description": "product"
}

II. Example Response: Validation Error, Missing field

{
    "status": false,
    "message": "Validation Error!",
    "errors": [
        {
            "param": "name",
            "key": "required",
            "message": "Name is required!"
        }
    ]
}

Status Code: 400


III. Example Request: Validation Error, additional Properties field

Body:

{
    "name": "product",
    "description": "product",
    "test": "asd"
}

III. Example Response: Validation Error, additional Properties field

{
    "status": false,
    "message": "Validation Error!",
    "errors": [
        {
            "param": "",
            "key": "additionalProperties",
            "message": "Field(s) is not allowed"
        }
    ]
}

Status Code: 400


IV. Example Request: Duplicate product

Body:

{
    "name": "product",
    "description": null
}

IV. Example Response: Duplicate product

{
    "status": false,
    "message": "Product is already exist!"
}

Status Code: 422


V. Example Request: Un Authorized

Body:

{
    "name": "product",
    "description": "product"
}

V. Example Response: Un Authorized

Unauthorized

Status Code: 401


VI. Example Request: Forbidden Access

Body:

{
    "name": "product",
    "description": null
}

VI. Example Response: Forbidden Access

Forbidden

Status Code: 403


2. UPDATE

Update product use JSON payload to update a product.

fields:

  • name is required
  • description is optional

Noted: Only Admin can perform this API

Endpoint:

Method: PUT
Type: RAW
URL: {{local}}/v1/products/1

Body:

{
    "name": "product",
    "description": "with description"
}

More example Requests/Responses:

I. Example Request: Success

Body:

{
    "name": "product",
    "description": "with description"
}

Status Code: 204


II. Example Request: Not Found

Body:

{
    "name": "product",
    "description": "with description"
}

II. Example Response: Not Found

{
    "status": false,
    "message": "Product not found!"
}

Status Code: 404


III. Example Request: Un Authorized

Body:

{
    "name": "product",
    "description": "product"
}

III. Example Response: Un Authorized

Unauthorized

Status Code: 401


IV. Example Request: Forbidden Access

Body:

{
    "name": "product",
    "description": null
}

IV. Example Response: Forbidden Access

Forbidden

Status Code: 403


3. GET

Fetch all Product list

Endpoint:

Method: GET
Type:
URL: {{local}}/v1/products

More example Requests/Responses:

I. Example Request: Success

Body: None

I. Example Response: Success

{
    "status": true,
    "message": "Success",
    "data": [
        {
            "id": 1,
            "name": "product",
            "description": "product",
            "status": true,
            "createdAt": "2023-01-28T05:11:47.000Z",
            "updatedAt": "2023-01-28T05:11:47.000Z",
            "stock": {
                "price": 0,
                "idStock": 1,
                "quantity": 0
            }
        }
    ]
}

Status Code: 200


II. Example Request: Un Authorized

Body: None

II. Example Response: Un Authorized

Unauthorized

Status Code: 401


4. GET ONE

Fetch a single product using idProduct

Endpoint:

Method: GET
Type:
URL: {{local}}/v1/products/1111

More example Requests/Responses:

I. Example Request: Success

Body: None

I. Example Response: Success

{
    "status": true,
    "message": "Success",
    "data": {
        "id": 1,
        "name": "product",
        "description": "with description",
        "status": true,
        "createdAt": "2023-01-28T05:11:47.000Z",
        "updatedAt": "2023-01-28T07:14:10.000Z",
        "stock": {
            "price": 10000,
            "idStock": 1,
            "quantity": 12
        }
    }
}

Status Code: 200


II. Example Request: Not Found

Body: None

II. Example Response: Not Found

{
    "status": false,
    "message": "Product is not found!"
}

Status Code: 404


III. Example Request: Un Authorized

Body: None

III. Example Response: Un Authorized

Unauthorized

Status Code: 401


5. DELETE

Delete a single product using idProduct

Noted: Deleting a product will delete stock as well and Only Admin can perform this API

Endpoint:

Method: DELETE
Type:
URL: {{local}}/v1/products/2

More example Requests/Responses:

I. Example Request: Success

Body: None

Status Code: 204


II. Example Request: Un Authorized

Body: None

II. Example Response: Un Authorized

Unauthorized

Status Code: 401


III. Example Request: Forbidden Access

Body: None

III. Example Response: Forbidden Access

Forbidden

Status Code: 403


STOCK

To access the STOCK API, a Bearer Token is needed which can be obtained from the AUTH API

STOCK API is used to manage Quantity and Price of Product.

Only user with role Admin can perform this API

1. CREATE

Create stoc use JSON payload to create a stock.

fields:

  • idProduct is required
  • quantity is required
  • price is required

Noted: this Api already performed in POST Product__, but this can help user managing between Product and Stock

Endpoint:

Method: POST
Type: RAW
URL: {{local}}/v1/stocks

Body:

{
    "idProduct": 1,
    "quantity": 10,
    "price": 10000
}

More example Requests/Responses:

I. Example Request: Success

Body:

{
    "idProduct": 1,
    "quantity": 10,
    "price": 10000
}

I. Example Response: Success

{
    "status": true,
    "message": "Success",
    "data": {
        "price": 10000,
        "id": 3,
        "idProduct": 1,
        "quantity": 10,
        "updatedAt": "2023-01-28T07:47:07.924Z",
        "createdAt": "2023-01-28T07:47:07.924Z"
    }
}

Status Code: 200


II. Example Request: Validation Error

Body:

{
    "idProduct": 1,
    "quantity": 10,
    "price": "10000",
    "test": "additional property"
}

II. Example Response: Validation Error

{
    "status": false,
    "message": "Validation Error!",
    "errors": [
        {
            "param": "test",
            "key": "additionalProperties",
            "message": "must NOT have additional properties"
        },
        {
            "param": "price",
            "key": "type",
            "message": "Price must be number"
        }
    ]
}

Status Code: 400


III. Example Request: Not Found

Body:

{
    "idProduct": 1111,
    "quantity": 10,
    "price": 10000
}

III. Example Response: Not Found

{
    "status": false,
    "message": "Product is not found"
}

Status Code: 404


IV. Example Request: Un Authorized

Body: None

IV. Example Response: Un Authorized

Unauthorized

Status Code: 401


V. Example Request: Forbidden Access

Body: None

V. Example Response: Forbidden Access

Forbidden

Status Code: 403


2. UPDATE

Update stock product use JSON payload to update a stock product.

fields:

  • quantity is required
  • price is required
  • idStock as params, required

Noted: Only Admin can perform this API

Endpoint:

Method: PUT
Type: RAW
URL: {{local}}/v1/stocks/7

Body:

{
    "quantity": 12,
    "price": 10000
}

More example Requests/Responses:

I. Example Request: Success

Body:

{
    "quantity": 12,
    "price": 10000
}

Status Code: 204


II. Example Request: Validation Error

Body:

{
    "idProduct": 1,
    "quantity": 10,
    "price": "10000",
    "test": "additional property"
}

II. Example Response: Validation Error

{
    "status": false,
    "message": "Validation Error!",
    "errors": [
        {
            "param": "idProduct",
            "key": "additionalProperties",
            "message": "must NOT have additional properties"
        },
        {
            "param": "test",
            "key": "additionalProperties",
            "message": "must NOT have additional properties"
        },
        {
            "param": "price",
            "key": "type",
            "message": "Price must be number"
        }
    ]
}

Status Code: 400


III. Example Request: Not Found

Body:

{
    "quantity": 10,
    "price": 10000
}

III. Example Response: Not Found

{
    "status": false,
    "message": "Product is not found"
}

Status Code: 404


IV. Example Request: Un Authorized

Body:

{
    "quantity": 10,
    "price": 10000
}

IV. Example Response: Un Authorized

Unauthorized

Status Code: 401


V. Example Request: Forbidden Access

Body: None

V. Example Response: Forbidden Access

Forbidden

Status Code: 403


3. GET

Fetch all stocks list

Endpoint:

Method: GET
Type:
URL: {{local}}/v1/stocks

More example Requests/Responses:

I. Example Request: Success

Body: None

I. Example Response: Success

{
    "status": true,
    "message": "Success",
    "data": [
        {
            "price": 10000,
            "id": 1,
            "idProduct": 1,
            "quantity": 12,
            "createdAt": "2023-01-28T05:11:47.000Z",
            "updatedAt": "2023-01-28T07:51:05.000Z",
            "product": {
                "idProduct": 1,
                "name": "product",
                "status": true
            }
        },
        {
            "price": 10000,
            "id": 3,
            "idProduct": 1,
            "quantity": 10,
            "createdAt": "2023-01-28T07:47:07.000Z",
            "updatedAt": "2023-01-28T07:47:07.000Z",
            "product": {
                "idProduct": 1,
                "name": "product",
                "status": true
            }
        }
    ]
}

Status Code: 200


II. Example Request: Un Authorized

Body: None

II. Example Response: Un Authorized

Unauthorized

Status Code: 401


4. GET ONE

Fetch a single stock of product using idStock

Endpoint:

Method: GET
Type:
URL: {{local}}/v1/stocks/1

More example Requests/Responses:

I. Example Request: Success

Body: None

I. Example Response: Success

{
    "status": true,
    "message": "Success",
    "data": {
        "price": 10000,
        "id": 1,
        "idProduct": 1,
        "quantity": 12,
        "createdAt": "2023-01-28T05:11:47.000Z",
        "updatedAt": "2023-01-28T07:51:05.000Z",
        "product": {
            "idProduct": 1,
            "name": "product",
            "status": true
        }
    }
}

Status Code: 200


II. Example Request: Un Authorized

Body: None

II. Example Response: Un Authorized

Unauthorized

Status Code: 401


5. DELETE

Delete a single stock using idStock

Noted: Deleting a stock will delete product as well and Only Admin can perform this API

Endpoint:

Method: DELETE
Type:
URL: {{local}}/v1/stocks/3

More example Requests/Responses:

I. Example Request: Success

Body: None

Status Code: 204


II. Example Request: Un Authorized

Body: None

II. Example Response: Un Authorized

Unauthorized

Status Code: 401


III. Example Request: Forbidden Access

Body: None

III. Example Response: Forbidden Access

Forbidden

Status Code: 403


CART

The API using Redis Database to store the cart items

This API is only available for User Logged In with active session

Even user has logged out, this used to keep the cart exists.

1. CREATE

Create/Add item cart use JSON payload to add item to cart.

fields:

  • data is required
  • data is array

Endpoint:

Method: POST
Type: RAW
URL: {{local}}/v1/carts

Body:

{
    "data": [
        {
            "idProduct": 3,
            "quantity": 1
        },
        {
            "idProduct": 5,
            "quantity": 1
        }
    ]
}

More example Requests/Responses:

I. Example Request: Success

Body:

{
    "data": [
        {
            "idProduct": 3,
            "quantity": 6
        },
        {
            "idProduct": 5,
            "quantity": 2
        }
    ]
}

I. Example Response: Success

{
    "status": true,
    "message": "Success",
    "data": true
}

Status Code: 200


II. Example Request: Insufficient Quantity

Body:

{
    "data": [
        {
            "idProduct": 3,
            "quantity": 6
        },
        {
            "idProduct": 5,
            "quantity": 2
        }
    ]
}

II. Example Response: Insufficient Quantity

{
    "status": false,
    "message": "Insuficient quantity of product2"
}

Status Code: 422


III. Example Request: Un Authorized

Body:

{
    "data": [
        {
            "idProduct": 3,
            "quantity": 6
        },
        {
            "idProduct": 5,
            "quantity": 2
        }
    ]
}

III. Example Response: Un Authorized

Unauthorized

Status Code: 401


2. GET

Fetch all cart list of actve session

Endpoint:

Method: GET
Type:
URL: {{local}}/v1/carts

More example Requests/Responses:

I. Example Request: Success

Body: None

I. Example Response: Success

{
    "status": true,
    "message": "Success",
    "data": {
        "details": [
            {
                "idProduct": 3,
                "quantity": 6,
                "status": true,
                "subTotal": 60000,
                "name": "product2",
                "originProduct": {
                    "price": 10000,
                    "idStock": 4,
                    "quantity": 12
                }
            },
            {
                "idProduct": 5,
                "quantity": 2,
                "status": true,
                "subTotal": 20000,
                "name": "product",
                "originProduct": {
                    "price": 10000,
                    "idStock": 7,
                    "quantity": 12
                }
            }
        ],
        "grandTotal": 80000
    }
}

Status Code: 200


II. Example Request: No Data

Body: None

II. Example Response: No Data

{
    "status": false,
    "message": "The shoppping cart is empty, please select some items first!"
}

Status Code: 404


III. Example Request: Un Authorized

Body: None

III. Example Response: Un Authorized

Unauthorized

Status Code: 401


3. DELETE

Delete all cart list

Endpoint:

Method: DELETE
Type:
URL: {{local}}/v1/carts

More example Requests/Responses:

I. Example Request: Success

Body: None

Status Code: 204


II. Example Request: Un Authorized

Body: None

II. Example Response: Un Authorized

Unauthorized

Status Code: 401


TRANSACTION

The TRANSACTION API is used to manage user transaction.

1. CHECKOUT

Endpoint:

Method:
Type:
URL:

2. CHECKOUT

CHECKOUT API is used to simulate Calculation from CART API.

we will used Active Session and Cache to create a transaction.

Endpoint:

Method: POST
Type: RAW
URL: {{local}}/v1/transactions/checkout

Body:

{
    "amountPaid": 200000
}

More example Requests/Responses:

I. Example Request: Success

Body:

{
    "amountPaid": 200000
}

I. Example Response: Success

{
    "status": true,
    "message": "Success",
    "data": {
        "details": [
            {
                "idProduct": 3,
                "quantity": 1,
                "status": true,
                "subTotal": 10000,
                "name": "product2",
                "originProduct": {
                    "idStock": 4,
                    "quantity": 11,
                    "price": "10000"
                }
            },
            {
                "idProduct": 5,
                "quantity": 1,
                "status": true,
                "subTotal": 10000,
                "name": "product",
                "originProduct": {
                    "idStock": 7,
                    "quantity": 11,
                    "price": "10000"
                }
            }
        ],
        "grandTotal": 20000,
        "amountPaid": 200000
    }
}

Status Code: 200


II. Example Request: No data Cart

Body:

{
    "amountPaid": 200000
}

II. Example Response: No data Cart

{
    "status": false,
    "message": "The shoppping cart is empty, please select some items first!"
}

Status Code: 404


III. Example Request: Un Authorized

Body: None

III. Example Response: Un Authorized

Unauthorized

Status Code: 401


3. HISTORY TRANSACTION

Fetch all transaction list

If User has role Admin, it will show all history transactions and if User is not , it will only return user's own history transaction

Endpoint:

Method: GET
Type:
URL: {{local}}/v1/transactions/history

More example Requests/Responses:

I. Example Request: Success for Non Admin

Body: None

I. Example Response: Success for Non Admin

{
    "status": true,
    "message": "Success",
    "data": [
        {
            "total": null,
            "amountPaid": 200000,
            "id": 29,
            "idUser": 6,
            "invoice": "e5ee47d7-653c-4ee5-8a09-9c1ba844f1d5",
            "details": [
                {
                    "name": "product2",
                    "status": true,
                    "quantity": 1,
                    "subTotal": 10000,
                    "idProduct": 3
                },
                {
                    "name": "product",
                    "status": true,
                    "quantity": 1,
                    "subTotal": 10000,
                    "idProduct": 5
                }
            ],
            "status": "done",
            "createdAt": "2023-01-29T02:04:36.000Z",
            "updatedAt": "2023-01-29T02:04:36.000Z"
        }
    ]
}

Status Code: 200


II. Example Request: Success for Admin

Body: None

II. Example Response: Success for Admin

{
    "status": true,
    "message": "Success",
    "data": [
        {
            "total": 20000,
            "amountPaid": 200000,
            "id": 24,
            "idUser": 2,
            "invoice": "984e4a16-4024-421c-a56a-d954f2be6447",
            "details": [
                {
                    "name": "product2",
                    "status": true,
                    "quantity": 1,
                    "subTotal": 10000,
                    "idProduct": 3
                },
                {
                    "name": "product",
                    "status": true,
                    "quantity": 1,
                    "subTotal": 10000,
                    "idProduct": 5
                }
            ],
            "status": "done",
            "createdAt": "2023-01-29T01:15:29.000Z",
            "updatedAt": "2023-01-29T01:15:29.000Z",
            "user": {
                "username": "user"
            }
        },
        {
            "total": 20000,
            "amountPaid": 200000,
            "id": 25,
            "idUser": 2,
            "invoice": "2db43379-bf3c-4755-8ffd-fb2620ae28d0",
            "details": [
                {
                    "name": "product2",
                    "status": true,
                    "quantity": 1,
                    "subTotal": 10000,
                    "idProduct": 3
                },
                {
                    "name": "product",
                    "status": true,
                    "quantity": 1,
                    "subTotal": 10000,
                    "idProduct": 5
                }
            ],
            "status": "done",
            "createdAt": "2023-01-29T01:17:54.000Z",
            "updatedAt": "2023-01-29T01:17:54.000Z",
            "user": {
                "username": "user"
            }
        },
        {
            "total": 20000,
            "amountPaid": 200000,
            "id": 29,
            "idUser": 6,
            "invoice": "e5ee47d7-653c-4ee5-8a09-9c1ba844f1d5",
            "details": [
                {
                    "name": "product2",
                    "status": true,
                    "quantity": 1,
                    "subTotal": 10000,
                    "idProduct": 3
                },
                {
                    "name": "product",
                    "status": true,
                    "quantity": 1,
                    "subTotal": 10000,
                    "idProduct": 5
                }
            ],
            "status": "done",
            "createdAt": "2023-01-29T02:04:36.000Z",
            "updatedAt": "2023-01-29T02:04:36.000Z",
            "user": {
                "username": "usertest"
            }
        },
        {
            "total": 20000,
            "amountPaid": 200000,
            "id": 30,
            "idUser": 6,
            "invoice": "6c65eb48-c082-4e87-b334-e4e2a5ad64c7",
            "details": [
                {
                    "name": "product2",
                    "status": true,
                    "quantity": 1,
                    "subTotal": 10000,
                    "idProduct": 3
                },
                {
                    "name": "product",
                    "status": true,
                    "quantity": 1,
                    "subTotal": 10000,
                    "idProduct": 5
                }
            ],
            "status": "done",
            "createdAt": "2023-01-29T02:09:55.000Z",
            "updatedAt": "2023-01-29T02:09:55.000Z",
            "user": {
                "username": "usertest"
            }
        }
    ]
}

Status Code: 200


III. Example Request: Un Authorized Copy

Body: None

III. Example Response: Un Authorized Copy

Unauthorized

Status Code: 401


If you have any question, please contact me or send me email

mrbontor@gmail.com


Back to top