162 lines
5.2 KiB
Java
162 lines
5.2 KiB
Java
package dev.peerat.backend.repository;
|
|
|
|
import java.sql.Connection;
|
|
import java.sql.PreparedStatement;
|
|
import java.sql.ResultSet;
|
|
import java.sql.SQLException;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
|
|
import dev.peerat.backend.Configuration;
|
|
import dev.peerat.backend.model.Completion;
|
|
import dev.peerat.backend.model.Puzzle;
|
|
|
|
public class DatabaseCompletionRepository extends BaseDatabaseQuery{
|
|
|
|
private static enum Query{
|
|
|
|
// COMPLETIONS
|
|
GET_COMPLETION(
|
|
"SELECT * FROM completions WHERE fk_puzzle = ? AND fk_player = ?"),
|
|
GET_COMPLETION_GROUP("SELECT c.*\r\n"
|
|
+ "FROM completions c\r\n"
|
|
+ "WHERE c.fk_puzzle = ? AND c.fk_player IN\r\n"
|
|
+ "(select f.fk_player FROM containsGroups cgs JOIN containsGroups f ON f.fk_group = cgs.fk_group JOIN groups g ON g.id_group = cgs.fk_group WHERE g.fk_chapter = 12 AND cgs.fk_player = ?)"),
|
|
INSERT_COMPLETION(
|
|
"INSERT INTO completions (fk_puzzle, fk_player, tries, code, fileName, score) values (?, ?, ?, ?, ?, ?)"),
|
|
UPDATE_COMPLETION(
|
|
"UPDATE completions SET tries = ?, score = ?, fk_player = ? WHERE fk_puzzle = ? AND fk_player = ?"),
|
|
SCORE("SELECT score FROM completions WHERE fk_player = ? AND fk_puzzle = ?"),
|
|
SCORE_GROUP("SELECT c.score\r\n"
|
|
+ "FROM completions c\r\n"
|
|
+ "WHERE c.fk_puzzle = ? AND c.fk_player IN\r\n"
|
|
+ "(select f.fk_player FROM containsGroups cgs JOIN containsGroups f ON f.fk_group = cgs.fk_group JOIN groups g ON g.id_group = cgs.fk_group WHERE g.fk_chapter = 12 AND cgs.fk_player = ?)");
|
|
|
|
private String request;
|
|
|
|
Query(Query parent, String request) {
|
|
this.request = parent.request + request;
|
|
}
|
|
|
|
Query(String request) {
|
|
this.request = request;
|
|
}
|
|
|
|
public PreparedStatement prepare(BaseDatabaseQuery base) throws SQLException {
|
|
return base.prepare(this.request);
|
|
}
|
|
|
|
@Override
|
|
public String toString() {
|
|
return this.request;
|
|
}
|
|
}
|
|
|
|
|
|
private Configuration config;
|
|
private DatabaseChapterRepository chapterRepo;
|
|
|
|
public DatabaseCompletionRepository(ConnectionManager con, Configuration config, DatabaseChapterRepository chapterRepo){
|
|
super(con);
|
|
this.config = config;
|
|
this.chapterRepo = chapterRepo;
|
|
}
|
|
|
|
public Completion getCompletionGroup(int user, int puzzle) {
|
|
try {
|
|
PreparedStatement stmt = Query.GET_COMPLETION_GROUP.prepare(this);
|
|
stmt.setInt(1, puzzle);
|
|
stmt.setInt(2, user);
|
|
ResultSet result = stmt.executeQuery();
|
|
if (result.next())
|
|
return makeCompletion(result);
|
|
} catch (SQLException e) {
|
|
e.printStackTrace();
|
|
}
|
|
return getCompletion(user, puzzle);
|
|
}
|
|
|
|
public Completion getCompletion(int playerId, int puzzleId) {
|
|
try {
|
|
PreparedStatement completionsStmt = Query.GET_COMPLETION.prepare(this);
|
|
completionsStmt.setInt(1, puzzleId);
|
|
completionsStmt.setInt(2, playerId);
|
|
ResultSet result = completionsStmt.executeQuery();
|
|
if (result.next()) {
|
|
return makeCompletion(result);
|
|
}
|
|
} catch (SQLException e) {
|
|
e.printStackTrace();
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public Completion insertOrUpdatePuzzleResponse(int puzzleId, int userId, String fileName, byte[] code,
|
|
byte[] response, Puzzle currentPuzzle){
|
|
try {
|
|
ensureConnection();
|
|
Completion completion = getCompletionGroup(userId, puzzleId);
|
|
if (completion == null){
|
|
System.out.println("Completion is null");
|
|
completion = new Completion(userId, puzzleId, fileName, code, response, currentPuzzle);
|
|
insertCompletion(completion);
|
|
} else {
|
|
System.out.println(completion);
|
|
completion.addTry(currentPuzzle, response, chapterRepo.getChapter(currentPuzzle).getId());
|
|
int lastUserId = completion.getPlayerId();
|
|
completion.updatePlayer(userId);
|
|
updateCompletion(completion, lastUserId);
|
|
}
|
|
return completion;
|
|
} catch (SQLException e) {
|
|
e.printStackTrace();
|
|
}
|
|
return null;
|
|
}
|
|
|
|
private void insertCompletion(Completion newCompletion) throws SQLException {
|
|
PreparedStatement statement = Query.INSERT_COMPLETION.prepare(this);
|
|
statement.setInt(1, newCompletion.getPuzzleId());
|
|
statement.setInt(2, newCompletion.getPlayerId());
|
|
statement.setInt(3, newCompletion.getTries());
|
|
statement.setBytes(4, newCompletion.getCode());
|
|
statement.setString(5, newCompletion.getFileName());
|
|
statement.setInt(6, newCompletion.getScore());
|
|
statement.executeUpdate();
|
|
}
|
|
|
|
|
|
private void updateCompletion(Completion completionToUpdate, int user) throws SQLException{
|
|
System.out.println("update "+completionToUpdate);
|
|
PreparedStatement statement = Query.UPDATE_COMPLETION.prepare(this);
|
|
statement.setInt(1, completionToUpdate.getTries());
|
|
statement.setInt(2, completionToUpdate.getScore());
|
|
statement.setInt(3, completionToUpdate.getPlayerId());
|
|
statement.setInt(4, completionToUpdate.getPuzzleId());
|
|
statement.setInt(5, user);
|
|
statement.executeUpdate();
|
|
}
|
|
|
|
public int getScore(int user, int puzzle) {
|
|
try {
|
|
ensureConnection();
|
|
PreparedStatement stmt = Query.SCORE_GROUP.prepare(this);
|
|
stmt.setInt(1, puzzle);
|
|
stmt.setInt(2, user);
|
|
ResultSet result = stmt.executeQuery();
|
|
if (result.next())
|
|
return result.getInt("score");
|
|
|
|
stmt = Query.SCORE.prepare(this);
|
|
stmt.setInt(1, user);
|
|
stmt.setInt(2, puzzle);
|
|
|
|
result = stmt.executeQuery();
|
|
if (result.next())
|
|
return result.getInt("score");
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
}
|
|
return -1;
|
|
}
|
|
}
|