vte.cxではグループを作成し、グループ独自の共有フォルダを作成できます。
vte.cxの共有フォルダ機能には以下のようなメリットがあります。
- グループを作成することで、複数のユーザーの権限をまとめて管理できます。
- グループごとにユーザ検索ができるようになります。
- 共有フォルダを作成することで、グループ内で情報共有ができるようになります。
今回は共有フォルダを作成する流れを説明します。
大まかな流れ
共有フォルダの作成は大まかに以下のような流れになります。
- グループを作成する
- グループにメンバーを追加する
- グループの共有フォルダを作成する
この一通りの流れを実行すると**「共有フォルダ」**が作成できます。
1. グループを作成する
グループとは
- 集団(しゅうだん)
- 組(くみ)
- チーム
例えば、一つのアプリの管理を行うとき、「データを登録するグループ(Aグループ)」と「データを編集するグループ(Bグループ)」に分けたりする場合があると思います。そういったグループ分けをvte.cxでは行うことができます。
/{uid}/groupにグループを作成する
/{uid}/groupとは
ユーザ作成時に自動的に登録される特別なフォルダです。
グループフォルダと呼びます。
/{uid}/groupでは{uid}が所属しているグループを管理します。
※ uidについてはこちらをご覧ください。
グループ用フォルダの例
今回は例として、**「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"について解説はこちら
追加されたメンバーが確認して承認を行う(署名機能)
グループにメンバーを追加することは誰にでもできます。
追加されたメンバーはそれが意図したグループなのかの確認を行うために、「私はこのグループに参加します」と宣言(承認)する必要があります。
その時に署名機能を利用して署名することで承認したことになります。
123ユーザがhogeグループに987ユーザを追加した時、
987ユーザは以下のリクエストを実行し、署名をしてください。
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>
```