---
# System prepended metadata

title: 甜之呼吸 後端API 文件

---

# 甜之呼吸 後端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" }
```






