Files
FA_Gateway_Java/src/web/WebServer.java
2025-06-30 09:03:08 +07:00

133 lines
5.1 KiB
Java

package web;
import additional.config;
import database.ContactInputData;
import io.javalin.Javalin;
import lombok.Getter;
import main.Main;
import org.tinylog.Logger;
import static additional.Somecodes.ValidString;
import static additional.Somecodes.gson;
public class WebServer {
private Javalin app;
private @Getter boolean isRunning = false;
/**
* Start the web server on the specified port.
* @param listenport the port to listen on
*/
public void Start(int listenport){
isRunning = false;
app = null;
try{
var xx = Javalin.create(config -> {
config.useVirtualThreads = true;
config.staticFiles.add("/html");
}).start(listenport);
isRunning = true;
app = xx;
Logger.info("Web server started on port {}", listenport);
AssignRoutes();
} catch (Exception e){
Logger.error("Failed to start web server: {}", e.getMessage());
}
}
private void AssignRoutes(){
if (app == null) {
Logger.error("Web server is not running, cannot assign routes.");
return;
}
app.ws("/ws", ws->{
ws.onConnect(ctx -> {
Logger.info("WebSocket connected: {}", ctx.session.getRemoteAddress());
});
ws.onMessage(ctx -> {
Logger.info("WebSocket message received: {}", ctx.message());
try{
webRequest req = ctx.messageAsClass(webRequest.class);
if (ValidString(req.request())){
String cmd = req.request().trim().toUpperCase();
switch(cmd){
case "GET_SETTING" :
webSettingArgs args1 = additional.config.To_webSettingArgs(Main.config);
webResponse response = new webResponse("GET_SETTING", gson.toJson(args1));
ctx.send(response);
break;
case "RESET_DEFAULT":
Main.config.MakeDefaults();
webResponse resetResponse = new webResponse("RESET_DEFAULT", "Default settings restored.");
ctx.send(resetResponse);
// Send updated settings after reset
webSettingArgs args2 = additional.config.To_webSettingArgs(Main.config);
webResponse response2 = new webResponse("GET_SETTING", gson.toJson(args2));
ctx.send(response2);
break;
case "SET_SETTING":
webSettingArgs args3 = gson.fromJson(req.args(), webSettingArgs.class);
config newConfig = additional.config.From_webSettingArgs(args3);
if (Main.config.IsEqual(newConfig)) {
Logger.info("No changes detected in settings, not updating.");
ctx.send(new webResponse("SET_SETTING", "No changes made."));
} else {
Main.config = newConfig;
Main.config.Save();
Logger.info("Settings updated successfully.");
ctx.send(new webResponse("SET_SETTING", "Settings updated successfully."));
}
break;
case "GET_CONTACT_SETUP":
// ambil dari database ContactInputData, kirim balik
ContactInputData[] contactInputs = Main.db.contactInputDataList.toArray(new ContactInputData[0]);
break;
case "GET_CONTACT_STATUS":
// ambil dari Nanopi Gpio, kirim balik
break;
}
}
} catch (Exception e){
Logger.error("Not processing web request: {} because {}", ctx.message(), e.getMessage());
webResponse response = new webResponse("ERROR", e.getMessage());
ctx.send(response);
}
});
ws.onClose(ctx -> {
Logger.info("WebSocket closed: {} ", ctx.session.getRemoteAddress());
});
ws.onError(ctx -> {
if (ctx.error()!=null && ValidString(ctx.error().getMessage())){
Logger.error("WebSocket error: {}", ctx.error().getMessage());
}
});
});
}
/**
* Stop the web server if it is running.
*/
public void Stop(){
if (app!=null){
try{
app.stop();
} catch (Exception e){
Logger.error("Failed to stop web server: {}", e.getMessage());
}
app = null;
}
isRunning = false;
}
}