---
# System prepended metadata

title: Webhook Schedule API
tags: [Webhook的log table需求, API規格]

---

# 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" : 錯誤訊息 //若有錯誤訊息，請備註在這裡
}
```

