フローチャート図
アクセス制御・認証・権限判定・図表描画などの分岐ロジックを示します。
1. リクエスト処理の全体フロー
flowchart TD S(["リクエスト受信
HTTP / WebSocket"]) --> G{"プライベートIPか?
PrivateNetworkGuard"} G -- いいえ --> R403["403 / WS close(4403)
社外アクセス拒否"] G -- はい --> T{"認証が必要な
エンドポイントか?"} T -- いいえ --> H["ハンドラ実行"] T -- はい --> AUTH{"Bearerトークン
有効?"} AUTH -- いいえ --> R401["401 認証エラー"] AUTH -- はい --> ACT{"ユーザーが
有効(is_active)?"} ACT -- いいえ --> R401 ACT -- はい --> H H --> RESP(["レスポンス返却"])
flowchart TD S(["Request received
HTTP / WebSocket"]) --> G{"Private IP?
PrivateNetworkGuard"} G -- No --> R403["403 / WS close(4403)
reject external access"] G -- Yes --> T{"Auth-required
endpoint?"} T -- No --> H["run handler"] T -- Yes --> AUTH{"Bearer token
valid?"} AUTH -- No --> R401["401 auth error"] AUTH -- Yes --> ACT{"User active
(is_active)?"} ACT -- No --> R401 ACT -- Yes --> H H --> RESP(["return response"])
図12. 全リクエスト共通の処理フロー。ネットワーク制御 → 認証 → ユーザー有効性の順に検証する。
2. 権限判定フロー(require_role)
flowchart TD S(["操作要求
(例: チャンネル作成)"]) --> M{"サーバーの
メンバーか?"} M -- いいえ --> E403a["403 メンバーではありません"] M -- はい --> R{"必要ロールを
満たすか?"} R -- いいえ --> E403b["403 権限がありません"] R -- はい --> OK(["操作を許可"])
flowchart TD S(["Operation request
(e.g. create channel)"]) --> M{"Member of
the server?"} M -- No --> E403a["403 not a member"] M -- Yes --> R{"Has required
role?"} R -- No --> E403b["403 no permission"] R -- Yes --> OK(["allow operation"])
図13. 権限判定。所属確認 → ロール確認の二段階。例えば招待発行は admin / moderator、ロール変更・キックは admin のみ。
3. メッセージ送信・編集フロー(フロントエンド)
flowchart TD
S(["送信ボタン / Enter"]) --> ED{"編集モード中か?
state.editingId"}
ED -- はい --> EMPTY{"本文が空?"}
EMPTY -- はい --> CANCEL["編集をキャンセル"]
EMPTY -- いいえ --> SAME{"内容が
未変更?"}
SAME -- はい --> CANCEL
SAME -- いいえ --> PATCH["PATCH /api/messages/{id}"]
PATCH --> CLR["入力欄クリア・編集解除"]
ED -- いいえ --> VAL{"本文または
添付あり?"}
VAL -- いいえ --> NOOP(["何もしない"])
VAL -- はい --> POST["POST メッセージ作成"]
POST --> RESET["入力欄・添付プレビュー初期化"]
flowchart TD
S(["Send button / Enter"]) --> ED{"Edit mode?
state.editingId"}
ED -- Yes --> EMPTY{"Body empty?"}
EMPTY -- Yes --> CANCEL["cancel edit"]
EMPTY -- No --> SAME{"Content
unchanged?"}
SAME -- Yes --> CANCEL
SAME -- No --> PATCH["PATCH /api/messages/{id}"]
PATCH --> CLR["clear input, exit edit"]
ED -- No --> VAL{"Body or
attachment?"}
VAL -- No --> NOOP(["do nothing"])
VAL -- Yes --> POST["POST create message"]
POST --> RESET["reset input & attachment preview"]
図14. フロント側の送信/編集フロー。編集は専用ダイアログではなく下部の入力欄を用いたインライン編集方式。
4. 図表(ダイアグラム)レンダリングのフォールバック
flowchart TD S(["コードブロック検出
言語: mermaid / plantuml"]) --> TYPE{"種類は?"} TYPE -- mermaid --> ML{"mermaid 同梱
ライブラリあり?"} ML -- はい --> MR["クライアントでSVG描画"] ML -- いいえ --> SRC["ソースコード表示に
フォールバック"] TYPE -- plantuml --> PA{"サーバーで
plantuml.jar + JRE
利用可能?"} PA -- はい --> PR["POST /api/render/plantuml
サーバーでSVG生成(SANDBOX)"] PR --> PCHECK{"描画成功?"} PCHECK -- はい --> POUT["SVG表示(キャッシュ)"] PCHECK -- いいえ --> SRC PA -- いいえ --> SRC
flowchart TD S(["Code block detected
lang: mermaid / plantuml"]) --> TYPE{"Which type?"} TYPE -- mermaid --> ML{"Bundled mermaid
library present?"} ML -- Yes --> MR["render SVG on client"] ML -- No --> SRC["fallback to
source display"] TYPE -- plantuml --> PA{"plantuml.jar + JRE
available on server?"} PA -- Yes --> PR["POST /api/render/plantuml
server SVG (SANDBOX)"] PR --> PCHECK{"render ok?"} PCHECK -- Yes --> POUT["show SVG (cached)"] PCHECK -- No --> SRC PA -- No --> SRC
図15. 図表描画。利用不可・失敗時はソース表示にフォールバックし、機能を停止させない。PlantUMLはSANDBOXプロファイルで実行。
5. 未読件数の算出フロー
flowchart TD S(["GET /api/unread"]) --> RS["ReadState を取得
(チャンネル/DMごとの最終既読ID)"] RS --> CH["所属サーバーの全チャンネルを走査"] CH --> CNT["last_read より新しく
自分以外が投稿し
未削除のメッセージ数を集計"] CNT --> DM["参加中の全DMを走査して同様に集計"] DM --> OUT(["{channels:{...}, dms:{...}} を返却"])
flowchart TD S(["GET /api/unread"]) --> RS["load ReadState
(last read id per channel/DM)"] RS --> CH["scan all channels of joined servers"] CH --> CNT["count messages newer than last_read,
authored by others,
and not deleted"] CNT --> DM["scan all joined DMs and count likewise"] DM --> OUT(["return {channels:{...}, dms:{...}}"])
図16. 未読バッジ算出。自分の投稿・削除済みは未読に含めない。