プロジェクト管理

mindzieStudioテナント内でプロジェクトを管理します。データセット、調査、ダッシュボード、分析ワークフローを含むプロジェクトの作成、取得、更新、削除を行います。

接続テスト

認証不要のPing

GET /api/{tenantId}/project/unauthorized-ping

認証不要のテストエンドポイントです。ネットワーク接続の確認に使用します。

レスポンス

Ping Successful

認証済みPing

GET /api/{tenantId}/project/ping

特定テナントのAPIアクセスを検証する認証済みPingエンドポイントです。

レスポンス (200 OK)

Ping Successful (tenant id: {tenantId})

すべてのプロジェクトの一覧取得

GET /api/{tenantId}/project

指定したテナント内で認証ユーザーがアクセス可能なすべてのプロジェクトのページネーションされたリストを取得します。

パスパラメータ

パラメータ 種類 必須 説明
tenantId GUID はい テナントの識別子

クエリパラメータ

パラメータ 種類 デフォルト 説明
page integer 1 ページ番号(ページネーション用)
pageSize integer 50 1ページあたりのアイテム数(推奨最大:100)

レスポンス (200 OK)

{
  "projects": [
    {
      "projectId": "87654321-4321-4321-4321-210987654321",
      "tenantId": "12345678-1234-1234-1234-123456789012",
      "projectName": "Purchase Order Analysis",
      "projectDescription": "Process mining analysis of P2P workflow",
      "dateCreated": "2024-01-15T10:30:00Z",
      "dateModified": "2024-01-20T14:45:00Z",
      "createdBy": "user@example.com",
      "modifiedBy": "user@example.com",
      "isActive": true,
      "datasetCount": 3,
      "investigationCount": 5,
      "dashboardCount": 2,
      "userCount": 8
    }
  ],
  "totalCount": 15,
  "page": 1,
  "pageSize": 50
}

プロジェクトオブジェクトのフィールド

フィールド 種類 説明
projectId GUID プロジェクトの一意識別子
tenantId GUID このプロジェクトが属するテナント
projectName string プロジェクトの表示名
projectDescription string プロジェクトの説明
dateCreated datetime プロジェクト作成日時
dateModified datetime プロジェクト最終更新日時
createdBy string 作成ユーザー
modifiedBy string 最終更新ユーザー
isActive boolean プロジェクトがアクティブかどうか
datasetCount integer プロジェクトのデータセット数
investigationCount integer 調査の数
dashboardCount integer ダッシュボードの数
userCount integer アクセス権のあるユーザー数

プロジェクト詳細の取得

GET /api/{tenantId}/project/{projectId}

特定プロジェクトの詳細情報を取得します。

パスパラメータ

パラメータ 種類 必須 説明
tenantId GUID はい テナント識別子
projectId GUID はい プロジェクト識別子

レスポンス (200 OK)

一覧レスポンスのプロジェクトオブジェクトと同じ構造です。

エラー応答

Not Found (404):

{
  "error": "Project not found with ID '{projectId}'. The project may have been deleted or the ID is incorrect.",
  "projectId": "87654321-4321-4321-4321-210987654321"
}

プロジェクトサマリーの取得

GET /api/{tenantId}/project/{projectId}/summary

プロジェクトに関する集計統計および主要な指標を取得します。

レスポンス (200 OK)

{
  "projectId": "87654321-4321-4321-4321-210987654321",
  "projectName": "Purchase Order Analysis",
  "projectDescription": "Process mining analysis of P2P workflow",
  "dateCreated": "2024-01-15T10:30:00Z",
  "dateModified": "2024-01-20T14:45:00Z",
  "statistics": {
    "totalDatasets": 3,
    "totalInvestigations": 5,
    "totalDashboards": 2,
    "totalNotebooks": 12,
    "totalUsers": 8
  }
}

プロジェクトの作成

POST /api/{tenantId}/project

指定したテナント内に新しいプロジェクトを作成します。

リクエストボディ

{
  "projectName": "New Analysis Project",
  "projectDescription": "Process mining analysis for procurement workflow"
}

リクエストフィールド

フィールド 種類 必須 説明
projectName string はい プロジェクト名(最大255文字)
projectDescription string いいえ 説明(最大1000文字)

レスポンス (201 Created)

作成されたプロジェクトオブジェクトを返します(Get Projectと同じ構造)。

エラー応答

Bad Request (400):

{
  "error": "Validation failed",
  "validationErrors": ["Project name is required"]
}

プロジェクトの更新

PUT /api/{tenantId}/project/{projectId}

既存プロジェクトのプロパティを更新します。

パスパラメータ

パラメータ 種類 説明
tenantId GUID テナント識別子
projectId GUID プロジェクト識別子

リクエストボディ

{
  "projectName": "Updated Project Name",
  "projectDescription": "Updated description",
  "isActive": true
}

リクエストフィールド

フィールド 種類 必須 説明
projectName string はい 新しいプロジェクト名
projectDescription string いいえ 新しい説明
isActive boolean いいえ プロジェクトの有効/無効切り替え

レスポンス (200 OK)

更新されたプロジェクトオブジェクトを返します。


プロジェクトの削除

DELETE /api/{tenantId}/project/{projectId}

プロジェクトおよびすべての関連データを完全に削除します。

警告: これは元に戻せない破壊的操作です。

カスケード削除対象

  • プロジェクト内のすべてのデータセット
  • すべての調査およびノートブック
  • すべてのダッシュボード
  • すべてのユーザーパーミッション
  • すべてのBLOBストレージファイル(イベントログ、添付ファイル)

パスパラメータ

パラメータ 種類 説明
tenantId GUID テナント識別子
projectId GUID プロジェクト識別子

レスポンス (200 OK)

{
  "message": "Project deleted successfully",
  "projectId": "87654321-4321-4321-4321-210987654321"
}

実装例

cURL

# すべてのプロジェクトを一覧取得
curl -X GET "https://your-mindzie-instance.com/api/12345678-1234-1234-1234-123456789012/project" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

# プロジェクト詳細を取得
curl -X GET "https://your-mindzie-instance.com/api/12345678-1234-1234-1234-123456789012/project/87654321-4321-4321-4321-210987654321" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

# 新規プロジェクトを作成
curl -X POST "https://your-mindzie-instance.com/api/12345678-1234-1234-1234-123456789012/project" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "projectName": "Q4 Analysis",
    "projectDescription": "Quarterly procurement analysis"
  }'

# プロジェクトを更新
curl -X PUT "https://your-mindzie-instance.com/api/12345678-1234-1234-1234-123456789012/project/87654321-4321-4321-4321-210987654321" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "projectName": "Q4 Analysis - Final",
    "projectDescription": "Updated description"
  }'

# プロジェクトを削除(注意: 元に戻せません!)
curl -X DELETE "https://your-mindzie-instance.com/api/12345678-1234-1234-1234-123456789012/project/87654321-4321-4321-4321-210987654321" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Python

import requests

TENANT_ID = '12345678-1234-1234-1234-123456789012'
BASE_URL = 'https://your-mindzie-instance.com'

class ProjectManager:
    def __init__(self, token):
        self.headers = {
            'Authorization': f'Bearer {token}',
            'Content-Type': 'application/json'
        }

    def list_projects(self, page=1, page_size=50):
        """テナント内のすべてのプロジェクトを一覧取得します。"""
        url = f'{BASE_URL}/api/{TENANT_ID}/project'
        params = {'page': page, 'pageSize': page_size}
        response = requests.get(url, headers=self.headers, params=params)
        response.raise_for_status()
        return response.json()

    def get_project(self, project_id):
        """プロジェクトの詳細を取得します。"""
        url = f'{BASE_URL}/api/{TENANT_ID}/project/{project_id}'
        response = requests.get(url, headers=self.headers)
        response.raise_for_status()
        return response.json()

    def create_project(self, name, description=''):
        """新しいプロジェクトを作成します。"""
        url = f'{BASE_URL}/api/{TENANT_ID}/project'
        payload = {
            'projectName': name,
            'projectDescription': description
        }
        response = requests.post(url, json=payload, headers=self.headers)
        response.raise_for_status()
        return response.json()

    def update_project(self, project_id, name=None, description=None, is_active=None):
        """既存プロジェクトを更新します。"""
        url = f'{BASE_URL}/api/{TENANT_ID}/project/{project_id}'
        payload = {}
        if name:
            payload['projectName'] = name
        if description is not None:
            payload['projectDescription'] = description
        if is_active is not None:
            payload['isActive'] = is_active
        response = requests.put(url, json=payload, headers=self.headers)
        response.raise_for_status()
        return response.json()

    def delete_project(self, project_id):
        """プロジェクトを削除します(注意:元に戻せません!)。"""
        url = f'{BASE_URL}/api/{TENANT_ID}/project/{project_id}'
        response = requests.delete(url, headers=self.headers)
        response.raise_for_status()
        return response.json()

# 利用例
manager = ProjectManager('your-auth-token')

# すべてのプロジェクトを一覧表示
result = manager.list_projects()
print(f"総プロジェクト数: {result['totalCount']}")

for project in result['projects']:
    print(f"- {project['projectName']}: {project['datasetCount']} 個のデータセット")

# 新しいプロジェクトを作成
new_project = manager.create_project(
    name='API Test Project',
    description='Created via API'
)
print(f"作成されたプロジェクトID: {new_project['projectId']}")

JavaScript/Node.js

const TENANT_ID = '12345678-1234-1234-1234-123456789012';
const BASE_URL = 'https://your-mindzie-instance.com';

class ProjectManager {
  constructor(token) {
    this.headers = {
      'Authorization': `Bearer ${token}`,
      'Content-Type': 'application/json'
    };
  }

  async listProjects(page = 1, pageSize = 50) {
    const url = `${BASE_URL}/api/${TENANT_ID}/project?page=${page}&pageSize=${pageSize}`;
    const response = await fetch(url, { headers: this.headers });
    if (!response.ok) throw new Error(`Failed: ${response.status}`);
    return await response.json();
  }

  async getProject(projectId) {
    const url = `${BASE_URL}/api/${TENANT_ID}/project/${projectId}`;
    const response = await fetch(url, { headers: this.headers });
    if (!response.ok) throw new Error(`Failed: ${response.status}`);
    return await response.json();
  }

  async createProject(name, description = '') {
    const url = `${BASE_URL}/api/${TENANT_ID}/project`;
    const response = await fetch(url, {
      method: 'POST',
      headers: this.headers,
      body: JSON.stringify({ projectName: name, projectDescription: description })
    });
    if (!response.ok) throw new Error(`Failed: ${response.status}`);
    return await response.json();
  }

  async deleteProject(projectId) {
    const url = `${BASE_URL}/api/${TENANT_ID}/project/${projectId}`;
    const response = await fetch(url, {
      method: 'DELETE',
      headers: this.headers
    });
    if (!response.ok) throw new Error(`Failed: ${response.status}`);
    return await response.json();
  }
}

// 利用例
const manager = new ProjectManager('your-auth-token');

const projects = await manager.listProjects();
console.log(`見つかったプロジェクト数: ${projects.totalCount}`);