refactor: remove voting system, add author colors + pin numbering
- Remove votes backend (route, db functions, server mount) - Remove votes frontend (store, socket, PinOverlay badges, FeedbackPanel UI) - Add authorColors utility (8-color palette, deterministic hash) - Add getPinNumber() to annotationStore - Fix JWT to include username/display_name - Add resolveAuthorName DB fallback for old tokens
This commit is contained in:
@@ -14,9 +14,19 @@ const {
|
||||
deleteComment,
|
||||
incrementThreadCommentCount,
|
||||
decrementThreadCommentCount,
|
||||
getUserById,
|
||||
} = require('../db');
|
||||
const { hasCollectionRole, resolveBoard } = require('./board-access');
|
||||
|
||||
function resolveAuthorName(reqUser) {
|
||||
if (reqUser.display_name || reqUser.username) {
|
||||
return reqUser.display_name || reqUser.username;
|
||||
}
|
||||
// Fallback: look up from DB (old JWT tokens lack these fields)
|
||||
const dbUser = getUserById(reqUser.id);
|
||||
return dbUser ? (dbUser.display_name || dbUser.username || dbUser.email) : 'Unknown';
|
||||
}
|
||||
|
||||
const router = Router();
|
||||
|
||||
router.use(authMiddleware);
|
||||
@@ -86,7 +96,7 @@ router.post('/:boardId/threads', (req, res) => {
|
||||
id: commentId,
|
||||
threadId,
|
||||
userId,
|
||||
authorName: req.user.display_name || req.user.username,
|
||||
authorName: resolveAuthorName(req.user),
|
||||
authorColor: null,
|
||||
content: content.trim(),
|
||||
});
|
||||
@@ -198,7 +208,7 @@ router.post('/:boardId/threads/:threadId/comments', (req, res) => {
|
||||
id: commentId,
|
||||
threadId: req.params.threadId,
|
||||
userId,
|
||||
authorName: req.user.display_name || req.user.username,
|
||||
authorName: resolveAuthorName(req.user),
|
||||
authorColor: null,
|
||||
content: content.trim(),
|
||||
});
|
||||
|
||||
@@ -1,54 +0,0 @@
|
||||
const { Router } = require('express');
|
||||
const { authMiddleware } = require('../auth');
|
||||
const { getVotesByBoard, toggleVote } = require('../db');
|
||||
const { resolveBoard } = require('./board-access');
|
||||
|
||||
const router = Router();
|
||||
|
||||
router.use(authMiddleware);
|
||||
|
||||
// GET /api/boards/:boardId/votes — all votes for board
|
||||
router.get('/:boardId/votes', (req, res) => {
|
||||
try {
|
||||
const result = resolveBoard(req, res, 'viewer');
|
||||
if (!result) return;
|
||||
|
||||
const votes = getVotesByBoard(req.params.boardId);
|
||||
return res.json({ votes });
|
||||
} catch (err) {
|
||||
console.error('[votes] list error:', err);
|
||||
return res.status(500).json({ error: 'Internal server error' });
|
||||
}
|
||||
});
|
||||
|
||||
// POST /api/boards/:boardId/votes — toggle vote
|
||||
router.post('/:boardId/votes', (req, res) => {
|
||||
try {
|
||||
const result = resolveBoard(req, res, 'viewer');
|
||||
if (!result) return;
|
||||
|
||||
const { object_id } = req.body;
|
||||
if (!object_id) {
|
||||
return res.status(400).json({ error: 'object_id is required' });
|
||||
}
|
||||
|
||||
const active = toggleVote(req.params.boardId, object_id, req.user.id);
|
||||
|
||||
const io = req.app.get('io');
|
||||
if (io) {
|
||||
io.to(`board:${req.params.boardId}`).emit('vote:toggle', {
|
||||
boardId: req.params.boardId,
|
||||
objectId: object_id,
|
||||
userId: req.user.id,
|
||||
active,
|
||||
});
|
||||
}
|
||||
|
||||
return res.json({ active });
|
||||
} catch (err) {
|
||||
console.error('[votes] toggle error:', err);
|
||||
return res.status(500).json({ error: 'Internal server error' });
|
||||
}
|
||||
});
|
||||
|
||||
module.exports = router;
|
||||
Reference in New Issue
Block a user