From ee9739f5d3f03e2939af27b0fd19f52be45270a3 Mon Sep 17 00:00:00 2001 From: jeffcheasey88 Date: Sun, 30 Jun 2024 18:37:13 +0200 Subject: [PATCH] Update Framework with dependencies injector --- PeerAtCodeFramework.jar | Bin 537628 -> 541838 bytes src/dev/peerat/backend/Main.java | 51 +++++------------ .../repository/DatabaseRepository.java | 52 ++++++++++++++++++ .../backend/routes/DynamicLeaderboard.java | 3 +- .../peerat/backend/routes/PlayerDetails.java | 1 - .../peerat/backend/routes/PuzzleResponse.java | 3 +- src/dev/peerat/backend/routes/Swagger.java | 3 +- .../backend/routes/admins/DynamicLogs.java | 3 +- .../backend/routes/admins/ExceptionLogs.java | 3 +- .../routes/admins/WebHookLeaderboard.java | 3 +- .../backend/routes/groups/GroupCreate.java | 3 +- .../backend/routes/groups/GroupJoin.java | 3 +- .../backend/routes/groups/GroupQuit.java | 3 +- .../routes/users/MailConfirmation.java | 7 ++- .../peerat/backend/routes/users/Register.java | 3 +- 15 files changed, 89 insertions(+), 52 deletions(-) diff --git a/PeerAtCodeFramework.jar b/PeerAtCodeFramework.jar index 58440ecb8da096cb06ddb491a2e1a7a98d2f273c..b6c9c212e64a686d43ec0b31dbb5a8993e7e3590 100644 GIT binary patch delta 28736 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 F{twt^nDzhw diff --git a/src/dev/peerat/backend/Main.java b/src/dev/peerat/backend/Main.java index 1ab997d..a5790a2 100644 --- a/src/dev/peerat/backend/Main.java +++ b/src/dev/peerat/backend/Main.java @@ -51,6 +51,7 @@ import dev.peerat.backend.routes.users.ProfileSettings; import dev.peerat.backend.routes.users.Register; import dev.peerat.backend.utils.Mail; import dev.peerat.framework.Context; +import dev.peerat.framework.DependencyInjector; import dev.peerat.framework.HttpReader; import dev.peerat.framework.HttpWriter; import dev.peerat.framework.Locker; @@ -177,44 +178,18 @@ public class Main{ } private static void initRoutes(Router router, DatabaseRepository repo, Configuration config) throws Exception{ - Map playersWaiting = new HashMap<>(); - Mail mail = config.getMail(); - Locker groupLock = new Locker<>(); - Locker leaderboard = new Locker<>(); - - if(config.isProduction()) - router. - register(new Register(repo, playersWaiting, mail)). - register(new MailConfirmation(repo, router, config.getUsersFiles(), config.getGitToken(), playersWaiting, mail)); - - router. - register(new Login(repo, router)). - register(new ProfileSettings(repo)). - register(new ChangePassword(repo)). -// register(new ForgotPassword(router, repo, mail)). - - register(new DynamicLogs(router.getLogger(), repo)). - register(new ExceptionLogs(router.getExceptionLogger())). - - register(new WebHookLeaderboard(leaderboard)). - - register(new ChapterElement(repo)). - register(new ChapterList(repo)). - register(new PuzzleElement(repo)). - register(new Result(repo)). - register(new Leaderboard(repo)). - register(new PlayerDetails(repo)). - register(new BadgeDetails(repo)). - - register(new DynamicLeaderboard(repo, leaderboard)). - register(new PuzzleResponse(repo, config.getUsersFiles(), leaderboard)). - - register(new GroupCreate(repo, groupLock, config.getGroupJoinMinutes())). - register(new GroupList(repo)). - register(new GroupJoin(repo, config.getGroupJoinMinutes(), config.getGroupQuitMinutes(), leaderboard)). - register(new GroupQuit(repo, config.getGroupJoinMinutes(), leaderboard)) - - .register(new Swagger(new RouteExtracter(router),config.getTokenIssuer())); + router.registerPackages(new DependencyInjector() + .of(repo, router, config.getMail(), new RouteExtracter(router)) + .of("waitting", new HashMap<>()) + .of("leaderboard", new Locker<>()) + .of("log", router.getLogger()) + .of("exception", router.getExceptionLogger()) + .of("groups", new Locker<>()) + .of("groupDelay", config.getGroupJoinMinutes()) + .of("waitTime", config.getGroupQuitMinutes()) + .of("usersFiles", config.getUsersFiles()) + .of("gitToken", config.getGitToken()) + .of("issuer", config.getTokenIssuer())); // Bot bot = new Bot(config, repo, groupLock); // bot.start(); diff --git a/src/dev/peerat/backend/repository/DatabaseRepository.java b/src/dev/peerat/backend/repository/DatabaseRepository.java index 0e1b0d7..193b829 100644 --- a/src/dev/peerat/backend/repository/DatabaseRepository.java +++ b/src/dev/peerat/backend/repository/DatabaseRepository.java @@ -8,7 +8,9 @@ import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.SortedSet; import java.util.TreeSet; @@ -32,6 +34,56 @@ public class DatabaseRepository { public DatabaseRepository(Configuration config) { this.config = config; } + + public void hotfix() throws Exception{ + ensureConnection(); + + PreparedStatement stmt = con.prepareStatement("SELECT c.*, g.* FROM completions c JOIN puzzles p ON c.fk_puzzle = p.id_puzzle JOIN containsGroups cg ON cg.fk_player = c.fk_player JOIN groups g ON g.id_group = cg.fk_group WHERE g.fk_chapter = 12 AND p.fk_chapter = 12;"); + ResultSet results = stmt.executeQuery(); + List list = new ArrayList<>(); + while(results.next()){ + Completionz complete = new Completionz(results); + list.add(complete); + } + Map> map = new HashMap<>(); + for(Completionz comp : list){ + Map puz = map.get(comp.puzzle); + if(puz == null){ + puz = new HashMap<>(); + map.put(comp.puzzle, puz); + } + Completionz c = puz.get(comp.groups); + if(c == null){ + puz.put(comp.groups, comp); + }else{ + if(comp.score >= c.score){ + puz.put(comp.groups, comp); + System.out.println("remove compl "+c.id); + } + } + } + } + + private static class Completionz{ + + public int id; + public int puzzle; + public int player; + public int tries; + public int score; + public int groups; + + public Completionz(ResultSet result) throws Exception{ + id = result.getInt("id_completion"); + puzzle = result.getInt("fk_puzzle"); + player = result.getInt("fk_player"); + tries = result.getInt("tries"); + score = result.getInt("score"); + groups = result.getInt("id_group"); + System.out.println(id); + } + + } private void ensureConnection() throws SQLException { if (con == null || (!con.isValid(5))) { diff --git a/src/dev/peerat/backend/routes/DynamicLeaderboard.java b/src/dev/peerat/backend/routes/DynamicLeaderboard.java index b2df758..5748e01 100644 --- a/src/dev/peerat/backend/routes/DynamicLeaderboard.java +++ b/src/dev/peerat/backend/routes/DynamicLeaderboard.java @@ -8,6 +8,7 @@ import dev.peerat.backend.repository.DatabaseRepository; import dev.peerat.framework.Context; import dev.peerat.framework.HttpReader; import dev.peerat.framework.HttpWriter; +import dev.peerat.framework.Injection; import dev.peerat.framework.Locker; import dev.peerat.framework.Locker.Key; import dev.peerat.framework.Route; @@ -16,7 +17,7 @@ public class DynamicLeaderboard extends Leaderboard{ private Locker locker; - public DynamicLeaderboard(DatabaseRepository databaseRepo, Locker locker){ + public DynamicLeaderboard(DatabaseRepository databaseRepo, @Injection("leaderboard") Locker locker){ super(databaseRepo); this.locker = locker; } diff --git a/src/dev/peerat/backend/routes/PlayerDetails.java b/src/dev/peerat/backend/routes/PlayerDetails.java index e309ae1..8bcff6e 100644 --- a/src/dev/peerat/backend/routes/PlayerDetails.java +++ b/src/dev/peerat/backend/routes/PlayerDetails.java @@ -1,6 +1,5 @@ package dev.peerat.backend.routes; -import java.util.Base64; import java.util.regex.Matcher; import dev.peerat.backend.bonus.extract.RouteDoc; diff --git a/src/dev/peerat/backend/routes/PuzzleResponse.java b/src/dev/peerat/backend/routes/PuzzleResponse.java index 321e5e3..bef440e 100644 --- a/src/dev/peerat/backend/routes/PuzzleResponse.java +++ b/src/dev/peerat/backend/routes/PuzzleResponse.java @@ -22,6 +22,7 @@ import dev.peerat.backend.repository.DatabaseRepository; import dev.peerat.framework.Context; import dev.peerat.framework.HttpReader; import dev.peerat.framework.HttpWriter; +import dev.peerat.framework.Injection; import dev.peerat.framework.Locker; import dev.peerat.framework.Response; import dev.peerat.framework.Route; @@ -33,7 +34,7 @@ public class PuzzleResponse implements Response { private final Locker leaderboard; - public PuzzleResponse(DatabaseRepository databaseRepo, String initUsersFilesPath, Locker locker){ + public PuzzleResponse(DatabaseRepository databaseRepo, @Injection("usersFiles") String initUsersFilesPath, @Injection("leaderboard") Locker locker){ this.databaseRepo = databaseRepo; usersFilesPath = initUsersFilesPath; this.leaderboard = locker; diff --git a/src/dev/peerat/backend/routes/Swagger.java b/src/dev/peerat/backend/routes/Swagger.java index 24a90e2..ba271c2 100644 --- a/src/dev/peerat/backend/routes/Swagger.java +++ b/src/dev/peerat/backend/routes/Swagger.java @@ -6,6 +6,7 @@ import dev.peerat.backend.bonus.extract.RouteExtracter; import dev.peerat.framework.Context; import dev.peerat.framework.HttpReader; import dev.peerat.framework.HttpWriter; +import dev.peerat.framework.Injection; import dev.peerat.framework.Response; import dev.peerat.framework.Route; @@ -13,7 +14,7 @@ public class Swagger implements Response{ private String json; - public Swagger(RouteExtracter extracter, String host){ + public Swagger(RouteExtracter extracter, @Injection("issuer") String host){ try{ this.json = extracter.swagger(host).toString(); }catch(Exception e){ diff --git a/src/dev/peerat/backend/routes/admins/DynamicLogs.java b/src/dev/peerat/backend/routes/admins/DynamicLogs.java index 3248de9..a76ff72 100644 --- a/src/dev/peerat/backend/routes/admins/DynamicLogs.java +++ b/src/dev/peerat/backend/routes/admins/DynamicLogs.java @@ -9,6 +9,7 @@ import dev.peerat.backend.repository.DatabaseRepository; import dev.peerat.framework.Context; import dev.peerat.framework.HttpReader; import dev.peerat.framework.HttpWriter; +import dev.peerat.framework.Injection; import dev.peerat.framework.Locker; import dev.peerat.framework.Locker.Key; import dev.peerat.framework.Response; @@ -20,7 +21,7 @@ public class DynamicLogs implements Response{ private Locker locker; //Context private DatabaseRepository repo; - public DynamicLogs(Locker locker, DatabaseRepository repo){ + public DynamicLogs(@Injection("log") Locker locker, DatabaseRepository repo){ this.locker = locker; this.repo = repo; } diff --git a/src/dev/peerat/backend/routes/admins/ExceptionLogs.java b/src/dev/peerat/backend/routes/admins/ExceptionLogs.java index 900c796..a8fdeff 100644 --- a/src/dev/peerat/backend/routes/admins/ExceptionLogs.java +++ b/src/dev/peerat/backend/routes/admins/ExceptionLogs.java @@ -5,6 +5,7 @@ import java.util.regex.Matcher; import dev.peerat.framework.Context; import dev.peerat.framework.HttpReader; import dev.peerat.framework.HttpWriter; +import dev.peerat.framework.Injection; import dev.peerat.framework.Locker; import dev.peerat.framework.Locker.Key; import dev.peerat.framework.Response; @@ -16,7 +17,7 @@ public class ExceptionLogs implements Response{ private Locker locker; - public ExceptionLogs(Locker locker){ + public ExceptionLogs(@Injection("exception") Locker locker){ this.locker = locker; } diff --git a/src/dev/peerat/backend/routes/admins/WebHookLeaderboard.java b/src/dev/peerat/backend/routes/admins/WebHookLeaderboard.java index aa7e7e1..9a3b560 100644 --- a/src/dev/peerat/backend/routes/admins/WebHookLeaderboard.java +++ b/src/dev/peerat/backend/routes/admins/WebHookLeaderboard.java @@ -6,6 +6,7 @@ import dev.peerat.backend.model.Completion; import dev.peerat.framework.Context; import dev.peerat.framework.HttpReader; import dev.peerat.framework.HttpWriter; +import dev.peerat.framework.Injection; import dev.peerat.framework.Locker; import dev.peerat.framework.Response; import dev.peerat.framework.Route; @@ -14,7 +15,7 @@ public class WebHookLeaderboard implements Response{ private Locker locker; - public WebHookLeaderboard(Locker locker){ + public WebHookLeaderboard(@Injection("leaderboard") Locker locker){ this.locker = locker; } diff --git a/src/dev/peerat/backend/routes/groups/GroupCreate.java b/src/dev/peerat/backend/routes/groups/GroupCreate.java index c8ddbc4..711dfc6 100644 --- a/src/dev/peerat/backend/routes/groups/GroupCreate.java +++ b/src/dev/peerat/backend/routes/groups/GroupCreate.java @@ -14,6 +14,7 @@ import dev.peerat.backend.utils.FormResponse; import dev.peerat.framework.Context; import dev.peerat.framework.HttpReader; import dev.peerat.framework.HttpWriter; +import dev.peerat.framework.Injection; import dev.peerat.framework.Locker; import dev.peerat.framework.Response; import dev.peerat.framework.Route; @@ -25,7 +26,7 @@ public class GroupCreate extends FormResponse { private DatabaseRepository repo; private int groupDelay; - public GroupCreate(DatabaseRepository repo, Locker locker, int groupDelay){ + public GroupCreate(DatabaseRepository repo, @Injection("groups") Locker locker, @Injection("groupDelay") int groupDelay){ this.repo = repo; this.locker = locker; this.groupDelay = groupDelay; diff --git a/src/dev/peerat/backend/routes/groups/GroupJoin.java b/src/dev/peerat/backend/routes/groups/GroupJoin.java index ba2736c..f90fda4 100644 --- a/src/dev/peerat/backend/routes/groups/GroupJoin.java +++ b/src/dev/peerat/backend/routes/groups/GroupJoin.java @@ -14,6 +14,7 @@ import dev.peerat.backend.repository.DatabaseRepository; import dev.peerat.framework.Context; import dev.peerat.framework.HttpReader; import dev.peerat.framework.HttpWriter; +import dev.peerat.framework.Injection; import dev.peerat.framework.Locker; import dev.peerat.framework.Response; import dev.peerat.framework.Route; @@ -26,7 +27,7 @@ public class GroupJoin implements Response{ private final Locker leaderboard; - public GroupJoin(DatabaseRepository repo, int groupDelay, String waitTime, Locker locker){ + public GroupJoin(DatabaseRepository repo, @Injection("groupDelay") int groupDelay, @Injection("waitTime") String waitTime, @Injection("leaderboard") Locker locker){ this.repo = repo; this.groupDelay = groupDelay; this.waitTime = waitTime; diff --git a/src/dev/peerat/backend/routes/groups/GroupQuit.java b/src/dev/peerat/backend/routes/groups/GroupQuit.java index d710613..c319a13 100644 --- a/src/dev/peerat/backend/routes/groups/GroupQuit.java +++ b/src/dev/peerat/backend/routes/groups/GroupQuit.java @@ -14,6 +14,7 @@ import dev.peerat.backend.repository.DatabaseRepository; import dev.peerat.framework.Context; import dev.peerat.framework.HttpReader; import dev.peerat.framework.HttpWriter; +import dev.peerat.framework.Injection; import dev.peerat.framework.Locker; import dev.peerat.framework.Response; import dev.peerat.framework.Route; @@ -25,7 +26,7 @@ public class GroupQuit implements Response{ private final Locker leaderboard; - public GroupQuit(DatabaseRepository repo, int groupDelay, Locker locker){ + public GroupQuit(DatabaseRepository repo, @Injection("groupDelay") int groupDelay, @Injection("leaderboard") Locker locker){ this.repo = repo; this.groupDelay = groupDelay; diff --git a/src/dev/peerat/backend/routes/users/MailConfirmation.java b/src/dev/peerat/backend/routes/users/MailConfirmation.java index f7185bd..27892b0 100644 --- a/src/dev/peerat/backend/routes/users/MailConfirmation.java +++ b/src/dev/peerat/backend/routes/users/MailConfirmation.java @@ -32,6 +32,7 @@ import dev.peerat.backend.utils.Mail; import dev.peerat.framework.Context; import dev.peerat.framework.HttpReader; import dev.peerat.framework.HttpWriter; +import dev.peerat.framework.Injection; import dev.peerat.framework.Route; import dev.peerat.framework.Router; import dev.peerat.framework.utils.json.JsonMap; @@ -50,9 +51,9 @@ public class MailConfirmation extends FormResponse { public MailConfirmation( DatabaseRepository databaseRepo, Router router, - String initUsersFilesPath, - String gitToken, - Map playersWaiting, + @Injection("usersFiles") String initUsersFilesPath, + @Injection("gitToken") String gitToken, + @Injection("waitting") Map playersWaiting, Mail mail) throws NoSuchAlgorithmException{ this.databaseRepo = databaseRepo; diff --git a/src/dev/peerat/backend/routes/users/Register.java b/src/dev/peerat/backend/routes/users/Register.java index b4e40f7..96a4ccb 100644 --- a/src/dev/peerat/backend/routes/users/Register.java +++ b/src/dev/peerat/backend/routes/users/Register.java @@ -13,6 +13,7 @@ import dev.peerat.backend.utils.Mail; import dev.peerat.framework.Context; import dev.peerat.framework.HttpReader; import dev.peerat.framework.HttpWriter; +import dev.peerat.framework.Injection; import dev.peerat.framework.Route; import dev.peerat.framework.utils.json.JsonMap; @@ -22,7 +23,7 @@ public class Register extends FormResponse { private Map playersWaiting; private Mail mail; - public Register(DatabaseRepository databaseRepo, Map playersWaiting, Mail mail){ + public Register(DatabaseRepository databaseRepo, @Injection("waitting") Map playersWaiting, Mail mail){ this.databaseRepo = databaseRepo; this.playersWaiting = playersWaiting; this.mail = mail;