peer-at-code-backend/src/dev/peerat/backend/Main.java
2023-09-04 16:22:47 +02:00

116 lines
4.4 KiB
Java

package dev.peerat.backend;
import static dev.peerat.framework.RequestType.OPTIONS;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import dev.peerat.backend.model.Completion;
import dev.peerat.backend.model.Group;
import dev.peerat.backend.model.PeerAtUser;
import dev.peerat.backend.model.Player;
import dev.peerat.backend.repository.DatabaseRepository;
import dev.peerat.backend.routes.BadgeDetails;
import dev.peerat.backend.routes.ChapterElement;
import dev.peerat.backend.routes.ChapterList;
import dev.peerat.backend.routes.DynamicLeaderboard;
import dev.peerat.backend.routes.Leaderboard;
import dev.peerat.backend.routes.Login;
import dev.peerat.backend.routes.MailConfirmation;
import dev.peerat.backend.routes.PlayerDetails;
import dev.peerat.backend.routes.PuzzleElement;
import dev.peerat.backend.routes.PuzzleResponse;
import dev.peerat.backend.routes.Register;
import dev.peerat.backend.routes.Result;
import dev.peerat.backend.routes.groups.GroupCreate;
import dev.peerat.backend.routes.groups.GroupJoin;
import dev.peerat.backend.routes.groups.GroupList;
import dev.peerat.backend.routes.groups.GroupQuit;
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.Locker;
import dev.peerat.framework.RequestType;
import dev.peerat.framework.Response;
import dev.peerat.framework.Route;
import dev.peerat.framework.Router;
public class Main{
public static void main(String[] args) throws Exception{
Configuration config = new Configuration("config.txt");
config.load();
Class.forName("com.mysql.cj.jdbc.Driver");
DatabaseRepository repo = new DatabaseRepository(config);
Router<PeerAtUser> router = new Router<PeerAtUser>()
.configureJwt(
(builder) -> builder.setExpectedIssuer(config.getTokenIssuer()),
(claims) -> {
claims.setIssuer(config.getTokenIssuer()); // who creates the token and signs it
claims.setExpirationTimeMinutesInTheFuture(config.getTokenExpiration());
},
(claims) -> new PeerAtUser(claims));
router.addDefaultHeaders(RequestType.GET, "Access-Control-Allow-Origin: *");
router.addDefaultHeaders(RequestType.POST, "Access-Control-Allow-Origin: *");
router.setDefault((matcher, context, reader, writer) -> {
context.response(404);
writer.write("404 not Found.\n");
writer.flush();
writer.close();
});
router.register(new Response(){
@Route(path = "^(.*)$", type = OPTIONS)
public void exec(Matcher matcher, Context context, HttpReader reader, HttpWriter writer) throws Exception {
context.response(200,
"Access-Control-Allow-Origin: *",
"Access-Control-Allow-Methods: *",
"Access-Control-Allow-Headers: *");
}
});
initRoutes(router, repo, config);
// RouteExtracter extracter = new RouteExtracter(router);
// extracter.extract();
if(config.useSsl()) router.configureSSL(config.getSslKeystore(), config.getSslKeystorePasswd());
router.listen(config.getTcpPort(), config.useSsl());
}
private static void initRoutes(Router<PeerAtUser> router, DatabaseRepository repo, Configuration config){
final Map<Integer, Player> playersWaiting = new HashMap<>();
router.register(new ChapterElement(repo));
router.register(new ChapterList(repo));
router.register(new PuzzleElement(repo));
router.register(new Register(repo, router, config.getUsersFiles(), playersWaiting));
router.register(new MailConfirmation(repo, router, config.getUsersFiles(), playersWaiting));
router.register(new Login(repo, router));
router.register(new Result(repo));
router.register(new Leaderboard(repo));
router.register(new PlayerDetails(repo));
router.register(new BadgeDetails(repo));
Locker<Group> groupLock = new Locker<>();
router.register(new GroupCreate(repo, groupLock, config.getGroupJoinMinutes()));
DynamicLeaderboard dlb = new DynamicLeaderboard(repo);
router.register(dlb);
Locker<Completion> leaderboard = dlb.getLocker();
router.register(new PuzzleResponse(repo, config.getUsersFiles(), leaderboard));
router.register(new GroupList(repo));
router.register(new GroupJoin(repo, config.getGroupJoinMinutes(), config.getGroupQuitMinutes(), leaderboard));
router.register(new GroupQuit(repo, config.getGroupJoinMinutes(), leaderboard));
// Bot bot = new Bot(config, repo, groupLock);
// bot.start();
}
}