91 lines
3.2 KiB
Java
91 lines
3.2 KiB
Java
package dev.peerat.backend.routes;
|
|
|
|
import java.io.IOException;
|
|
import java.util.SortedSet;
|
|
import java.util.regex.Matcher;
|
|
|
|
import dev.peerat.backend.bonus.extract.RouteDoc;
|
|
import dev.peerat.backend.model.Chapter;
|
|
import dev.peerat.backend.model.Group;
|
|
import dev.peerat.backend.model.Player;
|
|
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.Response;
|
|
import dev.peerat.framework.Route;
|
|
import dev.peerat.framework.utils.json.JsonArray;
|
|
import dev.peerat.framework.utils.json.JsonMap;
|
|
|
|
public class Leaderboard implements Response {
|
|
|
|
private final DatabaseRepository databaseRepo;
|
|
|
|
public Leaderboard(DatabaseRepository databaseRepo) {
|
|
this.databaseRepo = databaseRepo;
|
|
}
|
|
|
|
@RouteDoc(path = "/leaderboard/{id}", responseCode = 200, responseDescription = "JSON contenant le leaderboard")
|
|
|
|
@Route(path = "^\\/leaderboard\\/?(\\d+)?$")
|
|
public void exec(Matcher matcher, Context context, HttpReader reader, HttpWriter writer) throws Exception {
|
|
context.response(200);
|
|
if (matcher.group(1) != null) {
|
|
groupsLeaderboard(Integer.parseInt(matcher.group(1)), writer);
|
|
} else {
|
|
playersLeaderboard(writer);
|
|
}
|
|
}
|
|
|
|
public final void groupsLeaderboard(int chapterId, HttpWriter writer) throws IOException {
|
|
Chapter chInfo = databaseRepo.getChapter(chapterId);
|
|
|
|
SortedSet<Group> allGroupsForChapter = databaseRepo.getAllGroupForChapterLeaderboard(chapterId);
|
|
JsonMap leaderboardJSON = new JsonMap();
|
|
if (chInfo.getStartDate() != null)
|
|
leaderboardJSON.set("start_date", chInfo.getStartDate().toString());
|
|
if (chInfo.getEndDate() != null)
|
|
leaderboardJSON.set("end_date", chInfo.getEndDate().toString());
|
|
JsonArray groupsJSON = new JsonArray();
|
|
if (allGroupsForChapter != null) {
|
|
int rank = 1;
|
|
int sameRankCount = 1;
|
|
Group previousGroup = null;
|
|
for (Group g : allGroupsForChapter) {
|
|
if (previousGroup != null) {
|
|
if (g.compareTo(previousGroup) == 0) {
|
|
sameRankCount++;
|
|
} else {
|
|
rank = rank + sameRankCount;
|
|
sameRankCount = 1;
|
|
}
|
|
}
|
|
groupsJSON.add(g.toJson(rank));
|
|
previousGroup = g;
|
|
}
|
|
}
|
|
leaderboardJSON.set("groups", groupsJSON);
|
|
writer.write(leaderboardJSON.toString().replace("\\", ""));
|
|
}
|
|
|
|
public final void playersLeaderboard(HttpWriter writer) throws IOException {
|
|
SortedSet<Player> allPlayers = databaseRepo.getAllPlayerForLeaderboard();
|
|
JsonArray playersJSON = new JsonArray();
|
|
if (allPlayers != null) {
|
|
for (Player player : allPlayers) {
|
|
JsonMap playerJSON = new JsonMap();
|
|
playerJSON.set("pseudo", player.getPseudo());
|
|
if (player.getGroups() != null)
|
|
playerJSON.set("groups", player.getJsonGroups());
|
|
// if (player.getAvatar() != null)
|
|
// playerJSON.put("avatar", Base64.getEncoder().encodeToString(player.getAvatar()));
|
|
playerJSON.set("rank", player.getRank());
|
|
playerJSON.set("score", player.getTotalScore());
|
|
playerJSON.set("completions", player.getTotalCompletion());
|
|
playerJSON.set("tries", player.getTotalTries());
|
|
playersJSON.add(playerJSON);
|
|
}
|
|
}
|
|
writer.write(playersJSON.toString().replace("\\", ""));
|
|
}
|
|
}
|