# Webhook Schedule API
> [name=阿水]
###### tags: `Webhook的log table需求` `API規格`
## code內關鍵字
- function : saveonpassword
- dao參考 model.memberchangelog memberchangelogdao memberchangelogdaoimpl
## 流程
- 本次阿水負責的簡易流程 : 客戶修改密碼 $\longrightarrow$ 紀錄在這次要製作的log table $\longrightarrow$ scheduler的排程執行程式 $\longrightarrow$ 程式發送通知給有該應用服務權限(app_service_target)的客戶所提供的URL(後面簡稱webhookURL)
## 可能遇到的問題
- 若是該帳號在排程時間還沒到的時候,又再其他網站更換密碼的狀況
- 寄送通知是否該跳過原本的網站,還是應該把url附在通知裡由各自的網站自己處理
## 查詢有該應用服務權限的SQL範例
SELECT * FROM taitra_member.app_service_target
left join app_service on app_service.sid = app_service_target.service_id
where target_type = 'USR'
and target_id = '2c94d0df6a259bf4016a2b0265a00041';
(target_id就是member_id)
## 本次預計新增的 table
本次預計新增3張table
- table name : app_service_webhook_url AppServiceWebhookUrl
- insert時機 : 手動新增、UI新增、API新增
| 欄位名稱 | 欄位說明 | 型態 | 是否必要欄位 |
| -------- | -------- | -------- | -------- |
| webhook_url | 該服務類別的webhook url | String | Y |
| service_id | 應用服務ID | String | Y |
| type | 類別 | String | Y |
* type : 目前唯一種類,修改密碼--pwd
- DDL
CREATE TABLE `app_service_webhook_url` (
`LID` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL,
`TYPE` char(3) COLLATE utf8mb4_unicode_ci NOT NULL,
`SERVICE_ID` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`WEBHOOK_URL` varchar(256) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
PRIMARY KEY (`LID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
- table name : pwd_change_log
- insert時機 : 每次修改密碼時(在function : addmemberchangelog之後)
| 欄位名稱 | 欄位說明 | 型態 | 是否必要欄位 |
| -------- | -------- | -------- | -------- |
| member_id | 被密碼修改的帳號 | String | Y |
| modify_date | 該帳號被密碼修改的時間 | DATETIME | Y |
| modify_type | 修改來源類型 | String | Y |
| modify_serivce | 修改應用服務 | String | Y |
| host_ip | 密碼修改的Client IP | String | N |
| host_user_agent | 密碼修改的User Agent | String | N |
| status | 狀態 | String | Y |
* status : 0為未處理,1為處理成功,2為處理失敗(過段時間再處理)
- DDL
CREATE TABLE `pwd_change_log` (
`LID` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL,
`MEMBER_ID` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`MODIFY_DATE` datetime NOT NULL,
`MODIFY_TYPE` char(3) COLLATE utf8mb4_unicode_ci NOT NULL,
`MODIFY_SERVICE` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`HOST_IP` varchar(256) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`HOST_USER_AGENT` varchar(256) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`STATUS` char(1) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0',
PRIMARY KEY (`LID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
- table name : pwd_webhook_log PwdWebhookLog
- insert時機 : scheduler發送完webhook拿到的結果
| 欄位名稱 | 欄位說明 | 型態 | 是否必要欄位 |
| -------- | -------- | -------- | -------- |
| member_id | 被修改的帳號 | String | Y |
| webhook_url | 應用服務ID | String | Y |
| webhook_date | webhook收到回傳的時間 | DATETIME | Y |
| type | 類別 | String | Y |
| status | 狀態 | number | Y |
* type : 目前唯一種類,修改密碼--pwd
* status : 0為未處理,1為處理成功,2為處理失敗(狀態不會被更新)
- DDL
CREATE TABLE `pwd_webhook_log` (
`LID` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL,
`MEMBER_ID` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`WEBHOOK_URL` varchar(256) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`WEBHOOK_DATE` datetime NOT NULL,
`TYPE` char(3) COLLATE utf8mb4_unicode_ci NOT NULL,
`STATUS` char(1) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0',
PRIMARY KEY (`LID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
## 網址
- path:符合 RESTful API 命名規則
## Input JSON Path
- path:符合 RESTful API 命名規則
- Request Method:POST
- Content Type:application/json;charset=utf-8
- query : 無
- body :
```=json
{
"member_id" : 被密碼修改的帳號, //ex: vinceshieh@yahoo.com.tw
"modify_date" : 該帳號被密碼修改的時間 //ex: 2022-04-17 17:53:48
"modify_type" : 修改來源類型, // API : API修改(密碼) / USR: 會員中心(密碼修改) / FPW: 忘記密碼(重設密碼)
"modify_serivce" : 修改應用服務, // 如果modify_type是 API,顯示此欄位
"host_ip" : 密碼修改的Client IP // ex: 61.66.108.194
"host_user_agent" : 密碼修改的User Agent // ex: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36
}
```
我只是想打文字 test.sh,就變成超連結
## Output JSON Path
```=json
{
"status" : 本次處理狀態, //1為處理成功,2為處理失敗
"error" : 錯誤訊息 //若有錯誤訊息,請備註在這裡
}
```