TiedWorkspace 管理 (tied-workspace-admin)
ご招待フォーム (invite-form) の運用管理を担うアプリ。配信する招待リンクと メール文面を設定し、同意・送信履歴を閲覧する。公開フォーム (invite-web) と対になる管理側。
- アプリ:
apps/tied-workspace-admin - Worker 名:
tied-workspace-admin(React Router v7 framework モード / SSR on Cloudflare Workers) - 公開 URL (予定):
https://admin.tied-workspace.com
全体像
全ページを better-auth (Sign in with Slack/OIDC、共有認証基盤 packages/auth) で保護する。
| ルート | 役割 |
|---|---|
/ | /settings へリダイレクト (要サインイン) |
/settings | 招待リンク・メール件名・本文の設定 (invite_settings の書き込み) |
/invitations | 同意・送信履歴の閲覧 + 状態別件数 (invitations の読み取り) |
/sign-in | 運営メンバーの Slack サインイン |
/api/auth/* | better-auth ハンドラへの委譲 |
mermaid
flowchart LR
subgraph admin["tied-workspace-admin (管理・要認証)"]
S["/settings: 招待リンク/文面を設定"]
H["/invitations: 履歴閲覧"]
end
subgraph form["invite-web (公開フォーム)"]
F["/ : 同意 → メール配信"]
end
S -->|書込| DB[("D1 invite_settings")]
F -->|読込| DB
F -->|書込| INV[("D1 invitations")]
H -->|読込| INV設計の不変条件
- 全ページ認証必須: 運営向けの管理 UI のため、loader / action 冒頭で必ず
requireSessionを呼ぶ (GET/POST 両方)。認証ロジックは共有認証基盤packages/authに集約し、アプリ個別に 書かない。Cloudflare Access は使わない (やまびこ / ダミ声カラス / ご招待フォームと同じ方針)。 - データは公開フォームと共有: D1
tied-workspaceのinvite_settings/invitationsを invite-web と共有する。admin はinvite_settingsを読み書きし、invitationsを読むだけ (同意記録の書き込みは公開フォーム側)。 - スキーマは packages/d1 が正本: テーブル定義 (
invite_settings/invitations) はpackages/d1/migrations/tied-workspace/0002_invite_form.sql。admin はそれを使うだけで migration を所有しない。
アーキテクチャ
apps/tied-workspace-admin/
├── app/
│ ├── root.tsx # 共通レイアウト (サインイン時のみナビ表示)
│ ├── routes.ts
│ ├── routes/
│ │ ├── index.tsx # /settings へリダイレクト
│ │ ├── settings.tsx # 招待設定 (loader/action とも requireSession)
│ │ ├── invitations.tsx # 履歴閲覧 (requireSession)
│ │ ├── sign-in.tsx
│ │ └── api.auth.$.ts
│ └── lib/
│ ├── auth.server.ts # better-auth (getAuth / requireSession)
│ ├── auth-client.ts
│ ├── deps.server.ts # ルートが使う依存の集約
│ └── invitations.server.ts # D1 データ層 (invite_settings 読書 / invitations 読取)
└── workers/app.ts # Cloudflare Worker エントリ (fetch)今後の TODO
- 操作できる運営の限定: 現状は Slack でサインインできれば誰でも管理 UI に入れる (noisy-crow 管理 UI と同じ)。招待ポリシー の運用 (山本および指定メンバーのみ) に合わせて、特定の運営メンバーに絞る認可 (許可リスト等) は将来の改善余地。
- 送信失敗の再送: 失敗した招待 (
status='failed') の再送 UI。現状は履歴で失敗を把握する までで、再送は候補者の再送信または別途対応。
運用
開発・デプロイ・環境変数は 運用 / デプロイ を参照。