---
# System prepended metadata

title: Invite 功能的資料更動與動線
tags: [v1]

---

---
title: Invite 功能的資料更動與動線
tags: v1
---

# Table of Content
[ToC]

# 先備知識

## MongoDB Collection: fio

fio = app = S.M.A.R.T. Contract

## MongoDB Collection: alpha_admin

使用者帳號資料

## 畫面上，status 與 UX 的關係

![](https://i.imgur.com/ga3jQp1.jpg)

- status: pending 的 APP 會出現在 user dashboard
- status: active 的 APP 會出現在 sidebar - invited app block
- status: reject 的 APP 就不出現
- status: inactive 的 APP，該 User 就不可看到該 APP 畫面
# 目標
- 可以發送邀請 也可以接受或拒絕邀請
- 同時將先前存取 user 與 approver 的資料合併儲存 也就是 fio.users 與 fio.approvers 這兩個資料表

# 規劃

1. 將資料庫的 fio.approvers 與 fio.users 合併成 fio.invitations
    - 欄位:
        ```
        [
            {
                type: 'user', // user || approver
                email: 'micky@fio.one' // 被邀請人的 email
                status: pending // 邀請後一率都是 pending 直到被邀請人接受
                date: '2021,01,01' // 邀請日期
            }

        ]
    -  type: user/approver
    -  email: xxxxx@gmail.com
    -  status: pending/active/reject/inactive
    -  date: 更新日期
 
![](https://i.imgur.com/7CFMz85.png)

2. 在 alpha_admin 新增一個叫 invited(array object)
    - 欄位:
        ```
        [
            {
                type: 'user', // user || approver
                app_id: ID, //被邀請的app id
                app_name: fio.name //被邀請的 app name）
                enabled: true / false (solution 是否啟用)
                solution: LearningCurve (被邀請的 solution)
                status: active/inactive/pending
            }

        ]
        ```
    - type: user/approver
    - app_id: fio._id （被邀請的app id）
    - app_name: fio.name （被邀請的 app name） 
    - enabled: true / false (solution 是否啟用)
    - solution: LearningCurve (被邀請的 solution)
## Micky 的想法

Sidebar 資料來源：從 alpha_admin 尋找
不需要依序至 fio.users、fio.approvers 尋找
> 要確保資料的一致性，才能這麼做 [name=Joe]
>> 沒錯。能有兩個方式處理：
>> 1. 在 User management 刪除或變更這個 User，必須：
    >> a. 刪除/變更  alpha_admin.invite
    >> b. 刪除/變更 fio.users 或 fio.approvers
>> 2. 將 fio.users 及 fio.approvers 合併成 invited 的 Array，再加一個欄位判斷「是 user 或 approver」。之後就都透過 fio.invited 尋找，不需要另外在 `alpha_admin` 下增加欄位
>> [name=MickyFan]

> 當 `alpha_admin` 該 user 不存在時，怎麼辦？ [name=Joe]
>> 有登入的才會看到 Dashboard 上的邀請，這裡邀請的資料是透過 fio.users 跟 fio.appreovers 去找到的，然後按下 accept 我們再到`alpha_admin`裡加入第二點的資料 [name=Micky]

被 Reject 後，User 能在 FiO 看到 reject log 嗎？
> User 看不到，可是邀請的人看得到 User 拒絕了他的邀請
> [name=Micky]

## Summary

為了減少搜尋資料的次數
1. `alpha_admin.invited`: 在 User accept 邀請後，在`alpha_admin` 加入所需資料，未來要找被 invited 的資料 只需在 `alpha_admin` 尋找即可
     - 遇到問題 : 資料變更的時候需要在原本出處與新增的地方都做變更
2. `fio.invited`: 把 fio.users 與 fio.approvers 合併成一個叫 invited 的 array 並加入欄位判斷是 user/approver，日後搜尋只需查詢 fio.invited 就好

# 結論

需要從這些角度思考

- 動作(CTA)：invite, aceept, reject
- CRUD 的動線

## 規劃
1. 將 fio.users 與 fio.approvers 存入 fio.invitations 並加入欄位 status : active
2. 將已在 fio.user 與 fio.approvers  存入 alpha_admin.invited 

- School invite Approver
    - FiO:
        - insert in fio.invitations
- Approver accept
    - FiO:
        - insert fio.approvers
        - update fio.invitations
        - insert alpha_admin.invited
- School/Approver invite User
    - FiO:
        - insert in fio.invitations
            - 因為 alpha_admin 可能會不存在該 user
- User accept:
    - FiO:
        - insert fio.users
        - update fio.invitations
            - 註明被 invite 的狀態、日期、被誰邀請等等資訊
        - insert alpha_admin.invited
            - 該 user 總共被 invited 哪些 app
- School/Teacher remove User 
    - FiO:
        - update fio.invitations
            - 註明該 user 被 remove
        - remove alpha_admin.invited
            - 該 user 無法再使用該 app

## 邏輯流程圖：User flow

![](https://i.imgur.com/hvp1NFr.jpg)

## 資料流程圖：Data flow

![](https://i.imgur.com/0zsBK6r.jpg)


## API

### Menu 用的 API

API: 
- GET /my-apps/sidebar

1. function: 我已訂閱的 apps
2. function: 被邀請並已加入的 apps

alpha_admin.invited
{type: approver}
{type: user}

- PUT /username

## 變更後原本資料的影響
### Case 1

1. 抓取資料的欄位變更
    - 解決想法流程圖:    
    
      ![](https://i.imgur.com/3NxhAIG.jpg)
> 加入 status = active 原因: 舊制邀請後自動加入app，因此 status 會是 active 


2. 變更前已經接受邀請的人 `alpha_admin.invited` 沒資料
    - 解決想法流程圖: 
        
         ![](https://i.imgur.com/GfobD8e.jpg)
### Case 2
- 寫一支程式一次搞定
    - migration.js  

## Final
- 採用 Case 1