145 lines
3.8 KiB
JavaScript
145 lines
3.8 KiB
JavaScript
const express = require('express');
|
||
const router = express.Router();
|
||
const viewHistoryStore = require('../store/viewHistoryStore');
|
||
const roomStore = require('../store/roomStore');
|
||
|
||
/**
|
||
* 简单的认证中间件
|
||
* 从 Authori-zation 头获取用户ID(实际项目应验证 JWT)
|
||
*/
|
||
function authMiddleware(req, res, next) {
|
||
const token = req.headers['authori-zation'] || req.headers['authorization'];
|
||
|
||
if (!token) {
|
||
return res.status(401).json({
|
||
code: 401,
|
||
message: '请先登录'
|
||
});
|
||
}
|
||
|
||
// 简单模拟:从 token 中提取用户ID
|
||
// 实际项目应该验证 JWT 并解析用户信息
|
||
// 这里假设 token 格式为 "Bearer userId" 或直接是 userId
|
||
let userId;
|
||
if (token.startsWith('Bearer ')) {
|
||
userId = parseInt(token.substring(7), 10);
|
||
} else {
|
||
userId = parseInt(token, 10);
|
||
}
|
||
|
||
if (isNaN(userId)) {
|
||
// 如果无法解析,默认使用用户ID 1
|
||
userId = 1;
|
||
}
|
||
|
||
req.userId = userId;
|
||
next();
|
||
}
|
||
|
||
/**
|
||
* 记录观看历史
|
||
* POST /api/front/activity/record-view
|
||
*/
|
||
router.post('/record-view', authMiddleware, (req, res) => {
|
||
try {
|
||
const { targetType, targetId, targetTitle, coverImage, streamerName, authorName, viewDuration } = req.body;
|
||
|
||
if (!targetType || !targetId) {
|
||
return res.status(400).json({ code: 400, message: '缺少必要参数' });
|
||
}
|
||
|
||
viewHistoryStore.record({
|
||
userId: req.userId,
|
||
targetType,
|
||
targetId,
|
||
targetTitle,
|
||
coverImage,
|
||
streamerName,
|
||
authorName,
|
||
viewDuration
|
||
});
|
||
|
||
res.json({ code: 200, message: '记录成功', data: { success: true } });
|
||
} catch (error) {
|
||
console.error('[ViewHistory] 记录观看历史失败:', error);
|
||
res.status(500).json({ code: 500, message: '记录失败' });
|
||
}
|
||
});
|
||
|
||
/**
|
||
* 获取观看历史
|
||
* GET /api/front/activity/view-history
|
||
*/
|
||
router.get('/view-history', authMiddleware, (req, res) => {
|
||
try {
|
||
const { type, page = 1, pageSize = 20 } = req.query;
|
||
|
||
const result = viewHistoryStore.getUserHistory(
|
||
req.userId,
|
||
type,
|
||
parseInt(page),
|
||
parseInt(pageSize)
|
||
);
|
||
|
||
// 补充直播间的实时状态
|
||
result.list = result.list.map(item => {
|
||
if (item.targetType === 'room') {
|
||
const room = roomStore.getById(item.targetId);
|
||
if (room) {
|
||
return {
|
||
...item,
|
||
isLive: room.isLive,
|
||
viewerCount: room.viewerCount
|
||
};
|
||
}
|
||
}
|
||
return item;
|
||
});
|
||
|
||
res.json({ code: 200, message: '获取成功', data: result });
|
||
} catch (error) {
|
||
console.error('[ViewHistory] 获取观看历史失败:', error);
|
||
res.status(500).json({ code: 500, message: '获取失败' });
|
||
}
|
||
});
|
||
|
||
/**
|
||
* 清除观看历史
|
||
* DELETE /api/front/activity/view-history
|
||
*/
|
||
router.delete('/view-history', authMiddleware, (req, res) => {
|
||
try {
|
||
const { type } = req.query;
|
||
|
||
viewHistoryStore.clearUserHistory(req.userId, type);
|
||
|
||
res.json({ code: 200, message: '清除成功', data: 'success' });
|
||
} catch (error) {
|
||
console.error('[ViewHistory] 清除观看历史失败:', error);
|
||
res.status(500).json({ code: 500, message: '清除失败' });
|
||
}
|
||
});
|
||
|
||
/**
|
||
* 删除单条观看历史
|
||
* DELETE /api/front/activity/view-history/:id
|
||
*/
|
||
router.delete('/view-history/:id', authMiddleware, (req, res) => {
|
||
try {
|
||
const { id } = req.params;
|
||
|
||
const success = viewHistoryStore.deleteRecord(req.userId, parseInt(id));
|
||
|
||
if (success) {
|
||
res.json({ code: 200, message: '删除成功', data: 'success' });
|
||
} else {
|
||
res.status(404).json({ code: 404, message: '记录不存在' });
|
||
}
|
||
} catch (error) {
|
||
console.error('[ViewHistory] 删除观看历史失败:', error);
|
||
res.status(500).json({ code: 500, message: '删除失败' });
|
||
}
|
||
});
|
||
|
||
module.exports = router;
|