initial commit
This commit is contained in:
100
backend/routes/picker.js
Normal file
100
backend/routes/picker.js
Normal file
@@ -0,0 +1,100 @@
|
||||
const express = require('express');
|
||||
const db = require('../database');
|
||||
|
||||
const router = express.Router();
|
||||
|
||||
// Pick a random game with filters and repeat avoidance
|
||||
router.post('/pick', (req, res) => {
|
||||
try {
|
||||
const {
|
||||
playerCount,
|
||||
drawing,
|
||||
length,
|
||||
familyFriendly,
|
||||
sessionId
|
||||
} = req.body;
|
||||
|
||||
// Build query for eligible games
|
||||
let query = 'SELECT * FROM games WHERE enabled = 1';
|
||||
const params = [];
|
||||
|
||||
if (playerCount) {
|
||||
const count = parseInt(playerCount);
|
||||
query += ' AND min_players <= ? AND max_players >= ?';
|
||||
params.push(count, count);
|
||||
}
|
||||
|
||||
if (drawing === 'only') {
|
||||
query += ' AND game_type = ?';
|
||||
params.push('Drawing');
|
||||
} else if (drawing === 'exclude') {
|
||||
query += ' AND (game_type != ? OR game_type IS NULL)';
|
||||
params.push('Drawing');
|
||||
}
|
||||
|
||||
if (length) {
|
||||
if (length === 'short') {
|
||||
query += ' AND (length_minutes <= 15 OR length_minutes IS NULL)';
|
||||
} else if (length === 'medium') {
|
||||
query += ' AND length_minutes > 15 AND length_minutes <= 25';
|
||||
} else if (length === 'long') {
|
||||
query += ' AND length_minutes > 25';
|
||||
}
|
||||
}
|
||||
|
||||
if (familyFriendly !== undefined) {
|
||||
query += ' AND family_friendly = ?';
|
||||
params.push(familyFriendly ? 1 : 0);
|
||||
}
|
||||
|
||||
// Get eligible games
|
||||
const stmt = db.prepare(query);
|
||||
let eligibleGames = stmt.all(...params);
|
||||
|
||||
if (eligibleGames.length === 0) {
|
||||
return res.status(404).json({
|
||||
error: 'No games match the current filters',
|
||||
suggestion: 'Try adjusting your filters or enabling more games'
|
||||
});
|
||||
}
|
||||
|
||||
// Apply repeat avoidance if session provided
|
||||
if (sessionId) {
|
||||
const lastGames = db.prepare(`
|
||||
SELECT game_id FROM session_games
|
||||
WHERE session_id = ?
|
||||
ORDER BY played_at DESC
|
||||
LIMIT 2
|
||||
`).all(sessionId);
|
||||
|
||||
const excludeIds = lastGames.map(g => g.game_id);
|
||||
|
||||
if (excludeIds.length > 0) {
|
||||
eligibleGames = eligibleGames.filter(game => !excludeIds.includes(game.id));
|
||||
}
|
||||
|
||||
if (eligibleGames.length === 0) {
|
||||
return res.status(404).json({
|
||||
error: 'All eligible games have been played recently',
|
||||
suggestion: 'Enable more games or adjust your filters',
|
||||
recentlyPlayed: excludeIds
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Pick random game from eligible pool
|
||||
const randomIndex = Math.floor(Math.random() * eligibleGames.length);
|
||||
const selectedGame = eligibleGames[randomIndex];
|
||||
|
||||
res.json({
|
||||
game: selectedGame,
|
||||
poolSize: eligibleGames.length,
|
||||
totalEnabled: eligibleGames.length + (sessionId ? 2 : 0) // Approximate
|
||||
});
|
||||
} catch (error) {
|
||||
res.status(500).json({ error: error.message });
|
||||
}
|
||||
});
|
||||
|
||||
module.exports = router;
|
||||
|
||||
Reference in New Issue
Block a user