# 画面設計書 40-APIキー管理画面（リダイレクト）

## 概要

APIキー管理画面へのリダイレクト専用ページ。内部プラン（Internal plan）のチームのみアクセス可能で、アクセス時に `/settings/team/api-keys` へ自動的にリダイレクトする。

### 本画面の処理概要

**業務上の目的・背景**：Giselleでは以前 `/manage/api-keys` というパスでAPIキー管理機能を提供していた可能性がある。本画面は、その古いパスへのアクセスを新しいパス `/settings/team/api-keys` へリダイレクトする互換性維持のためのページである。内部プランのチームのみがAPIキー機能を利用できるため、それ以外のプランのチームには404を返す。

**画面へのアクセス方法**：`/manage/api-keys` にアクセスした場合に表示される（実際にはリダイレクトが発生するため画面は表示されない）。

**主要な操作・処理内容**：
1. チームプランの確認：現在のチームが内部プランかどうかを確認
2. 非内部プランの場合：404 Not Found を返す
3. 内部プランの場合：`/settings/team/api-keys` へリダイレクト

**画面遷移**：
- 条件付きリダイレクト先：/settings/team/api-keys（内部プランの場合）
- 404ページ（それ以外のプランの場合）

**権限による表示制御**：
- 内部プラン（internal）のチームのみアクセス可能
- それ以外のプランでは404 Not Foundを返す

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 67 | シークレット追加 | 遷移先機能 | APIキー管理画面へのリダイレクト処理 |

## 画面種別

リダイレクト

## URL/ルーティング

`/manage/api-keys` (リダイレクト元)
`/settings/team/api-keys` (リダイレクト先)

## 入出力項目

本画面にはフォーム入力はない（リダイレクトのみ）。

## 表示項目

本画面には表示項目はない（即座にリダイレクトまたは404）。

## イベント仕様

### 1-ページロード時

Server Component としてページがロードされた際に自動的に処理を実行する。

1. `fetchCurrentTeam()` で現在のチーム情報を取得
2. `isInternalPlan(team)` でプランを確認
3. 内部プランでない場合：`notFound()` を呼び出して404を返す
4. 内部プランの場合：`redirect("/settings/team/api-keys")` でリダイレクト

## データベース更新仕様

本画面ではデータベース更新は行わない。

## メッセージ仕様

| 種別 | メッセージ | 表示条件 |
|------|----------|---------|
| エラー | 404 Not Found | 内部プラン以外でアクセスした場合 |

## 例外処理

| 例外状況 | 処理内容 |
|---------|---------|
| 非内部プランのチーム | notFound() を呼び出して404ページを表示 |

## 備考

- Server Component として実装されている
- 実際のUIは存在せず、サーバーサイドでリダイレクトまたは404を返す
- 古いURLパスの互換性維持のためのページ
- 内部プランは Giselle 社内または特定パートナー向けのプラン

---

## コードリーディングガイド

本画面を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: エントリーポイントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | page.tsx | `apps/studio.giselles.ai/app/(main)/manage/api-keys/page.tsx` | Server Component としてのリダイレクト処理 |

**主要処理フロー**:
1. **行6**: fetchCurrentTeam() でチーム情報取得
2. **行7-9**: isInternalPlan で内部プランか確認、非内部プランなら notFound()
3. **行10**: redirect() で /settings/team/api-keys へリダイレクト

### プログラム呼び出し階層図

```
ApiKeysPage (page.tsx)
    │
    ├─ fetchCurrentTeam() ───────────────────────────────▶ チーム情報取得
    │
    ├─ isInternalPlan(team) ─────────────────────────────▶ プラン確認
    │      │
    │      ├─ false ─────────────────────────────────────▶ notFound() → 404
    │      │
    │      └─ true ──────────────────────────────────────▶ redirect("/settings/team/api-keys")
    │
    └─ redirect() ───────────────────────────────────────▶ リダイレクト
```

### データフロー図

```
[トリガー]                      [処理]                              [出力]

/manage/api-keys                ┌─────────────────────┐
アクセス ───────────────────▶   │ fetchCurrentTeam()  │ ─────────▶ Team情報
                                └─────────────────────┘
                                        │
                                        ▼
                                ┌─────────────────────┐
                                │ isInternalPlan()    │
                                └─────────────────────┘
                                        │
                        ┌───────────────┴───────────────┐
                        ▼                               ▼
                ┌───────────────┐               ┌───────────────┐
                │ false         │               │ true          │
                │ → notFound()  │               │ → redirect()  │
                └───────────────┘               └───────────────┘
                        │                               │
                        ▼                               ▼
                ┌───────────────┐               ┌───────────────┐
                │ 404 Page      │               │ /settings/    │
                │               │               │ team/api-keys │
                └───────────────┘               └───────────────┘
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| page.tsx | `apps/studio.giselles.ai/app/(main)/manage/api-keys/page.tsx` | ソース | リダイレクトページ |
| utils.ts | `apps/studio.giselles.ai/services/teams/utils.ts` | ソース | isInternalPlan 関数 |
