From 50e95577d768288cdca3fe58c22dc33886d2f649 Mon Sep 17 00:00:00 2001 From: posimai Date: Mon, 20 Apr 2026 22:31:07 +0900 Subject: [PATCH] =?UTF-8?q?fix(together):=20invite=5Fcode=20=E3=82=92=20JW?= =?UTF-8?q?T=20=E5=BF=85=E9=A0=88=E3=81=AB=E5=A4=89=E6=9B=B4=E3=80=81Guard?= =?UTF-8?q?=20Web=20v1=20=E6=96=B9=E9=87=9D=E3=82=92=20STATUS.md=20?= =?UTF-8?q?=E3=81=AB=E6=98=8E=E8=A8=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- STATUS.md | 10 ++++++---- server.js | 5 ++++- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/STATUS.md b/STATUS.md index 5e4c69d5..eacef090 100644 --- a/STATUS.md +++ b/STATUS.md @@ -31,10 +31,12 @@ - **表示 HTML**: DOMPurify + `safeHtml()`、解説の保存時サニタイズ ✓ - **学習フロー UX**: 戻る=1枚前、学習フローを終了(理解度保持)、理解度をクリアして学ぶ、`#comprehension-quiz` へスクロール ✓ -### Guard / Tauri -1. **Timer → Pulse 連携(セッションログ)** — タイマー終了時にセッション記録モーダル。`posimai-timer-sessions` に保存 -2. **Tauri アプリ動作確認** — デスクトップショートカットから起動、CodeViewer が WebView でも動くか確認 -3. **Diff → 履歴保存 + Journal 送信** — 比較結果をlocalStorage保存・Journal連携 +### Guard(方針確定: Web v1のみ・2026-04-20) +**v1 = Web PWA のみ。Tauri・VS Code拡張・CLI はすべて v1 タグ後のロードマップ。** +現行の main ブランチは Web のみを対象とする。Tauri/拡張のブランチは統合しない。 + +v1 残タスク: +1. **Web v1 完了条件の文書化** — 入力・出力・非機能(タイムアウト・APIキー未設定時)・免責表記を検証可能な形で定義する ### Guard 完成状態(2026-04-14) - ルールエンジン(133ルール)✓ diff --git a/server.js b/server.js index ac8f74d9..58b47c60 100644 --- a/server.js +++ b/server.js @@ -2688,6 +2688,7 @@ ${excerpt} }); // GET /together/groups/:groupId — グループ情報(メンバーのみ) + // invite_code は JWT 認証済みの場合のみ返す(レガシー ?u= のみでは返さない) r.get('/together/groups/:groupId', async (req, res) => { if (!/^[a-zA-Z0-9_-]+$/.test(req.params.groupId)) return res.status(400).json({ error: 'invalid groupId' }); const username = normalizeTogetherUsername(req.query.u); @@ -2696,7 +2697,9 @@ ${excerpt} if (!(await togetherEnsureMember(pool, res, req.params.groupId, username, jwtUserId))) return; const result = await pool.query('SELECT id, name, invite_code, created_at FROM together_groups WHERE id=$1', [req.params.groupId]); if (result.rows.length === 0) return res.status(404).json({ error: 'グループが見つかりません' }); - res.json(result.rows[0]); + const row = result.rows[0]; + if (!jwtUserId) delete row.invite_code; + res.json(row); } catch (e) { res.status(500).json({ error: 'Internal server error' }); }