Skip to content

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-workspaceinvite_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。現状は履歴で失敗を把握する までで、再送は候補者の再送信または別途対応。

運用

開発・デプロイ・環境変数は 運用 / デプロイ を参照。