90 lines
2.5 KiB
TypeScript
90 lines
2.5 KiB
TypeScript
import express, { Request, Response } from 'express';
|
|
import { SudokuRecord, SudokuDifficulty } from '../models/SudokuRecord';
|
|
import { auth } from '../middleware/auth';
|
|
|
|
const router = express.Router();
|
|
|
|
// 提交数独记录(需要登录)
|
|
router.post('/record', auth, async (req: Request, res: Response) => {
|
|
try {
|
|
const { difficulty, timeSeconds, won } = req.body;
|
|
|
|
if (!req.user?._id) {
|
|
return res.status(401).json({ error: '未登录' });
|
|
}
|
|
|
|
const validDifficulties: SudokuDifficulty[] = ['easy', 'medium', 'hard'];
|
|
if (!validDifficulties.includes(difficulty)) {
|
|
return res.status(400).json({ error: '无效的难度级别' });
|
|
}
|
|
|
|
if (typeof timeSeconds !== 'number' || timeSeconds < 0) {
|
|
return res.status(400).json({ error: '无效的时间' });
|
|
}
|
|
|
|
if (typeof won !== 'boolean') {
|
|
return res.status(400).json({ error: '无效的游戏结果' });
|
|
}
|
|
|
|
const record = new SudokuRecord({
|
|
userId: req.user._id,
|
|
username: req.user.username,
|
|
fullname: req.user.fullname || req.user.username,
|
|
difficulty,
|
|
timeSeconds,
|
|
won
|
|
});
|
|
|
|
await record.save();
|
|
|
|
res.status(201).json({
|
|
message: '游戏记录保存成功',
|
|
record
|
|
});
|
|
} catch (error) {
|
|
console.error('保存数独记录失败:', error);
|
|
res.status(500).json({ error: '保存数独记录失败' });
|
|
}
|
|
});
|
|
|
|
// 获取数独排行榜
|
|
router.get('/leaderboard/:difficulty', async (req: Request, res: Response) => {
|
|
try {
|
|
const { difficulty } = req.params;
|
|
const { page = '1', limit = '10' } = req.query;
|
|
|
|
const validDifficulties: SudokuDifficulty[] = ['easy', 'medium', 'hard'];
|
|
if (!validDifficulties.includes(difficulty as SudokuDifficulty)) {
|
|
return res.status(400).json({ error: '无效的难度级别' });
|
|
}
|
|
|
|
const pageNum = parseInt(page as string, 10);
|
|
const pageSize = parseInt(limit as string, 10);
|
|
const skipCount = (pageNum - 1) * pageSize;
|
|
|
|
const records = await SudokuRecord.getLeaderboard(
|
|
difficulty as SudokuDifficulty,
|
|
skipCount,
|
|
pageSize
|
|
);
|
|
|
|
const totalUsers = await SudokuRecord.distinct('userId', {
|
|
difficulty,
|
|
won: true
|
|
});
|
|
|
|
res.json({
|
|
records,
|
|
total: totalUsers.length,
|
|
currentPage: pageNum,
|
|
totalPages: Math.ceil(totalUsers.length / pageSize),
|
|
difficulty
|
|
});
|
|
} catch (error) {
|
|
console.error('获取数独排行榜失败:', error);
|
|
res.status(500).json({ error: '获取数独排行榜失败' });
|
|
}
|
|
});
|
|
|
|
export default router;
|