v0.8.5 fix pinning

This commit is contained in:
2026-03-13 10:51:27 -04:00
parent a02facff1a
commit b3aac1981c
13 changed files with 153 additions and 504 deletions

View File

@@ -173,71 +173,4 @@ router.post('/:id/reactions', authMiddleware, (req, res) => {
});
// Get pinned messages for a DM group
router.get('/pinned', authMiddleware, (req, res) => {
const db = getDb();
const userId = req.user.id;
const groupId = parseInt(req.query.groupId);
if (!groupId) return res.status(400).json({ error: 'groupId required' });
// Verify membership
const member = db.prepare('SELECT 1 FROM group_members WHERE group_id = ? AND user_id = ?').get(groupId, userId);
if (!member) return res.status(403).json({ error: 'Not a member' });
const pinned = db.prepare(`
SELECT m.id, m.content, m.image_url, m.created_at, m.user_id,
u.name as user_name, u.display_name as user_display_name, u.avatar as user_avatar,
pm.pin_order, pm.pinned_at
FROM pinned_messages pm
JOIN messages m ON pm.message_id = m.id
JOIN users u ON m.user_id = u.id
WHERE pm.user_id = ? AND pm.group_id = ? AND m.is_deleted = 0
ORDER BY pm.pin_order ASC
`).all(userId, groupId);
res.json({ pinned, count: pinned.length });
});
// Pin a message in a DM
router.post('/:id/pin', authMiddleware, (req, res) => {
const db = getDb();
const userId = req.user.id;
const messageId = parseInt(req.params.id);
const msg = db.prepare('SELECT m.*, g.is_direct FROM messages m JOIN groups g ON m.group_id = g.id WHERE m.id = ? AND m.is_deleted = 0').get(messageId);
if (!msg) return res.status(404).json({ error: 'Message not found' });
if (!msg.is_direct) return res.status(400).json({ error: 'Can only pin messages in direct messages' });
// Verify membership
const member = db.prepare('SELECT 1 FROM group_members WHERE group_id = ? AND user_id = ?').get(msg.group_id, userId);
if (!member) return res.status(403).json({ error: 'Not a member' });
// Check limit (5 per group per user)
const count = db.prepare('SELECT COUNT(*) as n FROM pinned_messages WHERE user_id = ? AND group_id = ?').get(userId, msg.group_id).n;
if (count >= 5) return res.status(400).json({ error: 'Maximum 5 pinned messages per conversation' });
const maxOrder = db.prepare('SELECT MAX(pin_order) as m FROM pinned_messages WHERE user_id = ? AND group_id = ?').get(userId, msg.group_id).m || 0;
db.prepare('INSERT OR IGNORE INTO pinned_messages (user_id, message_id, group_id, pin_order) VALUES (?, ?, ?, ?)')
.run(userId, messageId, msg.group_id, maxOrder + 1);
const newCount = db.prepare('SELECT COUNT(*) as n FROM pinned_messages WHERE user_id = ? AND group_id = ?').get(userId, msg.group_id).n;
res.json({ ok: true, count: newCount });
});
// Unpin a message
router.delete('/:id/pin', authMiddleware, (req, res) => {
const db = getDb();
const userId = req.user.id;
const messageId = parseInt(req.params.id);
const msg = db.prepare('SELECT group_id FROM messages WHERE id = ?').get(messageId);
if (!msg) return res.status(404).json({ error: 'Message not found' });
db.prepare('DELETE FROM pinned_messages WHERE user_id = ? AND message_id = ?').run(userId, messageId);
const newCount = db.prepare('SELECT COUNT(*) as n FROM pinned_messages WHERE user_id = ? AND group_id = ?').get(userId, msg.group_id).n;
res.json({ ok: true, count: newCount });
});
module.exports = router;