Webex Messasingのスペース管理をAPIで行う①

#APIでスペース管理を試してみたきっかけ
私はSIer経験があり、Messagingツールを使ってシステム構築プロジェクトの情報共有を行っていました。
そこで当時困っていたのがスペースの管理で、以下の課題です。

* 用途によって参加者が異なるスペースを複数作成する必要がある
* 登録ミスがあると情報共有が行き届かなかったり、不要な情報を伝えてしまう恐れがある
* プロジェクトへの途中参画/離任によりスペースの登録/削除が発生する
* 離任の場合、登録されているスペースから全て削除する必要があるが、参画している一覧を取得できない

そこで、以上のような課題をAPIを使用して解消できないかと思い、[webex for Developers](https://developer.webex.com/)からAPIを確認したところ、活用できそうなAPIがあったので作ってみる事にしました。
![WebexApp27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2299182/db44c9a0-6794-042d-5719-1c30c5628159.png)

#APIを活用してスペースを管理するBotを作成する
上記の課題を解消すべく、Excel（今回はスプレッドシート）にどのユーザーがどのスペースに参加しているか記録して、そのExcelを読み込ませることでリストとスペースの差分を反映する仕組みをAPIを使用して作成してみました。

APIの流れは次のようにしています。
　1.　任意のスペースに「作業用のBot」を追加する
　2.　Botに対して「ユーザー登録」とメッセージを送信する
　3.　Botから作業開始通知（Webex API）
　4.　スプレッドシートとスペースの差分をチェックする（Google API、Webex API）
　5.　差分を登録（Webex API）
　6.　差分を削除（Webex API）
　7.　作業履歴を作成（Google API）
　8.　Botから作業完了通知（Webex API）
　    ※（）の中は使用するAPI

上記一連の流れはiPaaSを活用してノーコードで作成できるため、今回は [webMethods.io](https://www.softwareag.cloud/site/product/webmethods-io-integration.html#/) を使用して作成します。

工程4で使用するスプレッドシートは、以下の内容で作成します。

* 行：　ユーザーのメールアドレス
* 列：　登録/削除対象のスペース
* セル：　O：スペースに存在する（登録する）、x：スペースに存在しない（削除する）
![WebexApp15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2299182/b870ee34-189b-69cc-4dad-e5b239ae1681.png)



まずは、全体の流れを作成します。
![WebexApp28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2299182/de2bf05a-4b26-98a3-f1d9-63ec5ade6db7.png)

このフローの内、

 * スプレッドシートを操作には「Google API」
 * WebexのBotを操作するには「Webex Messaging Bot」

をあらかじめ作成して使用できるようにしておく必要があります。
（webMethods.ioでそれぞれが使用できるようにする方法は、「Webex Messasingのスペース管理をAPIで行う②」で記載します）

では続いて「ユーザー登録/削除処理（※1）」のフローを作成していきます。
スプレッドシートで取得した件数分ループする必要があるため、（※1）処理はループ処理になり、「webMethods.io」ではループ処理は「ループのフロー」で別に作成していきます。
（※1）の処理はスプレッドシートの行分（ユーザー数）繰り替えしを行います。
![WebexApp29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2299182/6114e5ea-5252-d9f8-fa78-97ab071d5280.png)
ユーザー数繰り返す処理では、ユーザーに対して各スペースの状態を判定する必要があります。
よって、（※1）フロー内ではスペース数を繰り返す（※2）の「ループのフロー」を作成する必要があります。

「ユーザー登録/削除処理（※2）」のフローを作成していきます。
フローは以下の通りで作成しています。
![WebexApp30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2299182/e30b3e99-3b79-a497-64cc-ac05316e5994.png)
「行（ユーザー）」と「列（スペース）」が指定された「セル（登録可否情報）」の情報に従って処理を進めるため、（※2）フローがメインの処理を行うフローになります。

ではこのフローを順番に確認していきます。

最初に、スペースにユーザーが存在するか否かを確認します。
「webMethods.io」では、すでに登録済のユーザーをスペースに登録したり、存在しないユーザーを削除しようとするとエラーとなってしまいます。
よって、まずは

* 登録の場合、スペースにユーザーが存在していない
* 削除の場合、スペースにユーザーが存在している

を判定して、該当する場合に処理を進めるように分岐する必要があります。
![WebexApp31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2299182/290b3042-7c47-22a3-c9ed-50283a80d5ef.png)

分岐処理が作成できたら、登録/削除処理を作成していきます。
![WebexApp32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2299182/3e1466af-9e2d-2d6c-c0aa-7fedd40ebc1f.png)
処理対象であれば処理を行い、結果をスプレッドシートに記載して履歴とする処理です。
ここで注意が必要なのが、「Delete a Team Membership」のAPIを使用するために「membershipId」というパラメータが必要ということです。
この「membershipId」はここまでで保持している情報には存在していない情報であるため、ユーザー削除のAPIを実行する前に取得する必要があります。

ここまで作成できればフローは完成です。
実際にBotに話しかけて、作成した処理を確認してみたいと思います。

#スペース管理APIを実行する
今回は、以下の仮想プロジェクトを想定して、スプレッドシートに情報を入力していきます。
Botをユーザーと見立てて、仮想プロジェクトの内容でWebex Messasingのスペースとスプレッドシートを作成します。

　プロジェクト名：
　　　ABCシステム構築プロジェクト

　プロジェクト関係者：
　　　A：自社SE
　　　B：自社SME
　　　C：自社営業
　　　D：協力会社SE
　　　E：海外プログラマ
　　　F：お客様

各グループのユーザーは、必要性のあるやり取りを考慮して以下のスペースに振り分けます。

　　　自社メンバースペース：A、B、C
　　　プロジェクトメンバースペース：A、B、C、D
　　　開発者連携スペース：A、D、E
　　　お客様連絡スペース：A、B、C、D、F
　　　雑談部屋：A、D、E

作成したスプレッドシートは次のものになります。
![WebexApp15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2299182/ffe1d9d4-0de4-820f-73c6-f18f67d3a3d4.png)

スペースは次のように作成します。
「一般」スペースを作業用にして、ユーザーを追加したいスペースを作成しました。
![WebexApp09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2299182/f9502703-d292-a50a-73df-4e994d80fbac.png)

「一般」スペースにAPI呼び出しのトリガーに設定したBotをメンバーに追加します。
![WebexApp16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2299182/671bce51-542c-4c8e-f55e-42f24943adf7.png)

Botに「ユーザー登録」と話しかけてみます。
![WebexApp17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2299182/e47da6d7-e834-0de8-5ede-ddd2f72da3da.png)

APIの実行開始/完了時に、Botがメッセージを送信するように作成したため、Botからメッセージが返ってきました。
![WebexApp18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2299182/efce9c16-9b0c-e7b4-9131-347c3a92ad23.png)

よって作業は完了したようです。
作業履歴を作成したスプレッドシートと、スペースを確認します。
![WebexApp19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2299182/70bb5a7e-e895-9f0e-320f-704a7ab607d5.png)

![WebexApp20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2299182/9fea1c07-a42e-8eca-62e9-f8f35fb983da.png)
![WebexApp21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2299182/7e4ede6b-3cd0-354c-c6f2-99073921b629.png)

各スペースにスプレッドシートで「o」としたユーザーが追加されており、「x」としたユーザーが追加されていないことが確認できました。


では続いて、プロジェクトの途中で参画、離任のイベントが発生した場合を想定して、ユーザーの差分登録/削除を実施してみます。
今回は、以下2名のメンバーが参画/離任する想定で進めます。

　　参画
　　　　協力会社SE2（グループ：D、メールアドレス：spaceTestBotD2@webex.bot）

　　離任
　　　　海外プログラマ（グループ：E、メールアドレス：spaceTestBotE@webex.bot）

状況に合わせてスプレッドシートを編集します。

協力会社SE2：協力会社SEと同じ登録内容とする（下図黄色背景）
海外プログラマ：全てのスペースから削除する（下図オレンジ背景）
![WebexApp22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2299182/106144fa-e776-93e6-2894-de4d0f80e457.png)

スプレッドシートの編集が完了したため、Botに「ユーザー登録」と話しかけてみます。
API実行が完了した通知を確認して、作業履歴とスペースを確認します。
![WebexApp23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2299182/19f7a678-ddcd-bb03-37eb-bae68dbaf3fa.png)

履歴シートには、登録処理を行った結果の下に、登録/削除した情報が記載されています。
![WebexApp24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2299182/6dc746c1-2724-a8db-dd02-1e331a3dc44c.png)

各スペースを確認すると、参画/離任したユーザーのみが処理されており、スプレッドシートの内容通りになっている事が確認できました。
![WebexApp25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2299182/cb24be93-4605-f03b-5fc5-52b7c6779f47.png)
![WebexApp26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2299182/5ba8ca83-2a38-99b0-754e-f5e3b23ec683.png)

#最後に
以上のように、スペースは情報共有を行うためにとても便利な機能ですが、管理面に課題がありました。
その課題もwebex APIとiPaaSを活用する事で、ノーコードで管理システムを作成する事ができました。