From d74013a13a36664fa57f0a56c02b49b2799ad38d Mon Sep 17 00:00:00 2001 From: Francois G Date: Fri, 17 Mar 2023 14:33:12 +0100 Subject: [PATCH] Solve compatibility problem with new DB schema. To test use pac_test instead of pc in config.txt --- .../peeratcode/model/Chapter.java | 16 ++++++++++++- .../repository/DatabaseRepository.java | 24 ++++++++++--------- .../peeratcode/routes/ChapterElement.java | 2 ++ .../peeratcode/routes/Leaderboard.java | 3 ++- 4 files changed, 32 insertions(+), 13 deletions(-) diff --git a/src/be/jeffcheasey88/peeratcode/model/Chapter.java b/src/be/jeffcheasey88/peeratcode/model/Chapter.java index 8d98cad..f286ae3 100644 --- a/src/be/jeffcheasey88/peeratcode/model/Chapter.java +++ b/src/be/jeffcheasey88/peeratcode/model/Chapter.java @@ -1,5 +1,7 @@ package be.jeffcheasey88.peeratcode.model; +import java.sql.Timestamp; +import java.time.LocalDateTime; import java.util.List; public class Chapter { @@ -7,10 +9,14 @@ public class Chapter { private int id; private String name; private List puzzles; + private Timestamp startDate; + private Timestamp endDate; - public Chapter(int id, String name) { + public Chapter(int id, String name, Timestamp startDate, Timestamp endDate) { this.id = id; this.name = name; + this.startDate = startDate; + this.endDate = endDate; } public int getId() { @@ -36,6 +42,14 @@ public class Chapter { public void setPuzzles(List puzzles) { this.puzzles = puzzles; } + + public Timestamp getStartDate() { + return startDate; + } + + public Timestamp getEndDate() { + return endDate; + } @Override public boolean equals(Object object){ diff --git a/src/be/jeffcheasey88/peeratcode/repository/DatabaseRepository.java b/src/be/jeffcheasey88/peeratcode/repository/DatabaseRepository.java index 0f337c3..6dac7d3 100644 --- a/src/be/jeffcheasey88/peeratcode/repository/DatabaseRepository.java +++ b/src/be/jeffcheasey88/peeratcode/repository/DatabaseRepository.java @@ -33,20 +33,21 @@ public class DatabaseRepository { private static final String CHECK_PASSWORD = "SELECT id_player, passwd FROM players WHERE pseudo=?"; private static final String SCORE = "SELECT score FROM completions WHERE fk_player = ? AND fk_puzzle = ?"; private static final String GET_COMPLETION = "SELECT id_completion, tries, fileName, score FROM completions WHERE fk_puzzle = ? AND fk_player = ?"; - private static final String GET_PLAYER = "SELECT * FROM players WHERE "; - private static final String GET_PLAYER_BY_ID = GET_PLAYER + "id_player = ?"; - private static final String GET_PLAYER_BY_PSEUDO = GET_PLAYER + "pseudo = ?"; - private static final String GET_PLAYER_DETAILS = "SELECT p.pseudo, p.email, p.firstname, p.lastname, p.description, p.avatar, p.sgroup,\n" + private static final String PART_GET_PLAYER_GROUP = " LEFT JOIN containsGroups cg ON p.id_player = cg.fk_player LEFT JOIN groups g ON cg.fk_group = g.id_group "; + private static final String GET_PLAYER = "SELECT p.*, GROUP_CONCAT(g.name) FROM players p WHERE "; + private static final String GET_PLAYER_BY_ID = GET_PLAYER + "id_player = ?" + PART_GET_PLAYER_GROUP; + private static final String GET_PLAYER_BY_PSEUDO = GET_PLAYER + "pseudo = ?" + PART_GET_PLAYER_GROUP;; + private static final String GET_PLAYER_DETAILS = "SELECT p.pseudo, p.email, p.firstname, p.lastname, p.description, p.avatar, GROUP_CONCAT(DISTINCT g.name) AS sgroup,\n" + " SUM(c.score) AS playerScore, COUNT(c.id_completion) AS playerCompletions, SUM(c.tries) AS playerTries,\n" - + " GROUP_CONCAT(DISTINCT b.name ORDER BY b.name ASC SEPARATOR ', ') AS badges\n" + "FROM players p\n" + + " GROUP_CONCAT(DISTINCT b.name ORDER BY b.name ASC) AS badges FROM players p\n" + "LEFT JOIN completions c ON p.id_player = c.fk_player\n" + "LEFT JOIN containsBadges cb ON p.id_player = cb.fk_player\n" - + "LEFT JOIN badges b ON cb.fk_badge = b.id_badge\n"; + + "LEFT JOIN badges b ON cb.fk_badge = b.id_badge\n" + PART_GET_PLAYER_GROUP; private static final String GET_PLAYER_DETAILS_BY_ID = GET_PLAYER_DETAILS - + "WHERE p.id_player = ? GROUP BY p.id_player;"; + + " WHERE p.id_player = ? GROUP BY p.id_player;"; private static final String GET_PLAYER_DETAILS_BY_PSEUDO = GET_PLAYER_DETAILS - + "WHERE p.pseudo = ? GROUP BY p.pseudo;"; - private static final String ALL_PLAYERS_FOR_LEADERBOARD = "SELECT p.*, sum(c.score) AS playerScore, count(c.id_completion) AS playerCompletions, sum(c.tries) AS playerTries FROM players p LEFT JOIN completions c ON c.fk_player = p.id_player GROUP BY p.id_player ORDER BY playerScore DESC"; + + " WHERE p.pseudo = ? GROUP BY p.pseudo;"; + private static final String ALL_PLAYERS_FOR_LEADERBOARD = "SELECT p.*, GROUP_CONCAT(DISTINCT g.name) AS sgroup, sum(c.score) AS playerScore, count(c.id_completion) AS playerCompletions, sum(c.tries) AS playerTries FROM players p " + PART_GET_PLAYER_GROUP + "LEFT JOIN completions c ON c.fk_player = p.id_player GROUP BY p.id_player ORDER BY playerScore DESC"; private static final String GET_BADGE = "SELECT * FROM badges WHERE id_badge = ?"; private static final String INSERT_COMPLETION = "INSERT INTO completions (fk_puzzle, fk_player, tries, code, fileName, score) values (?, ?, ?, ?, ?, ?)"; private static final String UPDATE_COMPLETION = "UPDATE completions SET tries = ?, filename = ?, score = ? WHERE fk_puzzle = ? AND fk_player = ?"; @@ -68,11 +69,12 @@ public class DatabaseRepository { private Puzzle makePuzzle(ResultSet puzzleResult) throws SQLException { return new Puzzle(puzzleResult.getInt("id_puzzle"), puzzleResult.getString("name"), - puzzleResult.getString("content"), null, "", 0, hasColumn(puzzleResult, "origin") ? puzzleResult.getInt("origin") : -1); + puzzleResult.getString("content"), null, "", 0, + hasColumn(puzzleResult, "origin") ? puzzleResult.getInt("origin") : -1); } private Chapter makeChapter(ResultSet chapterResult) throws SQLException { - return new Chapter(chapterResult.getInt("id_chapter"), chapterResult.getString("name")); + return new Chapter(chapterResult.getInt("id_chapter"), chapterResult.getString("name"), chapterResult.getTimestamp("start_date"), chapterResult.getTimestamp("end_date")); } private Completion makeCompletion(int playerId, int puzzleId, ResultSet completionResult) throws SQLException { diff --git a/src/be/jeffcheasey88/peeratcode/routes/ChapterElement.java b/src/be/jeffcheasey88/peeratcode/routes/ChapterElement.java index 8e6ade6..0c5d5e0 100644 --- a/src/be/jeffcheasey88/peeratcode/routes/ChapterElement.java +++ b/src/be/jeffcheasey88/peeratcode/routes/ChapterElement.java @@ -31,6 +31,8 @@ public class ChapterElement implements Response { JSONObject chapterJSON = new JSONObject(); chapterJSON.put("id", chapter.getId()); chapterJSON.put("name", chapter.getName()); + if (chapter.getStartDate() != null) chapterJSON.put("startDate", chapter.getStartDate()); + if (chapter.getEndDate() != null) chapterJSON.put("endDate", chapter.getEndDate()); JSONArray puzzles = new JSONArray(); for (Puzzle puzzle : chapter.getPuzzles()) { JSONObject puzzleJSON = new JSONObject(); diff --git a/src/be/jeffcheasey88/peeratcode/routes/Leaderboard.java b/src/be/jeffcheasey88/peeratcode/routes/Leaderboard.java index 48f3487..3178b7a 100644 --- a/src/be/jeffcheasey88/peeratcode/routes/Leaderboard.java +++ b/src/be/jeffcheasey88/peeratcode/routes/Leaderboard.java @@ -11,6 +11,7 @@ import be.jeffcheasey88.peeratcode.webserver.User; import org.json.simple.JSONArray; import org.json.simple.JSONObject; +import java.util.Base64; import java.util.SortedSet; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -33,7 +34,7 @@ public class Leaderboard implements Response { JSONObject playerJSON = new JSONObject(); playerJSON.put("pseudo", player.getPseudo()); playerJSON.put("group", player.getGroup()); - // chapterJSON.put("avatar", player.); + if(player.getAvatar() != null) playerJSON.put("avatar", new String(Base64.getEncoder().encode(player.getAvatar()))); playerJSON.put("score", player.getTotalScore()); playerJSON.put("completions", player.getTotalCompletion()); playerJSON.put("tries", player.getTotalTries());