テナントユーザー操作
テナントスコープのユーザーエンドポイントは、特定のテナント内のユーザーを管理します。これらのエンドポイントには、グローバルAPIキーまたはテナントAPIキーのいずれかでアクセスできます。
認証
| APIキータイプ | アクセス |
|---|---|
| グローバルAPIキー | 任意のテナントにアクセス可能 |
| テナントAPIキー | 自身のテナントのみアクセス可能 |
テナントのユーザー一覧取得
GET /api/tenant/{tenantId}/user
特定のテナントに割り当てられているユーザーを取得します。
パスパラメーター
| パラメーター | 種類 | 必須 | 説明 |
|---|---|---|---|
tenantId |
GUID | はい | テナント識別子 |
クエリパラメーター
| パラメーター | 種類 | デフォルト | 説明 |
|---|---|---|---|
page |
整数 | 1 | ページ番号(ページング用) |
pageSize |
整数 | 50 | 1ページあたりのアイテム数(最大1000) |
includeDisabled |
ブール値 | false | 無効化されたユーザーを含める |
role |
文字列 | null | ロール名でのフィルタリング |
search |
文字列 | null | メールまたは表示名での検索 |
レスポンス (200 OK)
グローバルの全ユーザー一覧と同じ構造ですが、指定したテナントに絞られています。
テナント内でユーザー作成
POST /api/tenant/{tenantId}/user
新しいユーザーを作成し、テナントに割り当てるか、既存ユーザーをテナントに割り当てます。
注意: 指定されたメールアドレスのユーザーが既に存在する場合は、重複作成せずにテナントに割り当てます。
パスパラメーター
| パラメーター | 種類 | 必須 | 説明 |
|---|---|---|---|
tenantId |
GUID | はい | テナント識別子 |
リクエストボディ
{
"email": "john.smith@example.com",
"displayName": "John Smith",
"firstName": "John",
"lastName": "Smith",
"roleName": "Analyst"
}
リクエストフィールド
| フィールド | 種類 | 必須 | 説明 |
|---|---|---|---|
email |
文字列 | はい | ユーザーのメールアドレス |
displayName |
文字列 | はい | 表示名(2~100文字) |
firstName |
文字列 | いいえ | 名(最大50文字) |
lastName |
文字列 | いいえ | 姓(最大50文字) |
roleName |
文字列 | はい | ロール名(ロールと権限参照) |
容量バリデーション
この操作はテナントの容量制限を検証します:
- MaxUsers 制限はすべてのロールに対して確認されます
- MaxAnalyst 制限はAnalystロールに対して確認されます
レスポンス (201 Created)
{
"userId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"email": "john.smith@example.com",
"displayName": "John Smith",
"message": "User created and assigned to tenant successfully"
}
エラー応答
Conflict (409):
{
"error": "User is already assigned to this tenant"
}
容量超過 (400):
{
"error": "Cannot add user: tenant has reached its maximum user limit (100)",
"hint": "Increase the tenant's user or analyst limit to add more users"
}
テナント内のユーザー取得
GET /api/tenant/{tenantId}/user/{userId}
テナント内の特定ユーザーを取得します。
パスパラメーター
| パラメーター | 種類 | 必須 | 説明 |
|---|---|---|---|
tenantId |
GUID | はい | テナント識別子 |
userId |
GUID | はい | ユーザー識別子 |
レスポンス (200 OK)
ユーザーがテナントに割り当てられている場合はユーザーオブジェクトを返します。
テナント内のメールによるユーザー取得
GET /api/tenant/{tenantId}/user/by-email/{email}
テナント内のメールアドレスによるユーザーを取得します。
パスパラメーター
| パラメーター | 種類 | 必須 | 説明 |
|---|---|---|---|
tenantId |
GUID | はい | テナント識別子 |
email |
文字列 | はい | ユーザーのメールアドレス(URLエンコード済み) |
レスポンス (200 OK)
ユーザーがテナントに割り当てられている場合はユーザーオブジェクトを返します。
既存ユーザーをテナントに割り当て
POST /api/tenant/{tenantId}/user/{userId}
既存ユーザーをテナントに割り当てます。
パスパラメーター
| パラメーター | 種類 | 必須 | 説明 |
|---|---|---|---|
tenantId |
GUID | はい | テナント識別子 |
userId |
GUID | はい | ユーザー識別子 |
リクエストボディ (オプション)
{
"roleName": "Analyst"
}
レスポンス (200 OK)
{
"message": "User assigned to tenant successfully"
}
テナント内のユーザー更新
PUT /api/tenant/{tenantId}/user/{userId}
テナント内ユーザーのプロパティを更新します。
パスパラメーター
| パラメーター | 種類 | 必須 | 説明 |
|---|---|---|---|
tenantId |
GUID | はい | テナント識別子 |
userId |
GUID | はい | ユーザー識別子 |
リクエストボディ
{
"displayName": "Updated Name",
"roleName": "TenantAdmin"
}
レスポンス (200 OK)
{
"message": "User updated successfully"
}
テナントからユーザー削除
DELETE /api/tenant/{tenantId}/user/{userId}
ユーザーのテナント割り当てを解除します。ユーザー自体はシステムから削除されません。
パスパラメーター
| パラメーター | 種類 | 必須 | 説明 |
|---|---|---|---|
tenantId |
GUID | はい | テナント識別子 |
userId |
GUID | はい | ユーザー識別子 |
レスポンス (200 OK)
{
"message": "User removed from tenant successfully"
}
エラー応答
Not Found (404):
{
"error": "User is not assigned to this tenant"
}
実装例
cURL
# テナントのユーザー一覧取得(テナントAPIキーが利用可能)
curl -X GET "https://your-mindzie-instance.com/api/tenant/12345678-1234-1234-1234-123456789012/user" \
-H "Authorization: Bearer YOUR_TENANT_API_KEY"
# テナント内ユーザー検索
curl -X GET "https://your-mindzie-instance.com/api/tenant/12345678-1234-1234-1234-123456789012/user?search=john" \
-H "Authorization: Bearer YOUR_TENANT_API_KEY"
# テナント内でユーザー作成(ユーザー作成と割り当てを同時に実行)
curl -X POST "https://your-mindzie-instance.com/api/tenant/12345678-1234-1234-1234-123456789012/user" \
-H "Authorization: Bearer YOUR_TENANT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"email": "new.user@example.com",
"displayName": "New User",
"roleName": "Analyst"
}'
# 既存ユーザーをテナントに割り当て
curl -X POST "https://your-mindzie-instance.com/api/tenant/12345678-1234-1234-1234-123456789012/user/a1b2c3d4-e5f6-7890-abcd-ef1234567890" \
-H "Authorization: Bearer YOUR_TENANT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"roleName": "Analyst"}'
# テナントからユーザー削除
curl -X DELETE "https://your-mindzie-instance.com/api/tenant/12345678-1234-1234-1234-123456789012/user/a1b2c3d4-e5f6-7890-abcd-ef1234567890" \
-H "Authorization: Bearer YOUR_TENANT_API_KEY"
Python
import requests
BASE_URL = 'https://your-mindzie-instance.com'
class TenantUserManager:
def __init__(self, api_key, tenant_id):
"""
APIキーとテナントIDで初期化。
グローバルまたはテナントAPIキーのどちらでも動作。
"""
self.headers = {
'Authorization': f'Bearer {api_key}',
'Content-Type': 'application/json'
}
self.tenant_id = tenant_id
def list_users(self, page=1, page_size=50, role=None, search=None):
"""このテナントに割り当てられたユーザーを一覧取得。"""
url = f'{BASE_URL}/api/tenant/{self.tenant_id}/user'
params = {'page': page, 'pageSize': page_size}
if role:
params['role'] = role
if search:
params['search'] = search
response = requests.get(url, headers=self.headers, params=params)
response.raise_for_status()
return response.json()
def create_user(self, email, display_name, role_name,
first_name=None, last_name=None):
"""ユーザーを作成しテナントに割り当て(もしくは既存ユーザーを割り当て)。"""
url = f'{BASE_URL}/api/tenant/{self.tenant_id}/user'
payload = {
'email': email,
'displayName': display_name,
'roleName': role_name
}
if first_name:
payload['firstName'] = first_name
if last_name:
payload['lastName'] = last_name
response = requests.post(url, json=payload, headers=self.headers)
response.raise_for_status()
return response.json()
def assign_user(self, user_id, role_name=None):
"""既存ユーザーをこのテナントに割り当て。"""
url = f'{BASE_URL}/api/tenant/{self.tenant_id}/user/{user_id}'
payload = {}
if role_name:
payload['roleName'] = role_name
response = requests.post(url, json=payload, headers=self.headers)
response.raise_for_status()
return response.json()
def remove_user(self, user_id):
"""このテナントからユーザーを削除(ユーザー自体は削除しない)。"""
url = f'{BASE_URL}/api/tenant/{self.tenant_id}/user/{user_id}'
response = requests.delete(url, headers=self.headers)
response.raise_for_status()
return response.json()
def get_user(self, user_id):
"""このテナント内の特定ユーザーを取得。"""
url = f'{BASE_URL}/api/tenant/{self.tenant_id}/user/{user_id}'
response = requests.get(url, headers=self.headers)
response.raise_for_status()
return response.json()
# テナントAPIキーを使用した例
tenant_id = '12345678-1234-1234-1234-123456789012'
manager = TenantUserManager('your-tenant-api-key', tenant_id)
# テナント内のすべてのAnalystを一覧表示
analysts = manager.list_users(role='Analyst')
print(f"テナントには {analysts['totalCount']} 人のアナリストがいます")
for user in analysts['users']:
print(f" - {user['displayName']} ({user['email']})")
# 新しいアナリストの追加
new_user = manager.create_user(
email='new.analyst@example.com',
display_name='New Analyst',
role_name='Analyst'
)
print(f"追加されたユーザーID: {new_user['userId']}")
# テナントからユーザーを削除(ユーザーはシステムに残る)
manager.remove_user(new_user['userId'])
print("ユーザーをテナントから削除しました")
JavaScript/Node.js
const BASE_URL = 'https://your-mindzie-instance.com';
class TenantUserManager {
constructor(apiKey, tenantId) {
this.headers = {
'Authorization': `Bearer ${apiKey}`,
'Content-Type': 'application/json'
};
this.tenantId = tenantId;
}
async listUsers(options = {}) {
const params = new URLSearchParams({
page: options.page || 1,
pageSize: options.pageSize || 50
});
if (options.role) params.append('role', options.role);
if (options.search) params.append('search', options.search);
const url = `${BASE_URL}/api/tenant/${this.tenantId}/user?${params}`;
const response = await fetch(url, { headers: this.headers });
if (!response.ok) throw new Error(`Failed: ${response.status}`);
return await response.json();
}
async createUser(email, displayName, roleName) {
const url = `${BASE_URL}/api/tenant/${this.tenantId}/user`;
const response = await fetch(url, {
method: 'POST',
headers: this.headers,
body: JSON.stringify({ email, displayName, roleName })
});
if (!response.ok) throw new Error(`Failed: ${response.status}`);
return await response.json();
}
async assignUser(userId, roleName = null) {
const url = `${BASE_URL}/api/tenant/${this.tenantId}/user/${userId}`;
const body = roleName ? { roleName } : {};
const response = await fetch(url, {
method: 'POST',
headers: this.headers,
body: JSON.stringify(body)
});
if (!response.ok) throw new Error(`Failed: ${response.status}`);
return await response.json();
}
async removeUser(userId) {
const url = `${BASE_URL}/api/tenant/${this.tenantId}/user/${userId}`;
const response = await fetch(url, {
method: 'DELETE',
headers: this.headers
});
if (!response.ok) throw new Error(`Failed: ${response.status}`);
return await response.json();
}
}
// 使用例
const tenantId = '12345678-1234-1234-1234-123456789012';
const manager = new TenantUserManager('your-tenant-api-key', tenantId);
// ユーザー一覧を取得
const users = await manager.listUsers();
console.log(`テナントには ${users.totalCount} 人のユーザーがいます`);
// 新しいユーザーを追加
const newUser = await manager.createUser(
'new@example.com',
'New User',
'Analyst'
);
console.log(`追加されたユーザーID: ${newUser.userId}`);
ベストプラクティス
- テナントAPIキーを使用する: ほとんどの操作はテナントスコープキーの方がより安全です
- 容量を確認する: 大量のユーザー作成前にテナント制限を確認してください
- 削除と解除の違い: テナントからの削除はユーザーをシステムに残し、他テナントへの影響を避けます
- 作成前に検索する: 重複を避けるためにユーザーが存在しないか確認してください