# 甜之呼吸 後端API 文件
### Root Path: /api/
總共五個類別的 API
* users
* product
* category
* feature
* order
sss
## Users
| 功能 | Method | path |
| --- | --- | -------- |
| 註冊 | POST |/api/register|
| 登入 | POST |/api/login|
| 驗證 | GET |/api/me|
| 會員撈取個人資料 | GET |/api/user|
| 會員編輯個人資料 | PUT |/api/user|
| 管理員撈取會員資料 | GET |/api/users|
| 管理員編輯會員權限 | GET |/api/users/:id|
### 註冊
URL: /api/register
Method: POST
用來註冊使用者的,需要傳入 username, password email 以及 fullname,即可在系統內註冊一個使用者。( address, birthday 非必填 )
註冊之後會拿到一個 token,是驗證身份用的,這個之後會再提到。
範例:
```
fetch('/api/register', {
method: 'POST',
headers: {
'content-type': 'application/json'
},
body: JSON.stringify({
fullname: 'hello',
username: 'hey',
password: '1234',
email: '1234@123.com'
})
})
.then(res => res.json())
.then(data => console.log(data))
```
response:
```
{
ok: 1,
token: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImhleSIsInVzZXJJZCI6IjAwNmIwNjkwYTgyY2YiLCJpYXQiOjE2MDQxMzI4MTZ9.dfJ4z8DIASsPEytsHE3zA1i2MgNCb2zMLogfqq5ugWU"
}
```
### 登入
URL: /api/login
Method: POST
傳入 username 以及 password 即可登入,登入成功以後一樣會拿到上面註冊成功的 response。
若登入會員被禁用權限(status = 0),則無法登入。
### 身份驗證
URL:/api/me
Method: GET
這個 server 會利用 HTTP Request header 中的 authorization 欄位進行驗證,假設你拿到的 token 是 1234,那 authorization 就必須帶:Bearer 1234
Server 在需要驗證身份的時候會去檢查這個 header,並把 JWT token 拿出來做比對,如果你有成功攜帶正確的 header,打這一個 API 的時候會回覆正確的使用者資料。
**可以利用回傳的 is_admin 來驗證管理權限。**
範例:
```
fetch('/api/me', {
headers: {
'authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImhleSIsInVzZXJJZCI6IjAwNmIwNjkwYTgyY2YiLCJpYXQiOjE2MDQxMzI4MTZ9.dfJ4z8DIASsPEytsHE3zA1i2MgNCb2zMLogfqq5ugWU'
}
})
.then(res => res.json())
.then(data => console.log(data))
```
response:
```
{
"ok": 1,
"data": {
"username": "admin",
"is_admin": true,
"iat": 1608992157
}
}
```
### 會員端
#### 會員撈取個人資料
URL: /api/user
Method: GET
撈取會員也是利用 HTTP Request header 中的 authorization 欄位進行驗證,假設你拿到的 token 是 1234,那 authorization 就必須帶:Bearer 1234。
Server 在需要驗證身份的時候會去檢查這個 header,並把 JWT token 拿出來做比對,如果你有成功攜帶正確的 header,打這一個 API 的時候會回覆正確的使用者資料。
```
{
"ok": 1,
"data": {
"username": "QQQ",
"fullname": "QQ安安",
"email": "QQQ@QQQ.com",
"address": "安安路",
"birthday": null
}
}
```
#### 會員編輯個人資料
URL: /api/user
Method: PUT
僅可編輯 fullname, email, address, birthday 欄位,且 fullname, email 為必填欄位。
reponse:
```
{
"ok": 1,
"message": "編輯會員資料完成"
}
```
---
### 管理員端
URL: /api/users
#### 撈取所有會員資料
URL: /api/users
Method: GET
管理員撈取 GET 所有會員也是利用 HTTP Request header 中的 authorization 欄位進行驗證。
reponse:
```
{
"ok": 1,
"data": [
{
"id": ...
},{
"id": ...
},
]
}
```
#### 編輯特定會員權限
URL: /api/users/:id
Method: PUT
需帶入欲更改會員 id 於網址列中。
管理員 POST 編輯特定會員也是利用 HTTP Request header 中的 authorization 欄位進行驗證。並需要傳送 id (API 網址列上), is_admin, status (request body)欄位。
reponse:
```
{
"ok": 1,
"message": "編輯會員權限完成"
}
```
## Products
| 功能 | Method | path |
| --- | --- | -------- |
| 撈取產品 | GET |/api/products|
| 撈取單一產品 | GET |/api/product/:id|
| 管理員撈取產品 | GET |/api/all_products|
| 管理員新增產品 | POST |/api/product|
| 管理員編輯產品 | PUT |/api/product/:id|
| 管理員刪除產品 | DELETE |/api/product/:id|
### 管理員端
需利用 HTTP Request header 中的 authorization 欄位進行驗證是否有管理權限。
#### 撈取所有商品
URL: /api/all_products
Method: GET
管理員查看所有未刪除的商品清單,並且和 Feature 表單關聯,可查看該商品中未刪除的規格內容。
#### 新增商品
URL: /api/product
Method: POST
表單設計為每一商品至少有一個規格,在新增商品同時也會新增規格。
* 欄位:CategoryId, name, image, info, status, feature_name, price, promo_price, stock
* 必填:CategoryId, name, image, feature_name, price, promo_price, stock
response:
```
{
ok: 1,
message: "商品新增完成",
}
```
#### 編輯商品
URL: /api/product/:id
Method: PUT
編輯商品僅會更新商品表單,若需更新規格,需使用編輯規格 API。
* 欄位:CategoryId, name, image, info, status
* 必填:CategoryId, name, image
response:
```
{
ok: 1,
message: "商品編輯完成",
}
```
#### 刪除商品
URL: /api/product/:id
Method: DELETE
* 備註:雖然是發 DELETE METHOD,但是後端處理是更改刪除狀態
response:
```
{
ok: 1,
message: "商品刪除完成",
}
```
### 訪客端
#### 撈取所有商品
URL: /api/products
Method: GET
查看所有未刪除且狀態上架中的商品,並且和 Feature 表單關聯,可查看該商品中未刪除的規格內容。
#### 撈取特定商品
URL:/api/product/:id
Method:GET
查看單一未刪除的商品,需帶入 id 資訊。並且和 Product 表單關聯,可查看該商品中未刪除的商品內容。
## Category
| 功能 | Method | path |
| --- | --- | -------- |
| 撈取分類 | GET |/api/category|
| 以分類撈取產品 | GET |/api/category/product|
| 以所有分類撈取所有產品 | GET |/api/category/products|
| 管理員新增分類 | POST |/api/category|
| 管理員編輯分類 | PUT |/api/category/:id|
| 管理員刪除產品 | DELETE |/api/category/:id|
### 撈取所有分類
URL: /api/category
Method: GET
查看所有未刪除的分類。
### 以分類撈取所有產品
URL: /api/category/product
Method: GET
查看所有未刪除的分類,並且和 Product 表單關聯,可查看該分類中未刪除的商品內容。(僅會顯示含有商品的分類)
### 以所有分類撈取產品
URL: /api/category/products
Method: GET
查看所有未刪除的分類,並且和 Product 表單關聯,可查看該分類中未刪除的商品內容。
### 新增分類
URL: /api/category
Method: POST
需利用 HTTP Request header 中的 authorization 欄位進行驗證是否有管理權限,才可以新增商品。
* 欄位:name
* 必填:name
response:
```
{
ok: 1,
message: "分類新增完成",
}
```
### 編輯分類
URL: /api/category/:id
Method: PUT
需利用 HTTP Request header 中的 authorization 欄位進行驗證是否有管理權限,才可以編輯分類。
* 欄位:name
* 必填:name
response:
```
{
ok: 1,
message: "分類編輯完成",
}
```
### 刪除分類
URL: /api/category/:id
Method: DELETE
需利用 HTTP Request header 中的 authorization 欄位進行驗證是否有管理權限,才可以刪除商品。
* 備註:雖然是發 DELETE METHOD,但是後端處理是更改刪除狀態
response:
```
{
ok: 1,
message: "分類刪除完成",
}
```
## Feature
| 功能 | Method | path |
| --- | --- | -------- |
| 管理員新增規格 | POST |/api/feature/:id|
| 管理員編輯規格 | PUT |/api/feature/:id|
| 管理員刪除產品 | DELETE |/api/feature/:id|
皆需利用 HTTP Request header 中的 authorization 欄位進行驗證是否有管理權限。
### 新增規格
URL: /api/feature/:id
Method: POST
網址列的 id 為規格隸屬的 ProductId。
查看所有未刪除的分類,並且和 Product 表單關聯,可查看該分類中未刪除的商品內容。
* 欄位:name, price, promo_price, stock
* 必填:name, price, stock
response:
```
{
ok: 1,
message: "商品新增完成",
}
```
### 編輯規格
URL: /api/feature/:id
Method: PUT
網址列的 id 為規格的 id。
* 欄位:name, price, promo_price, stock
* 必填:name, price, stock
response:
```
{
ok: 1,
message: "規格編輯完成",
}
```
### 刪除規格
URL: /api/feature/:id
Method: DELETE
網址列的 id 為規格的 id。
* 備註:雖然是發 DELETE METHOD,但是後端處理是更改刪除狀態
response:
```
{
ok: 1,
message: "規格刪除完成",
}
```
## Order
| 功能 | Method | path |
| --- | --- | -------- |
| 生成訂單 | POST |/api/orders|
| 取得訂單清單 | GET |/api/orders|
| 取得特定買家訂單 | GET |/api/order/:user_id|
| 取得特定訂單品項 | GET |/api/order_item/:order_number|
| 編輯訂單狀態 | PUT |/api/order/:order_number|
### 新增訂單
URL: /api/orders
Method: POST
Header: authorization 要帶入任意合法 token
Body:
```
{
"UserId":"123",
"buyer_fullname":"QQQ",
"buyer_email":"123@sadsad",
"buyer_phone":"1231233",
"postal_code":"12321",
"buyer_address":"213123123213",
"total":213123,
"order_items":
[
{"product_id":1,"product_name":"蛋糕","product_image":"https://imgur.com/lxWa1BS.png",product_feature":"5吋","product_price":"500","product_quantity":"2"},
{"product_id":1,"product_name":"饅頭","product_image":"https://imgur.com/lxWa1BS.png","product_feature":"大顆","product_price":"500","product_quantity":"9"},
{"product_id":1,"product_name":"饅頭","product_image":"https://imgur.com/lxWa1BS.png","product_feature":"小顆","product_price":"100","product_quantity":"6"}
]
}
```
response:
```
{
ok: 1,
message: "訂單建立成功"
}
```
### 取得訂單列表
URL: /api/orders
Method: GET
Header: authorization 要帶入管理員的 token。
### 取得特定買家訂單
URL:/api/order/:user_id
Method: GET
Header: authorization 要帶入使用者的 token。
### 取得特定訂單品項
URL:/api/order_item/:order_number
Method: GET
Header: NIL
### 編輯訂單狀態
URL:/api/order/:order_number
Method: PUT
Header: NIL
Body:
```
{ "is_paid":true, "is_sent":true, "is_done":true, "is_cancel":false, "status":"is_done" }
```