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


いいなと思ったら応援しよう!