Compare commits
3 Commits
45893eb453
...
e0c2211e0d
| Author | SHA1 | Date |
|---|---|---|
|
|
e0c2211e0d | |
|
|
b20393b8a9 | |
|
|
4390748534 |
10
STATUS.md
10
STATUS.md
|
|
@ -13,11 +13,13 @@
|
||||||
- **contact.html**: Resend API 経由に切り替え済み・送受信テスト完了(2026-04-21)✓
|
- **contact.html**: Resend API 経由に切り替え済み・送受信テスト完了(2026-04-21)✓
|
||||||
- **Stripe 本番化時**: index.html・index-b.html・index-c.html・index-d.html の 4ファイルにある `test_9B67sEbN3fowfMW4jwenS00` を本番 Payment Link URL に一括差し替え(Cursor 指摘 2026-04-22)
|
- **Stripe 本番化時**: index.html・index-b.html・index-c.html・index-d.html の 4ファイルにある `test_9B67sEbN3fowfMW4jwenS00` を本番 Payment Link URL に一括差し替え(Cursor 指摘 2026-04-22)
|
||||||
|
|
||||||
## Together legacy path 廃止(2026-04-22 完了)
|
## Together 認証設計(2026-04-22 確定)
|
||||||
|
|
||||||
- Docker ログで legacy hit 0件を確認の上、JWT 必須化済み(server.js `togetherEnsureMember`)
|
- Together は Posimai アカウント不要のため、JWT なし username 認証を継続維持する
|
||||||
- JWT なしリクエストは 401 を返す
|
- JWT あり: user_id + username で strict チェック
|
||||||
- Gemini 2.5-flash 503 フォールバック(→ 2.0-flash)を `archiveShare` + `rearchive` に追加済み
|
- JWT なし: username のみで照合(Eiji 等 Posimai 外メンバー向け)
|
||||||
|
- invite_code はメンバー認証済みであれば JWT 有無に関わらず返す
|
||||||
|
- Gemini 2.5-flash 503 フォールバック(→ 2.0-flash)を `archiveShare` + `rearchive` に追加済み(2026-04-22)
|
||||||
|
|
||||||
## 次にやること(優先順)
|
## 次にやること(優先順)
|
||||||
|
|
||||||
|
|
|
||||||
22
server.js
22
server.js
|
|
@ -807,10 +807,7 @@ async function togetherEnsureMember(pool, res, groupId, username, jwtUserId) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
if (!jwtUserId) {
|
if (jwtUserId) {
|
||||||
res.status(401).json({ error: '認証が必要です' });
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
const strict = await pool.query(
|
const strict = await pool.query(
|
||||||
`SELECT 1 FROM together_members m
|
`SELECT 1 FROM together_members m
|
||||||
WHERE m.group_id = $1 AND (
|
WHERE m.group_id = $1 AND (
|
||||||
|
|
@ -825,6 +822,18 @@ async function togetherEnsureMember(pool, res, groupId, username, jwtUserId) {
|
||||||
if (strict.rows.length > 0) return true;
|
if (strict.rows.length > 0) return true;
|
||||||
res.status(403).json({ error: 'グループのメンバーではありません' });
|
res.status(403).json({ error: 'グループのメンバーではありません' });
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
// JWT なし: username のみで照合(Together は Posimai アカウント不要のため継続許容)
|
||||||
|
const primaryUsername = usernames[0];
|
||||||
|
const legacyOnly = await pool.query(
|
||||||
|
'SELECT 1 FROM together_members WHERE group_id=$1 AND username=$2',
|
||||||
|
[gidNum, primaryUsername]
|
||||||
|
);
|
||||||
|
if (legacyOnly.rows.length === 0) {
|
||||||
|
res.status(403).json({ error: 'グループのメンバーではありません' });
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error('[Together] togetherEnsureMember', e.message);
|
console.error('[Together] togetherEnsureMember', e.message);
|
||||||
res.status(500).json({ error: 'Internal server error' });
|
res.status(500).json({ error: 'Internal server error' });
|
||||||
|
|
@ -2760,7 +2769,6 @@ ${excerpt}
|
||||||
});
|
});
|
||||||
|
|
||||||
// GET /together/groups/:groupId — グループ情報(メンバーのみ)
|
// GET /together/groups/:groupId — グループ情報(メンバーのみ)
|
||||||
// invite_code は JWT 認証済みの場合のみ返す(レガシー ?u= のみでは返さない)
|
|
||||||
r.get('/together/groups/:groupId', async (req, res) => {
|
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' });
|
if (!/^[a-zA-Z0-9_-]+$/.test(req.params.groupId)) return res.status(400).json({ error: 'invalid groupId' });
|
||||||
const username = normalizeTogetherUsername(req.query.u);
|
const username = normalizeTogetherUsername(req.query.u);
|
||||||
|
|
@ -2769,9 +2777,7 @@ ${excerpt}
|
||||||
if (!(await togetherEnsureMember(pool, res, req.params.groupId, username, jwtUserId))) return;
|
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]);
|
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: 'グループが見つかりません' });
|
if (result.rows.length === 0) return res.status(404).json({ error: 'グループが見つかりません' });
|
||||||
const group = result.rows[0];
|
res.json(result.rows[0]);
|
||||||
if (!jwtUserId) delete group.invite_code;
|
|
||||||
res.json(group);
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
res.status(500).json({ error: 'Internal server error' });
|
res.status(500).json({ error: 'Internal server error' });
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue