131 lines
4.6 KiB
Markdown
131 lines
4.6 KiB
Markdown
# Shelf Project
|
|
|
|
An online storefront to showcase products. Users is able to browse an index of all products, see the specifics of a single product, and add products to an order that they can view in a cart page.
|
|
|
|
# Pre-requisite
|
|
|
|
- Add a `.env` file in /Shelf folder with the following :
|
|
|
|
```
|
|
POSTGRES_HOST=127.0.0.1
|
|
POSTGRES_DB=shelf
|
|
POSTGRES_TEST_DB="shelf_test"
|
|
POSTGRES_USER=postgres
|
|
POSTGRES_PASSWORD=postgres
|
|
ENV=dev
|
|
|
|
BCRYPT_PASSWORD=speak-friend-and-enter
|
|
SALT_ROUNDS=10
|
|
TOKEN_SECRET=alohomora123!
|
|
TOKEN_SECRET_TEST=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjp7ImlkIjoxLCJmaXJzdG5hbWUiOiJKb2huIiwibGFzdG5hbWUiOiJEb2UiLCJ1c2VybmFtZSI6InRlc3QiLCJwYXNzd29yZF9kaWdlc3QiOiIkMmIkMTAkeXNkTHQuUjVqdjFJdHVzTk5NMGJNLlU0RkZvbmJRYUV2VFBsVnFhQWJqSkV3NTdzTEZwVGEifSwiaWF0IjoxNjUzMjUzODIxfQ.rdC42gcdhzAwnwwVJxmhBLVK5tvf2zONG3UcHLU6xE0`
|
|
```
|
|
|
|
- Inside shelf folder mount the container: `docker compose up`
|
|
- Create shelf_test database with the following commands:
|
|
|
|
`docker exec -it shelf-postgres-1 /bin/bash`
|
|
|
|
`psql -U postgres`
|
|
|
|
`CREATE DATABASE shelf_test`
|
|
|
|
# Installation
|
|
|
|
- Install packages dependencies: `npm install`
|
|
- Run tests: `npm run test`
|
|
- Run the database: `npm run up` and get access via http://127.0.0.1:5432
|
|
- Launch the application: `npm run start`, you can access the application with this link : http://127.0.0.1:3000
|
|
|
|
Note : If needed you can reset the tables by closing the app and running the following commands:
|
|
|
|
- `npm run down`
|
|
- `npm run up`
|
|
|
|
# Availaible endpoints
|
|
|
|
- Products :
|
|
|
|
| HTTP Verb | Endpoint | CRUD |
|
|
|:--------------:|:--------------------|:-----------------|
|
|
| Get | `/products` | Index |
|
|
| Get | `/products/:id` | Read |
|
|
| Post | `/products` | Create ( Token ) |
|
|
| Put | `/products/:id` | Update ( Token ) |
|
|
| Delete | `/products/:id` | Delete ( Token ) |
|
|
|
|
- Users :
|
|
|
|
| HTTP Verb | Endpoint | CRUD |
|
|
|:--------------:|:--------------------|:-----------------------|
|
|
| Get | `/users`, | Index ( Token ) |
|
|
| Get | `/users/:id` | Read ( Token ) |
|
|
| Post | `/users` | Create |
|
|
| Put | `/users/auth` | Authenticate ( Token ) |
|
|
| Put | `/users/:id` | Update ( Token ) |
|
|
| Delete | `/users/:id` | Delete ( Token ) |
|
|
|
|
- Orders
|
|
|
|
| HTTP Verb | Endpoint | CRUD |
|
|
|:--------------:|:-----------------------|:-----------------|
|
|
| Get | `/orders`, | Index ( Token ) |
|
|
| Get | `/orders/:id` | Read |
|
|
| Post | `/orders` | Create |
|
|
| Post | `/orders/:id/products` | Create ( Token ) |
|
|
| Delete | `/orders/:id/products` | Delete ( Token ) |
|
|
|
|
# Data shapes
|
|
|
|
- Products :
|
|
|
|
| Column | Type |
|
|
|:-------------:|:------------------------------------------|
|
|
| id | SERIAL PRIMARY KEY |
|
|
| name | VARCHAR(250) NOT NULL |
|
|
| price | INTEGER NOT NULL |
|
|
|
|
- Users :
|
|
|
|
| Column | Type |
|
|
|:-------------:|:------------------------------------------|
|
|
| id | SERIAL PRIMARY KEY |
|
|
| firstName | VARCHAR(250) NOT NULL |
|
|
| lastName | VARCHAR(250) NOT NULL |
|
|
| username | VARCHAR(250) NOT NULL |
|
|
| password | VARCHAR(250) NOT NULL |
|
|
|
|
- Orders :
|
|
| Column | Type |
|
|
|:-------------:|:------------------------------------------|
|
|
| id | SERIAL PRIMARY KEY |
|
|
| status | VARCHAR(15) |
|
|
| user_id | INTEGER NOT NULL REFERENCES users(id) |
|
|
|
|
- Orders Products :
|
|
|
|
| Column | Type |
|
|
|:-------------:|:------------------------------------------|
|
|
| id | SERIAL PRIMARY KEY |
|
|
| quantity | INTEGER NOT NULL, |
|
|
| order_id | INTEGER NOT NULL REFERENCES orders(id) |
|
|
| product_id | INTEGER NOT NULL REFERENCES products(id) |
|
|
|
|
|
|
|
|
# Built with
|
|
|
|
- Typescript
|
|
- Node
|
|
- Express
|
|
- Dotenv
|
|
- Docker
|
|
- Postgres
|
|
- Db-migrate
|
|
- Jsonwebtoken
|
|
- Jasmine
|
|
- Supertest
|
|
|
|
# Author
|
|
|
|
Anis Benziane.
|