---
# System prepended metadata

title: 好友功能

---

---
title: 好友功能
description: 
---

# 好友功能
### 後端更新
* user 表格新增 fbId 欄位
```sql=
ALTER TABLE `user` ADD COLUMN `fbId` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL;
```
* 新增 friend 表格
```sql=
SET character_set_client = utf8mb4 ;
CREATE TABLE `friend` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `friendId` int(11) DEFAULT NULL,
  `type` enum('fb','normal') COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `userId` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `friendId` (`friendId`),
  KEY `userId` (`userId`),
  CONSTRAINT `friend_ibfk_1` FOREIGN KEY (`friendId`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE,
  CONSTRAINT `friend_ibfk_2` FOREIGN KEY (`userId`) REFERENCES `user` (`id`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
```
* 新增 friend_invitation 表格
```sql=
SET character_set_client = utf8mb4;
CREATE TABLE `friend_invitation` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `status` enum('pending','inactive') COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `createdAt` datetime NOT NULL,
  `updatedAt` datetime NOT NULL,
  `userId` int(11) DEFAULT NULL,
  `fromUserId` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `userId` (`userId`),
  KEY `fromUserId` (`fromUserId`),
  CONSTRAINT `friend_invitation_ibfk_1` FOREIGN KEY (`userId`) REFERENCES `user` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT `friend_invitation_ibfk_2` FOREIGN KEY (`fromUserId`) REFERENCES `user` (`id`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
```


### TODO
* 新增登入時取得是否有好友邀請(bool)(實作小紅點)
* 好友 API
    * 以暱稱搜尋好友，回傳搜尋結果列表
        * 傳入
            * 使用者 id(int)
            * 暱稱(string)
        * 回傳列表
            * 使用者 id(int)
            * 暱稱(string)
            * 特務檔案編號(int)
            * 狀態(int)
                * 非好友
                * 已邀請
                * 好友
    * 發送好友邀請
        * 傳入使用者 id(int)
        * 回傳已更新的搜尋列表項目(單筆)
            * 使用者 id(int)
            * 暱稱(string)
            * 特務檔案編號(int)
            * 狀態(int)
                * 已邀請
    * 取得好友邀請列表
        * 傳入
            * 使用者 id
        * 回傳列表
            * 好友邀請 id(int)
            * 暱稱(string)
            * 特務檔案編號(int)
    * 接受/拒絕好友邀請
        * 傳入
            * 好友邀請 id(int)
            * 接受或拒絕(bool)
        * 回傳
            * 成功或失敗(int)
            * 短訊息(string)
            * 成功時回傳好友列表更新
    * 取得好友列表
        * 傳入使用者 id(int)
        * 回傳好友列表
            * id(int)
            * 暱稱(string)
            * 特務檔案編號(int)
            * 特務評比文字(string)
            * 特務評比分數(int)
            * 特務評比最高分(int)
            * 類型(int)
                * 一般
                * FB
            * FB id(string)
    * 刪除好友
        * 傳入好友 id(int)
        * 回傳
            * 成功或失敗(int)
* 連結 FB API
    * 連結 FB
        * 傳入
            * 使用者 FB id(假設是一串數字)
            * 使用者好友列表
                * FB id(同使用者 FB id)
        * 回傳已連結的好友列表
            * 暱稱(string)
            * 特務檔案編號(int)
            * 特務評比文字(string)
            * 特務評比分數(int)
            * 特務評比最高分(int)
            * FB id(string)


使用者在前端授權使用 FB 好友後，取得
* 自己的 id 及其他資訊(名稱、頭像...)
* 好友列表
    * 好友的 id 及其他資訊(名稱、頭像...)

測試資料：
建立三個使用者
暱稱：
1. 古木
2. 信義區古木(一般好友)
3. 古木花生(已邀請)
4. 古木花生醬(非好友)

1. 使用者1登入 /1234567
2. 好友列表顯示一個一般好友(信義區古木)
3. 搜尋"古木"列出四個好友：信義區古木(好友)、古木花生(已邀請)、古木花生醬(非好友)、全服最強古木(非好友)
4. 使用者2登入 /2345678 (信義區古木)，綁定 FB (測試已經是一般好友後，使用者1已經綁定 FB，使用者2接著綁定 FB，使用者1、使用者2成為 FB 好友)
5. 使用者3登入 /3456789 (古木花生)，綁定 FB (測試使用者1已經送出邀請，使用者1綁定 FB，使用者1及使用者2成為 FB 好友，邀請消失)
6. 使用者4登入 /4567890 (古木花生醬)，綁定 FB ，向古木發出好友邀請 (測試使用者4已經送出邀請，使用者1綁定，使用者4、使用者1成為 FB 好友，邀請消失)
7. 使用者1，綁定FB，好友列表有三個 FB 好友，沒有邀請
8. 使用者2擁有1個 FB 好友，沒有邀請
9. 使用者3擁有1個 FB 好友，沒有邀請
10. 使用者4擁有1個 FB 好友，沒有邀請
11. 使用者1解除 FB 連結，好友列表只剩一個一般好友
12. 刪除一個 FB 好友
13. 解除 FB 連結
14. 重新綁定 FB 連結，所有 FB 好友重新加回