fix: Together API に投稿前グループメンバー確認を追加
/together/share, /together/react, /together/comments の各書き込みエンドポイントに together_members テーブルでのメンバーチェックを追加。 非メンバーによる投稿・リアクション・コメントを 403 で拒否する。 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
10402464c5
commit
47c75cae4f
22
server.js
22
server.js
|
|
@ -2477,6 +2477,13 @@ ${excerpt}
|
|||
const grpCheck = await pool.query('SELECT id FROM together_groups WHERE id=$1', [group_id]);
|
||||
if (grpCheck.rows.length === 0) return res.status(404).json({ error: 'グループが見つかりません' });
|
||||
|
||||
// グループメンバーであることを確認(非メンバーの投稿を防止)
|
||||
const memberCheck = await pool.query(
|
||||
'SELECT 1 FROM together_members WHERE group_id=$1 AND username=$2',
|
||||
[group_id, shared_by]
|
||||
);
|
||||
if (memberCheck.rows.length === 0) return res.status(403).json({ error: 'グループのメンバーではありません' });
|
||||
|
||||
const result = await pool.query(
|
||||
`INSERT INTO together_shares (group_id, shared_by, url, title, message, tags)
|
||||
VALUES ($1, $2, $3, $4, $5, $6) RETURNING *`,
|
||||
|
|
@ -2498,6 +2505,7 @@ ${excerpt}
|
|||
const { username } = req.body || {};
|
||||
if (!username) return res.status(400).json({ error: 'username は必須です' });
|
||||
try {
|
||||
// shared_by が一致する行のみ削除(なければ 403)
|
||||
const result = await pool.query(
|
||||
'DELETE FROM together_shares WHERE id=$1 AND shared_by=$2 RETURNING id',
|
||||
[req.params.id, username]
|
||||
|
|
@ -2556,6 +2564,13 @@ ${excerpt}
|
|||
if (!share_id || !username) return res.status(400).json({ error: 'share_id と username は必須です' });
|
||||
if (!['like', 'star', 'fire'].includes(type)) return res.status(400).json({ error: 'type は like/star/fire のみ有効です' });
|
||||
try {
|
||||
// share の group に対してメンバーであることを確認
|
||||
const memberCheck = await pool.query(
|
||||
'SELECT 1 FROM together_members m JOIN together_shares s ON s.group_id=m.group_id WHERE s.id=$1 AND m.username=$2',
|
||||
[share_id, username]
|
||||
);
|
||||
if (memberCheck.rows.length === 0) return res.status(403).json({ error: 'グループのメンバーではありません' });
|
||||
|
||||
const existing = await pool.query(
|
||||
'SELECT 1 FROM together_reactions WHERE share_id=$1 AND username=$2 AND type=$3',
|
||||
[share_id, username, type]
|
||||
|
|
@ -2599,6 +2614,13 @@ ${excerpt}
|
|||
return res.status(400).json({ error: 'share_id, username, body は必須です' });
|
||||
}
|
||||
try {
|
||||
// share の group に対してメンバーであることを確認
|
||||
const memberCheck = await pool.query(
|
||||
'SELECT 1 FROM together_members m JOIN together_shares s ON s.group_id=m.group_id WHERE s.id=$1 AND m.username=$2',
|
||||
[share_id, username]
|
||||
);
|
||||
if (memberCheck.rows.length === 0) return res.status(403).json({ error: 'グループのメンバーではありません' });
|
||||
|
||||
const result = await pool.query(
|
||||
'INSERT INTO together_comments (share_id, username, body) VALUES ($1, $2, $3) RETURNING *',
|
||||
[share_id, username, body.trim()]
|
||||
|
|
|
|||
Loading…
Reference in New Issue