diff --git a/cryptide_project/server/api/controllers/ScoreboardController.js b/cryptide_project/server/api/controllers/ScoreboardController.js index 51812fd..6010beb 100644 --- a/cryptide_project/server/api/controllers/ScoreboardController.js +++ b/cryptide_project/server/api/controllers/ScoreboardController.js @@ -6,6 +6,10 @@ const ENIGME_MOYEN = "enigme_moyenne"; const ENIGME_DIFFICILE = "enigme_difficile"; class SessionController { + // --------------------------------------------------- + // ----------------- GET DAILY STATS ----------------- + // --------------------------------------------------- + static async getDailyMastermind(req, res){ const db = new DatabaseService(); @@ -14,7 +18,68 @@ class SessionController { const dailyMastermindStats = await db.getDailyMastermindStats(); - res.status(200).json({ dailyMastermindStats }); + res.status(200).json({ tab : dailyMastermindStats }); + } + catch(error){ + console.error(error); + res.status(500).json({ error: 'Erreur lors de la récupération du scoreboard.' }); + } + finally{ + await db.disconnect(); + } + } + + static async getDailyOnline(req, res){ + const db = new DatabaseService(); + + try{ + await db.connect(); + + const dailyOnlineStats = await db.getDailyOnlineStats(); + + res.status(200).json({ tab : dailyOnlineStats }); + } + catch(error){ + console.error(error); + res.status(500).json({ error: 'Erreur lors de la récupération du scoreboard.' }); + } + finally{ + await db.disconnect(); + } + } + + // --------------------------------------------------- + // ---------------- GET WEEKLY STATS ----------------- + // --------------------------------------------------- + + static async getWeeklyMastermind(req, res){ + const db = new DatabaseService(); + + try{ + await db.connect(); + + const weeklyMastermindStats = await db.getWeeklyMastermindStats(); + + res.status(200).json({ tab : weeklyMastermindStats }); + } + catch(error){ + console.error(error); + res.status(500).json({ error: 'Erreur lors de la récupération du scoreboard.' }); + } + finally{ + await db.disconnect(); + } + } + + static async getWeeklyOnline(req, res){ + const db = new DatabaseService(); + + try{ + await db.connect(); + + const weeklyOnlineStats = await db.getWeeklyOnlineStats(); + + res.status(200).json({ tab : weeklyOnlineStats }); } catch(error){ console.error(error); @@ -24,6 +89,7 @@ class SessionController { await db.disconnect(); } } + } module.exports = SessionController; \ No newline at end of file diff --git a/cryptide_project/server/api/routes/AuthRoutes.js b/cryptide_project/server/api/routes/AuthRoutes.js index 1642035..9622c3b 100644 --- a/cryptide_project/server/api/routes/AuthRoutes.js +++ b/cryptide_project/server/api/routes/AuthRoutes.js @@ -21,7 +21,12 @@ router.post('/session/addHardEnigmaStats', SessionController.addHardEnigmaStats) router.post('/session/addOnlineStats', SessionController.addOnlineStats); router.put('/session/updatePseudo', SessionController.UpdatePseudo); -// Routes pour le scoreboard +// Routes pour le daily scoreboard router.get('/scoreboard/getDailyMastermind', ScoreboardController.getDailyMastermind); +router.get('/scoreboard/getDailyOnline', ScoreboardController.getDailyOnline); +// Routes pour le weekly scoreboard +router.get('/scoreboard/getWeeklyMastermind', ScoreboardController.getWeeklyMastermind); +router.get('/scoreboard/getWeeklyOnline', ScoreboardController.getWeeklyOnline); + module.exports = router; diff --git a/cryptide_project/server/api/services/DatabaseService.js b/cryptide_project/server/api/services/DatabaseService.js index 7cc35b8..7c8e9c2 100644 --- a/cryptide_project/server/api/services/DatabaseService.js +++ b/cryptide_project/server/api/services/DatabaseService.js @@ -127,16 +127,16 @@ class DatabaseService { }); } - // ------------------------------------------------------------- - // ------------------- STATS GENERALES ------------------------- - // ------------------------------------------------------------- + // --------------------------------------------------------------- + // ------------------- STATS JOURNALIERE ------------------------- + // --------------------------------------------------------------- - // Récupérer les 10 meilleurs scores de la journée async getDailyMastermindStats() { return new Promise((resolve, reject) => { // Obtenez la date actuelle au format AAAA-MM-JJ const currentDate = new Date().toISOString().slice(0, 10); + // Récupérer les 5 meilleurs scores de la journée this.client.all( 'SELECT pseudo, score FROM users INNER JOIN games ON users.idUser = games.idUser WHERE gameType = ? AND SUBSTR(playedDate, 1, 10) = ? ORDER BY score DESC LIMIT 10', "mastermind", @@ -151,8 +151,74 @@ class DatabaseService { ); }); } + + async getDailyOnlineStats() { + return new Promise((resolve, reject) => { + const currentDate = new Date().toISOString().slice(0, 10); + this.client.all( + 'SELECT pseudo, COUNT(*) AS wins FROM users INNER JOIN games ON users.idUser = games.idUser WHERE gameType = ? AND SUBSTR(playedDate, 1, 10) = ? AND win = ? GROUP BY users.idUser ORDER BY wins DESC LIMIT 10', + "multijoueur", currentDate, 1, + (err, result) => { + if (err) { + reject(err); + } else { + resolve(result); + } + } + ); + }); + } + + + // --------------------------------------------------------------- + // ------------------- STATS HEBDOMADAIRE ------------------------ + // --------------------------------------------------------------- + + async getWeeklyMastermindStats() { + return new Promise((resolve, reject) => { + const currentDate = new Date().toISOString().slice(0, 10); + const currentDay = new Date().getDay(); + const firstDayOfWeek = new Date(new Date().setDate(new Date().getDate() - currentDay)).toISOString().slice(0, 10); + + this.client.all( + 'SELECT pseudo, score FROM users INNER JOIN games ON users.idUser = games.idUser WHERE gameType = ? AND SUBSTR(playedDate, 1, 10) BETWEEN ? AND ? ORDER BY score DESC LIMIT 10', + "mastermind", + firstDayOfWeek, + currentDate, + (err, result) => { + if (err) { + reject(err); + } else { + resolve(result); + } + } + ); + }); + } + + async getWeeklyOnlineStats() { + return new Promise((resolve, reject) => { + const currentDate = new Date().toISOString().slice(0, 10); + const currentDay = new Date().getDay(); + const firstDayOfWeek = new Date(new Date().setDate(new Date().getDate() - currentDay)).toISOString().slice(0, 10); + this.client.all( + 'SELECT pseudo, COUNT(*) as wins FROM users INNER JOIN games ON users.idUser = games.idUser WHERE gameType = ? AND SUBSTR(playedDate, 1, 10) BETWEEN ? AND ? AND win = ? ORDER BY wins DESC LIMIT 10', + "multijoueur", + firstDayOfWeek, + currentDate, + 1, + (err, result) => { + if (err) { + reject(err); + } else { + resolve(result); + } + } + ); + }); + } // ------------------------------------------------------------- // ------------------- STATS MASTERMIND ------------------------ diff --git a/cryptide_project/src/Components/ScoreBoard.tsx b/cryptide_project/src/Components/ScoreBoard.tsx index 15f63ee..9d504e6 100644 --- a/cryptide_project/src/Components/ScoreBoard.tsx +++ b/cryptide_project/src/Components/ScoreBoard.tsx @@ -29,26 +29,51 @@ import ScoreboardService from '../services/ScoreboardService'; const ScoreBoard: React.FC<{ Player: User }> = ({ Player }) => { const theme=useTheme(); + // DAILY STATS const [dailyMastermindStats, setDailyMastermindStats] = useState(null); + const [dailyEasyEnigmaStats, setDailyEasyEnigmaStats] = useState(null); + const [dailyMediumEnigmaStats, setDailyMediumEnigmaStats] = useState(null); + const [dailyHardEnigmaStats, setDailyHardEnigmaStats] = useState(null); + const [dailyOnlineStats, setDailyOnlineStats] = useState(null); - // Récupérer les records daily et weekly + // WEEKLY STATS + const [weeklyMastermindStats, setWeeklyMastermindStats] = useState(null); + const [weeklyEasyEnigmaStats, setWeeklyEasyEnigmaStats] = useState(null); + const [weeklyMediumEnigmaStats, setWeeklyMediumEnigmaStats] = useState(null); + const [weeklyHardEnigmaStats, setWeeklyHardEnigmaStats] = useState(null); + const [weeklyOnlineStats, setWeeklyOnlineStats] = useState(null); + + // Récupérer les records daily useEffect(() => { - async function fetchDailyMastermindStats() { + async function fetchDailyStats() { try { - const result = await ScoreboardService.getDailyMastermindStats(); - console.log(result); - setDailyMastermindStats(result); + const resultMM = await ScoreboardService.getDailyMastermindStats(); + const resultOL = await ScoreboardService.getDailyOnlineStats(); + console.log(resultMM); + console.log(resultOL); + setDailyMastermindStats(resultMM); + setDailyOnlineStats(resultOL); + } catch (error) { + console.error(error); + } + } + + async function fetchWeeklyStats() { + try{ + const resultWMM = await ScoreboardService.getWeeklyMastermindStats(); + const resultOL = await ScoreboardService.getWeeklyOnlineStats(); + console.log(resultWMM); + console.log(resultOL); + setWeeklyMastermindStats(resultWMM); + setWeeklyOnlineStats(resultOL); } catch (error) { console.error(error); } } - - fetchDailyMastermindStats(); + + fetchDailyStats(); + fetchWeeklyStats(); }, []); - - useEffect(() => { - console.log("Updated dailyMastermindStats:", dailyMastermindStats); - }, [dailyMastermindStats]); return ( //
@@ -153,13 +178,33 @@ const ScoreBoard: React.FC<{ Player: User }> = ({ Player }) => { width='100' alt="Person2"/> - {dailyMastermindStats !== null ? (dailyMastermindStats.dailyMastermindStats.map((stats: any, index: number) => ( + MasterMind : + {dailyMastermindStats !== null ? (dailyMastermindStats.tab.length !== 0 ? dailyMastermindStats.tab.map((stats: any, index: number) => ( {stats.pseudo} {stats.score} - )) - ) : ( + )) : ( + + No data + + )) : ( + + No data + + )} +
+ Multijoueur : + {dailyOnlineStats !== null ? (dailyOnlineStats.tab.length !== 0 ? dailyOnlineStats.tab.map((stats: any, index: number) => ( + + {stats.pseudo} + {stats.wins} + + )) : ( + + No data + + )) : ( No data @@ -171,6 +216,39 @@ const ScoreBoard: React.FC<{ Player: User }> = ({ Player }) => { height='100' width='100' alt="Person2"/> + + MasterMind : + {weeklyMastermindStats !== null ? (weeklyMastermindStats.tab.length !== 0 ? weeklyMastermindStats.tab.map((stats: any, index: number) => ( + + {stats.pseudo} + {stats.score} + + )) : ( + + No data + + )) : ( + + No data + + )} +
+ Multijoueur : + {weeklyOnlineStats !== null ? (weeklyOnlineStats.tab.length !== 0 ? weeklyOnlineStats.tab.map((stats: any, index: number) => ( + + {stats.pseudo} + {stats.wins} + + )) : ( + + No data + + )) : ( + + No data + + )} +
diff --git a/cryptide_project/src/services/ScoreboardService.tsx b/cryptide_project/src/services/ScoreboardService.tsx index 9e5427f..cf7f72d 100644 --- a/cryptide_project/src/services/ScoreboardService.tsx +++ b/cryptide_project/src/services/ScoreboardService.tsx @@ -1,6 +1,11 @@ import {ADRESSE_DBSERVER} from '../AdressSetup'; class ScoreboardService { + + // ------------------------------ GET ------------------------------ + // ----------------------------- DAILY ----------------------------- + // ----------------------------- STATS ----------------------------- + static async getDailyMastermindStats() { try { const response = await fetch(ADRESSE_DBSERVER + '/scoreboard/getDailyMastermind', { @@ -23,6 +28,79 @@ class ScoreboardService { throw error; } } + + static async getDailyOnlineStats() { + try { + const response = await fetch(ADRESSE_DBSERVER + '/scoreboard/getDailyOnline', { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + credentials: 'include', + }); + + if (response.ok) { + const result = await response.json(); + return result; + } else { + const errorResponse = await response.json(); + throw new Error(errorResponse.error); + } + } catch (error) { + console.error(error); + throw error; + } + } + + // ------------------------------ GET ------------------------------ + // ----------------------------- WEEKLY ---------------------------- + // ----------------------------- STATS ----------------------------- + + static async getWeeklyMastermindStats() { + try { + const response = await fetch(ADRESSE_DBSERVER + '/scoreboard/getWeeklyMastermind', { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + credentials: 'include', + }); + + if (response.ok) { + const result = await response.json(); + return result; + } else { + const errorResponse = await response.json(); + throw new Error(errorResponse.error); + } + } catch (error) { + console.error(error); + throw error; + } + } + + static async getWeeklyOnlineStats() { + try { + const response = await fetch(ADRESSE_DBSERVER + '/scoreboard/getWeeklyOnline', { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + credentials: 'include', + }); + + if (response.ok) { + const result = await response.json(); + return result; + } else { + const errorResponse = await response.json(); + throw new Error(errorResponse.error); + } + } catch (error) { + console.error(error); + throw error; + } + } } export default ScoreboardService; \ No newline at end of file