Yellowfin REST API ： クライアント組織の管理

## はじめに
REST API を介して Yellowfin を管理する方法は、以前にもいくつかご紹介差し上げています。
今回は、[クライアント組織](https://wiki.yellowfin.co.jp/pages/viewpage.action?pageId=3801315)の管理にかかわる内容を紹介します。クライアント組織の情報参照、新規作成、組織へのユーザー登録などに関する処理です。なお、サンプルコードはすべて php で記述しています。

## アクセストークンの取得
REST API 経由でリソースの参照、作成、追加などの処理を行う場合、まずはアクセストークンの取得が必須となります。
アクセストークンを取得するまでのコードは、[第 1 回 『Yellowfin REST API エクスポートできるコンテンツの確認』]( https://qiita.com/ExtremeCarvFJ/items/34447db30788b8a1445e) を参照ください。

## 組織情報の参照

アクセストークンを取得したら、続いて以下のコードを順に記述します。

・クライアント組織の管理に関わる処理は、/api/orgs/ API を使用します。
```php:getOrgs.php
$url3 = 'http://localhost:8080/api/orgs/';
```

・API に引き渡すヘッダー情報の中に、アクセストークンを含めます。
```php:getOrgs.php
$header3 = array(
    'Authorization:YELLOWFIN ts='.$time.', nonce=123, token='.$accessToken,
    'Accept:application/vnd.yellowfin.api-v2+json'
);
```

・curl で処理を実行します。先のコードで作成したヘッダー情報などを伴って、GET で情報を要求します。
```php:getOrgs.php
$ch3 = curl_init();
curl_setopt($ch3, CURLOPT_URL, $url3);
curl_setopt($ch3, CURLOPT_HTTPHEADER, $header3);
curl_setopt($ch3, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch3, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch3, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch3, CURLOPT_RETURNTRANSFER, true); 
$result3 = curl_exec($ch3);
$result3_json = json_decode($result3, true);
curl_close($ch3);
```
・result3_json に、組織に関する情報が JSON の配列の形で格納されます。具体的な形式は、[開発者サイト Response samples](https://developers.yellowfinbi.com/dev/api-docs/current/#operation/createOrg) に説明があります。見やすくするために、result3_json からクライアント組織の内部 ID、クライアント参照 ID 、名前、タイムゾーン、カスタムスタイルパスに関する情報だけを抜き出し、カンマ区切りの CSV 形式に変更しています。
```php:getOrgs.php
$i=0;
foreach($result3_json["items"] as $value) {
    $orgInfo=$result3_json["items"][$i]["ipOrg"].','.$result3_json["items"][$i]["clientRefId"].','. 
             $result3_json["items"][$i]["name"].','.$result3_json["items"][$i]["defaultTimezone"].','.
             $result3_json["items"][$i]["customStylePath"]."\n";
    echo($orgInfo);
    $i++;
}
```

・getOrgs.php を実行すると、以下のような結果が返ってきます。
```powershell:実行結果
1,,Default,ASIA/TOKYO,
13151,001,A社,ASIA/TOKYO,001
13204,002,B社,ASIA/TOKYO,002
```
この中で、13151、13204 が ipOrg と呼ばれる内部 ID で、クライアント組織を一位に認識する情報です。この情報を、組織にユーザーを登録する処理の中で使用します。

## クライアント組織の新規作成

アクセストークンを取得したら、続いて以下のコードを順に記述します。

・情報参照の処理と同様に、/api/orgs/ API を使用します。

```php:createOrg.php
$url3 = 'http://localhost:8080/api/orgs/';
```

・API に引き渡すヘッダー情報の中に、アクセストークンを含めます。
```php:createOrg.php
$header3 = array(
    'Authorization:YELLOWFIN ts='.$time.', nonce=123, token='.$accessToken,
    'Accept:application/vnd.yellowfin.api-v2+json',
    'Content-Type:application/json'
);
```

・作成するクライアント組織の情報を JSON 形式の外部ファイルから読み込みます。
```php:createOrg.php
ob_start();
include("org.json");
$orgData = ob_get_clean();
```
・下記は、クライアント参照 ID が 003 の、C 社という名前の組織を追加する JSON の例です。JSON ファイルに含める各項目の詳細は、[開発者サイトの REQUEST BODY SCHEME](https://developers.yellowfinbi.com/dev/api-docs/current/#operation/createOrg) の箇所をご確認ください。
```json:org.json
{
    "clientRefId": "003",
    "name": "C社",
    "defaultTimezone": "ASIA/TOKYO",
    "customStylePath": "003"
}

```
・curl で処理を実行します。先のコードで作成したヘッダー、ボディー情報などを伴って、POST で要求します。
```php:createOrg.php$ch3 = curl_init();
curl_setopt($ch3, CURLOPT_HTTPHEADER, $header3);
curl_setopt($ch3, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch3, CURLOPT_POSTFIELDS, $orgData);
curl_setopt($ch3, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch3, CURLOPT_URL, $url3);
$result3 =curl_exec($ch3);
curl_close($ch3);
```

## クライアント組織へのユーザー登録
クライアント組織にユーザーを所属させるためには、クライアント組織の ID (ipOrg) と、ユーザーの ID (userId) に関する情報が必要となります。ipOrg の確認方法は先述の通りです。 userId の確認方法は [『Yellowfin 情報参照プログラム PHP + REST API でロール / ユーザー / グループなどの情報を取得』](https://qiita.com/ExtremeCarvFJ/items/0d3d9005b03e917ad839)の記事をご確認ください。

アクセストークンを取得したら、続いて以下のコードを順に記述します。

・URL の一部に、ipOrg を含めます。
```php:regUserToOrg
$iporg='13204';
$url3 = 'http://localhost:8080/api/orgs/'.$iporg.'/user-access/';
```
・ヘッダー情報として、取得したアクセストークンを受け渡します。
```php:regUserToOrg
$header3 = array(
    'Authorization:YELLOWFIN ts='.$time.', nonce=123, token='.$accessToken,
    'Accept:application/vnd.yellowfin.api-v2+json',
    'Content-Type:application/json'
);
```

・登録するユーザーの情報を JSON ファイルから読み込みます。
```php:regUserToOrg
ob_start();
include("userOrg.json");
$orgData = ob_get_clean();
```
・JSON ファイルには、登録するユーザーの userId 情報のみを含みます。
```json:userOrg.json
{
    "userId": 13202
}
```
・curl で処理を実行します。先のコードで作成したヘッダー、ボディー情報などを伴って、POST で要求します。
```php:regUserToOrg 
$ch3 = curl_init();
curl_setopt($ch3, CURLOPT_HTTPHEADER, $header3);
curl_setopt($ch3, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch3, CURLOPT_POSTFIELDS, $orgData);
curl_setopt($ch3, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch3, CURLOPT_URL, $url3);
$result3 =curl_exec($ch3);
curl_close($ch3);
```

## 最後に
[開発者サイト](https://developers.yellowfinbi.com/dev/api-docs/current/#tag/orgs)には、上記で説明した以外にも、様々な API が紹介されています。いずれも、本記事内のサンプルコードを修正することでほぼ対応が可能です。
いろいろとお試しください。

では皆様、良いデータ分析を! Cheers!! Santé!

## おまけ コード全容

```php:getOrgs.php
//変数の宣言
$adminId = 'admin@yellowfin.com.au';
$adminPassword = 'test';
$time = ceil(microtime(true)*1000);
$url = 'http://localhost:8080/api/refresh-tokens';
$url2 = 'http://localhost:8080/api/access-tokens';
$refreshToken = "";
$accessToken = "";

//リフレッシュトークン：HEADERデータ作成
$header = array(
    'Authorization:YELLOWFIN ts='.$time.', nonce=123',
    'Accept:application/vnd.yellowfin.api-v2+json',
    'Content-Type:application/json;charset=UTF-8'
);

//リフレッシュトークン：BODYデータ作成
$body = array(
    'userName'=>$adminId,
    'password'=>$adminPassword
);
$body_json = json_encode($body, JSON_PRETTY_PRINT);

//リフレッシュトークン：Yellowfinにトークンを要求
$ch = curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, $body_json);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, $url);
$result = curl_exec($ch);
$json_result = json_decode($result);
$refreshToken = $json_result->securityToken;
curl_close($ch);

//アクセストークン：HEADERデータ作成
$header2 = array(
    'Authorization:YELLOWFIN ts='.$time.', nonce=123, token='.$refreshToken,
    'Accept:application/vnd.yellowfin.api-v2+json',
    'Content-Type:application/json'
);

//アクセストークン：Yellowfinにトークンを要求
$ch2 = curl_init();
curl_setopt($ch2, CURLOPT_HTTPHEADER, $header2);
curl_setopt($ch2, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch2, CURLOPT_POSTFIELDS, '');
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_URL, $url2);
curl_close($ch);
$result2 = curl_exec($ch2);
$json_result2 = json_decode($result2);
$accessToken=$json_result2->securityToken;

//変数の宣言
$url3 = 'http://localhost:8080/api/orgs/';

//クライアント組織参照：HEADERデータ作成
$header3 = array(
	'Authorization:YELLOWFIN ts='.$time.', nonce=123, token='.$accessToken,
	'Accept:application/vnd.yellowfin.api-v2+json'
);

//クライアント組織参照：処理
$ch3 = curl_init();
curl_setopt($ch3, CURLOPT_URL, $url3);
curl_setopt($ch3, CURLOPT_HTTPHEADER, $header3);
curl_setopt($ch3, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch3, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch3, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch3, CURLOPT_RETURNTRANSFER, true); 
$result3 = curl_exec($ch3);
$result3_json = json_decode($result3, true);
curl_close($ch3);

//クライアント組織：情報出力
$i=0;
foreach($result3_json["items"] as $value) {
    $orgInfo=$result3_json["items"][$i]["ipOrg"].','.$result3_json["items"][$i]["clientRefId"].','. 
             $result3_json["items"][$i]["name"].','.$result3_json["items"][$i]["defaultTimezone"].','.
             $result3_json["items"][$i]["customStylePath"]."\n";
    echo($orgInfo);
    $i++;
}
```

```php:createOrg.php
//変数の宣言
$adminId = 'admin@yellowfin.com.au';
$adminPassword = 'test';
$time = ceil(microtime(true)*1000);
$url = 'http://localhost:8080/api/refresh-tokens';
$url2 = 'http://localhost:8080/api/access-tokens';
$refreshToken = "";
$accessToken = "";

//リフレッシュトークン：HEADERデータ作成
$header = array(
    'Authorization:YELLOWFIN ts='.$time.', nonce=123',
    'Accept:application/vnd.yellowfin.api-v2+json',
    'Content-Type:application/json;charset=UTF-8'
);

//リフレッシュトークン：BODYデータ作成
$body = array(
    'userName'=>$adminId,
    'password'=>$adminPassword
);
$body_json = json_encode($body, JSON_PRETTY_PRINT);

//リフレッシュトークン：Yellowfinにトークンを要求
$ch = curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, $body_json);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, $url);
$result = curl_exec($ch);
$json_result = json_decode($result);
$refreshToken = $json_result->securityToken;
curl_close($ch);

//アクセストークン：HEADERデータ作成
$header2 = array(
    'Authorization:YELLOWFIN ts='.$time.', nonce=123, token='.$refreshToken,
    'Accept:application/vnd.yellowfin.api-v2+json',
    'Content-Type:application/json'
);

//アクセストークン：Yellowfinにトークンを要求
$ch2 = curl_init();
curl_setopt($ch2, CURLOPT_HTTPHEADER, $header2);
curl_setopt($ch2, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch2, CURLOPT_POSTFIELDS, '');
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_URL, $url2);
curl_close($ch);
$result2 = curl_exec($ch2);
$json_result2 = json_decode($result2);
$accessToken=$json_result2->securityToken;

//変数の宣言
$url3 = 'http://localhost:8080/api/orgs/';

//クライアント組織作成：HEADERデータ作成
$header3 = array(
	'Authorization:YELLOWFIN ts='.$time.', nonce=123, token='.$accessToken,
	'Accept:application/vnd.yellowfin.api-v2+json',
	'Content-Type:application/json'
);

//クライアント組織作成：データ読込
ob_start();
include("org.json");
$orgData = ob_get_clean();

//クライアント組織作成：作成
$ch3 = curl_init();
curl_setopt($ch3, CURLOPT_HTTPHEADER, $header3);
curl_setopt($ch3, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch3, CURLOPT_POSTFIELDS, $orgData);
curl_setopt($ch3, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch3, CURLOPT_URL, $url3);
$result3 =curl_exec($ch3);
curl_close($ch3);
```

```php:regUserToOrg 
//変数の宣言
$adminId = 'admin@yellowfin.com.au';
$adminPassword = 'test';
$time = ceil(microtime(true)*1000);
$url = 'http://localhost:8080/api/refresh-tokens';
$url2 = 'http://localhost:8080/api/access-tokens';
$refreshToken = "";
$accessToken = "";

//リフレッシュトークン：HEADERデータ作成
$header = array(
    'Authorization:YELLOWFIN ts='.$time.', nonce=123',
    'Accept:application/vnd.yellowfin.api-v2+json',
    'Content-Type:application/json;charset=UTF-8'
);

//リフレッシュトークン：BODYデータ作成
$body = array(
    'userName'=>$adminId,
    'password'=>$adminPassword
);
$body_json = json_encode($body, JSON_PRETTY_PRINT);

//リフレッシュトークン：Yellowfinにトークンを要求
$ch = curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, $body_json);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, $url);
$result = curl_exec($ch);
$json_result = json_decode($result);
$refreshToken = $json_result->securityToken;
curl_close($ch);

//アクセストークン：HEADERデータ作成
$header2 = array(
    'Authorization:YELLOWFIN ts='.$time.', nonce=123, token='.$refreshToken,
    'Accept:application/vnd.yellowfin.api-v2+json',
    'Content-Type:application/json'
);

//アクセストークン：Yellowfinにトークンを要求
$ch2 = curl_init();
curl_setopt($ch2, CURLOPT_HTTPHEADER, $header2);
curl_setopt($ch2, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch2, CURLOPT_POSTFIELDS, '');
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_URL, $url2);
curl_close($ch);
$result2 = curl_exec($ch2);
$json_result2 = json_decode($result2);
$accessToken=$json_result2->securityToken;

//変数の宣言
$iporg='13204';
$url3 = 'http://localhost:8080/api/orgs/'.$iporg.'/user-access/';

//ユーザー登録：HEADERデータ作成
$header3 = array(
	'Authorization:YELLOWFIN ts='.$time.', nonce=123, token='.$accessToken,
	'Accept:application/vnd.yellowfin.api-v2+json',
	'Content-Type:application/json'
);

//ユーザー登録：データ読込
ob_start();
include("userOrg.json");
$orgData = ob_get_clean();

//ユーザー登録：登録
$ch3 = curl_init();
curl_setopt($ch3, CURLOPT_HTTPHEADER, $header3);
curl_setopt($ch3, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch3, CURLOPT_POSTFIELDS, $orgData);
curl_setopt($ch3, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch3, CURLOPT_URL, $url3);
$result3 =curl_exec($ch3);
curl_close($ch3);
```