-
+
diff --git a/src/content/Language.kt b/src/content/Language.kt
index 0274b87..c7ea77f 100644
--- a/src/content/Language.kt
+++ b/src/content/Language.kt
@@ -12,5 +12,5 @@ enum class Language(name: String) {
Local("LOCAL"),
Japanese("JAPANESE"),
Chinese("CHINESE"),
- Arabic("ARABIC"),;
+ Arabic("ARABIC");
}
\ No newline at end of file
diff --git a/src/database/MariaDB.kt b/src/database/MariaDB.kt
index 2ff842f..3e8e355 100644
--- a/src/database/MariaDB.kt
+++ b/src/database/MariaDB.kt
@@ -222,15 +222,15 @@ class MariaDB(
*/
fun GetLogForHtml(date: String, consumer: Consumer>) {
val logList = ArrayList()
- println("GetLogForHtml Date: $date" )
+ //println("GetLogForHtml Date: $date" )
if (ValiDateForLogHtml(date)) {
try {
// must convert from DD-MM-YYYY to DD/MM/YYYY, because in database we use DD/MM/YYYY
val adjusteddate = date.replace("-", "/")
val statement = connection?.prepareStatement("SELECT * FROM logs WHERE datenya = ?")
statement?.setString(1, adjusteddate)
- println("GetLogForHtml Date: $adjusteddate" )
- println("GetLogForHtml SQL: " +statement?.toString())
+ //println("GetLogForHtml Date: $adjusteddate" )
+ // println("GetLogForHtml SQL: " +statement?.toString())
val resultSet = statement?.executeQuery()
while (resultSet?.next() == true) {
val log = Log(
@@ -258,7 +258,7 @@ class MariaDB(
*/
fun GetLogForHtml(date: String, filter: String, consumer: Consumer>) {
val logList = ArrayList()
- println("GetLogForHtml Date: $date Filter: $filter" )
+ //println("GetLogForHtml Date: $date Filter: $filter" )
if (ValiDateForLogHtml(date)) {
try {
@@ -268,8 +268,8 @@ class MariaDB(
connection?.prepareStatement("SELECT * FROM logs WHERE datenya = ? AND description LIKE ?")
statement?.setString(1, adjusteddate)
statement?.setString(2, "%$filter%")
- println("GetLogForHtml Date: $adjusteddate , Filter=$filter" )
- println("GetLogForHtml SQL: " +statement?.toString())
+ //println("GetLogForHtml Date: $adjusteddate , Filter=$filter" )
+ //println("GetLogForHtml SQL: " +statement?.toString())
val resultSet = statement?.executeQuery()
while (resultSet?.next() == true) {
val log = Log(
@@ -457,6 +457,29 @@ class MariaDB(
return false
}
+ /**
+ * Resort the schedulebank table, in order to reorder the index after deletions, and sort ascending by Day and Time.
+ * @return True if the resorting was successful, false otherwise.
+ */
+ fun Resort_Schedulebank_by_Day_Time(): Boolean {
+ try {
+ val statement = connection?.createStatement()
+ // use a temporary table to reorder the index
+ statement?.executeUpdate("CREATE TABLE IF NOT EXISTS temp_schedulebank LIKE schedulebank")
+ statement?.executeUpdate("INSERT INTO temp_schedulebank (Description, Day, Time, Soundpath, Repeat, Enable, BroadcastZones, Language) SELECT Description, Day, Time, Soundpath, Repeat, Enable, BroadcastZones, Language FROM schedulebank ORDER BY Day ASC, Time ASC")
+ statement?.executeUpdate("TRUNCATE TABLE schedulebank")
+ statement?.executeUpdate("INSERT INTO schedulebank (Description, Day, Time, Soundpath, Repeat, Enable, BroadcastZones, Language) SELECT Description, Day, Time, Soundpath, Repeat, Enable, BroadcastZones, Language FROM temp_schedulebank")
+ statement?.executeUpdate("DROP TABLE temp_schedulebank")
+ Logger.info("schedulebank table resorted by Day and Time" as Any)
+ // reload the local list
+ Reload_Schedulebank()
+ return true
+ } catch (e: Exception) {
+ Logger.error("Error resorting schedulebank table by Day and Time: ${e.message}" as Any)
+ }
+ return false
+ }
+
/**
* Clears all entries from the schedulebank table in the database and the local list.
*/
@@ -695,6 +718,29 @@ class MariaDB(
return false
}
+ /**
+ * Resort the language link table, in order to reorder the index after deletions, and sort ascending by TAG.
+ * @return True if the resorting was successful, false otherwise.
+ */
+ fun Resort_LanguageLink_by_TAG() : Boolean {
+ try {
+ val statement = connection?.createStatement()
+ // use a temporary table to reorder the index
+ statement?.executeUpdate("CREATE TABLE IF NOT EXISTS temp_languagelinking LIKE languagelinking")
+ statement?.executeUpdate("INSERT INTO temp_languagelinking (TAG, Language) SELECT TAG, Language FROM languagelinking ORDER BY TAG ASC")
+ statement?.executeUpdate("TRUNCATE TABLE languagelinking")
+ statement?.executeUpdate("INSERT INTO languagelinking (TAG, Language) SELECT TAG, Language FROM temp_languagelinking")
+ statement?.executeUpdate("DROP TABLE temp_languagelinking")
+ Logger.info("languagelinking table resorted by TAG" as Any)
+ // reload the local list
+ Reload_LanguageLink()
+ return true
+ } catch (e: Exception) {
+ Logger.error("Error resorting languagelinking table by TAG: ${e.message}" as Any)
+ }
+ return false
+ }
+
/**
* Clears all entries from the language link table in the database and the local list.
*/
@@ -945,6 +991,29 @@ class MariaDB(
return false
}
+ /**
+ * Resort the soundbank table, in order to reorder the index after deletions, and sort ascending by Description.
+ * @return True if the resorting was successful, false otherwise.
+ */
+ fun Resort_Soundbank_by_Description(): Boolean {
+ try {
+ val statement = connection?.createStatement()
+ // use a temporary table to reorder the index
+ statement?.executeUpdate("CREATE TABLE IF NOT EXISTS temp_soundbank LIKE soundbank")
+ statement?.executeUpdate("INSERT INTO temp_soundbank (Description, TAG, Category, Language, VoiceType, Path) SELECT Description, TAG, Category, Language, VoiceType, Path FROM soundbank ORDER BY Description ASC")
+ statement?.executeUpdate("TRUNCATE TABLE soundbank")
+ statement?.executeUpdate("INSERT INTO soundbank (Description, TAG, Category, Language, VoiceType, Path) SELECT Description, TAG, Category, Language, VoiceType, Path FROM temp_soundbank")
+ statement?.executeUpdate("DROP TABLE temp_soundbank")
+ Logger.info("soundbank table resorted by Description" as Any)
+ // reload the local list
+ Reload_Soundbank()
+ return true
+ } catch (e: Exception) {
+ Logger.error("Error resorting soundbank table by Description: ${e.message}" as Any)
+ }
+ return false
+ }
+
/**
* Clears all entries from the soundbank table in the database and the local list.
*/
@@ -1173,6 +1242,29 @@ class MariaDB(
return false
}
+ /**
+ * Resort the messagebank table, in order to reorder the index after deletions, and sort ascending by ANN_ID.
+ * @return True if the resorting was successful, false otherwise.
+ */
+ fun Resort_Messagebank_by_ANN_ID(): Boolean {
+ try {
+ val statement = connection?.createStatement()
+ // use a temporary table to reorder the index
+ statement?.executeUpdate("CREATE TABLE IF NOT EXISTS temp_messagebank LIKE messagebank")
+ statement?.executeUpdate("INSERT INTO temp_messagebank (Description, Language, ANN_ID, Voice_Type, Message_Detail, Message_TAGS) SELECT Description, Language, ANN_ID, Voice_Type, Message_Detail, Message_TAGS FROM messagebank ORDER BY ANN_ID ASC")
+ statement?.executeUpdate("TRUNCATE TABLE messagebank")
+ statement?.executeUpdate("INSERT INTO messagebank (Description, Language, ANN_ID, Voice_Type, Message_Detail, Message_TAGS) SELECT Description, Language, ANN_ID, Voice_Type, Message_Detail, Message_TAGS FROM temp_messagebank")
+ statement?.executeUpdate("DROP TABLE temp_messagebank")
+ Logger.info("messagebank table resorted by Description" as Any)
+ // reload the local list
+ Reload_Messagebank()
+ return true
+ } catch (e: Exception) {
+ Logger.error("Error resorting messagebank table by Description: ${e.message}" as Any)
+ }
+ return false
+ }
+
/**
* Exports the messagebank table to an XLSX workbook.
* @return An XSSFWorkbook containing the messagebank data.
@@ -1527,6 +1619,29 @@ class MariaDB(
return false
}
+ /**
+ * Resort the broadcast_zones table, in order to reorder the index after deletions, and sort ascending by description.
+ * @return True if the resorting was successful, false otherwise.
+ */
+ fun Resort_BroadcastZones_by_description(): Boolean {
+ try {
+ val statement = connection?.createStatement()
+ // use a temporary table to reorder the index
+ statement?.executeUpdate("CREATE TABLE IF NOT EXISTS temp_broadcast_zones LIKE broadcast_zones")
+ statement?.executeUpdate("INSERT INTO temp_broadcast_zones (description, SoundChannel, Box, Relay) SELECT description, SoundChannel, Box, Relay FROM broadcast_zones ORDER BY description ASC")
+ statement?.executeUpdate("TRUNCATE TABLE broadcast_zones")
+ statement?.executeUpdate("INSERT INTO broadcast_zones (description, SoundChannel, Box, Relay) SELECT description, SoundChannel, Box, Relay FROM temp_broadcast_zones")
+ statement?.executeUpdate("DROP TABLE temp_broadcast_zones")
+ Logger.info("broadcast_zones table resorted by description" as Any)
+ // reload the local list
+ GetBroadcastZones()
+ return true
+ } catch (e: Exception) {
+ Logger.error("Error resorting broadcast_zones table by description: ${e.message}" as Any)
+ }
+ return false
+ }
+
/**
* Clears all entries from the broadcast_zones in the database.
*/
diff --git a/src/web/WebApp.kt b/src/web/WebApp.kt
index 562202e..48e9b7f 100644
--- a/src/web/WebApp.kt
+++ b/src/web/WebApp.kt
@@ -3,7 +3,6 @@ package web
import codes.Somecodes
import codes.Somecodes.Companion.ListAudioFiles
import codes.Somecodes.Companion.ValiDateForLogHtml
-import codes.Somecodes.Companion.ValidDate
import codes.Somecodes.Companion.ValidFile
import codes.Somecodes.Companion.ValidScheduleDay
import codes.Somecodes.Companion.ValidScheduleTime
@@ -66,13 +65,13 @@ class WebApp(val listenPort: Int, val userlist: List>, val
val username = it.formParam("username")
val password = it.formParam("password")
if (username == null || password == null) {
- it.status(400).result("Username and password are required")
+ it.status(400).result(objectmapper.writeValueAsString(resultMessage("Username and password are required")))
return@post
}
// Check if user exists in userlist
val user = userlist.find { it.first == username && it.second == password }
if (user == null) {
- it.status(401).result("Invalid username or password")
+ it.status(401).result(objectmapper.writeValueAsString(resultMessage("Invalid username or password")))
return@post
}
// Set user session
@@ -208,40 +207,43 @@ class WebApp(val listenPort: Int, val userlist: List>, val
if (!exists) {
if (ValidFile(addvalue.Path)) {
if (db.Add_Soundbank(addvalue)) {
- it.result(objectmapper.writeValueAsString(mapOf("message" to "OK")))
+ db.Resort_Soundbank_by_Description()
+ it.result(objectmapper.writeValueAsString(resultMessage("OK")))
} else it.status(500)
- .result("Failed to add soundbank to database")
+ .result(objectmapper.writeValueAsString(resultMessage("Failed to add soundbank to database")))
} else it.status(400)
- .result("Invalid Path, file does not exist")
+ .result(objectmapper.writeValueAsString(resultMessage("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(objectmapper.writeValueAsString(mapOf("message" to "Invalid Language")))
- } else it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "Invalid Category")))
- } else it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "Invalid TAG")))
- } else it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "Invalid Description")))
+ .result(objectmapper.writeValueAsString(resultMessage("TAG=${addvalue.TAG} already exists for the same Language=${addvalue.Language} and Category=${addvalue.Category}")))
+ } else it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Path")))
+ } else it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Language")))
+ } else it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Category")))
+ } else it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid TAG")))
+ } else it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Description")))
} catch (_: Exception) {
- it.status(400).result("Invalid request body")
+ it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid request body")))
}
}
delete("List") {
// truncate soundbank table
if (db.Clear_Soundbank()) {
- it.result(objectmapper.writeValueAsString(mapOf("message" to "OK")))
+ db.Reload_Soundbank()
+ it.result(objectmapper.writeValueAsString(resultMessage("OK")))
} else {
- it.status(500).result("Failed to truncate soundbank table")
+ it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to truncate soundbank table")))
}
}
delete("DeleteByIndex/{index}") {
// delete by index
val index = it.pathParam("index").toUIntOrNull()
if (index == null) {
- it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "Invalid index")))
+ it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid index")))
} else {
if (db.Delete_Soundbank_by_index(index)) {
- it.result(objectmapper.writeValueAsString(mapOf("message" to "OK")))
+ db.Resort_Soundbank_by_Description()
+ it.result(objectmapper.writeValueAsString(resultMessage("OK")))
} else {
- it.status(500).result("Failed to delete soundbank with index $index")
+ it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to delete soundbank with index $index")))
}
}
}
@@ -250,17 +252,17 @@ class WebApp(val listenPort: Int, val userlist: List>, val
val index = it.pathParam("index").toUIntOrNull()
if (index == null) {
// tidak ada path param index
- it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "Invalid index")))
+ it.status(400).result(objectmapper.writeValueAsString(resultMessage("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")
+ it.status(404).result(objectmapper.writeValueAsString(resultMessage("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(objectmapper.writeValueAsString(mapOf("message" to "UpdateByIndex with index=$index has empty body")))
+ it.status(400).result(objectmapper.writeValueAsString(resultMessage("UpdateByIndex with index=$index has empty body")))
} else {
val _description = json.get("Description").asText()
val _tag = json.get("TAG").asText()
@@ -283,7 +285,7 @@ class WebApp(val listenPort: Int, val userlist: List>, val
sb.Category = _category
changed = true
} else {
- it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "Invalid Category")))
+ it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Category")))
return@patch
}
}
@@ -296,16 +298,17 @@ class WebApp(val listenPort: Int, val userlist: List>, val
sb.Path = _path
changed = true
} else {
- it.status(400).result("Invalid Path, file does not exist")
+ it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Path, file does not exist")))
return@patch
}
}
if (changed) {
if (db.Update_Soundbank_by_index(index, sb)) {
- it.result(objectmapper.writeValueAsString(mapOf("message" to "OK")))
- } else it.status(500).result("Failed to update soundbank with index $index")
+ db.Resort_Soundbank_by_Description()
+ it.result(objectmapper.writeValueAsString(resultMessage("OK")))
+ } else it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to update soundbank with index $index")))
} else it.status(400)
- .result("Nothing has changed for soundbank with index $index")
+ .result(objectmapper.writeValueAsString(resultMessage("Nothing has changed for soundbank with index $index")))
}
}
}
@@ -322,24 +325,25 @@ class WebApp(val listenPort: Int, val userlist: List>, val
xlsxdata.write(out)
}
} else {
- it.status(500).result("Failed to export soundbank to XLSX")
+ it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to export soundbank to XLSX")))
}
}
post("ImportXLSX") {
val uploaded = it.uploadedFile("file")
if (uploaded == null) {
- it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "No file uploaded")))
+ it.status(400).result(objectmapper.writeValueAsString(resultMessage("No file uploaded")))
return@post
}
try {
val xlsx = XSSFWorkbook(uploaded.content())
if (db.Import_Soundbank_XLSX(xlsx)) {
- it.result(objectmapper.writeValueAsString(mapOf("message" to "OK")))
+ db.Resort_Soundbank_by_Description()
+ it.result(objectmapper.writeValueAsString(resultMessage("OK")))
} else {
- it.status(500).result("Failed to import soundbank from XLSX")
+ it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to import soundbank from XLSX")))
}
} catch (e: Exception) {
- it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "Invalid XLSX file")))
+ it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid XLSX file")))
}
}
}
@@ -354,21 +358,23 @@ class WebApp(val listenPort: Int, val userlist: List>, val
delete("List") {
// truncate messagebank table
if (db.Clear_Messagebank()) {
- it.result(objectmapper.writeValueAsString(mapOf("message" to "OK")))
+ db.Reload_Messagebank()
+ it.result(objectmapper.writeValueAsString(resultMessage("OK")))
} else {
- it.status(500).result(objectmapper.writeValueAsString(mapOf("message" to "Failed to truncate messagebank table")))
+ it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to truncate messagebank table")))
}
}
delete("DeleteByIndex/{index}") {
// delete by index
val index = it.pathParam("index").toUIntOrNull()
if (index == null) {
- it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "Invalid index")))
+ it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid index")))
} else {
if (db.Delete_Messagebank_by_index(index)) {
- it.result(objectmapper.writeValueAsString(mapOf("message" to "OK")))
+ db.Resort_Messagebank_by_ANN_ID()
+ it.result(objectmapper.writeValueAsString(resultMessage("OK")))
} else {
- it.status(500).result(objectmapper.writeValueAsString(mapOf("message" to "Failed to delete messagebank with index $index")))
+ it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to delete messagebank with index $index")))
}
}
}
@@ -376,15 +382,15 @@ class WebApp(val listenPort: Int, val userlist: List>, val
// update messagebank by index
val index = it.pathParam("index").toUIntOrNull()
if (index == null) {
- it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "Invalid index")))
+ it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid index")))
} else {
val mb = db.MessagebankList.find { xx -> xx.index == index }
if (mb == null) {
- it.status(404).result(objectmapper.writeValueAsString(mapOf("message" to "Messagebank with index $index not found")))
+ it.status(404).result(objectmapper.writeValueAsString(resultMessage("Messagebank with index $index not found")))
} else {
val json: JsonNode = objectmapper.readTree(it.body())
if (json.isEmpty) {
- it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "UpdateByIndex with index=$index has empty body")))
+ it.status(400).result(objectmapper.writeValueAsString(resultMessage("UpdateByIndex with index=$index has empty body")))
} else {
val _description = json.get("Description").asText()
val _language = json.get("Language").asText()
@@ -411,7 +417,7 @@ class WebApp(val listenPort: Int, val userlist: List>, val
mb.Voice_Type = _voice_type
changed = true
} else {
- it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "Invalid Voice_Type")))
+ it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Voice_Type")))
return@patch
}
}
@@ -425,11 +431,12 @@ class WebApp(val listenPort: Int, val userlist: List>, val
}
if (changed) {
if (db.Update_Messagebank_by_index(index, mb)) {
- it.result(objectmapper.writeValueAsString(mapOf("message" to "OK")))
+ db.Resort_Messagebank_by_ANN_ID()
+ it.result(objectmapper.writeValueAsString(resultMessage("OK")))
} else it.status(500)
- .result(objectmapper.writeValueAsString(mapOf("message" to "Failed to update messagebank with index $index")))
+ .result(objectmapper.writeValueAsString(resultMessage("Failed to update messagebank with index $index")))
} else it.status(400)
- .result(objectmapper.writeValueAsString(mapOf("message" to "Nothing has changed for messagebank with index $index")))
+ .result(objectmapper.writeValueAsString(resultMessage("Nothing has changed for messagebank with index $index")))
}
}
}
@@ -446,24 +453,25 @@ class WebApp(val listenPort: Int, val userlist: List>, val
xlsxdata.write(out)
}
} else {
- it.status(500).result(objectmapper.writeValueAsString(mapOf("message" to "Failed to export messagebank to XLSX")))
+ it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to export messagebank to XLSX")))
}
}
post("ImportXLSX") {
val uploaded = it.uploadedFile("file")
if (uploaded == null) {
- it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "No file uploaded")))
+ it.status(400).result(objectmapper.writeValueAsString(resultMessage("No file uploaded")))
return@post
}
try {
val xlsx = XSSFWorkbook(uploaded.content())
if (db.Import_Messagebank_XLSX(xlsx)) {
- it.result(objectmapper.writeValueAsString(mapOf("message" to "OK")))
+ db.Resort_Messagebank_by_ANN_ID()
+ it.result(objectmapper.writeValueAsString(resultMessage("OK")))
} else {
- it.status(500).result(objectmapper.writeValueAsString(mapOf("message" to "Failed to import messagebank from XLSX")))
+ it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to import messagebank from XLSX")))
}
} catch (e: Exception) {
- it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "Invalid XLSX file")))
+ it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid XLSX file")))
}
}
}
@@ -477,35 +485,51 @@ class WebApp(val listenPort: Int, val userlist: List>, val
val json: JsonNode = objectmapper.readTree(it.body())
val tag = json.get("tag").asText()
val languages = json.get("language").asText().split(";")
+ println("Add Language Link, tag=$tag, languages=$languages")
if (ValidString(tag)){
- if (languages.all { xx -> Language.entries.any { yy -> yy.name== xx} }){
- if (db.LanguageLinkList.any { ll -> ll.TAG==tag }){
+ if (languages.all { xx -> Language.entries.any { yy -> yy.name.equals(xx,true)} }){
+ if (!db.LanguageLinkList.any { ll -> ll.TAG.equals(tag,true) }) {
val newvalue = LanguageLink(0u, tag, languages.joinToString(";"))
if (db.Add_LanguageLink(newvalue)){
- it.result(objectmapper.writeValueAsString(mapOf("message" to "OK")))
- } else it.status(500).result(objectmapper.writeValueAsString(mapOf("message" to "Failed to add language link to database")))
- } else it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "TAG=$tag already exists")))
- } else it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "Contains unsupported language")))
- } else it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "Invalid tag or language")))
+ db.Resort_LanguageLink_by_TAG()
+ it.result(objectmapper.writeValueAsString(resultMessage("OK")))
+ } else {
+ it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to add language link to database")))
+ println("Failed to add language link to database")
+ }
+ } else {
+ it.status(400).result(objectmapper.writeValueAsString(resultMessage("TAG=$tag already exists")))
+ println("TAG=$tag already exists")
+ }
+ } else {
+ it.status(400).result(objectmapper.writeValueAsString(resultMessage("Contains unsupported language")))
+ println("Contains unsupported language")
+ }
+ } else {
+ it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid tag or language")))
+ println("Invalid tag")
+ }
}
delete("List") {
// truncate language link table
if (db.Clear_LanguageLink()) {
- it.result(objectmapper.writeValueAsString(mapOf("message" to "OK")))
+ db.Reload_LanguageLink()
+ it.result(objectmapper.writeValueAsString(resultMessage("OK")))
} else {
- it.status(500).result(objectmapper.writeValueAsString(mapOf("message" to "Failed to truncate language link table")))
+ it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to truncate language link table")))
}
}
delete("DeleteByIndex/{index}") {
// delete by index
val index = it.pathParam("index").toUIntOrNull()
if (index == null) {
- it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "Invalid index")))
+ it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid index")))
} else {
if (db.Delete_LanguageLink_by_index(index)) {
- it.result(objectmapper.writeValueAsString(mapOf("message" to "OK")))
+ db.Resort_LanguageLink_by_TAG()
+ it.result(objectmapper.writeValueAsString(resultMessage("OK")))
} else {
- it.status(500).result(objectmapper.writeValueAsString(mapOf("message" to "Failed to delete language link with index $index")))
+ it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to delete language link with index $index")))
}
}
}
@@ -513,15 +537,15 @@ class WebApp(val listenPort: Int, val userlist: List>, val
// update by index
val index = it.pathParam("index").toUIntOrNull()
if (index == null) {
- it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "Invalid index")))
+ it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid index")))
} else {
val ll = db.LanguageLinkList.find { xx -> xx.index == index }
if (ll == null) {
- it.status(404).result(objectmapper.writeValueAsString(mapOf("message" to "Language link with index $index not found")))
+ it.status(404).result(objectmapper.writeValueAsString(resultMessage("Language link with index $index not found")))
} else {
val json: JsonNode = objectmapper.readTree(it.body())
if (json.isEmpty) {
- it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "UpdateByIndex with index=$index has empty body")))
+ it.status(400).result(objectmapper.writeValueAsString(resultMessage("UpdateByIndex with index=$index has empty body")))
} else {
val _tag = json.get("tag").asText()
val _language = json.get("language").asText()
@@ -536,11 +560,12 @@ class WebApp(val listenPort: Int, val userlist: List>, val
}
if (changed) {
if (db.Update_LanguageLink_by_index(index, ll)) {
- it.result(objectmapper.writeValueAsString(mapOf("message" to "OK")))
+ db.Resort_LanguageLink_by_TAG()
+ it.result(objectmapper.writeValueAsString(resultMessage("OK")))
} else it.status(500)
- .result(objectmapper.writeValueAsString(mapOf("message" to "Failed to update language link with index $index")))
+ .result(objectmapper.writeValueAsString(resultMessage("Failed to update language link with index $index")))
} else it.status(400)
- .result(objectmapper.writeValueAsString(mapOf("message" to "Nothing has changed for language link with index $index")))
+ .result(objectmapper.writeValueAsString(resultMessage("Nothing has changed for language link with index $index")))
}
}
}
@@ -557,24 +582,25 @@ class WebApp(val listenPort: Int, val userlist: List>, val
xlsxdata.write(out)
}
} else {
- it.status(500).result(objectmapper.writeValueAsString(mapOf("message" to "Failed to export language link to XLSX")))
+ it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to export language link to XLSX")))
}
}
post("ImportXLSX") {
val uploaded = it.uploadedFile("file")
if (uploaded == null) {
- it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "No file uploaded")))
+ it.status(400).result(objectmapper.writeValueAsString(resultMessage("No file uploaded")))
return@post
}
try {
val xlsx = XSSFWorkbook(uploaded.content())
if (db.Import_LanguageLink_XLSX(xlsx)) {
- it.result(objectmapper.writeValueAsString(mapOf("message" to "OK")))
+ db.Resort_LanguageLink_by_TAG()
+ it.result(objectmapper.writeValueAsString(resultMessage("OK")))
} else {
- it.status(500).result(objectmapper.writeValueAsString(mapOf("message" to "Failed to import language link from XLSX")))
+ it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to import language link from XLSX")))
}
} catch (e: Exception) {
- it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "Invalid XLSX file")))
+ it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid XLSX file")))
}
}
}
@@ -586,21 +612,23 @@ class WebApp(val listenPort: Int, val userlist: List>, val
delete("List") {
// truncate timer table
if (db.Clear_Schedulebank()) {
- it.result(objectmapper.writeValueAsString(mapOf("message" to "OK")))
+ db.Reload_Schedulebank()
+ it.result(objectmapper.writeValueAsString(resultMessage("OK")))
} else {
- it.status(500).result(objectmapper.writeValueAsString(mapOf("message" to "Failed to truncate schedulebank table")))
+ it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to truncate schedulebank table")))
}
}
delete("DeleteByIndex/{index}") {
// delete by index
val index = it.pathParam("index").toUIntOrNull()
if (index == null) {
- it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "Invalid index")))
+ it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid index")))
} else {
if (db.Delete_Schedulebank_by_index(index)) {
- it.result(objectmapper.writeValueAsString(mapOf("message" to "OK")))
+ db.Resort_Schedulebank_by_Day_Time()
+ it.result(objectmapper.writeValueAsString(resultMessage("OK")))
} else {
- it.status(500).result("Failed to delete schedule with index $index")
+ it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to delete schedule with index $index")))
}
}
}
@@ -608,15 +636,15 @@ class WebApp(val listenPort: Int, val userlist: List>, val
// update by index
val index = it.pathParam("index").toUIntOrNull()
if (index == null) {
- it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "Invalid index")))
+ it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid index")))
} else {
val sb = db.SchedulebankList.find { xx -> xx.index == index }
if (sb == null) {
- it.status(404).result("Schedule with index $index not found")
+ it.status(404).result(objectmapper.writeValueAsString(resultMessage("Schedule with index $index not found")))
} else {
val json: JsonNode = objectmapper.readTree(it.body())
if (json.isEmpty) {
- it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "UpdateByIndex with index=$index has empty body")))
+ it.status(400).result(objectmapper.writeValueAsString(resultMessage("UpdateByIndex with index=$index has empty body")))
} else {
val _description = json.get("Description").asText()
val _time = json.get("Time").asText()
@@ -636,7 +664,7 @@ class WebApp(val listenPort: Int, val userlist: List>, val
sb.Time = _time
changed = true
} else {
- it.status(400).result("Invalid Time format, must be HH:mm")
+ it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Time format, must be HH:mm")))
return@patch
}
}
@@ -645,7 +673,7 @@ class WebApp(val listenPort: Int, val userlist: List>, val
sb.Day = _day
changed = true
} else {
- it.status(400).result("Invalid Day format")
+ it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Day format")))
return@patch
}
}
@@ -670,17 +698,18 @@ class WebApp(val listenPort: Int, val userlist: List>, val
sb.Language = _language
changed = true
} else {
- it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "Invalid Language")))
+ it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Language")))
return@patch
}
}
if (changed) {
if (db.Update_Schedulebank_by_index(index, sb)) {
- it.result(objectmapper.writeValueAsString(mapOf("message" to "OK")))
+ db.Resort_Schedulebank_by_Day_Time()
+ it.result(objectmapper.writeValueAsString(resultMessage("OK")))
} else it.status(500)
- .result(objectmapper.writeValueAsString(mapOf("message" to "Failed to update schedule with index $index")))
+ .result(objectmapper.writeValueAsString(resultMessage("Failed to update schedule with index $index")))
} else it.status(400)
- .result(objectmapper.writeValueAsString(mapOf("message" to "Nothing has changed for schedule with index $index")))
+ .result(objectmapper.writeValueAsString(resultMessage("Nothing has changed for schedule with index $index")))
}
}
}
@@ -697,24 +726,25 @@ class WebApp(val listenPort: Int, val userlist: List>, val
xlsxdata.write(out)
}
} else {
- it.status(500).result(objectmapper.writeValueAsString(mapOf("message" to "Failed to export schedulebank to XLSX")))
+ it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to export schedulebank to XLSX")))
}
}
post("ImportXLSX") {
val uploaded = it.uploadedFile("file")
if (uploaded == null) {
- it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "No file uploaded")))
+ it.status(400).result(objectmapper.writeValueAsString(resultMessage("No file uploaded")))
return@post
}
try {
val xlsx = XSSFWorkbook(uploaded.content())
if (db.Import_Schedulebank_XLSX(xlsx)) {
- it.result(objectmapper.writeValueAsString(mapOf("message" to "OK")))
+ db.Resort_Schedulebank_by_Day_Time()
+ it.result(objectmapper.writeValueAsString(resultMessage("OK")))
} else {
- it.status(500).result("Failed to import schedulebank from XLSX")
+ it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to import schedulebank from XLSX")))
}
} catch (e: Exception) {
- it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "Invalid XLSX file")))
+ it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid XLSX file")))
}
}
}
@@ -735,7 +765,7 @@ class WebApp(val listenPort: Int, val userlist: List>, val
}
} else {
println("Invalid logdate=$logdate")
- get1.status(400).result("Invalid logdate")
+ get1.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid logdate")))
}
}
get("ExportXLSX") { get1 ->
@@ -758,11 +788,86 @@ class WebApp(val listenPort: Int, val userlist: List>, val
xlsxdata.write(out)
}
} else {
- get1.status(500).result("Failed to export log to XLSX")
+ get1.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to export log to XLSX")))
}
- } else get1.status(400).result("Invalid logdate")
+ } else get1.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid logdate")))
}
}
+ path("BroadcastZones"){
+ get("List") {
+ // get broadcast zones list
+ it.result(MariaDB.ArrayListtoString(db.BroadcastZoneList))
+ }
+ delete("List"){
+ // truncate broadcast zones table
+ if (db.Clear_BroadcastZones()) {
+ db.GetBroadcastZones()
+ it.result(objectmapper.writeValueAsString(resultMessage("OK")))
+ } else {
+ it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to truncate broadcast zones table")))
+ }
+ }
+ post("Add") {
+ // Parse JSON from request body
+ val json: JsonNode = objectmapper.readTree(it.body())
+ val zone = json.get("zone").asText()
+ val description = json.get("description").asText()
+ println("Add Broadcast Zone, zone=$zone, description=$description")
+ // TODO continue tomorrow
+ }
+ delete("DeleteByIndex/{index}") {
+ // delete by index
+ val index = it.pathParam("index").toUIntOrNull()
+ if (index == null) {
+ it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid index")))
+ } else {
+ if (db.Delete_BroadcastZones_by_index(index)) {
+ db.Resort_BroadcastZones_by_description()
+ it.result(objectmapper.writeValueAsString(resultMessage("OK")))
+ } else {
+ it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to delete broadcast zone with index $index")))
+ }
+ }
+ }
+ post("UpdateByIndex/{index}") {
+ // TODO continue tomorrow
+
+ }
+ get("ExportXLSX") {
+ val xlsxdata = db.Export_BroadcastZones_XLSX()
+ if (xlsxdata != null) {
+ it.header(
+ "Content-Type",
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
+ )
+ it.header("Content-Disposition", "attachment; filename=\"broadcastzones.xlsx\"")
+ it.outputStream().use { out ->
+ xlsxdata.write(out)
+ }
+ } else {
+ it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to export broadcast zones to XLSX")))
+ }
+ }
+ post("ImportXLSX") {
+ val uploaded = it.uploadedFile("file")
+ if (uploaded == null) {
+ it.status(400).result(objectmapper.writeValueAsString(resultMessage("No file uploaded")))
+ return@post
+ }
+ try {
+ val xlsx = XSSFWorkbook(uploaded.content())
+ if (db.Import_BroadcastZones_XLSX(xlsx)) {
+ db.Resort_BroadcastZones_by_description()
+ it.result(objectmapper.writeValueAsString(resultMessage("OK")))
+ } else {
+ it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to import broadcast zones from XLSX")))
+ }
+ } catch (e: Exception) {
+ it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid XLSX file")))
+ }
+ }
+
+ }
}
}
}.start(listenPort)
diff --git a/src/web/resultMessage.kt b/src/web/resultMessage.kt
new file mode 100644
index 0000000..8543017
--- /dev/null
+++ b/src/web/resultMessage.kt
@@ -0,0 +1,4 @@
+package web
+
+@Suppress("unused")
+data class resultMessage(val message: String)