---
# System prepended metadata

title: '`PUT` /api/users/:id'
tags: [API-doc]

---

# `PUT` /api/users/:id

## API 功能  
更新自己的使用者資料。  
* 驗證身份：
    * 需登入，且role = user
    * 只能修改自己的資料，動態路由傳入之id值與req.user.id需相符
* 資料處理：
    * 若輸入字串前後有空白鍵，則空白鍵會被移除；若只有輸入空白鍵，處理後變成無資料
    * 若無輸入值或無上傳圖片，視為不修改，自動帶入使用者原本的資料
    * 上傳圖片(avatar, cover)會送到第三方儲存空間(imgur)，並收到圖片連結網址，資料庫存入網址
* 資料驗證：
    * email, accout不可與資料庫內已註冊之email/account重複
    * name長度不可超過50字，introduction不可超過160字
    * password與checkPassword必須相符  
* 成功更新後，將使用者的資料回傳（密碼除外）

## 前端傳入資料  
### parameters  
| params | Description | required |
| ------ | ----------- | -------- |
| `id`   | user   id   | true     |
### Request
Content-Type: multipart/form-data

All values are optional.
params | Description |
--- | ---|
`id` | user id
`name` | user name
`email` | user email
`password` | user password
`checkPassword` | user password again
`introduction` | user introduction
`avatar` | user avatar （string: image url)
`cover` | user cover （string: image url)


## 後端回傳資料  
### 更新成功  
```json
// status code: 200
{
    "id": 2,
    "account": "user1",
    "email": "user1@example.com",
    "name": "user1",
    "avatar": "https://avatar-url",
    "cover": "https://cover-url",
    "introduction": "helloworld",
    "role": "user",
    "createdAt": "2022-08-03T11:10:34.000Z",
    "updatedAt": "2022-08-04T03:34:37.263Z"
}
```

### 失敗  
發生原因：未收到動態路由傳入之 id
```json
// status code: 401
{
    "status": "error",
    "message": "Id number is not found in url request"
}
```
發生原因：動態路由傳入 id 與目前使用者id不符
```json
// status code: 400
{
    "status": "error",
    "message": "Can not edit other's profile"
}
```
發生原因：輸入的email已註冊過
```json
// status code: 401
{
    "status": "error",
    "message": "The email is registered."
}
```
發生原因：輸入的account已註冊過
```json
// status code: 401
{
    "status": "error",
    "message": "The account is registered."
}
```
發生原因：輸入的 name 超過50字
```json
// status code: 400
{
    "status": "error",
    "message": "Name is too long."
}
```
發生原因：輸入的 introduction 超過160字
```json
// status code: 400
{
    "status": "error",
    "message": "Introduction is too long."
}
```
發生原因：輸入之 password 與 checkPassword 不相符
```json
// status code: 401
{
    "status": "error",
    "message": "Password and checkPassword are not same."
}
```


## 相關連結  
* [回首頁](https://hackmd.io/@twitter-2022/index)  
* [API 總表](/Gl56cI2LQ5ObBpmQnbnphw)

###### tags: `API-doc`