テナントユーザー操作

テナントスコープのユーザーエンドポイントは、特定のテナント内のユーザーを管理します。これらのエンドポイントには、グローバル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}`);

ベストプラクティス

  1. テナントAPIキーを使用する: ほとんどの操作はテナントスコープキーの方がより安全です
  2. 容量を確認する: 大量のユーザー作成前にテナント制限を確認してください
  3. 削除と解除の違い: テナントからの削除はユーザーをシステムに残し、他テナントへの影響を避けます
  4. 作成前に検索する: 重複を避けるためにユーザーが存在しないか確認してください