From 9c98ca573a365bc021501beb785b01a296ee84d5 Mon Sep 17 00:00:00 2001 From: jeffcheasey88 <66554203+jeffcheasey88@users.noreply.github.com> Date: Mon, 3 Apr 2023 23:55:41 +0200 Subject: [PATCH] Create Group --- src/be/jeffcheasey88/peeratcode/Main.java | 2 ++ .../jeffcheasey88/peeratcode/model/Group.java | 6 ++++ .../peeratcode/repository/DatabaseQuery.java | 3 +- .../repository/DatabaseRepository.java | 19 +++++++--- .../peeratcode/routes/groups/CreateGroup.java | 36 +++++++++++++++++++ .../peeratcode/routes/groups/GroupList.java | 2 ++ 6 files changed, 63 insertions(+), 5 deletions(-) create mode 100644 src/be/jeffcheasey88/peeratcode/routes/groups/CreateGroup.java diff --git a/src/be/jeffcheasey88/peeratcode/Main.java b/src/be/jeffcheasey88/peeratcode/Main.java index 071e846..2ec0190 100644 --- a/src/be/jeffcheasey88/peeratcode/Main.java +++ b/src/be/jeffcheasey88/peeratcode/Main.java @@ -22,6 +22,7 @@ import be.jeffcheasey88.peeratcode.routes.PuzzleElement; import be.jeffcheasey88.peeratcode.routes.PuzzleResponse; import be.jeffcheasey88.peeratcode.routes.Register; import be.jeffcheasey88.peeratcode.routes.Result; +import be.jeffcheasey88.peeratcode.routes.groups.CreateGroup; import be.jeffcheasey88.peeratcode.routes.groups.GroupList; import be.jeffcheasey88.peeratcode.webserver.Client; import be.jeffcheasey88.peeratcode.webserver.HttpReader; @@ -80,6 +81,7 @@ public class Main { router.register(new BadgeDetails(router.getDataBase())); router.register(new GroupList(router.getDataBase())); + router.register(new CreateGroup(router.getDataBase())); } private static void startWebServer(Configuration config, Router router) throws IOException { diff --git a/src/be/jeffcheasey88/peeratcode/model/Group.java b/src/be/jeffcheasey88/peeratcode/model/Group.java index ff3c921..e41f30b 100644 --- a/src/be/jeffcheasey88/peeratcode/model/Group.java +++ b/src/be/jeffcheasey88/peeratcode/model/Group.java @@ -7,6 +7,12 @@ public class Group { private int linkToChapter; private int linkToPuzzle; + public Group(JSONObject json){ + this.name = (String)json.get("name"); + this.linkToChapter = ((Number)json.get("chapter")).intValue(); + this.linkToPuzzle = ((Number)json.get("puzzle")).intValue(); + } + public Group(String name, int initChap, int initPuzz) { this.name = name; this.linkToChapter = initChap; diff --git a/src/be/jeffcheasey88/peeratcode/repository/DatabaseQuery.java b/src/be/jeffcheasey88/peeratcode/repository/DatabaseQuery.java index 18d78f4..9689439 100644 --- a/src/be/jeffcheasey88/peeratcode/repository/DatabaseQuery.java +++ b/src/be/jeffcheasey88/peeratcode/repository/DatabaseQuery.java @@ -11,6 +11,7 @@ public enum DatabaseQuery { PUZZLES_IN_CHAPTER_QUERY("SELECT p.*, GROUP_CONCAT(t.name) AS tags FROM puzzles p LEFT JOIN containsTags ct ON ct.fk_puzzle = p.id_puzzle LEFT JOIN tags t ON t.id_tag = ct.fk_tag WHERE fk_chapter = ? GROUP BY p.id_puzzle"), ALL_CHAPTERS_QUERY("SELECT * FROM chapters WHERE id_chapter > 0"), ALL_GROUPS("SELCT * FROM groups"), + ALL_PLAYERS_FOR_LEADERBOARD("select p.*, scores.*, g.* from players p ,(SELECT fk_player, SUM(c.score) AS score, COUNT(c.id_completion) AS completions, SUM(c.tries) AS tries, rank() over(ORDER BY score DESC) AS rank FROM completions c GROUP BY c.fk_player) AS scores LEFT JOIN containsGroups cg ON scores.fk_player = cg.fk_player LEFT JOIN groups g ON cg.fk_group = g.id_group WHERE p.id_player = scores.fk_player ORDER BY g.fk_chapter, g.fk_puzzle"), CHECK_PSEUDO_AVAILABLE_QUERY("SELECT * FROM players WHERE pseudo = ?"), CHECK_EMAIL_AVAILABLE_QUERY("SELECT * FROM players WHERE email = ?"), REGISTER_QUERY("INSERT INTO players (pseudo, email, passwd, firstname, lastname, description, avatar) VALUES (?, ?, ?, ?, ?, ?, ?)"), @@ -22,10 +23,10 @@ public enum DatabaseQuery { GET_PLAYER_DETAILS("SELECT p.*, scores.score, scores.completions, scores.tries, scores.rank, g.* FROM players p, (SELECT fk_player, SUM(c.score) AS score, COUNT(c.id_completion) AS completions, SUM(c.tries) AS tries, rank() over(ORDER BY score DESC) AS rank FROM completions c GROUP BY c.fk_player) AS scores LEFT JOIN containsGroups cg ON scores.fk_player = cg.fk_player LEFT JOIN groups g ON cg.fk_group = g.id_group WHERE p.id_player = scores.fk_player AND "), GET_PLAYER_DETAILS_BY_ID(GET_PLAYER_DETAILS," p.id_player = ? ORDER BY g.fk_chapter, g.fk_puzzle;"), GET_PLAYER_DETAILS_BY_PSEUDO(GET_PLAYER_DETAILS,"p.pseudo = ? ORDER BY g.fk_chapter, g.fk_puzzle;"), - ALL_PLAYERS_FOR_LEADERBOARD("select p.*, scores.*, g.* from players p ,(SELECT fk_player, SUM(c.score) AS score, COUNT(c.id_completion) AS completions, SUM(c.tries) AS tries, rank() over(ORDER BY score DESC) AS rank FROM completions c GROUP BY c.fk_player) AS scores LEFT JOIN containsGroups cg ON scores.fk_player = cg.fk_player LEFT JOIN groups g ON cg.fk_group = g.id_group WHERE p.id_player = scores.fk_player ORDER BY g.fk_chapter, g.fk_puzzle"), GET_BADGE("SELECT * FROM badges WHERE id_badge = ?"), GET_BADGES_OF_PLAYER("SELECT * FROM badges b LEFT JOIN containsBadges cb ON cb.fk_badge = b.id_badge WHERE cb.fk_player = ?"), INSERT_COMPLETION("INSERT INTO completions (fk_puzzle, fk_player, tries, code, fileName, score) values (?, ?, ?, ?, ?, ?)"), + INSERT_GROUP("INSERT INTO groups (name, fk_chapter, fk_puzzle) VALUES (?,?,?)"), UPDATE_COMPLETION("UPDATE completions SET tries = ?, filename = ?, score = ? WHERE fk_puzzle = ? AND fk_player = ?"); private String request; diff --git a/src/be/jeffcheasey88/peeratcode/repository/DatabaseRepository.java b/src/be/jeffcheasey88/peeratcode/repository/DatabaseRepository.java index 3fceda2..a26fad3 100644 --- a/src/be/jeffcheasey88/peeratcode/repository/DatabaseRepository.java +++ b/src/be/jeffcheasey88/peeratcode/repository/DatabaseRepository.java @@ -91,10 +91,8 @@ public class DatabaseRepository { // Found on StackOverflow ResultSetMetaData rsmd = rs.getMetaData(); int columns = rsmd.getColumnCount(); - for (int x = 1; x <= columns; x++) { - if (columnName.equals(rsmd.getColumnName(x))) { - return true; - } + for(int x = 1; x <= columns; x++){ + if(columnName.equals(rsmd.getColumnName(x))) return true; } return false; } @@ -304,6 +302,7 @@ public class DatabaseRepository { public List getAllGroups() { try { + ensureConnection(); List list = new ArrayList<>(); PreparedStatement stmt = DatabaseQuery.ALL_GROUPS.prepare(this.con); ResultSet groupResult = stmt.executeQuery(); @@ -454,6 +453,18 @@ public class DatabaseRepository { statement.setInt(6, newCompletion.getScore()); statement.executeUpdate(); } + + public boolean insertGroup(Group group){ + try { + ensureConnection(); + PreparedStatement statement = DatabaseQuery.INSERT_GROUP.prepare(this.con); + statement.setString(1, group.getName()); + statement.setInt(2, group.getLinkToChapter()); + statement.setInt(3, group.getLinkToPuzzle()); + return statement.executeUpdate() >= 0; + }catch(Exception e){} + return false; + } private void updateCompletion(Completion completionToUpdate) throws SQLException { // Update completions diff --git a/src/be/jeffcheasey88/peeratcode/routes/groups/CreateGroup.java b/src/be/jeffcheasey88/peeratcode/routes/groups/CreateGroup.java new file mode 100644 index 0000000..2c96332 --- /dev/null +++ b/src/be/jeffcheasey88/peeratcode/routes/groups/CreateGroup.java @@ -0,0 +1,36 @@ +package be.jeffcheasey88.peeratcode.routes.groups; + +import java.util.regex.Matcher; + +import org.json.simple.JSONObject; + +import be.jeffcheasey88.peeratcode.model.Group; +import be.jeffcheasey88.peeratcode.repository.DatabaseRepository; +import be.jeffcheasey88.peeratcode.webserver.HttpReader; +import be.jeffcheasey88.peeratcode.webserver.HttpUtil; +import be.jeffcheasey88.peeratcode.webserver.HttpWriter; +import be.jeffcheasey88.peeratcode.webserver.Response; +import be.jeffcheasey88.peeratcode.webserver.Route; +import be.jeffcheasey88.peeratcode.webserver.User; + +public class CreateGroup implements Response{ + + private DatabaseRepository repo; + + public CreateGroup(DatabaseRepository repo){ + this.repo = repo; + } + + @Route(path = "^\\/groupCreate$", type = "POST", needLogin = true) + @Override + public void exec(Matcher matcher, User user, HttpReader reader, HttpWriter writer) throws Exception { + HttpUtil.skipHeaders(reader); + + if(this.repo.insertGroup(new Group((JSONObject)HttpUtil.readJson(reader)))){ + HttpUtil.responseHeaders(writer, 200, "Access-Control-Allow-Origin: *"); + }else{ + HttpUtil.responseHeaders(writer, 403, "Access-Control-Allow-Origin: *"); + } + } + +} diff --git a/src/be/jeffcheasey88/peeratcode/routes/groups/GroupList.java b/src/be/jeffcheasey88/peeratcode/routes/groups/GroupList.java index 43cc46b..17038be 100644 --- a/src/be/jeffcheasey88/peeratcode/routes/groups/GroupList.java +++ b/src/be/jeffcheasey88/peeratcode/routes/groups/GroupList.java @@ -8,6 +8,7 @@ import org.json.simple.JSONObject; import be.jeffcheasey88.peeratcode.model.Group; import be.jeffcheasey88.peeratcode.repository.DatabaseRepository; import be.jeffcheasey88.peeratcode.webserver.HttpReader; +import be.jeffcheasey88.peeratcode.webserver.HttpUtil; import be.jeffcheasey88.peeratcode.webserver.HttpWriter; import be.jeffcheasey88.peeratcode.webserver.Response; import be.jeffcheasey88.peeratcode.webserver.Route; @@ -24,6 +25,7 @@ public class GroupList implements Response{ @Route(path = "^\\/groups$", needLogin = true) @Override public void exec(Matcher matcher, User user, HttpReader reader, HttpWriter writer) throws Exception { + HttpUtil.responseHeaders(writer, 200, "Access-Control-Allow-Origin: *"); JSONArray result = new JSONArray(); for(Group group : this.repo.getAllGroups()) result.add(group.toJson()); writer.write(result.toJSONString());