commit 03/09/2025

This commit is contained in:
2025-09-03 11:05:30 +07:00
parent ea1defa78e
commit ea04f8d316
14 changed files with 1272 additions and 210 deletions

View File

@@ -6,6 +6,7 @@
<inspection_tool class="DuplicatedCode" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
<inspection_tool class="EnumEntryName" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
<inspection_tool class="FunctionName" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
<inspection_tool class="LocalVariableName" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
<inspection_tool class="MethodNameSameAsClassName" enabled="false" level="WARNING" enabled_by_default="false" />
<inspection_tool class="PropertyName" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
<inspection_tool class="RedundantCast" enabled="false" level="WARNING" enabled_by_default="false" />

View File

@@ -22,5 +22,23 @@
<orderEntry type="library" name="fasterxml.jackson.module.kotlin" level="project" />
<orderEntry type="library" name="fasterxml.jackson.core.databind" level="project" />
<orderEntry type="library" name="github.oshi.core" level="project" />
<orderEntry type="module-library">
<library>
<CLASSES>
<root url="jar://C:/SLC/Apache POI/poi-5.4.1.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library>
<CLASSES>
<root url="jar://C:/SLC/Apache POI/poi-ooxml-5.4.1.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
</component>
</module>

View File

@@ -1,4 +1,4 @@
package database
@Suppress("unused")
data class BroadcastZones(val index: UInt, val description: String, val SoundChannel: String, val Box: String, val Relay: String)
data class BroadcastZones(var index: UInt, var description: String, var SoundChannel: String, var Box: String, var Relay: String)

View File

@@ -1,4 +1,4 @@
package database
@Suppress("unused")
data class IpZones(val index:UInt, val description: String, val ip: String)
data class IpZones(var index:UInt, var description: String, var ip: String)

View File

@@ -1,4 +1,4 @@
package database
@Suppress("unused")
data class LanguageLink(val index: UInt, val TAG: String, val Language: String)
data class LanguageLink(var index: UInt, var TAG: String, var Language: String)

File diff suppressed because it is too large Load Diff

View File

@@ -1,11 +1,11 @@
package database
data class Messagebank(
val index : UInt,
val Description: String,
val Language: String,
val ANN_ID : UInt,
val Voice_Type: String,
val Message_Detail: String,
val Message_TAGS: String
var index : UInt,
var Description: String,
var Language: String,
var ANN_ID : UInt,
var Voice_Type: String,
var Message_Detail: String,
var Message_TAGS: String
)

View File

@@ -1,4 +1,4 @@
package database
@Suppress("unused")
data class QueueFids(val index: UInt, val ALCODE: String, val FLNUM: String, val ORIGIN: String, val ETAD: String, val FREMARK: String)
data class QueueFids(var index: UInt, var ALCODE: String, var FLNUM: String, var ORIGIN: String, var ETAD: String, var FREMARK: String)

View File

@@ -1,4 +1,4 @@
package database
@Suppress("unused")
data class QueuePaging(val index: UInt, val Date_Time: String, val Source: String, val Type: String, val Message: String, val BroadcastZones: String)
data class QueuePaging(var index: UInt, var Date_Time: String, var Source: String, var Type: String, var Message: String, var BroadcastZones: String)

View File

@@ -1,4 +1,4 @@
package database
@Suppress("unused")
data class QueueTable(val index: UInt, val Date_Time: String, val Source: String, val Type: String, val Message: String, val SB_TAGS: String, val BroadcastZones: String, val Repeat: UInt, val Language: String)
data class QueueTable(var index: UInt, var Date_Time: String, var Source: String, var Type: String, var Message: String, var SB_TAGS: String, var BroadcastZones: String, var Repeat: UInt, var Language: String)

View File

@@ -1,4 +1,4 @@
package database
@Suppress("unused")
data class ScheduleBank(val index: UInt, val Description: String, val Day: String, val Time: String, val Soundpath: String, val Repeat: UByte, val Enable: Boolean, val BroadcastZones: String, val Language: String)
data class ScheduleBank(var index: UInt, var Description: String, var Day: String, var Time: String, var Soundpath: String, var Repeat: UByte, var Enable: Boolean, var BroadcastZones: String, var Language: String)

View File

@@ -1,11 +1,11 @@
package database
data class Soundbank(
val index: UInt,
val Description: String,
val TAG : String,
val Category: String,
val Language: String,
val VoiceType: String,
val Path: String,
var index: UInt,
var Description: String,
var TAG : String,
var Category: String,
var Language: String,
var VoiceType: String,
var Path: String,
)

View File

@@ -1,4 +1,4 @@
package database
@Suppress("unused")
data class UserDB(val index: UInt, val username: String, val password: String, val location: String)
data class UserDB(var index: UInt, var username: String, var password: String, var location: String)

View File

@@ -2,17 +2,23 @@ package web
import codes.Somecodes
import codes.Somecodes.Companion.ValidDate
import codes.Somecodes.Companion.ValidFile
import codes.Somecodes.Companion.ValidString
import com.fasterxml.jackson.databind.JsonNode
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import content.Category
import database.MariaDB
import database.Soundbank
import io.javalin.Javalin
import io.javalin.apibuilder.ApiBuilder.before
import io.javalin.apibuilder.ApiBuilder.delete
import io.javalin.apibuilder.ApiBuilder.get
import io.javalin.apibuilder.ApiBuilder.patch
import io.javalin.apibuilder.ApiBuilder.path
import io.javalin.apibuilder.ApiBuilder.post
import io.javalin.apibuilder.ApiBuilder.ws
import io.javalin.http.Context
import io.javalin.json.JavalinJackson
import io.javalin.websocket.WsMessageContext
import java.time.LocalDateTime
@@ -36,6 +42,7 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>, val
config ->
config.useVirtualThreads = true
config.staticFiles.add("/webpage")
config.jsonMapper(JavalinJackson(jacksonObjectMapper()))
config.router.apiBuilder {
path("/"){
get { ctx ->
@@ -133,10 +140,56 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>, val
}
path("soundbank.html") {
before {CheckUsers(it)}
}
path("messagebank.html") {
before { CheckUsers(it) }
}
path("language.html") {
before { CheckUsers(it) }
}
path("log.html") {
before { CheckUsers(it) }
}
path("setting.html") {
before { CheckUsers(it) }
}
path("timer.html") {
before { CheckUsers(it) }
}
path("api"){
path("SoundBank"){
get("List"){
// get soundbank list
it.result(MariaDB.ArrayListtoString(db.SoundbankList))
}
post("Add"){
try {
val addvalue = objectmapper.readValue(it.body(), Soundbank::class.java)
if (ValidString(addvalue.Description)){
if (ValidString(addvalue.TAG)){
if (ValidString(addvalue.Category)){
if (ValidString(addvalue.Language)){
if (ValidString(addvalue.Path)){
// check apakah TAG sudah ada untuk language dan category yang sama
val exists = db.SoundbankList.any { sb ->
sb.TAG == addvalue.TAG && sb.Language == addvalue.Language && sb.Category == addvalue.Category
}
if (!exists){
if (ValidFile(addvalue.Path)){
if (db.Add_Soundbank(addvalue)){
it.result("OK")
} else it.status(500).result("Failed to add soundbank to database")
} else it.status(400).result("Invalid Path, file does not exist")
} else it.status(400).result("TAG=${addvalue.TAG} already exists for the same Language=${addvalue.Language} and Category=${addvalue.Category}")
} else it.status(400).result("Invalid Path")
} else it.status(400).result("Invalid Language")
} else it.status(400).result("Invalid Category")
} else it.status(400).result("Invalid TAG")
} else it.status(400).result("Invalid Description")
} catch (_: Exception){
it.status(400).result("Invalid request body")
}
}
delete("List"){
// truncate soundbank table
if (db.Clear_Soundbank()){
@@ -157,14 +210,83 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>, val
it.status(500).result("Failed to delete soundbank with index $index")
}
}
}
patch("UpdateByIndex/{index}"){
// update by index
val index = it.pathParam("index").toUIntOrNull()
if (index == null){
// tidak ada path param index
it.status(400).result("Invalid index")
} else {
val sb = db.SoundbankList.find{ xx -> xx.index == index }
if (sb == null){
// soundbank dengan index tersebut tidak ditemukan
it.status(404).result("Soundbank with index $index not found")
} else {
// soundbank dengan index tersebut ditemukan, sekarang update
val json : JsonNode = objectmapper.readTree(it.body())
if (json.isEmpty){
it.status(400).result("UpdateByIndex with index=$index has empty body")
} else {
val _description = json.get("Description").asText()
val _tag = json.get("TAG").asText()
val _category = json.get("Category").asText()
val _language = json.get("Language").asText()
val _path = json.get("Path").asText()
var changed = false
if (ValidString(_description) && _description!=sb.Description){
sb.Description = _description
changed = true
}
if (ValidString(_tag) && _tag!=sb.TAG){
sb.TAG = _tag
changed = true
}
if (ValidString(_category) && _category!=sb.Category){
if (Category.entries.any {
cat -> cat.name == _category
}) {
sb.Category = _category
changed = true
} else {
it.status(400).result("Invalid Category")
return@patch
}
}
if (ValidString(_language) && _language!=sb.Language){
sb.Language = _language
changed = true
}
if (ValidString(_path) && _path!=sb.Path){
if (ValidFile(_path)){
sb.Path = _path
changed = true
} else {
it.status(400).result("Invalid Path, file does not exist")
return@patch
}
}
if (changed){
if (db.Update_Soundbank_by_index(index, sb)){
it.result("OK")
} else it.status(500).result("Failed to update soundbank with index $index")
} else it.status(400).result("Nothing has changed for soundbank with index $index")
}
}
}
}
get("ExportXLSX"){
}
post("ImportXLSX"){
val uploaded = it.uploadedFile("file")
if (uploaded==null){
it.status(400).result("No file uploaded")
return@post
}
path("messagebank.html") {
before { CheckUsers(it) }
}
}
path("MessageBank"){
get("List"){
// get messagebank list
it.result(MariaDB.ArrayListtoString(db.MessagebankList))
@@ -191,8 +313,7 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>, val
}
}
}
path("language.html") {
before { CheckUsers(it) }
path("LanguageLink"){
get("List"){
// get language link list
it.result(MariaDB.ArrayListtoString(db.LanguageLinkList))
@@ -218,34 +339,8 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>, val
}
}
}
}
path("log.html") {
before { CheckUsers(it) }
get("List/<logdate>/<logfilter>"){ get1 ->
val logdate = get1.pathParam("logdate")
val logfilter = get1.pathParam("logfilter")
if (ValidDate(logdate)){
if (ValidString(logfilter)){
// ada log filter
db.GetLog(logdate, logfilter){
get1.result(MariaDB.ArrayListtoString(it))
}
} else {
db.GetLog(logdate){
get1.result(MariaDB.ArrayListtoString(it))
}
}
} else get1.status(400).result("Invalid logdate")
}
}
path("setting.html") {
before { CheckUsers(it) }
}
path("timer.html") {
before { CheckUsers(it) }
path("ScheduleBank"){
get("List"){
// get timer list
it.result(MariaDB.ArrayListtoString(db.SchedulebankList))
@@ -272,6 +367,25 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>, val
}
}
}
path("Log"){
get("List/<logdate>/<logfilter>"){ get1 ->
val logdate = get1.pathParam("logdate")
val logfilter = get1.pathParam("logfilter")
if (ValidDate(logdate)){
if (ValidString(logfilter)){
// ada log filter
db.GetLog(logdate, logfilter){
get1.result(MariaDB.ArrayListtoString(it))
}
} else {
db.GetLog(logdate){
get1.result(MariaDB.ArrayListtoString(it))
}
}
} else get1.status(400).result("Invalid logdate")
}
}
}
}
}.start(listenPort)