Technical requirements | Usage |
---|---|
API Service | NestJS |
Database | MySQL |
Test Framework | Jest |
API document | Stoplight |
Version Control | Git |
Hosting | Linode |
CI/CD | GitHub Action |
see link
docker and docker-compose: https://www.docker.com/products/docker-d
- Set up the container
$ cp docker/.env.example docker/.env
$ docker-compose -f ./docker/docker-compose.yml --env-file ./docker/.env up -d
- Run database migrations
$ cp app/.env.example app/.env
$ cd docker/
$ docker compose exec app sh
$ yarn migration:run
- Start the API server
$ yarn start:dev
see Stoplight
- Sign up the account
curl --request POST \
--url https://ec.newideas.com.tw/auth/signup \
--header 'Content-Type: application/json' \
--data '{
"email": "b123105@gmail.com",
"password": "123456"
}'
- Login and get the access token
curl --request POST \
--url https://ec.newideas.com.tw/auth/login \
--header 'Content-Type: application/json' \
--data '{
"email": "b123105@gmail.com",
"password": "123456"
}'
- See your profile
curl --request GET \
--url https://ec.newideas.com.tw/user/profile \
--header 'Authorization: Bearer ${your access token}' \
--header 'Content-Type: application/json'
- See all products in the shop
curl --request GET \
--url https://ec.newideas.com.tw/product \
--header 'Content-Type: application/json'
- Add the product to shopping cart
curl --request POST \
--url https://ec.newideas.com.tw/cart/1 \
--header 'Authorization: Bearer ${your access token}' \
--header 'Content-Type: application/json' \
--data '{
"amount": 1
}'
- See your shopping cart
curl --request GET \
--url https://ec.newideas.com.tw/cart \
--header 'Authorization: Bearer ${your access token}' \
--header 'Content-Type: application/json'
- Checkout
curl --request POST \
--url https://ec.newideas.com.tw/cart/checkout \
--header 'Authorization: Bearer ${your access token}' \
--header 'Content-Type: application/json'
- See your orders
curl --request GET \
--url https://ec.newideas.com.tw/order \
--header 'Authorization: Bearer ${your access token}' \
--header 'Content-Type: application/json'
$ cd docker
$ docker compose exec app sh
$ yarn test
$ cd docker
$ docker compose exec app sh
$ yarn test:cov
--------------------------------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s |
---|---|---|---|---|---|
All files | 66.66 | 90.47 | 55.85 | 68.06 | |
src | 39.39 | 100 | 75 | 33.33 | |
app.controller.ts | 100 | 100 | 100 | 100 | |
app.module.ts | 0 | 100 | 100 | 0 | 1-26 |
app.service.ts | 100 | 100 | 100 | 100 | |
main.ts | 0 | 100 | 0 | 0 | 1-15 |
src/auth | 0 | 100 | 100 | 0 | |
auth.module.ts | 0 | 100 | 100 | 0 | 1-26 |
constants.ts | 0 | 100 | 100 | 0 | 1-3 |
src/auth/applications | 100 | 100 | 100 | 100 | |
auth.controller.ts | 100 | 100 | 100 | 100 | |
src/auth/dtos | 71.42 | 100 | 0 | 71.42 | |
auth-dto.ts | 71.42 | 100 | 0 | 71.42 | 22-26 |
src/auth/errors | 100 | 100 | 100 | 100 | |
email-exist-error.ts | 100 | 100 | 100 | 100 | |
src/auth/services | 100 | 100 | 100 | 100 | |
auth.service.ts | 100 | 100 | 100 | 100 | |
src/auth/strategies | 27.77 | 0 | 0 | 21.42 | |
jwt-auth.guard.ts | 100 | 100 | 100 | 100 | |
jwt.strategy.ts | 0 | 100 | 0 | 0 | 1-17 |
local-auth.guard.ts | 100 | 100 | 100 | 100 | |
local.strategy.ts | 0 | 0 | 0 | 0 | 1-24 |
src/cart | 0 | 100 | 100 | 0 | |
cart.module.ts | 0 | 100 | 100 | 0 | 1-16 |
src/cart/aggregates | 100 | 100 | 100 | 100 | |
cart-aggregate.ts | 100 | 100 | 100 | 100 | |
src/cart/applications | 87.87 | 100 | 100 | 87.09 | |
cart.controller.ts | 87.87 | 100 | 100 | 87.09 | 34,48,63,78 |
src/cart/dtos | 100 | 100 | 100 | 100 | |
cart-dto.ts | 100 | 100 | 100 | 100 | |
src/cart/errors | 88.88 | 66.66 | 50 | 88.88 | |
product-out-of-stock-error.ts | 88.88 | 66.66 | 50 | 88.88 | 19 |
src/cart/services | 81.81 | 100 | 90 | 81.13 | |
cart.service.ts | 81.81 | 100 | 90 | 81.13 | 100,125-154 |
src/entities | 69.09 | 100 | 2.85 | 75 | |
cart.entity.ts | 68 | 100 | 0 | 75 | 23,28,33,36,39 |
order-item.entity.ts | 71.42 | 100 | 0 | 76.47 | 22,27,32,35 |
order.entity.ts | 66.66 | 100 | 0 | 73.68 | 26,31,36,39,42 |
product.entity.ts | 71.42 | 100 | 14.28 | 76.47 | 19,24,29,32 |
user.entity.ts | 68.42 | 100 | 0 | 73.33 | 16,21,26,29 |
src/migrations | 0 | 100 | 0 | 0 | |
1659825406414-migrations.ts | 0 | 100 | 0 | 0 | 3-31 |
1659826861827-migrations.ts | 0 | 100 | 0 | 0 | 3-7 |
src/order | 0 | 100 | 100 | 0 | |
order.module.ts | 0 | 100 | 100 | 0 | 1-13 |
src/order/aggregates | 100 | 100 | 100 | 100 | |
order-aggregate.ts | 100 | 100 | 100 | 100 | |
src/order/applications | 91.66 | 100 | 100 | 90.9 | |
order.controller.ts | 91.66 | 100 | 100 | 90.9 | 25,47 |
src/order/errors | 100 | 100 | 100 | 100 | |
invalid-order-error.ts | 100 | 100 | 100 | 100 | |
src/order/services | 100 | 100 | 100 | 100 | |
order.service.ts | 100 | 100 | 100 | 100 | |
src/product | 0 | 100 | 100 | 0 | |
product.module.ts | 0 | 100 | 100 | 0 | 1-12 |
src/product/applications | 91.3 | 100 | 100 | 90.47 | |
product.controller.ts | 91.3 | 100 | 100 | 90.47 | 32,54 |
src/product/dtos | 100 | 100 | 100 | 100 | |
product-query-dto.ts | 100 | 100 | 100 | 100 | |
src/product/errors | 100 | 100 | 100 | 100 | |
product-not-found-error.ts | 100 | 100 | 100 | 100 | |
src/product/services | 100 | 100 | 100 | 100 | |
product.service.ts | 100 | 100 | 100 | 100 | |
src/user | 0 | 100 | 100 | 0 | |
user.module.ts | 0 | 100 | 100 | 0 | 1-13 |
src/user/applications | 100 | 100 | 100 | 100 | |
user.controller.ts | 100 | 100 | 100 | 100 | |
-------------------------------- | --------- | ---------- | --------- | --------- | ------------------- |