[Google Drive API v3] Javaでファイルのパーミッションを付与・更新・削除する

Google Drive API v3（Java）を使用して、
Driveに置かれているファイルのパーミッションを付与・更新・削除する方法
についてご紹介します。

:::note info
APIを利用する環境の準備から始める場合や、コードを実行する際は、
[⧉[Google Drive API v3] JavaでDrive APIを使う](https://qiita.com/doran/items/15b2c59adb410ddeeb8a)
を参照ください。
:::

|No||目次|
|---|---|---|
|1||[パーミッションの付与タイプと役割(ロール)](#1-パーミッションの付与タイプと役割ロール)|
||1|[アクセス権の付与タイプ](#11-アクセス権の付与タイプ)|
||2|[役割(ロール)](#12-役割ロール)|
|2||[パーミッションを付与](#2-パーミッションを付与)|
||1|[スコープ](#21-スコープ)|
||2|[実行](#22-実行)|
||3|[レスポンスの内容](#23-レスポンスの内容)|
|3||[パーミッションを更新](#3-パーミッションを更新)|
||1|[スコープ](#31-スコープ)|
||2|[実行](#32-実行)|
||3|[レスポンスの内容](#33-レスポンスの内容)|
|4||[パーミッションを削除](#4-パーミッションを削除)|
||1|[スコープ](#41-スコープ)|
||2|[実行](#42-実行)|
||3|[レスポンスの内容](#43-レスポンスの内容)|

## 1. パーミッションの付与タイプと役割(ロール)

### 1.1. アクセス権の付与タイプ

|タイプ|内容|
|---|---|
|user|単一のユーザーにアクセス許可を付与|
|group|グループにアクセス許可を付与|
|domain|ドメインにアクセス許可を付与|
|anyone|会社ドメインへのアクセス権を持つ人物にアクセス許可を付与|

### 1.2. 役割(ロール)

|許可された操作|owner|organizer|fileOrganizer|writer|commenter|reader|
|---|:-:|:-:|:-:|:-:|:-:|:-:|
|ファイルまたはフォルダーのメタデータ (名前、説明など) を読み取ります。|<font color=red>o</font>|<font color=red>o</font>|<font color=red>o</font>|<font color=red>o</font>|<font color=red>o</font>|<font color=red>o</font>|
|ファイルの内容を読む|<font color=red>o</font>|<font color=red>o</font>|<font color=red>o</font>|<font color=red>o</font>|<font color=red>o</font>|<font color=red>o</font>|
|フォルダー内のアイテムのリストを読む|<font color=red>o</font>|<font color=red>o</font>|<font color=red>o</font>|<font color=red>o</font>|<font color=red>o</font>|<font color=red>o</font>|
|ファイルにコメントを追加する|<font color=red>o</font>|<font color=red>o</font>|<font color=red>o</font>|<font color=red>o</font>|<font color=red>o</font>|x|
|ファイルまたはフォルダーのメタデータを変更する|<font color=red>o</font>|<font color=red>o</font>|<font color=red>o</font>|<font color=red>o</font>|x|x|
|ファイルの内容を変更する|<font color=red>o</font>|<font color=red>o</font>|<font color=red>o</font>|<font color=red>o</font>|x|x|
|過去のリビジョンにアクセスする|<font color=red>o</font>|<font color=red>o</font>|<font color=red>o</font>|<font color=red>o</font>|x|x|
|フォルダーにアイテムを追加する|<font color=red>o</font>|<font color=red>o</font>|<font color=red>o</font>|<font color=red>o</font>|x|x|
|「マイドライブ」フォルダからアイテムを削除する|<font color=red>o</font>|x|x|<font color=red>o</font>|x|x|
|「マイドライブ」フォルダーのアイテムを共有する|<font color=red>o</font>|x|x|<font color=red>o</font>|x|x|
|共有ドライブアイテムを共有する|x|<font color=red>o</font>|<font color=red>o</font>|<font color=red>o</font>|x|x|
|共有ドライブにファイルを追加する|x|<font color=red>o</font>|<font color=red>o</font>|<font color=red>o</font>|x|x|
|共有ドライブのメタデータを変更する|x|<font color=red>o</font>|x|x|x|x|
|共有ドライブのメンバーを追加する|x|<font color=red>o</font>|x|x|x|x|
|詳細なファイル権限にアクセスできます|<font color=red>o</font>|<font color=red>o</font>|<font color=red>o</font>|<font color=red>o</font>|x|x|
|共有ドライブ内のアイテムを再編成する|x|<font color=red>o</font>|<font color=red>o</font>|x|x|x|
|アイテムを共有ドライブの外に移動する|x|<font color=red>o</font>|x|x|x|x|
|アイテムをゴミ箱に移動する|<font color=red>o</font>|<font color=red>o</font>|<font color=red>o</font>|x|x|x|
|ゴミ箱からアイテムを回収する|<font color=red>o</font>|<font color=red>o</font>|<font color=red>o</font>|x|x|x|
|ゴミ箱を空にする|<font color=red>o</font>|<font color=red>o</font>|x|x|x|x|
|ファイルまたはフォルダーを削除する|<font color=red>o</font>|<font color=red>o</font>|x|x|x|x|
|共有ドライブ内のアイテムを削除する|x|<font color=red>o</font>|x|x|x|x|
|空の共有ドライブを削除する|x|<font color=red>o</font>|x|x|x|x|
|マイドライブフォルダー内のファイルにコンテンツ制限を追加する|<font color=red>o</font>|x|x|<font color=red>o</font>|x|x|
|共有ドライブ内のファイルにコンテンツ制限を追加する|x|<font color=red>o</font>|<font color=red>o</font>|<font color=red>o</font>|x|x|

## 2. パーミッションを付与

### 2.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
DriveScopes.DRIVE
DriveScopes.DRIVE_FILE
```
[⧉[Google Drive API v3] JavaでDrive APIを使う(2.2 Driveインスタンスを取得)](https://qiita.com/doran/items/15b2c59adb410ddeeb8a#22-driveインスタンスを取得)
でスコープを指定してください。
### 2.2. 実行
APIを実行します。

パーミッションを付与したいファイルに、
・メールアドレス
・[アクセス権の付与タイプ](#11-アクセス権の付与タイプ)
・[役割（ロール）](#12-役割ロール)
を設定します。
そのほかの設定は、[2.2.3. リクエストボディ](#223-リクエストボディ)を参照ください。

setFieldsでレンスポンスで取得したいフィールド（[Permission](#permission)）を指定できます。
指定しない場合は、必要最小限のレスポンスしか返ってきません。
ここでは「*」(全て取得)を指定しています。

```java
public static void main(String[] args) throws Exception{
    Drive drive = getDrive();
    Drive.Permissions permissions = drive.permissions();
    
    Permission permission = new Permission();
    permission.setEmailAddress("xxxxx@gmail.com");
    permission.setType("user");
    permission.setRole("reader");
    
    Drive.Permissions.Create create = permissions.create("ファイルID", permission);
    create.setEmailMessage("権限を付与しました");
    create.setFields("*");
    
    Permission res = create.execute();
    System.out.println(res);
}
```
#### 2.2.1. HTTPリクエスト
POST:　https:\//www.googleapis.com/drive/v3/files/{ファイルID}/permissions
が実行されます。

#### 2.2.2. クエリパラメータ
Drive.Permissions.Createのsetメソッドにより、クエリパラメータを追加できます。

|メソッド|引数|説明|
|---|---|---|
|setEmailMessage|String|通知メールに含めるプレーン テキストのカスタムメッセージ|
|setMoveToNewOwnersRoot|Boolean|親を変更するか<br>アイテムが共有ドライブになくリクエストがアイテムの所有権を譲渡しようとしている場合のみ|
|setSendNotificationEmail|Boolean|ユーザーまたはグループに共有するときに通知メールを送信するかどうか<br>デフォルトはture|
|setSupportsAllDrives|Boolean|要求元のアプリケーションがマイドライブと共有ドライブの両方をサポートしているか|
|setTransferOwnership|Boolean|所有権を指定したユーザーに譲渡し、現在の所有者をライターにダウングレードするか|
|setUseDomainAdminAccess|Boolean|ドメイン管理者としてリクエストを発行するか|

#### 2.2.3. リクエストボディ
Permissionのsetメソッドにより、リクエストボディを設定できます。

|メソッド|引数|説明|
|---|---|---|
|setType|String|[アクセス権の付与タイプ](#11-アクセス権の付与タイプ)|
|setEmailAddress|String|このパーミッションが参照するユーザーまたはグループの電子メールアドレス|
|setRole|String|[このパーミッションによって付与される役割](#12-役割ロール)|
|setAllowFileDiscovery|Boolean|検索によるファイルの検出を許可するパーミッションかどうか。<br>typeがdomain、anyoneの場合のみ|
|setDomain|String|このパーミッションが参照するドメイン|
|setExpirationTime|[DateTime](#datetime)|このパーミッションが期限切れになる時刻<br>typeがuser、groupの場合のみ|
|setPendingOwner|Boolean|このパーミッションに関連付けられたアカウントが保留中の所有者であるか<br>typeがuserで、共有ドライブにないファイルのタイプのパーミッションのみ|

#### DateTime

|メソッド|引数|説明|
|---|---|---|
|setValue|long|unixミリ秒|
|setTimeZoneShift|int|UTCからの分数で表されるタイムゾーン|

### 2.3. レスポンスの内容

#### Permission

|フィールド|メソッド|戻り値|説明|
|---|---|---|---|
|id|getId|String|パーミッションID|
|type|getType|String|[被付与者のタイプ](#11-アクセス権の付与タイプ)|
|displayName|getDisplayName|String|パーミッション名|
|kind|getKind|String|リソースの識別名<br>固定文字列：\"drive#permission\"|
|permissionDetails|getPermissionDetails|List\<[Permission.PermissionDetails](#permissionpermissiondetails)\>|アクセス許可の継承についての詳細<br>**共有ドライブのみ**|
|photoLink|getPhotoLink|String|ユーザーのプロフィール写真へのリンク|
|emailAddress|getEmailAddress|String|参照するユーザーまたはグループの電子メールアドレス|
|role|getRole|String|[付与される役割](#12-役割ロール)|
|allowFileDiscovery|getAllowFileDiscovery|Boolean|検索によるファイルの検出を許可するパーミッションか<br>**typeがanyoneの場合のみ**|
|domain|getDomain|String|パーミッションが参照するドメイン|
|expirationTime|getExpirationTime|String|期限切れになる時刻|
|deleted|getDeleted|Boolean|関連付けられたアカウントが削除されているか<br>**typeがuser、groupの場合のみ**|
|view|getView|String|パーミッションのビュー(publishedのみ)|
|pendingOwner|getPendingOwner|Boolean|関連付けられたアカウントが保留中の所有者であるか|

#### Permission.PermissionDetails
|メソッド|戻り値|説明|
|---|---|---|
|getPermissionType|String|パーミッションのタイプ<br>file、member|
|getInheritedFrom|String|継承元となるアイテムのID|
|getRole|String|[主な役割](#12-役割ロール)|
|getInherited|Boolean|パーミッションが継承されるかどうか|

## 3. パーミッションを更新

### 3.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
DriveScopes.DRIVE
DriveScopes.DRIVE_FILE
```
[⧉[Google Drive API v3] JavaでDrive APIを使う(2.2 Driveインスタンスを取得)](https://qiita.com/doran/items/15b2c59adb410ddeeb8a#22-driveインスタンスを取得)
でスコープを指定してください。
### 3.2. 実行
APIを実行します。
変更したいファイルのファイルIDとパーミッションIDを指定します。
```java
public static void main(String[] args) throws Exception{
    Drive drive = getDrive();
    Drive.Permissions permissions = drive.permissions();
    
    permission.setEmailAddress("xxxx@gmail.com");
    permission.setType("user");
    permission.setRole("reader");
    
    Drive.Permissions.Update update = permissions.update("ファイルID", "パーミッションID", permission);
    
    Permission res = update.execute();
    System.out.println(res);
}
```
#### 3.2.1. HTTPリクエスト
PATCH：　https:\//www.googleapis.com/drive/v3/files/{ファイルID}/permissions/{パーミッションID}
が実行されます。

#### 3.2.2. クエリパラメータ
Drive.Permissions.Getのsetメソッドにより、クエリパラメータを追加できます。

|メソッド|引数|説明|
|---|---|---|
|setRemoveExpiration|Boolean|有効期限を削除するか|
|setSupportsAllDrives|Boolean|要求元のアプリケーションがマイドライブと共有ドライブの両方をサポートしているか|
|setTransferOwnership|Boolean|所有権を指定したユーザーに譲渡し、現在の所有者をライターにダウングレードするか|
|setUseDomainAdminAccess|Boolean|ドメイン管理者としてリクエストを発行するか|

#### 3.2.3. リクエストボディ
Permissionのsetメソッドにより、リクエストボディを設定できます。

[2.2.3. リクエストボディ](#223-リクエストボディ)と同じです。

### 3.3. レスポンスの内容
#### Permission

[2.3. レスポンスの内容](#23-レスポンスの内容)と同じです。

## 4. パーミッションを削除

### 4.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
DriveScopes.DRIVE
DriveScopes.DRIVE_FILE
```
[⧉[Google Drive API v3] JavaでDrive APIを使う(2.2 Driveインスタンスを取得)](https://qiita.com/doran/items/15b2c59adb410ddeeb8a#22-driveインスタンスを取得)
でスコープを指定してください。
### 4.2. 実行
APIを実行します。
削除したいパーミッションのファイルIDとパーミッションIDを指定します。
```java
public static void main(String[] args) throws Exception{
    Drive drive = getDrive();
    Drive.Permissions permissions = drive.permissions();

	Drive.Permissions.Delete delete = permissions.delete("ファイルID", "パーミッションID");
		
	delete.execute();
}
```
#### 4.2.1. HTTPリクエスト
DELETE：　https:\//www.googleapis.com/drive/v3/files/{ファイルID}/permissions/{パーミッションID}
が実行されます。

#### 4.2.2. クエリパラメータ
Drive.Permissions.Deleteのsetメソッドにより、クエリパラメータを追加できます。

|メソッド|引数|説明|
|---|---|---|
|setSupportsAllDrives|Boolean|要求元のアプリケーションがマイドライブと共有ドライブの両方をサポートしているか|
|setUseDomainAdminAccess|Boolean|ドメイン管理者としてリクエストを発行するか|

### 4.3. レスポンスの内容

成功した場合は何も返しません。
失敗した場合は例外を出力します。

<br>
<br>
おしまい。。