fix: remove dead code, add ZodError handling, fix NaN pagination, add like routes, fix schemesCount sync
This commit is contained in:
@@ -54,7 +54,9 @@ router.get('/schemes/:userId', async (req: Request, res: Response) => {
|
||||
const { userId } = req.params;
|
||||
const { type = 'schemes', page = 1, limit = 20 } = req.query;
|
||||
|
||||
const skip = (Number(page) - 1) * Number(limit);
|
||||
const pageNum = Math.max(1, parseInt(String(page)) || 1);
|
||||
const limitNum = Math.min(100, Math.max(1, parseInt(String(limit)) || 20));
|
||||
const skip = (pageNum - 1) * limitNum;
|
||||
|
||||
let schemes;
|
||||
if (type === 'aob') {
|
||||
@@ -231,6 +233,9 @@ router.put('/username', async (req: Request, res: Response) => {
|
||||
username: body.username,
|
||||
});
|
||||
} catch (error) {
|
||||
if (error instanceof z.ZodError) {
|
||||
return res.status(400).json({ success: false, message: '参数验证失败', errors: error.errors });
|
||||
}
|
||||
console.error('Update username error:', error);
|
||||
res.status(500).json({ success: false, message: '更新失败' });
|
||||
}
|
||||
@@ -278,6 +283,9 @@ router.put('/email', async (req: Request, res: Response) => {
|
||||
email: body.email,
|
||||
});
|
||||
} catch (error) {
|
||||
if (error instanceof z.ZodError) {
|
||||
return res.status(400).json({ success: false, message: '参数验证失败', errors: error.errors });
|
||||
}
|
||||
console.error('Update email error:', error);
|
||||
res.status(500).json({ success: false, message: '更新失败' });
|
||||
}
|
||||
@@ -313,179 +321,12 @@ router.put('/avatar', async (req: Request, res: Response) => {
|
||||
avatar: body.avatar,
|
||||
});
|
||||
} catch (error) {
|
||||
if (error instanceof z.ZodError) {
|
||||
return res.status(400).json({ success: false, message: '参数验证失败', errors: error.errors });
|
||||
}
|
||||
console.error('Update avatar error:', error);
|
||||
res.status(500).json({ success: false, message: '更新失败' });
|
||||
}
|
||||
});
|
||||
|
||||
// ============================================
|
||||
// 获取用户统计
|
||||
// ============================================
|
||||
router.get('/stats/:userId', async (req: Request, res: Response) => {
|
||||
try {
|
||||
const { userId } = req.params;
|
||||
|
||||
const user = await prisma.user.findUnique({
|
||||
where: { id: userId },
|
||||
select: {
|
||||
schemesCount: true,
|
||||
favoritesCount: true,
|
||||
isVip: true,
|
||||
vipExpireAt: true,
|
||||
createdAt: true,
|
||||
},
|
||||
});
|
||||
|
||||
if (!user) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
message: '用户不存在',
|
||||
});
|
||||
}
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: {
|
||||
schemesCount: user.schemesCount,
|
||||
favoritesCount: user.favoritesCount,
|
||||
isVip: user.isVip,
|
||||
vipExpireAt: user.vipExpireAt,
|
||||
memberSince: user.createdAt,
|
||||
},
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('Get user stats error:', error);
|
||||
res.status(500).json({ success: false, message: '获取失败' });
|
||||
}
|
||||
});
|
||||
|
||||
// ============================================
|
||||
// 获取用户方案列表
|
||||
// ============================================
|
||||
router.get('/schemes/:userId', async (req: Request, res: Response) => {
|
||||
try {
|
||||
const { userId } = req.params;
|
||||
const { type = 'schemes', page = 1, limit = 20 } = req.query;
|
||||
|
||||
const skip = (Number(page) - 1) * Number(limit);
|
||||
|
||||
let schemes;
|
||||
if (type === 'aob') {
|
||||
schemes = await prisma.schemeAob.findMany({
|
||||
where: { userId, status: 'PUBLISHED' },
|
||||
orderBy: { createdAt: 'desc' },
|
||||
skip,
|
||||
take: Number(limit),
|
||||
select: {
|
||||
id: true, title: true, weaponName: true, category: true,
|
||||
viewsCount: true, downloadsCount: true, likesCount: true, createdAt: true,
|
||||
},
|
||||
});
|
||||
} else {
|
||||
schemes = await prisma.scheme.findMany({
|
||||
where: { userId, status: 'PUBLISHED' },
|
||||
orderBy: { createdAt: 'desc' },
|
||||
skip,
|
||||
take: Number(limit),
|
||||
select: {
|
||||
id: true, title: true, weaponName: true, category: true,
|
||||
viewsCount: true, downloadsCount: true, likesCount: true, createdAt: true,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: schemes,
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('Get user schemes error:', error);
|
||||
res.status(500).json({ success: false, message: '获取失败' });
|
||||
}
|
||||
});
|
||||
|
||||
// ============================================
|
||||
// 获取用户被收藏次数
|
||||
// ============================================
|
||||
router.get('/favorited-count/:userId', async (req: Request, res: Response) => {
|
||||
try {
|
||||
const { userId } = req.params;
|
||||
|
||||
const user = await prisma.user.findUnique({
|
||||
where: { id: userId },
|
||||
select: { favoritesCount: true },
|
||||
});
|
||||
|
||||
if (!user) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
message: '用户不存在',
|
||||
});
|
||||
}
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
favoritedCount: user.favoritesCount,
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('Get favorited count error:', error);
|
||||
res.status(500).json({ success: false, message: '获取失败' });
|
||||
}
|
||||
});
|
||||
|
||||
// ============================================
|
||||
// 获取用户功能限制信息
|
||||
// ============================================
|
||||
router.get('/limits/:userId', async (req: Request, res: Response) => {
|
||||
try {
|
||||
const { userId } = req.params;
|
||||
|
||||
// 验证用户是否存在
|
||||
const user = await prisma.user.findUnique({
|
||||
where: { id: userId },
|
||||
select: {
|
||||
id: true,
|
||||
isVip: true,
|
||||
vipExpireAt: true,
|
||||
},
|
||||
});
|
||||
|
||||
if (!user) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
message: '用户不存在',
|
||||
});
|
||||
}
|
||||
|
||||
// 检查 VIP 是否过期
|
||||
const now = new Date();
|
||||
const isVipActive = user.isVip && user.vipExpireAt && user.vipExpireAt > now;
|
||||
|
||||
// 根据 VIP 状态返回不同的限制
|
||||
const limits = isVipActive
|
||||
? {
|
||||
maxDailyUses: 500, // VIP: 每日最多使用500次
|
||||
dailyUsesLeft: 500, // 剩余次数(简化处理,实际需要统计当日使用)
|
||||
maxFavorites: 1000, // VIP: 最多收藏1000个
|
||||
maxSchemes: 200, // VIP: 最多创建200个方案
|
||||
canUploadIcc: true, // VIP: 可以上传 ICC
|
||||
}
|
||||
: {
|
||||
maxDailyUses: 50, // 非VIP: 每日最多使用50次
|
||||
dailyUsesLeft: 50, // 剩余次数
|
||||
maxFavorites: 100, // 非VIP: 最多收藏100个
|
||||
maxSchemes: 50, // 非VIP: 最多创建50个方案
|
||||
canUploadIcc: false, // 非VIP: 不能上传 ICC
|
||||
};
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
...limits,
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('Get user limits error:', error);
|
||||
res.status(500).json({ success: false, message: '获取失败' });
|
||||
}
|
||||
});
|
||||
|
||||
export default router;
|
||||
|
||||
Reference in New Issue
Block a user