--- title: 重新規劃 Collection of Dashboard Today and app-dashboard action required tags: v1 --- # 重新規劃 Collection of Dashboard Today and app-dashboard action required [TOC] # 先備知識 ## MongoDB Collection: fio fio = app = S.M.A.R.T. Contract ## MongoDB Collection: alpha_admin 使用者帳號資料 ## survey === form 之前都叫 survey 現在都叫 form 所以 API 還是寫 survey,但就是 form 的意思 # UI 畫面 ### Today ![](https://i.imgur.com/aEhQ6e5.png) ### action required ![](https://i.imgur.com/iYy3OGR.png) ## 3大類12種狀態 (2021/7) - 第一類:收到邀請、form 相關通知 - [x] 1. 所有 app: (等待被邀請)收到 app 邀請加入的通知 - user 可以接受("Accept invite" button)或拒絕("Reject invite" button) - [x] 2. LearningCurve: 請填寫 Form - [x] 3. LearningCurve: 通知 Admin/Owner,要去認證 - 通過("Authenticate" button)/拒絕("Reject" button) user 填寫 Form 的資料 - [x] 4. LearningCurve: 通知:你被拒絕了,請點擊 "Open form" button 重新填寫 Form - [x] 5. 所有 app: (已經接受邀請) 提示接受邀請者,可以快速進入此 app 的 "Go to app" button - 接受邀請 24 小時後,此通知就會消失 - 第二類:用量提醒 - [ ] 6. 你的 transation/data allowance 已用 75% 只剩下 25 % (可被 dismiss) - [ ] 7. 你的 transation/data allowance 已用 90% 只剩下 10 % (不可被 dismiss) - [ ] 8. 你的 transation/data allowance 已用 100% (不可被 dismiss) - 第三類:首次安裝的新手提示 - [x] 9. learning curve - on first install - let's send your first form - send form (可被 dismiss) - [x] 10. learning curve - on first install - invite a user - let's invite a user to you app - invite (可被 dismiss) - [ ] 11. smart IP app - on first install - let's upload your first file - upload file (可被 dismiss) - [ ] 12. nft app - on first install - let's create your first NFT - create NFT (可被 dismiss) - 12種通知範例圖![](https://i.imgur.com/mY7mF2S.jpg) [figma網址](https://www.figma.com/file/eHig3FCx9v95y1k3BnfYKj/FiO-Products-Design?node-id=5258%3A28788) - 欄位說明![](https://i.imgur.com/pko3FZs.png) ## 會觸發通知的 API 與時間點 - PUT `/fio/:id/invitation` - PUT `/fio/:id/invitation/accept` (顯示 24 小時) - PUT `/fio/:id/survey/send` - S.M.A.R.T. Contract when status == awaiting-auth (學生填寫完 form 的時候) - S.M.A.R.T. Contract when status == rejected (老師拒絕認證 form 的時候) - POST `/subscribed` ## 想法 - 將所需呈現在同一個畫面上的資料通通放在同一個 Collection 裡面 ## Jack 想法 - 所有通知都放到一個表叫 dashboard, 透過 username 去做 filter ## Collection 設計 ``` dashboard_notification: [{ _id: 自動新增欄位, level_app: true / false, // 如果是要在 app-dashboard 的通知則為 true level_all_apps: true / false, // 如果是要在 /dashboard Today 的通知則為 true display: true / false, username: req.session.username, status: Action required / Invit accepted / Rejected, fio_id: fio._id, fio_solution: fio.solution, fio_name: fio.name, link: fio.form,(Or 任何需要給出網址的) action_type: invite / send_form / invite_send_form / accept / awaiting_auth / reject user_type: user / approver sender_email: micky@fio.one,(造成此通知的人的 email) sender_name: Micky, comment: "accrpt to join the app", data: data, // 所有所需之資料 ex: 上鏈資訊 date: date, }, ... ] ``` ### action_type | | 代表意思 | |:---------------- |:----------------------------------------:| | invite | User 被邀請進入某一個 app 時 | | send_form | User 收到表單被要求填寫 | | invite_send_form | 被邀請同時被寄了一份表單,須接受邀請才會寄出表單填寫通知 | | accept | 接受邀請後 有進入 app 提示 | | awaiting_auth | 等待 Admin/Owner 認證表單資料通知 | | reject | User 填寫完的表單遭到拒絕後 重新填寫通知 | | invite_guide | 進入 app 時 引導邀請 user 通知 | | send_form_guide | 進入 app 時 引導寄出 form 通知 | | transaction_limit |代表 transactions 超過 limit, comment 紀錄多少 percent | | data_allowance_limit |代表 data_allowance 超過 limit, comment 紀錄多少 percent | ## 實作 - 不管舊通知,只加入新的通知 - 通知只會新增/刪除,不會修改 - 需要加開一隻刪除通知 API ## 刪除通知 API - DELETE `/notification/dismiss/:notify_id` ## 等待認證通知 - 需要在上鏈邏輯的地方加上通知,也就是 `clsses/Obj.js` 這隻檔案加入可通知的 function - 目標是任何 app 都可使用 ### 規劃邏輯 - 將每個固定都有的 `fio._id,fio.solution,fio.name` 放入 function - 可能有可能沒有的: 有的就給他相對的值 沒有則給 null - link - data - 其餘常用的當作參數讓其他 app 也能使用 - level_app - level_all_apps - action_type - comment - status (沒給則是 'Action required') ### 實作等待認證通知 ``` async notification(level_app, level_all_apps, action_type, comment, status, email){ let notifyObj = { level_app: level_app, // 如果是要在 app-dashboard 的通知則為 true level_all_apps: level_all_apps, // 如果是要在 /dashboard Today 的通知則為 true display: true, // 預設為 ture 顯示 fio_id: this.fio._id, fio_solution: this.fio.solution, fio_name: this.fio.name, link: this.fio.url ? this.fio.url : null, username: email ? email : this.fio.username, // 給誰的通知 action_type: invite / send_form / invite_send_form / accept / awaiting_auth / reject comment: comment ? comment : null, status: status ? status : 'Action required', // Action required / Invit accepted data: this.obj.vals ? this.obj.vals : null, user_type: null, sender_email: null, // email sender_name: null, date: new Date(), } await this.db.notification(notifyObj); if(!this.fio.invitations) return; this.fio.invitations.forEach( inv => { if(inv.type !== 'apprpver') return; notifyObj.username = inv.email; // 這裡不加 await 因為不會影響到後面的資料 考慮到效能所以這樣做 this.db.notification(notifyObj); }); } ``` ## send form before inviting - LearningCurve 可以再邀請前直接寄 form,但是要接受後才可以看到 form 通知 ### 規劃 - 寄送表單時如果還沒邀請該對象,此時 action_type = invite_send_form,顯示 invite 通知 - 接受邀請後加入 send_form 通知,所以前端必須傳入 action_type - 需更動 api - `PUT /fio/:id/invitation/accept` - `PUT /fio/:id/survey/send` ### 實作 ``` ```