【vte.cx入門】10.グループを作成し共有フォルダを作成する

vte.cxではグループを作成し、グループ独自の共有フォルダを作成できます。

vte.cxの共有フォルダ機能には以下のようなメリットがあります。

* グループを作成することで、複数のユーザーの権限をまとめて管理できます。
* グループごとにユーザ検索ができるようになります。
* 共有フォルダを作成することで、グループ内で情報共有ができるようになります。

今回は共有フォルダを作成する流れを説明します。

# 大まかな流れ

共有フォルダの作成は大まかに以下のような流れになります。

1. グループを作成する
2. グループにメンバーを追加する
3. グループの共有フォルダを作成する

この一通りの流れを実行すると**「共有フォルダ」**が作成できます。

# 1. グループを作成する
## グループとは

* 集団(しゅうだん) 
* 組(くみ) 
* チーム 

例えば、一つのアプリの管理を行うとき、「データを登録するグループ（Aグループ）」と「データを編集するグループ（Bグループ）」に分けたりする場合があると思います。そういったグループ分けをvte.cxでは行うことができます。

## /{uid}/groupにグループを作成する
### /{uid}/groupとは
ユーザ作成時に自動的に登録される特別なフォルダです。
**グループフォルダ**と呼びます。
/{uid}/groupでは{uid}が所属しているグループを管理します。

※ uidについては[こちら](http://reflexworks.jp/documentation.html#taggingservice.html#R1)をご覧ください。

### グループ用フォルダの例

今回は例として、**「hoge」**グループを作成したいと思います。
また、hogeグループを作成するユーザのuidを**「123」**とします。

以下のデータを/123/group配下に登録すると「hoge」グループが作成できます。

```
<entry>
  <contributor>
    <uri>urn:vte.cx:acl:123,CRUD.</uri>
  </contributor>
  <contributor>
    <uri>urn:vte.cx:acl:-,R.</uri>
  </contributor>
  <contributor>
    <uri>urn:vte.cx:acl:/123/group/hoge,CRUD/</uri>
  </contributor>
  <link rel="self" href="/123/group/hoge" />
</entry>
```

[グループ用フォルダの解説はこちら](#グループ用フォルダの解説)

# 2. グループにメンバーを追加する
hogeグループの作成ができたら、今度はhogeグループにメンバーを追加します。

## 作成したグループデータにメンバーをリンクさせる
以下のように、**作成したグループデータにlink項目のrel="alternate"を追加する**と、任意のメンバーを追加することができます。

```
<entry>
  <contributor>
    <uri>urn:vte.cx:acl:123,CRUD.</uri>
  </contributor>
  <contributor>
    <uri>urn:vte.cx:acl:-,R.</uri>
  </contributor>
  <contributor>
    <uri>urn:vte.cx:acl:/123/group/hoge,CRUD/</uri>
  </contributor>
  <id>/123/group/hoge,1</id>
  <link rel="self" href="/123/group/hoge" />
  <link rel="alternate" href="/{メンバーのuid}/group/hoge" />    ←   このlink項目を追加する
</entry>
```

あとはこれをPUTで更新するだけです。（id項目のリビジョン番号は一致させる必要があります。）

**基本はこれだけでメンバーの追加ができます。**
[link項目のrel="alternate"について解説はこちら](#link項目のrel="alternate"でデータをリンクさせる)


## 追加されたメンバーが確認して承認を行う（署名機能）
グループにメンバーを追加することは誰にでもできます。
追加されたメンバーはそれが意図したグループなのかの確認を行うために、**「私はこのグループに参加します」と宣言（承認）する**必要があります。

その時に**署名機能**を利用して署名することで承認したことになります。

123ユーザがhogeグループに987ユーザを追加した時、
987ユーザは以下のリクエストを実行し、署名をしてください。

````lang:署名のリクエスト
PUT /987/group/hoge?_signature=1
```
_signatureの値は**/123/group/hogeのリビジョン番号**です。

署名が成功すると以下のレスポンスが返ってきます。

```
<feed>
  <title>200</title>
  <subtitle>A signature has been applied.</subtitle>
</feed>
```

### 署名後のグループデータ

```
<feed>
  <entry>
    <author>
      <uri>urn:vte.cx:created:123</uri>
    </author>
    <author>
      <uri>urn:vte.cx:updated:987</uri>
    </author>
    <id>/123/group/hoge,2</id>
    <link href="/123/group/hoge" rel="self"/>
    <link href="/987/group/hoge" rel="alternate" title="2,+x1l7fURrHFbv8XzP+170K1C+VkO6sWRLdhovElbjW0="/>
    <published>2015-12-08T11:39:54.698+09:00</published>
    <updated>2015-12-08T13:11:45.697+09:00</updated>
  </entry>
</feed>
```
link rel="alternate"のtitleの値に署名値がセットされています。
これで署名完了です。

その他の署名についての仕様は[こちら](http://reflexworks.jp/documentation.html#taggingservice.html#S)をご参照ください。


# 3. グループの共有フォルダを作成する
メンバーに署名を行ってもらい、正式に追加できたら、/123/group/hoge配下に任意のデータを登録すれば、それがグループ内の共有フォルダになります。

```
/d
   /123
      /group
         /hoge
            /hoge_group_folder1    ←    hogeグループの共有フォルダ
            /hoge_group_folder2    ←    hogeグループの共有フォルダ
            /hoge_group_folder3    ←    hogeグループの共有フォルダ
```

これでグループ内での共有フォルダの作成方法を終わります。

その他のフォルダ共有の詳しい仕様は[こちら](http://reflexworks.jp/documentation.html#taggingservice.html#GR)をご参照ください。



ここから下は上記説明の補足説明となります。
# グループ用フォルダの解説

・{uid}にCRUD権限を付与します。
（CRUD権限については[こちら](http://reflexworks.jp/documentation.html#taggingservice.html#C1)のACLの種類をご参照ください。）
**※ グループを作成する際は必ず設定してください。**

```lang:{uid}にCRUD権限
  <contributor>
    <uri>urn:vte.cx:acl:123,CRUD.</uri>
  </contributor>
```

・「link selfまたはエイリアスのユーザトップエントリーのユーザが参照できる」という権限を与えられます。
（「-（マイナス）」権限については[こちら](http://reflexworks.jp/documentation.html#taggingservice.html#C1)のACLの種類をご参照ください。）
**※ グループを作成する際は必ず設定してください。**

```lang:linkselfまたはエイリアスのユーザトップエントリーのユーザが参照できる権限
  <contributor>
    <uri>urn:vte.cx:acl:-,R.</uri>
  </contributor>
```

・「{uid}は/{uid}/group/hoge配下を自由に編集できる」という権限を与えられます。
**※ グループを作成する際は必ず設定してください。**

```lang:{uid}は/hoge配下を自由に編集できる権限
  <contributor>
    <uri>urn:vte.cx:acl:/123/group/hoge,CRUD/</uri>
  </contributor>
```

# link項目のrel="alternate"でデータをリンクさせる
これはUnixのシンボリックリンクに似た機能です。
link項目のrel="alternate"を追加すると、どのようなことが起こるのか解説します。

* メンバー1のuidを**123**とする
* メンバー2のuidを**987**とする

/123/groupには、/hogeというデータがあるとします。

```
/123
   /group
      /hoge
```

一方、/987/groupには、/hogeというデータは存在しません。

```
/987
   /group
            ←  /hogeはない
```

これをlink項目のrel="alternate"を使用し、**「/123/group/hoge」を「/987/group」にリンク付ける**と以下のようになります。

```
/987
   /group
      /hoge   ←  /123/groupの/hogeがここに作成される
```

/987/groupには実際に/hogeデータは登録していないが、**/123/group/hogeがリンク付けされたので、/987/groupの配下に/123/groupの/hogeが作成された**状態になります。

このリンク付けが行われている状態で/123/group/hogeの配下にデータを登録すると、/987/group/hogeにも反映されます。

```
/123
   /group
      /hoge
         /123_hoge1    ←   123ユーザが作成したデータ
```

```
/987
   /group
      /hoge            ←   リンクされた/123/group/hoge
         /123_hoge1    ←   123ユーザが作成したデータが/987にも反映される
```

これが、link項目のrel="alternate"の機能です。

## どのようにリンクさせるのか

/123/group/hogeデータにリンク先（/987/group/hoge）をlink項目のrel="alternate"で指定します。

```
<entry>
    <link href="/123/group/hoge" rel="self" />       ←  実データ
    <link href="/987/group/hoge" rel="alternate" />  ←  リンク先
</entry>
```