kintone-Zoom連携自習6日目
多分Zoom連携自習はこれが最後。
kintone側でレコードに削除チェックが入ったら、Zoomミーティングを削除する。今回レコードを物理削除しない仕様のため、Webhookが削除では無くて更新処理として渡ってくる。一度削除したミーティングのレコードを編集した際にもWebhookが発火するため、Zoomミーティング作成時にレコードに登録したミーティングID等のフィールドを空にする処理も追加する。
※そうしないと、削除チェックしたレコードの他のフィールドを更新した際にもZoomミーティングの削除処理が走ってしまうため。
注意点
kintoneのレコードを登録してZoomミーティングを作成した後に、kintoneのレコードにZoomミーティングID他を登録する。その際にはkintoneのレコード更新になり、再度Webhookが発火するため注意。
つまり、新規にZoomミーティングを作成した場合のWebhookの発火は下記の通りになる。
1・新規レコード作成→
2・Webhookがタイプ='ADD_RECORD'で発火→
3・Zoomミーティングを作成→
4・ZoomミーティングIDをkintoneのレコードに登録する→
5・Webhookがタイプ='UPDATE_RECORD'で発火
となるので、5のWebhookの処理は何もしないで処理を終わらせるようにする必要がある。
つまり、Webhookのタイプが`UPDATE_RECORD`かつ削除にチェックが無い場合は何も処理しないようにする。
Webhookを使った処理は、必ずこの分岐の処理を入れないと無限にループします。(チャットボットを作る時と同じ)
一応kintoneではWebhookの制限値で1分間に60回までで、61回目以降は処理されないのですぐに気がつけば大丈夫ですが。。。
Zoomミーティングを削除する
Webhookのタイプが`UPDATE_RECORD`で削除フラグが立っていたらZoomミーティングを削除する。
削除にチェックが入っていても、ミーティングIDが空だったら既にミーティングが削除済みと判断して何もしない。
削除処理側
async deleteZoomMeeting(meetingId: string) {
try {
const axiosInstance = axios.create({
baseURL: 'https://api.zoom.us/v2',
headers: { Authorization: `Bearer ${this._accessToken}` },
});
const response = await axiosInstance.delete(`/meetings/${meetingId}/?meetingId=${meetingId}`);
console.log(response);
return response;
} catch (error) {
console.log(error);
}
}
呼び出し側
switch (kintoneWebhookType) {
case 'ADD_RECORD':
if (KintoneIntegration.deleteCheck(checkBoxValues)) {
// レコード追加時に削除チェックありの時。
console.log('レコード追加時に削除チェックありの時。何もしない');
break;
}
await zoom.getAccessToken();
const ZoomMeetingCreateSetting = generateZoomMeetingParam(webhookRequest.record);
const zoomCreateMeetingResponse = await zoom.createZoomMeeting(ZoomMeetingCreateSetting);
// console.log(zoomCreateMeetingResponse);
zoom.setMeetingResponse(zoomCreateMeetingResponse);
// console.log(zoom.meetingResponse);
kintoneIntegration.zoomMeetingParam({
meetingId: { value: zoom.meetingResponse.id },
join_url: { value: zoom.meetingResponse.join_url },
password: { value: zoom.meetingResponse.password },
});
const kintoneUpdateRecordResponse = await kintoneIntegration.updateRecord();
console.log(kintoneUpdateRecordResponse.status);
console.log(kintoneUpdateRecordResponse.data);
break;
case 'UPDATE_RECORD':
console.log('UPDATE_RECORD');
if (KintoneIntegration.deleteCheck(checkBoxValues)) {
// 削除チェックあり。
// ミーティングIDが登録されている場合は削除する。
const meetingId = kintoneIntegration.getWebhookRequestMeetingId();
if (meetingId) {
console.log('delete Zoom Meeting');
console.log(kintoneIntegration.kintoneUpdateRecordParam);
await zoom.getAccessToken();
const zoomMeetingDeleteResponse = await zoom.deleteZoomMeeting(meetingId);
console.log(zoomMeetingDeleteResponse);
kintoneIntegration.zoomMeetingParam({
meetingId: { value: '' },
join_url: { value: '' },
password: { value: '' },
});
console.log(kintoneIntegration.kintoneUpdateRecordParam);
const kintoneUpdateRecordResponse = await kintoneIntegration.updateRecord();
console.log(kintoneUpdateRecordResponse.status);
console.log(kintoneUpdateRecordResponse.data);
}
} else {
// 削除チェック無しでレコード更新された時
// UPDATE_RECORDでレコード作成された後、ZoomミーティングIDをkintoneに登録する時にも
// ここの処理を通る。
console.log('削除チェック無しでレコード更新された時。何もしない');
}
break;
default:
console.log('処理が実装されていません');
break;
}
参考リンク
Zoom API
https://marketplace.zoom.us/docs/api-reference/introduction/
kintone Webhook
kintone レコードの更新
https://developer.cybozu.io/hc/ja/articles/201941784
kintone フィールド形式
https://developer.cybozu.io/hc/ja/articles/202166330
AWS SAM リファレンス
https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-sam-reference.html
API Gateway アクセス制御
https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-controlling-access-to-apis.html
API Gateway Lambda オーソライザーを使用する
https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-use-lambda-authorizer.html
Setting up Server-to-Server (S2S) OAuth to test Zoom APIs via Postman
https://jenzushsu.medium.com/setting-up-server-to-server-s2s-oauth-to-test-zoom-apis-via-postman-32c9cd7a73