diff --git a/src/dev/peerat/backend/Main.java b/src/dev/peerat/backend/Main.java index 1584c64..d66275e 100644 --- a/src/dev/peerat/backend/Main.java +++ b/src/dev/peerat/backend/Main.java @@ -11,6 +11,7 @@ import java.util.regex.Matcher; import dev.peerat.backend.bonus.extract.RouteExtracter; import dev.peerat.backend.model.Group; import dev.peerat.backend.model.PeerAtUser; +import dev.peerat.backend.repository.ConnectionManager; import dev.peerat.backend.repository.DatabaseRepository; import dev.peerat.framework.Context; import dev.peerat.framework.DependencyInjector; @@ -39,7 +40,7 @@ public class Main{ Class.forName("com.mysql.cj.jdbc.Driver"); - DatabaseRepository repo = new DatabaseRepository(config); + DatabaseRepository repo = new DatabaseRepository(new ConnectionManager(config), config); Router router = new Router() .activeReOrdering(). addDefaultHeaders(RequestType.GET, "Access-Control-Allow-Origin: *"). diff --git a/src/dev/peerat/backend/repository/BaseDatabaseQuery.java b/src/dev/peerat/backend/repository/BaseDatabaseQuery.java index 5232dee..c6fc4f9 100644 --- a/src/dev/peerat/backend/repository/BaseDatabaseQuery.java +++ b/src/dev/peerat/backend/repository/BaseDatabaseQuery.java @@ -1,7 +1,6 @@ package dev.peerat.backend.repository; import java.sql.Connection; -import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; @@ -17,26 +16,19 @@ import dev.peerat.backend.model.Puzzle; public class BaseDatabaseQuery{ - Connection con; + private ConnectionManager con; private Configuration config; - public BaseDatabaseQuery(Connection con, Configuration config){ + public BaseDatabaseQuery(ConnectionManager con){ this.con = con; - this.config = config; } - - - public void ensureConnection() throws SQLException { - if (con == null || (!con.isValid(5))) { - this.con = DriverManager.getConnection( - "jdbc:mysql://" + config.getDbHost() + ":" + config.getDbPort() + "/" + config.getDbDatabase() + "", - config.getDbUser(), config.getDbPassword()); - } + public Connection ensureConnection() throws SQLException{ + return this.con.ensureConnection(); } public PreparedStatement prepare(String request) throws SQLException{ - return this.con.prepareStatement(request); + return this.con.ensureConnection().prepareStatement(request); } public Puzzle makePuzzle(ResultSet puzzleResult) throws SQLException { @@ -86,7 +78,7 @@ public class BaseDatabaseQuery{ } // ADD rank - PreparedStatement completionsStmt = con.prepareStatement(DatabasePlayerRepository.GET_PLAYER_RANK()); + PreparedStatement completionsStmt = con.ensureConnection().prepareStatement(DatabasePlayerRepository.GET_PLAYER_RANK()); completionsStmt.setInt(1, id); ResultSet result = completionsStmt.executeQuery(); while (result.next()) { diff --git a/src/dev/peerat/backend/repository/ConnectionManager.java b/src/dev/peerat/backend/repository/ConnectionManager.java new file mode 100644 index 0000000..e227ff7 --- /dev/null +++ b/src/dev/peerat/backend/repository/ConnectionManager.java @@ -0,0 +1,26 @@ +package dev.peerat.backend.repository; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; + +import dev.peerat.backend.Configuration; + +public class ConnectionManager { + + private Connection con; + private Configuration config; + + public ConnectionManager(Configuration config){ + this.config = config; + } + + public Connection ensureConnection() throws SQLException { + if (con == null || (!con.isValid(5))) { + this.con = DriverManager.getConnection( + "jdbc:mysql://" + config.getDbHost() + ":" + config.getDbPort() + "/" + config.getDbDatabase() + "", + config.getDbUser(), config.getDbPassword()); + } + return this.con; + } +} diff --git a/src/dev/peerat/backend/repository/DatabaseAdminRepository.java b/src/dev/peerat/backend/repository/DatabaseAdminRepository.java index 5171ef8..52632d2 100644 --- a/src/dev/peerat/backend/repository/DatabaseAdminRepository.java +++ b/src/dev/peerat/backend/repository/DatabaseAdminRepository.java @@ -56,15 +56,14 @@ public class DatabaseAdminRepository extends BaseDatabaseQuery{ private Configuration config; - public DatabaseAdminRepository(Connection con, Configuration config){ - super(con, config); + public DatabaseAdminRepository(ConnectionManager con, Configuration config){ + super(con); this.config = config; } //ADMIN public Chapter getAdminChapter(int id){ try { - ensureConnection(); PreparedStatement chapterStmt = Query.GET_CHAPTER.prepare(this); chapterStmt.setInt(1, id); ResultSet chapterResult = chapterStmt.executeQuery(); @@ -80,7 +79,6 @@ public class DatabaseAdminRepository extends BaseDatabaseQuery{ public Puzzle getAdminPuzzle(int id){ try { - ensureConnection(); PreparedStatement chapterStmt = Query.GET_PUZZLE.prepare(this); chapterStmt.setInt(1, id); ResultSet chapterResult = chapterStmt.executeQuery(); @@ -95,7 +93,6 @@ public class DatabaseAdminRepository extends BaseDatabaseQuery{ public List getAdminPuzzles(){ try { - ensureConnection(); PreparedStatement chapterStmt = Query.GET_PUZZLES.prepare(this); ResultSet chapterResult = chapterStmt.executeQuery(); List list = new ArrayList<>(); @@ -111,7 +108,6 @@ public class DatabaseAdminRepository extends BaseDatabaseQuery{ public List getAdminTags(){ try { - ensureConnection(); PreparedStatement chapterStmt = Query.GET_TAGS.prepare(this); ResultSet chapterResult = chapterStmt.executeQuery(); List list = new ArrayList<>(); @@ -126,7 +122,6 @@ public class DatabaseAdminRepository extends BaseDatabaseQuery{ } public boolean adminAddChapter(Chapter chapter) throws SQLException { - ensureConnection(); PreparedStatement statement = Query.ADD_CHAPTER.prepare(this); statement.setString(1, chapter.getName()); statement.setTimestamp(2, chapter.getStartDate()); @@ -135,7 +130,6 @@ public class DatabaseAdminRepository extends BaseDatabaseQuery{ } public boolean adminAddPuzzle(Puzzle puzzle, int chapter) throws SQLException { - ensureConnection(); PreparedStatement statement = Query.ADD_PUZZLE.prepare(this); statement.setString(1, puzzle.getName()); statement.setString(2, puzzle.getContent()); @@ -147,14 +141,12 @@ public class DatabaseAdminRepository extends BaseDatabaseQuery{ } public boolean adminAddTag(String name) throws SQLException { - ensureConnection(); PreparedStatement statement = Query.ADD_TAG.prepare(this); statement.setString(1, name); return (statement.executeUpdate() >= 0); } public boolean adminUpdateChapter(int id, Chapter chapter) throws SQLException { - ensureConnection(); PreparedStatement statement = Query.EDIT_CHAPTER.prepare(this); statement.setString(1, chapter.getName()); statement.setTimestamp(2, chapter.getStartDate()); @@ -164,7 +156,6 @@ public class DatabaseAdminRepository extends BaseDatabaseQuery{ } public boolean adminUpdatePuzzle(int id, Puzzle puzzle, int chapter) throws SQLException { - ensureConnection(); PreparedStatement statement = Query.EDIT_PUZZLE.prepare(this); statement.setString(1, puzzle.getName()); statement.setString(2, puzzle.getContent()); @@ -177,7 +168,6 @@ public class DatabaseAdminRepository extends BaseDatabaseQuery{ } public boolean adminUpdateTag(Tag tag) throws SQLException { - ensureConnection(); PreparedStatement statement = Query.EDIT_TAG.prepare(this); statement.setString(1, tag.getName()); statement.setInt(2, tag.getId()); @@ -185,21 +175,18 @@ public class DatabaseAdminRepository extends BaseDatabaseQuery{ } public boolean adminDeleteChapter(int id) throws SQLException { - ensureConnection(); PreparedStatement statement = Query.DELETE_CHAPTER.prepare(this); statement.setInt(1, id); return (statement.executeUpdate() >= 0); } public boolean adminDeletePuzzle(int id) throws SQLException { - ensureConnection(); PreparedStatement statement = Query.DELETE_PUZZLE.prepare(this); statement.setInt(1, id); return (statement.executeUpdate() >= 0); } public boolean adminDeleteTag(int id) throws SQLException { - ensureConnection(); PreparedStatement statement = Query.DELETE_TAG.prepare(this); statement.setInt(1, id); return (statement.executeUpdate() >= 0); diff --git a/src/dev/peerat/backend/repository/DatabaseAuthRepository.java b/src/dev/peerat/backend/repository/DatabaseAuthRepository.java index 02849ec..c0afae4 100644 --- a/src/dev/peerat/backend/repository/DatabaseAuthRepository.java +++ b/src/dev/peerat/backend/repository/DatabaseAuthRepository.java @@ -45,11 +45,10 @@ public class DatabaseAuthRepository extends BaseDatabaseQuery{ } } - private Configuration config; - public DatabaseAuthRepository(Connection con, Configuration config){ - super(con, config); + public DatabaseAuthRepository(ConnectionManager con, Configuration config){ + super(con); this.config = config; } @@ -75,8 +74,7 @@ public class DatabaseAuthRepository extends BaseDatabaseQuery{ private boolean checkAvailability(String queriedString, String correspondingQuery) { try { - ensureConnection(); - PreparedStatement statement = con.prepareStatement(correspondingQuery); + PreparedStatement statement = prepare(correspondingQuery); statement.setString(1, queriedString); ResultSet result = statement.executeQuery(); return !result.next(); @@ -104,7 +102,7 @@ public class DatabaseAuthRepository extends BaseDatabaseQuery{ try { String pass = Password.hash(password).withArgon2().getResult(); System.out.println("pass("+pass.length()+") "+pass); - ensureConnection(); + Connection con = ensureConnection(); con.setAutoCommit(false); try (PreparedStatement playerStatement = con.prepareStatement(Query.REGISTER_QUERY.toString(), Statement.RETURN_GENERATED_KEYS)) { @@ -153,7 +151,7 @@ public class DatabaseAuthRepository extends BaseDatabaseQuery{ public int login(String username, String password) { try { ensureConnection(); - PreparedStatement statement = con.prepareStatement(Query.CHECK_PASSWORD.toString()); + PreparedStatement statement = prepare(Query.CHECK_PASSWORD.toString()); statement.setString(1, username); ResultSet result = statement.executeQuery(); if (result.next()) { diff --git a/src/dev/peerat/backend/repository/DatabaseBadgeRepository.java b/src/dev/peerat/backend/repository/DatabaseBadgeRepository.java index 511a94b..777360d 100644 --- a/src/dev/peerat/backend/repository/DatabaseBadgeRepository.java +++ b/src/dev/peerat/backend/repository/DatabaseBadgeRepository.java @@ -47,8 +47,8 @@ public class DatabaseBadgeRepository extends BaseDatabaseQuery{ private Configuration config; - public DatabaseBadgeRepository(Connection con, Configuration config){ - super(con, config); + public DatabaseBadgeRepository(ConnectionManager con, Configuration config){ + super(con); this.config = config; } diff --git a/src/dev/peerat/backend/repository/DatabaseChapterRepository.java b/src/dev/peerat/backend/repository/DatabaseChapterRepository.java index 8247483..8de44e6 100644 --- a/src/dev/peerat/backend/repository/DatabaseChapterRepository.java +++ b/src/dev/peerat/backend/repository/DatabaseChapterRepository.java @@ -48,8 +48,8 @@ public class DatabaseChapterRepository extends BaseDatabaseQuery{ private Configuration config; private DatabasePuzzleRepository puzzleRepo; - public DatabaseChapterRepository(Connection con, Configuration config, DatabasePuzzleRepository puzzleRepo){ - super(con, config); + public DatabaseChapterRepository(ConnectionManager con, Configuration config, DatabasePuzzleRepository puzzleRepo){ + super(con); this.config = config; this.puzzleRepo = puzzleRepo; } diff --git a/src/dev/peerat/backend/repository/DatabaseCompletionRepository.java b/src/dev/peerat/backend/repository/DatabaseCompletionRepository.java index 29b4e43..3e2060b 100644 --- a/src/dev/peerat/backend/repository/DatabaseCompletionRepository.java +++ b/src/dev/peerat/backend/repository/DatabaseCompletionRepository.java @@ -56,8 +56,8 @@ public class DatabaseCompletionRepository extends BaseDatabaseQuery{ private Configuration config; private DatabaseChapterRepository chapterRepo; - public DatabaseCompletionRepository(Connection con, Configuration config, DatabaseChapterRepository chapterRepo){ - super(con, config); + public DatabaseCompletionRepository(ConnectionManager con, Configuration config, DatabaseChapterRepository chapterRepo){ + super(con); this.config = config; this.chapterRepo = chapterRepo; } diff --git a/src/dev/peerat/backend/repository/DatabaseGroupRepository.java b/src/dev/peerat/backend/repository/DatabaseGroupRepository.java index f491b19..2864788 100644 --- a/src/dev/peerat/backend/repository/DatabaseGroupRepository.java +++ b/src/dev/peerat/backend/repository/DatabaseGroupRepository.java @@ -47,8 +47,8 @@ public class DatabaseGroupRepository extends BaseDatabaseQuery{ private Configuration config; - public DatabaseGroupRepository(Connection con, Configuration config){ - super(con, config); + public DatabaseGroupRepository(ConnectionManager con, Configuration config){ + super(con); this.config = config; } diff --git a/src/dev/peerat/backend/repository/DatabaseLeaderboardRepository.java b/src/dev/peerat/backend/repository/DatabaseLeaderboardRepository.java index 6087882..a5474dd 100644 --- a/src/dev/peerat/backend/repository/DatabaseLeaderboardRepository.java +++ b/src/dev/peerat/backend/repository/DatabaseLeaderboardRepository.java @@ -43,11 +43,10 @@ public class DatabaseLeaderboardRepository extends BaseDatabaseQuery{ } } - private Configuration config; - public DatabaseLeaderboardRepository(Connection con, Configuration config){ - super(con, config); + public DatabaseLeaderboardRepository(ConnectionManager con, Configuration config){ + super(con); this.config = config; } diff --git a/src/dev/peerat/backend/repository/DatabasePlayerRepository.java b/src/dev/peerat/backend/repository/DatabasePlayerRepository.java index a71d64a..88e5f66 100644 --- a/src/dev/peerat/backend/repository/DatabasePlayerRepository.java +++ b/src/dev/peerat/backend/repository/DatabasePlayerRepository.java @@ -60,8 +60,8 @@ public class DatabasePlayerRepository extends BaseDatabaseQuery{ private Configuration config; - public DatabasePlayerRepository(Connection con, Configuration config){ - super(con, config); + public DatabasePlayerRepository(ConnectionManager con, Configuration config){ + super(con); this.config = config; } @@ -163,7 +163,7 @@ public class DatabasePlayerRepository extends BaseDatabaseQuery{ if (player == null) { id = result.getInt("id_player"); player = makePlayer(result, id); - completionsStmt = con.prepareStatement(DatabaseBadgeRepository.GET_BADGES_OF_PLAYER()); + completionsStmt = prepare(DatabaseBadgeRepository.GET_BADGES_OF_PLAYER()); completionsStmt.setInt(1, id); ResultSet resultBadges = completionsStmt.executeQuery(); while (resultBadges.next()) { diff --git a/src/dev/peerat/backend/repository/DatabasePuzzleRepository.java b/src/dev/peerat/backend/repository/DatabasePuzzleRepository.java index 4ef3dbe..0e65e8d 100644 --- a/src/dev/peerat/backend/repository/DatabasePuzzleRepository.java +++ b/src/dev/peerat/backend/repository/DatabasePuzzleRepository.java @@ -39,11 +39,10 @@ public class DatabasePuzzleRepository extends BaseDatabaseQuery{ } } - private Configuration config; - public DatabasePuzzleRepository(Connection con, Configuration config){ - super(con, config); + public DatabasePuzzleRepository(ConnectionManager con, Configuration config){ + super(con); this.config = config; } diff --git a/src/dev/peerat/backend/repository/DatabaseRepository.java b/src/dev/peerat/backend/repository/DatabaseRepository.java index fc6574e..132ef14 100644 --- a/src/dev/peerat/backend/repository/DatabaseRepository.java +++ b/src/dev/peerat/backend/repository/DatabaseRepository.java @@ -25,19 +25,19 @@ public class DatabaseRepository extends BaseDatabaseQuery{ private DatabaseLeaderboardRepository leaderboardRepo; private DatabasePlayerRepository playerRepo; - public DatabaseRepository(Configuration config) { - super(null, config); + public DatabaseRepository(ConnectionManager con, Configuration config) { + super(con); this.config = config; - this.puzzleRepo = new DatabasePuzzleRepository(null, config); - this.chapterRepo = new DatabaseChapterRepository(null, config, puzzleRepo); - this.adminRepo = new DatabaseAdminRepository(null, config); - this.authRepo = new DatabaseAuthRepository(null, config); - this.badgeRepo = new DatabaseBadgeRepository(null, config); - this.completionRepo = new DatabaseCompletionRepository(null, config, chapterRepo); - this.groupRepo = new DatabaseGroupRepository(null, config); - this.leaderboardRepo = new DatabaseLeaderboardRepository(null, config); - this.playerRepo = new DatabasePlayerRepository(null, config); + this.puzzleRepo = new DatabasePuzzleRepository(con, config); + this.chapterRepo = new DatabaseChapterRepository(con, config, puzzleRepo); + this.adminRepo = new DatabaseAdminRepository(con, config); + this.authRepo = new DatabaseAuthRepository(con, config); + this.badgeRepo = new DatabaseBadgeRepository(con, config); + this.completionRepo = new DatabaseCompletionRepository(con, config, chapterRepo); + this.groupRepo = new DatabaseGroupRepository(con, config); + this.leaderboardRepo = new DatabaseLeaderboardRepository(con, config); + this.playerRepo = new DatabasePlayerRepository(con, config); } public DatabasePuzzleRepository getPuzzleRepository(){