[Google Calendar API(V3)] Javaでアクセス制御ルール(ACL)を作成・更新・削除する

Google Calendar API V3(Java)を使用して、
Googleカレンダーのアクセス制御ルール(ACL)を取得する方法
についてご紹介します。

**カレンダーのアクセス制御ルール(ACL)とは**
指定したユーザー、またはグループと予定の共有ができます。
UIでは、カレンダーの設定 -> [特定のユーザーまたはグループと共有する]
から設定できる内容です。
<img width=480 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/b4ceb33f-d6c5-84ce-49fb-a1e68d192a65.png">

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

|No||目次|
|---|---|---|
|1||[アクセス制御ルールを作成](#1-アクセス制御ルールを作成)|
||1|[スコープ](#11-スコープ)|
||2|[実行](#12-実行)|
||3|[レスポンスの内容](#13-レスポンスの内容)|
|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. アクセス制御ルールを作成
Googleカレンダーのアクセス制御ルールを作成します。

### 1.1. スコープ
このAPIを実行するには、以下のスコープを指定してください。
```
CalendarScopes.CALENDAR
```
[⧉[Google Calendar API(V3)] JavaでCalendar APIを使う(2.2 Driveインスタンスを取得)](https://qiita.com/doran/items/c735c7b05c0a2ed4bfdb#22-calendarインスタンスを取得)
でスコープを指定してください。

### 1.2. 実行

```java
public static void main(String[] args) throws Exception{
    Calendar calendar = getCalendar();
    Calendar.Acl acl = calendar.acl();
    
    AclRule content = new AclRule();
    content.setRole("reader");
    content.setScope(new Scope().setType("user").setValue("メールアドレス"));
    Calendar.Acl.Insert insert = acl.insert("カレンダーID",content);
    
    AclRule res = insert.execute();
    System.out.println(res);
}
```
#### 1.2.1. HTTPリクエスト
POST:　https:\//www.googleapis.com/calendar/v3/calendars/{カレンダーID}/acl
が実行されます。

#### 1.2.2. クエリパラメータ
Calendar.Acl.Insertのsetメソッドにより、クエリパラメータを追加できます。

|メソッド|引数|説明|
|---|---|---|
|setSendNotifications|Boolean|カレンダーの共有の変更に関する通知を送信するか|

#### 1.2.3. リクエストボディ
AclRuleのsetメソッドにより、リクエストボディを追加できます。

|メソッド|引数|説明|
|---|---|---|
|setRole|String|【必須(作成・上書き)】<br>[スコープに割り当てられたロール](#ロール)|
|setScope|[Scope](#scopeset)|【必須(作成・上書き)】<br>ACLルールによってカレンダーへのアクセスが許可される範囲|	

#### Scope(set)
|メソッド|戻り値|説明|
|---|---|---|
|setType|String|【必須(作成・上書き)】<br>[スコープのタイプ](#スコープタイプ)|
|setValue|String|ユーザーまたはグループのメールアドレス、またはドメインの名前|

#### ロール
|定義値|内容|
|---|---|
|none|アクセスは許可されない|
|freeBusyReader|空き時間情報への読み取りアクセス権を付与<br><br>UI:[予定の表示(時間枠のみ、詳細は非表示)]|
|reader|読み取り権限を付与<br><br>UI:[予定の表示(すべての予定の詳細)]|
|writer|読み取りおよび書き込み権限を付与<br><br>UI:[予定の変更]|
|owner|所有権を提供<br><br>UI:[変更および共有の管理権限]|

#### スコープタイプ
|定義値|内容|
|---|---|
|default|パブリック スコープ|
|user|1人のユーザーに制限|
|group|グループに制限|
|domain|ドメインに制限|

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

#### AclRule
|メソッド|戻り値|説明|
|---|---|---|
|getEtag|String|Eタグ|
|getId|String|ACLルールID|
|getKind|String|リソースの種類<br>固定文字列："calendar#aclRule"|
|getRole|String|[スコープに割り当てられたロール](#ロール)|
|getScope|[Scope](#scope)|ACLルールによってカレンダーへのアクセスが許可される範囲|	

#### Scope
|メソッド|戻り値|説明|
|---|---|---|
|getType|String|[スコープのタイプ](#スコープタイプ)|
|getValue|String|ユーザーまたはグループのメールアドレス、またはドメインの名前|

## 2. アクセス制御ルールを上書き
Googleカレンダーの指定したアクセス制御ルールを上書きします。

[3. アクセス制御ルールを更新](#3-アクセス制御ルールを更新)と違うところは、
指定した存在するアクセス制御ルールを新しいアクセス制御ルールに置き換えます。

アクセス制御ルールのID(ACLルールID)は、
[1. アクセス制御ルールを作成(AclRule)](#aclrule)のgetId()で取得した値を使います。

また、ScopeのsetTypeとsetValueは上書き前の値と同じにしなければなりません。
異なった場合は例外が発生します。

### 2.1. スコープ
このAPIを実行するには、以下のスコープを指定してください。
```
CalendarScopes.CALENDAR
```
[⧉[Google Calendar API(V3)] JavaでCalendar APIを使う(2.2 Driveインスタンスを取得)](https://qiita.com/doran/items/c735c7b05c0a2ed4bfdb#22-calendarインスタンスを取得)
でスコープを指定してください。

### 2.2. 実行

```java
public static void main(String[] args) throws Exception{
    Calendar calendar = getCalendar();
    Calendar.Acl acl = calendar.acl();
    
    AclRule content = new AclRule();
    content.setRole("reader");
    content.setScope(new Scope().setType("user").setValue("ACLルールID"));
    Calendar.Acl.Update update = acl.update("カレンダーID","ACLルールID",content);
    
    AclRule res = update.execute();
    System.out.println(res);
}
```
#### 2.2.1. HTTPリクエスト
PUT:　https:\//www.googleapis.com/calendar/v3/calendars/{カレンダーID}/acl/{ACLルールID}
が実行されます。

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

|メソッド|引数|説明|
|---|---|---|
|setSendNotifications|Boolean|カレンダーの共有の変更に関する通知を送信するか|

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

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

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

#### AclRule

[1.3. レスポンスの内容(AclRule)](#aclrule)と同じです。

## 3. アクセス制御ルールを更新
Googleカレンダーの指定したアクセス制御ルールを更新します。

[2. アクセス制御ルールを上書き](#2-アクセス制御ルールを上書き)と違うところは、
指定した存在するアクセス制御ルールを更新します。

アクセス制御ルールのID(ACLルールID)は、
[1. アクセス制御ルールを作成(AclRule)](#aclrule)のgetId()で取得した値を使います。

### 3.1. スコープ
このAPIを実行するには、以下のスコープを指定してください。
```
CalendarScopes.CALENDAR
```
[⧉[Google Calendar API(V3)] JavaでCalendar APIを使う(2.2 Driveインスタンスを取得)](https://qiita.com/doran/items/c735c7b05c0a2ed4bfdb#22-calendarインスタンスを取得)
でスコープを指定してください。

### 3.2. 実行

```java
public static void main(String[] args) throws Exception{
    Calendar calendar = getCalendar();
    Calendar.Acl acl = calendar.acl();
    
    AclRule content = new AclRule();
    content.setRole("reader");
    Calendar.Acl.Patch patch = acl.patch("カレンダーID","ACLルールID",content);
    
    AclRule res = patch.execute();
    System.out.println(res);
}
```
#### 3.2.1. HTTPリクエスト
PATCH:　https:\//www.googleapis.com/calendar/v3/calendars/{カレンダーID}/acl/{ACLルールID}
が実行されます。

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

|メソッド|引数|説明|
|---|---|---|
|setSendNotifications|Boolean|カレンダーの共有の変更に関する通知を送信するか|

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

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

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

#### AclRule

[1.3. レスポンスの内容(AclRule)](#aclrule)と同じです。

## 4. アクセス制御ルールを削除
Googleカレンダーの指定したアクセス制御ルールを削除します。

アクセス制御ルールのID(ACLルールID)は、
[1. アクセス制御ルールを作成(AclRule)](#aclrule)のgetId()で取得した値を使います。

### 4.1. スコープ
このAPIを実行するには、以下のスコープを指定してください。
```
CalendarScopes.CALENDAR
```
[⧉[Google Calendar API(V3)] JavaでCalendar APIを使う(2.2 Driveインスタンスを取得)](https://qiita.com/doran/items/c735c7b05c0a2ed4bfdb#22-calendarインスタンスを取得)
でスコープを指定してください。

### 4.2. 実行

```java
public static void main(String[] args) throws Exception{
    Calendar calendar = getCalendar();
    Calendar.Acl acl = calendar.acl();
    
    Calendar.Acl.Delete delete = acl.delete("カレンダーID","ACLルールID");
    
    delete.execute();
}
```
#### 4.2.1. HTTPリクエスト
DELETE:　https:\//www.googleapis.com/calendar/v3/calendars/{カレンダーID}/acl/{ACLルールID}
が実行されます。

#### 4.2.2. クエリパラメータ
クエリパラメータはありません。

#### 4.2.3. リクエストボディ
リクエスボディはありません。

### 4.3. レスポンスの内容
レスポンスはありません。
削除に失敗した場合、例外が発生します。

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