270 lines
12 KiB
Kotlin
270 lines
12 KiB
Kotlin
package Web
|
|
|
|
import Log.LogGetter
|
|
import aas1
|
|
import aas2
|
|
import aas3
|
|
import com.fasterxml.jackson.databind.ObjectMapper
|
|
import com.fasterxml.jackson.module.kotlin.registerKotlinModule
|
|
import config
|
|
import database.FlightFilter
|
|
import io.javalin.Javalin
|
|
import io.javalin.apibuilder.ApiBuilder.before
|
|
import io.javalin.apibuilder.ApiBuilder.get
|
|
import io.javalin.apibuilder.ApiBuilder.post
|
|
import org.tinylog.Logger
|
|
|
|
@Suppress("unused")
|
|
/**
|
|
* Start WebUI Server
|
|
*/
|
|
class WebUI {
|
|
// regex untuk date dengan format YYYY-MM-DD
|
|
private val dateRegex1 = """\d{4}-\d{2}-\d{2}""".toRegex()
|
|
private val mapper = ObjectMapper().registerKotlinModule()
|
|
private var app: Javalin = Javalin.create { cfg ->
|
|
cfg.staticFiles.add("/")
|
|
cfg.router.apiBuilder {
|
|
get("/") {
|
|
if (config.WebUsername == it.cookie("username")) {
|
|
Logger.info { "${it.ip()} logged in as ${it.cookie("username")}, forward to home.html" }
|
|
it.redirect("home.html")
|
|
} else {
|
|
Logger.info { "${it.ip()} have not logged in, forward to login.html" }
|
|
it.redirect("login.html")
|
|
}
|
|
}
|
|
post("login.html") {
|
|
val username = it.formParam("username")
|
|
val password = it.formParam("password")
|
|
if (config.WebUsername == username && config.WebPassword == password) {
|
|
Logger.info { "${it.ip()} login successful for user $username" }
|
|
it.cookie("username", username)
|
|
it.redirect("home.html")
|
|
} else {
|
|
Logger.info { "${it.ip()} Login failed for user $username" }
|
|
it.redirect("/login.html?error=1")
|
|
}
|
|
}
|
|
|
|
get("getLogs") {
|
|
var date = it.queryParam("date")
|
|
Logger.info { "${it.ip()} User ${it.cookie("username")} requested logs for date: $date" }
|
|
if (date != null) {
|
|
if (date.isNotEmpty()) {
|
|
if (dateRegex1.matches(date)) {
|
|
// ketemu format YYYY-MM-DD, convert format ke dd/MM/yyyy
|
|
val parts = date.split("-")
|
|
date = "${parts[2]}/${parts[1]}/${parts[0]}"
|
|
}
|
|
val logs = LogGetter().getLog(date)
|
|
if (logs.isNotEmpty()) {
|
|
it.json(logs)
|
|
} else it.status(404).json(webReply(message = "No logs found for the specified date"))
|
|
} else it.status(400).json(webReply(message = "Date parameter is empty"))
|
|
} else it.status(400).json(webReply(message = "Please provide a date"))
|
|
}
|
|
|
|
get("logout") {
|
|
Logger.info { "${it.ip()} User ${it.cookie("username")} logged out" }
|
|
it.removeCookie("username")
|
|
it.redirect("login.html")
|
|
}
|
|
|
|
get("getSetting") {
|
|
val fd = farmData(
|
|
config.ActiveMQ_BrokerURL,
|
|
config.ActiveMQ_Username,
|
|
config.ActiveMQ_Password,
|
|
config.ActiveMQ_QueueName
|
|
)
|
|
val aas1 = aasData(config.MySQL_AAS1, config.MySQL_AAS1_Username, config.MySQL_AAS1_Password)
|
|
val aas2 = aasData(config.MySQL_AAS2, config.MySQL_AAS2_Username, config.MySQL_AAS2_Password)
|
|
val aas3 = aasData(config.MySQL_AAS3, config.MySQL_AAS3_Username, config.MySQL_AAS3_Password)
|
|
val setting = getSetting(fd, aas1, aas2, aas3)
|
|
it.json(setting)
|
|
}
|
|
post("saveFARM") {
|
|
|
|
try {
|
|
val fd = it.bodyAsClass(saveFARM::class.java)
|
|
config.ActiveMQ_BrokerURL = fd.farm.url
|
|
config.ActiveMQ_Username = fd.farm.username
|
|
config.ActiveMQ_Password = fd.farm.password
|
|
config.ActiveMQ_QueueName = fd.farm.queue
|
|
config.Save()
|
|
it.json(webReply(message = "success"))
|
|
} catch (e: Exception) {
|
|
val str = "Error saving FARM settings: ${e.message}"
|
|
Logger.error { str }
|
|
it.status(500).json(webReply(message = str))
|
|
}
|
|
}
|
|
post("saveAAS") {
|
|
|
|
try {
|
|
val ax = it.bodyAsClass(saveAAS::class.java)
|
|
config.MySQL_AAS1 = ax.aas1.url
|
|
config.MySQL_AAS1_Username = ax.aas1.username
|
|
config.MySQL_AAS1_Password = ax.aas1.password
|
|
config.MySQL_AAS2 = ax.aas2.url
|
|
config.MySQL_AAS2_Username = ax.aas2.username
|
|
config.MySQL_AAS2_Password = ax.aas2.password
|
|
config.MySQL_AAS3 = ax.aas3.url
|
|
config.MySQL_AAS3_Username = ax.aas3.username
|
|
config.MySQL_AAS3_Password = ax.aas3.password
|
|
config.Save()
|
|
it.json(webReply(message = "success"))
|
|
|
|
} catch (e: Exception) {
|
|
val str = "Error saving AAS settings: ${e.message}"
|
|
Logger.error { str }
|
|
it.status(500).json(webReply(message = str))
|
|
}
|
|
}
|
|
|
|
get("getBroadcastZones") {
|
|
val id = it.queryParam("id")?.toIntOrNull() ?: 0
|
|
val aas = when (id) {
|
|
1 -> aas1
|
|
2 -> aas2
|
|
3 -> aas3
|
|
else -> null
|
|
}
|
|
if (aas != null) {
|
|
aas.GetBroadcastZones { success, zones ->
|
|
if (success) {
|
|
it.json(zones)
|
|
} else {
|
|
it.status(500).json(webReply(message = "Failed to retrieve broadcast zones"))
|
|
}
|
|
}
|
|
} else it.status(400).json(webReply(message = "Invalid AAS id"))
|
|
}
|
|
|
|
get("getAirlineCodes") {
|
|
val id = it.queryParam("id")?.toIntOrNull() ?: 0
|
|
val aas = when (id) {
|
|
1 -> aas1
|
|
2 -> aas2
|
|
3 -> aas3
|
|
else -> null
|
|
}
|
|
if (aas != null) {
|
|
aas.GetAirlineCode { success, codes ->
|
|
if (success) {
|
|
it.json(codes)
|
|
} else {
|
|
it.status(500).json(webReply(message = "Failed to retrieve airline codes"))
|
|
}
|
|
}
|
|
} else it.status(400).json(webReply(message = "Invalid AAS id"))
|
|
}
|
|
|
|
post("FlightFilter") {
|
|
try {
|
|
val req = it.bodyAsClass(webRequest::class.java)
|
|
val aas_id = req.aas_id.toIntOrNull() ?: 0
|
|
val aas = when (aas_id) {
|
|
1 -> aas1
|
|
2 -> aas2
|
|
3 -> aas3
|
|
else -> throw Exception("Invalid AAS id")
|
|
}
|
|
when (req.command) {
|
|
"get" -> {
|
|
if (aas != null) {
|
|
aas.GetFlightFilterTable { success, filters ->
|
|
if (success) {
|
|
it.json(webReply(command = req.command, message = "success"))
|
|
} else throw Exception("Failed to retrieve Flight Filter data")
|
|
}
|
|
} else throw Exception("Invalid AAS id")
|
|
}
|
|
"clear" ->{
|
|
if (aas != null) {
|
|
aas.ClearFlightFilterTable { success ->
|
|
if (success) {
|
|
it.json(webReply(command = req.command, message = "success"))
|
|
} else throw Exception("Failed to clear Flight Filter data")
|
|
}
|
|
} else throw Exception("Invalid AAS id")
|
|
}
|
|
"add" ->{
|
|
val data = mapper.readValue(req.data, FlightFilter::class.java)
|
|
if (aas != null) {
|
|
aas.InsertFlightFilter(data) { success ->
|
|
if (success) {
|
|
it.json(webReply(command = req.command, data=req.data, message = "success"))
|
|
} else throw Exception("Failed to add Flight Filter data")
|
|
}
|
|
} else throw Exception("Invalid AAS id")
|
|
}
|
|
"delete"->{
|
|
// data is index of flight filter to delete
|
|
val data = req.data.toIntOrNull() ?: 0
|
|
if (aas != null) {
|
|
aas.DeleteFlightFilter(data) { success ->
|
|
if (success) {
|
|
it.json(webReply(command = req.command, data=req.data, message = "success"))
|
|
} else throw Exception("Failed to delete Flight Filter data")
|
|
}
|
|
} else throw Exception("Invalid AAS id")
|
|
}
|
|
"patch"->{
|
|
val data = mapper.readValue(req.data, FlightFilter::class.java)
|
|
if (aas != null) {
|
|
aas.PatchFlightFilter(data.id, data) { success ->
|
|
if (success) {
|
|
it.json(webReply(command = req.command, data=req.data, message = "success"))
|
|
} else throw Exception("Failed to patch Flight Filter data")
|
|
}
|
|
} else throw Exception("Invalid AAS id")
|
|
}
|
|
else -> throw Exception("Invalid FlightFilter command")
|
|
}
|
|
} catch (e: Exception) {
|
|
val str = "Error parsing FlightFilter request: ${e.message}"
|
|
Logger.error { str }
|
|
it.status(500).json(webReply(message = str))
|
|
}
|
|
}
|
|
|
|
before("home.html") {
|
|
if (config.WebUsername != it.cookie("username")) {
|
|
Logger.info { "${it.ip()} Have not logged in, forward to login.html" }
|
|
it.redirect("login.html")
|
|
}
|
|
}
|
|
before("log.html") {
|
|
if (config.WebUsername != it.cookie("username")) {
|
|
Logger.info { "${it.ip()} Have not logged in, forward to login.html" }
|
|
it.redirect("login.html")
|
|
}
|
|
}
|
|
before("setting.html") {
|
|
if (config.WebUsername != it.cookie("username")) {
|
|
Logger.info { "${it.ip()} Have not logged in, forward to login.html" }
|
|
it.redirect("login.html")
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* Start WebUI Server
|
|
*/
|
|
fun Start() {
|
|
app.start(config.WebPort)
|
|
}
|
|
|
|
/**
|
|
* Stop WebUI Server
|
|
*/
|
|
fun Stop() {
|
|
app.stop()
|
|
}
|
|
|
|
|
|
} |