Boxへのボットの接続
Boxへのボットの接続
ここでは、Slackから送信されるイベントを処理し、Boxのユーザーやグループとの接続に必要なすべての情報を取得します。その機能をBoxの関数に関連付ける必要があります。
この手順では、直前の手順で説明した関数をいくつか拡張し、新しいBox機能を組み込みます。
- Boxクライアントをインスタンス化する
- BoxグループにBoxユーザーを追加する
- BoxグループからBoxユーザーを削除する
- グループ名からBoxグループIDを取得する
- グループと共有するコンテンツを追加する
Boxクライアントのインスタンス化
Box APIを呼び出すには、最初にBoxクライアントを設定する必要があります。
process.js
で、先頭にある// INSTANTIATE BOX CLIENT
コメントを次の内容に置き換えます。
const boxConfig = require("./boxConfig.json");
const sdk = box.getPreconfiguredInstance(boxConfig);
const client = sdk.getAppAuthClient("enterprise");
boxConfig
の代入行では、手順2の最後でBoxアプリからダウンロードしたboxConfig.json
ファイルを使用します。上記のサンプルでは、ファイルをprocess.js
と同じフォルダに保存していることを前提としています。そうではない場合は、boxConfig.json
ファイルの場所を指すパスとファイル名に変更してください。
最後のclient
の代入行では、APIコールに使用できるBoxクライアントオブジェクトを作成します。この時点では、その対象範囲は特定のユーザーではなく、アプリケーションのサービスアカウントに設定されています。
Application.java
で、processEvent
メソッド内の// INSTANTIATE BOX CLIENT
コメントを次の内容に置き換えます。
this.fileReader = new FileReader("boxConfig.json");
this.boxConfig = BoxConfig.readFrom(fileReader);
this.boxAPI = BoxDeveloperEditionAPIConnection.getAppEnterpriseConnection(boxConfig);
boxConfig
の代入行では、手順2の最後でBoxアプリからダウンロードしたboxConfig.json
ファイルを使用します。上記のサンプルでは、ファイルをJavaプロジェクトのルートに保存していることを前提としています。そうではない場合は、fileReader
の代入行のパスを、boxConfig.json
ファイルの場所を指すパスとファイル名に変更してください。
最後のboxAPI
の代入行では、APIコールに使用できるBoxクライアントオブジェクトを作成します。この時点では、その対象範囲は特定のユーザーではなく、アプリケーションのサービスアカウントに設定されています。
グループへのBoxユーザーの追加
グループにBoxユーザーを追加する関数を追加します。ボットがチャンネルに追加され、チャンネルのすべてのユーザーを含むBoxグループの作成が必要になった場合、またはその操作の後に1人のユーザーがチャンネルに参加した場合に、この関数によってそのタスクが実行されます。
addGroupUser
関数を次の内容に置き換えます。
function addGroupUser(groupId, email) {
client.enterprise.getUsers({ filter_term: email }).then((users) => {
if (users.entries.length > 0) {
const userId = users.entries[0].id;
const groupRole = client.groups.userRoles.MEMBER;
client.groups
.addUser(groupId, userId, { role: groupRole })
.then((membership) => {
if (membership.id) {
console.log(`Member added with membership ID: ${membership.id}`);
} else {
console.log(`Member not added`);
}
})
.catch(function (err) {
console.log(err.response.body);
});
} else {
console.log("No Box user found to add to group");
}
});
}
addGroupUser
メソッドを次の内容に置き換えます。
public void addGroupUser(String groupId, String userEmail) {
Iterable<BoxUser.Info> users = BoxUser.getAllEnterpriseUsers(this.boxAPI, userEmail);
for (BoxUser.Info user : users) {
if (user.getLogin().toUpperCase().equals(userEmail.toUpperCase())) {
try {
BoxGroup group = new BoxGroup(boxAPI, groupId);
BoxUser boxUser = new BoxUser(this.boxAPI, user.getID());
BoxGroupMembership.Info groupMembershipInfo = group.addMembership(boxUser);
} catch (Exception ex) {
System.err.println("User already present");
}
}
}
}
メールアドレスを使用してSlackユーザーをBoxユーザーと照合しているため、最初に、Slackのプロフィールのメールアドレスを使用して一致するBoxユーザーを検索します。見つかると、そのユーザーをチャンネルのグループに追加するための呼び出しが行われます。このグループは、ボットが最初に追加されたときに作成されています。
グループからのBoxユーザーの削除
Slackチャンネルから退出したユーザーや削除されたユーザーは、共有グループコンテンツにアクセスできなくなるようにBoxグループから削除することもできます。
removeGroupUser
関数を次の内容に置 き換えます。
function removeGroupUser(groupId, email) {
client.groups.getMemberships(groupId).then(memberships => {
for (let i = 0; i < memberships.entries.length; i++) {
if (memberships.entries[i].user.login === email) {
client.groups
.removeMembership(memberships.entries[i].id)
.then(() => {
console.log('Group user removed')
});
break;
}
}
});
}
removeGroupUser
メソッドを次の内容に置き換えます。
public void removeGroupUser(String groupId, String userEmail) {
BoxGroup boxGroup = new BoxGroup(this.boxAPI, groupId);
Iterable<BoxGroupMembership.Info> memberships = boxGroup.getAllMemberships();
for (BoxGroupMembership.Info membershipInfo : memberships) {
if (membershipInfo.getUser().getLogin().toUpperCase().equals(userEmail.toUpperCase())) {
BoxGroupMembership membership = new BoxGroupMembership(this.boxAPI, membershipInfo.getID());
membership.delete();
}
}
}
このコードでは、SlackのチャンネルIDとなるグループIDを取得し、グループの全メンバーを取得します。メールアドレスに基づいて、Slackチャンネルを退出したユーザーに一致するメンバーが見つかると、そのユーザーはそのメンバーシップIDを使用してグループから削除されます。
グループ名に対応したBoxグループIDの取得
次に必要なBox関数には、主に2つの目的があります。
- 既存グループのBoxグループIDを返します。
- グループが存在しない場合、Boxグループを作成してそのIDを返します。
getGroupId
関数を次の内容に置き換えます。
function getGroupId(groupName, callback) {
client.groups.getAll().then((groups) => {
const group = groups.entries.filter((g) => g.name === groupName)[0];
if (!group) {
client.groups
.create(groupName, {
description: "Slack channel collaboration group",
invitability_level: "all_managed_users",
})
.then((group) => {
callback(group.id);
});
} else {
callback(group.id);
}
});
}
getGroupId
メソッドを次の内容に置き換えます。
public String getGroupId(String groupName) {
String groupId = new String();
Iterable<BoxGroup.Info> groups = BoxGroup.getAllGroups(this.boxAPI);
for (BoxGroup.Info groupInfo : groups) {
if (groupInfo.getName().toUpperCase().equals(groupName)) {
groupId = groupInfo.getID();
}
}
if (groupId.isEmpty()) {
BoxGroup.Info groupInfo = BoxGroup.createGroup(boxAPI, groupName);
groupId = groupInfo.getID();
}
return groupId;
}
このコードでは、社内のすべてのグループを取得し、SlackチャンネルIDとグループ名の照合を試みます。いずれかのグループが一致すると、そのグループIDが返されます。
一致するものがない場合は、新しいBoxグループが作成され、そのグループのIDが返されます。グループの名前はSlackチャンネルIDに基づいて付けられます。これはスラッシュコマンドとUser Eventの両方で返される定数であり、追加の関数がなくても簡単に検索できるようにするためです。
グループへの共有コンテンツの追加
最終的に、このアプリケーション全体の主な目的は、ユーザーが自分のBoxアカウントにあるファイルやフォルダをグループ内の他のユーザー全員と共有できるようにすることです。
ここまでのすべての機能を基に、次の関数でそのタスクを実行します。
processContent
関数を次の内容に置き換えます。
function processContent(user, channel, itemType, itemId) {
getGroupId(channel, function (groupId) {
const email = user.profile.email;
client.enterprise.getUsers({ filter_term: email }).then((users) => {
if (users.entries.length > 0) {
client.asUser(users.entries[0].id);
const collabRole = client.collaborationRoles.VIEWER;
const collabOptions = { type: itemType };
client.collaborations
.createWithGroupID(groupId, itemId, collabRole, collabOptions)
.then((collaboration) => {
console.log(
`Content added with collaboration ID ${collaboration.id}`
);
})
.catch(function (err) {
console.log(
util.inspect(err.response.body, {
showHidden: false,
depth: null,
})
);
});
}
});
});
}
processContent
メソッドを次の内容に置き換えます。
public void processContent(JSONObject userResponse, String channel, String fType, String fId) {
String groupId = getGroupId(channel);
JSONObject userObj = (JSONObject) userResponse.get("user");
JSONObject userProfile = (JSONObject) userObj.get("profile");
String userEmail = (String) userProfile.get("email");
Iterable<BoxUser.Info> users = BoxUser.getAllEnterpriseUsers(this.boxAPI, userEmail);
for (BoxUser.Info user : users) {
if (user.getLogin().toUpperCase().equals(userEmail.toUpperCase())) {
String uid = user.getID();
boxAPI.asUser(uid);
BoxCollaborator collabGroup = new BoxGroup(boxAPI, groupId);
try {
if (fType.equals("file")) {
BoxFile file = new BoxFile(boxAPI, fId);
file.collaborate(collabGroup, BoxCollaboration.Role.VIEWER, false, false);
} else if (fType.equals("folder")) {
BoxFolder folder = new BoxFolder(boxAPI, fId);
folder.collaborate(collabGroup, BoxCollaboration.Role.VIEWER);
}
} catch (Exception ex) {
System.err.println("Collaboration failed");
}
boxAPI.asSelf();
}
}
}
このコードでは、最初に、コンテンツの共有先となるSlackチャンネル用にBoxグループIDを取得します。
スラッシュコマンドを送信したユーザーのBoxアカウントからファイルやフォルダを共有するため、次に、そのユーザーのBoxユーザープロフィールをメールアドレスに基づいて取得します。
最後に、グループIDを使用して、コンテンツでグループとコラボレーションするための呼び出しを行います。
まとめ
- Boxクライアントをインスタンス化しました。
- Boxグループユーザーを追加および削除するための関数を作成しました。
- コンテンツをグループと共有するための関数を作成しました。