Added ChapterElement and ChapterList as routes to respectively get a chapter by id and all the chapters.

Removed DatabaseQueries class and added DatabaseRepo to contain all the database queries; Edited PuzzleElement to remove all database-related code.
This commit is contained in:
TheNagaki 2023-02-09 22:42:33 +01:00
parent 27f0b3718b
commit 80563cd86e
6 changed files with 220 additions and 58 deletions

View file

@ -1,5 +0,0 @@
package be.jeffcheasey88.peeratcode.repository;
public class DatabaseQueries {
public static final String SPECIFIC_PUZZLE_QUERY = "SELECT * FROM puzzle WHERE id_puzzle = ?";
}

View file

@ -0,0 +1,107 @@
package be.jeffcheasey88.peeratcode.repository;
import be.jeffcheasey88.peeratcode.model.Chapter;
import be.jeffcheasey88.peeratcode.model.Puzzle;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class DatabaseRepo {
private static final String SPECIFIC_PUZZLE_QUERY = "SELECT * FROM puzzle WHERE id_puzzle = ?";
private static final String SPECIFIC_CHAPTER_QUERY = "SELECT * FROM chapter WHERE id_chapter = ?";
private static final String PUZZLES_IN_CHAPTER_QUERY = "SELECT * FROM puzzle WHERE fk_chapter = ?";
public static final String ALL_CHAPTERS_QUERY = "SELECT * FROM chapter";
private final Connection con;
public DatabaseRepo(Connection con) {
this.con = con;
}
private Puzzle makePuzzle(ResultSet puzzleResult) throws SQLException {
return new Puzzle(puzzleResult.getInt("id_puzzle"), puzzleResult.getString("name"), puzzleResult.getString("content"));
}
private Chapter makeChapter(ResultSet chapterResult) throws SQLException {
return new Chapter(chapterResult.getInt("id_chapter"), chapterResult.getString("name"));
}
private List<Puzzle> getPuzzlesInChapter(int id) throws SQLException {
List<Puzzle> puzzles = new ArrayList<>();
PreparedStatement puzzleStmt = con.prepareStatement(PUZZLES_IN_CHAPTER_QUERY);
puzzleStmt.setInt(1, id);
ResultSet puzzleResult = puzzleStmt.executeQuery();
while (puzzleResult.next()) {
puzzles.add(makePuzzle(puzzleResult));
}
return puzzles;
}
/**
* Get a specific puzzle
*
* @param id The id of the puzzle
* @return The puzzle or null if an error occurred
*/
public Puzzle getPuzzle(int id) {
try {
PreparedStatement puzzleStmt = con.prepareStatement(SPECIFIC_PUZZLE_QUERY);
puzzleStmt.setInt(1, id);
ResultSet puzzleResult = puzzleStmt.executeQuery();
if (puzzleResult.next()) {
return makePuzzle(puzzleResult);
}
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
/**
* Get a specific chapter
*
* @param id The id of the chapter
* @return The chapter or null if an error occurred
*/
public Chapter getChapter(int id) {
try {
PreparedStatement chapterStmt = con.prepareStatement(SPECIFIC_CHAPTER_QUERY);
chapterStmt.setInt(1, id);
ResultSet chapterResult = chapterStmt.executeQuery();
if (chapterResult.next()) {
Chapter chapter = makeChapter(chapterResult);
List<Puzzle> puzzles = getPuzzlesInChapter(id);
chapter.setPuzzles(puzzles);
return chapter;
}
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
/**
* Get all chapters in the database
*
* @return List of all chapters or null if an error occurred
*/
public List<Chapter> getAllChapters() {
try {
List<Chapter> chapterList = new ArrayList<>();
PreparedStatement chapterStmt = con.prepareStatement(ALL_CHAPTERS_QUERY);
ResultSet chapterResult = chapterStmt.executeQuery();
while (chapterResult.next()) {
Chapter chapter = makeChapter(chapterResult);
chapter.setPuzzles(getPuzzlesInChapter(chapter.getId()));
chapterList.add(chapter);
}
return chapterList;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}

View file

@ -0,0 +1,54 @@
package be.jeffcheasey88.peeratcode.routes;
import be.jeffcheasey88.peeratcode.model.Chapter;
import be.jeffcheasey88.peeratcode.model.Puzzle;
import be.jeffcheasey88.peeratcode.repository.DatabaseRepo;
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 org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ChapterElement implements Response {
private final DatabaseRepo databaseRepo;
public ChapterElement(DatabaseRepo databaseRepo) {
this.databaseRepo = databaseRepo;
}
@Override
public void exec(Matcher matcher, HttpReader reader, HttpWriter writer) throws Exception {
HttpUtil.responseHeaders(writer, 200, "Access-Control-Allow-Origin: *");
Chapter chapter = databaseRepo.getChapter(extractId(matcher));
if (chapter != null) {
JSONObject chapterJSON = new JSONObject();
chapterJSON.put("id", chapter.getId());
chapterJSON.put("name", chapter.getName());
JSONArray puzzles = new JSONArray();
for (Puzzle puzzle : chapter.getPuzzles()) {
JSONObject puzzleJSON = new JSONObject();
puzzleJSON.put("id", puzzle.getId());
puzzleJSON.put("name", puzzle.getName());
puzzles.add(puzzleJSON);
}
chapterJSON.put("puzzles", puzzles);
writer.write(chapterJSON.toJSONString());
}
writer.flush();
writer.close();
}
@Override
public Pattern getPattern() {
return Pattern.compile("^\\/chapter\\/([0-9]+)$");
}
private int extractId(Matcher matcher) {
return Integer.parseInt(matcher.group(1));
}
}

View file

@ -0,0 +1,46 @@
package be.jeffcheasey88.peeratcode.routes;
import be.jeffcheasey88.peeratcode.model.Chapter;
import be.jeffcheasey88.peeratcode.repository.DatabaseRepo;
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 org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ChapterList implements Response {
private final DatabaseRepo databaseRepo;
public ChapterList(DatabaseRepo databaseRepo) {
this.databaseRepo = databaseRepo;
}
@Override
public void exec(Matcher matcher, HttpReader reader, HttpWriter writer) throws Exception {
HttpUtil.responseHeaders(writer, 200, "Access-Control-Allow-Origin: *");
List<Chapter> allChapters = databaseRepo.getAllChapters();
if (allChapters != null) {
JSONArray chaptersJSON = new JSONArray();
for (Chapter chapter : allChapters) {
JSONObject chapterJSON = new JSONObject();
chapterJSON.put("id", chapter.getId());
chapterJSON.put("name", chapter.getName());
chaptersJSON.add(chapterJSON);
}
writer.write(chaptersJSON.toJSONString());
}
writer.flush();
writer.close();
}
@Override
public Pattern getPattern() {
return Pattern.compile("^\\/chapters$");
}
}

View file

@ -1,43 +1,34 @@
package be.jeffcheasey88.peeratcode.routes; package be.jeffcheasey88.peeratcode.routes;
import be.jeffcheasey88.peeratcode.model.Puzzle;
import be.jeffcheasey88.peeratcode.repository.DatabaseRepo;
import be.jeffcheasey88.peeratcode.webserver.HttpReader; import be.jeffcheasey88.peeratcode.webserver.HttpReader;
import be.jeffcheasey88.peeratcode.webserver.HttpUtil; import be.jeffcheasey88.peeratcode.webserver.HttpUtil;
import be.jeffcheasey88.peeratcode.webserver.HttpWriter; import be.jeffcheasey88.peeratcode.webserver.HttpWriter;
import be.jeffcheasey88.peeratcode.webserver.Response; import be.jeffcheasey88.peeratcode.webserver.Response;
import org.json.simple.JSONObject; import org.json.simple.JSONObject;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import static be.jeffcheasey88.peeratcode.repository.DatabaseQueries.SPECIFIC_PUZZLE_QUERY;
public class PuzzleElement implements Response { public class PuzzleElement implements Response {
private final Connection con;
public PuzzleElement(Connection con) { private final DatabaseRepo databaseRepo;
this.con = con;
public PuzzleElement(DatabaseRepo databaseRepo) {
this.databaseRepo = databaseRepo;
} }
@Override @Override
public void exec(Matcher matcher, HttpReader reader, HttpWriter writer) throws Exception { public void exec(Matcher matcher, HttpReader reader, HttpWriter writer) throws Exception {
HttpUtil.responseHeaders(writer, 200, "Access-Control-Allow-Origin: *"); HttpUtil.responseHeaders(writer, 200, "Access-Control-Allow-Origin: *");
Puzzle puzzle = databaseRepo.getPuzzle(extractId(matcher));
JSONObject puzzle = new JSONObject(); if (puzzle != null) {
JSONObject puzzleJSON = new JSONObject();
PreparedStatement puzzleStmt = con.prepareStatement(SPECIFIC_PUZZLE_QUERY); puzzleJSON.put("id", puzzle.getId());
puzzleStmt.setInt(1, extractId(matcher)); puzzleJSON.put("name", puzzle.getName());
puzzleJSON.put("content", puzzle.getContent());
ResultSet puzzleResult = puzzleStmt.executeQuery(); writer.write(puzzleJSON.toJSONString());
if (puzzleResult.next()) {
puzzle.put("id", puzzleResult.getString("id_puzzle"));
puzzle.put("name", puzzleResult.getString("name"));
puzzle.put("content", puzzleResult.getString("content"));
puzzle.put("chapter", puzzleResult.getString("fk_chapter"));
writer.write(puzzle.toJSONString());
} }
writer.flush(); writer.flush();
writer.close(); writer.close();

View file

@ -1,31 +0,0 @@
package be.jeffcheasey88.peeratcode.routes;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.json.simple.JSONObject;
import be.jeffcheasey88.peeratcode.webserver.HttpReader;
import be.jeffcheasey88.peeratcode.webserver.HttpUtil;
import be.jeffcheasey88.peeratcode.webserver.HttpWriter;
import be.jeffcheasey88.peeratcode.webserver.Response;
public class PuzzleList implements Response{
@Override
public void exec(Matcher matcher, HttpReader reader, HttpWriter writer) throws Exception {
HttpUtil.responseHeaders(writer, 200, "Access-Control-Allow-Origin: *");
JSONObject json = new JSONObject();
json.put("Theo", "GL HF");
writer.write(json.toJSONString());
writer.flush();
writer.close();
}
@Override
public Pattern getPattern(){
return Pattern.compile("^\\/puzzle\\/?$");
}
}