Commit 30/09/2025

This commit is contained in:
rdkartono
2025-09-30 14:44:31 +07:00
parent cf24c06b35
commit 85776cce45
11 changed files with 2321 additions and 2201 deletions

9
.idea/dataSources.xml generated
View File

@@ -1,15 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
<data-source source="LOCAL" name="mariadB" uuid="a738dd17-8123-478b-81aa-6ecf4f890ccc">
<driver-ref>mariadb</driver-ref>
<data-source source="LOCAL" name="mysql" uuid="6f68a2ce-92f6-4203-a8c0-f18965b0d627">
<driver-ref>mysql.8</driver-ref>
<synchronize>true</synchronize>
<jdbc-driver>org.mariadb.jdbc.Driver</jdbc-driver>
<jdbc-url>jdbc:mariadb://localhost:3306/aas</jdbc-url>
<jdbc-driver>com.mysql.cj.jdbc.Driver</jdbc-driver>
<jdbc-url>jdbc:mysql://localhost:3306/aas</jdbc-url>
<jdbc-additional-properties>
<property name="com.intellij.clouds.kubernetes.db.host.port" />
<property name="com.intellij.clouds.kubernetes.db.enabled" value="false" />
<property name="com.intellij.clouds.kubernetes.db.resource.type" value="Deployment" />
<property name="com.intellij.clouds.kubernetes.db.container.port" />
</jdbc-additional-properties>
<working-dir>$ProjectFileDir$</working-dir>

2
.idea/sqldialects.xml generated
View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="SqlDialectMappings">
<file url="file://$PROJECT_DIR$/src/database/MariaDB.kt" dialect="GenericSQL" />
<file url="file://$PROJECT_DIR$/src/database/MariaDB.kt" dialect="MySQL" />
</component>
</project>

View File

@@ -5,6 +5,7 @@ import com.sun.jna.Platform
import commandServer.TCP_Android_Command_Server
import content.Language
import content.VoiceType
import database.Log
import database.MariaDB
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
@@ -19,7 +20,7 @@ import kotlin.concurrent.fixedRateTimer
lateinit var db: MariaDB
lateinit var audioPlayer: AudioPlayer
val StreamerOutputs: MutableMap<String, BarixConnection> = HashMap()
const val version = "0.0.1 (23/09/2025)"
const val version = "0.0.2 (23/09/2025)"
// dipakai untuk pilih voice type, bisa diganti via web nanti
var selected_voice = VoiceType.VOICE_1.name
@@ -76,14 +77,15 @@ fun main() {
val androidserver = TCP_Android_Command_Server()
androidserver.StartTcpServer(5003){
Logger.info { it }
db.Add_Log("ANDROID", it)
db.logDB.Add(Log.NewLog("ANDROID", it))
}
val barixserver = TCP_Barix_Command_Server()
barixserver.StartTcpServer { cmd ->
Logger.info { cmd }
val _streamer = StreamerOutputs[cmd.ipaddress]
val _sc = db.SoundChannelList.find { it.ip == cmd.ipaddress }
val _sc = db.soundchannelDB.List.find { it.ip == cmd.ipaddress }
if (_streamer == null) {
// belum create BarixConnection untuk ipaddress ini
Logger.info { "New Streamer Output connection from ${cmd.ipaddress}" }

View File

@@ -39,7 +39,7 @@ class MainExtension01 {
val validchannels = bz
// check apakah tiap zone ada di database broadcast zones
.filter { z1 ->
db.BroadcastZoneList.find { z2 -> z2.SoundChannel == z1 } != null
db.broadcastDB.List.find { z2 -> z2.SoundChannel == z1 } != null
}
// check apakah tiap zone ada di SoundChannelList dan Online
.filter { z3 ->
@@ -75,7 +75,7 @@ class MainExtension01 {
fun Get_MessageBank_by_id(id: Int, languages: List<String> = urutan_bahasa): ArrayList<Messagebank> {
val mb_list = ArrayList<Messagebank>()
languages.forEach { lang ->
db.MessagebankList.find { mb -> mb.ANN_ID == id.toUInt() && mb.Language == lang && mb.Voice_Type == selected_voice }
db.messageDB.List.find { mb -> mb.ANN_ID == id.toUInt() && mb.Language == lang && mb.Voice_Type == selected_voice }
?.let {
mb_list.add(it)
}
@@ -169,7 +169,7 @@ class MainExtension01 {
return
}
// dapatkan soundbank array berdasarkan VoiceType dan Language
val sb = db.SoundbankList
val sb = db.soundDB.List
.filter { it.VoiceType == mb.Voice_Type }
.filter { it.Language == mb.Language }
if (sb.isEmpty()) {
@@ -479,7 +479,8 @@ class MainExtension01 {
* Read and process Queue_Paging table.
*/
fun Read_Queue_Paging(){
for (qp in db.Read_Queue_Paging()) {
db.queuepagingDB.Get()
for (qp in db.queuepagingDB.List) {
if (qp.BroadcastZones.isNotBlank()) {
val zz = qp.BroadcastZones.split(";")
if (AllBroadcastZonesValid(zz)) {
@@ -496,12 +497,12 @@ class MainExtension01 {
"Broadcast started PAGING with Filename '${qp.Message}' to zones: ${qp.BroadcastZones}"
Logger.info { logmessage }
db.Add_Log("AAS", logmessage)
db.Delete_Queue_Paging_by_index(qp.index)
db.queuepagingDB.DeleteByIndex(qp.index.toInt())
return
} else {
// file tidak valid, delete from queue paging
db.Delete_Queue_Paging_by_index(qp.index)
db.queuepagingDB.DeleteByIndex(qp.index.toInt())
db.Add_Log(
"AAS",
"Cancelled paging message with index ${qp.index} due to invalid audio file"
@@ -552,7 +553,7 @@ class MainExtension01 {
"Broadcast started SHALAT message with generated file '$targetfile' to zones: ${qp.BroadcastZones}"
Logger.info { logmsg }
db.Add_Log("AAS", logmsg)
db.Delete_Queue_Paging_by_index(qp.index)
db.queuepagingDB.DeleteByIndex(qp.index.toInt())
} else {
db.Add_Log(
"AAS",
@@ -565,13 +566,13 @@ class MainExtension01 {
},
{ err ->
db.Delete_Queue_Paging_by_index(qp.index)
db.queuepagingDB.DeleteByIndex(qp.index.toInt())
db.Add_Log("AAS", err)
}
)
} else {
// tidak ada messagebank dengan ann_id ini, delete from queue paging
db.Delete_Queue_Paging_by_index(qp.index)
db.queuepagingDB.DeleteByIndex(qp.index.toInt())
db.Add_Log(
"AAS",
"Cancelled Shalat message with index ${qp.index} due to ANN_ID $ann_id not found in Messagebank"
@@ -580,7 +581,7 @@ class MainExtension01 {
}
} else {
// invalid ann_id, delete from queue paging
db.Delete_Queue_Paging_by_index(qp.index)
db.queuepagingDB.DeleteByIndex(qp.index.toInt())
db.Add_Log(
"AAS",
"Cancelled Shalat message with index ${qp.index} due to invalid ANN_ID"
@@ -590,7 +591,7 @@ class MainExtension01 {
}
} else {
// ada broadcast zone yang tidak valid, delete from queue paging
db.Delete_Queue_Paging_by_index(qp.index)
db.queuepagingDB.DeleteByIndex(qp.index.toInt())
db.Add_Log(
"AAS",
"Cancelled paging message with index ${qp.index} due to invalid broadcast zone"
@@ -598,7 +599,7 @@ class MainExtension01 {
}
} else {
// invalid broadcast zone, delete from queue paging
db.Delete_Queue_Paging_by_index(qp.index)
db.queuepagingDB.DeleteByIndex(qp.index.toInt())
db.Add_Log("AAS", "Cancelled paging message with index ${qp.index} due to empty broadcast zone")
}
}
@@ -609,7 +610,8 @@ class MainExtension01 {
* Read and process Queue_Table table.
*/
fun Read_Queue_Table(){
db.Read_Queue_Table().forEach { qa ->
db.queuetableDB.Get()
db.queuetableDB.List.forEach { qa ->
if (qa.BroadcastZones.isNotEmpty()) {
val zz = qa.BroadcastZones.split(";")
if (AllBroadcastZonesValid(zz)) {
@@ -645,7 +647,7 @@ class MainExtension01 {
"AAS",
"Cancelled SOUNDBANK message with index ${qa.index} due to missing or invalid ANN_ID in SB_TAGS"
)
db.Delete_Queue_Table_by_index(qa.index)
db.queuetableDB.DeleteByIndex(qa.index.toInt())
return@forEach
}
// sampe sini punya ann_id valid
@@ -680,7 +682,7 @@ class MainExtension01 {
"Broadcast started SOUNDBANK message with generated file '$targetfile' to zones: ${qa.BroadcastZones}"
Logger.info { logmsg }
db.Add_Log("AAS", logmsg)
db.Delete_Queue_Table_by_index(qa.index)
db.queuetableDB.DeleteByIndex(qa.index.toInt())
}
}
@@ -690,12 +692,12 @@ class MainExtension01 {
{
err ->
db.Add_Log("AAS", err)
db.Delete_Queue_Table_by_index(qa.index)
db.queuetableDB.DeleteByIndex(qa.index.toInt())
})
}
} else {
// tidak ada messagebank dengan ann_id ini, delete from queue table
db.Delete_Queue_Table_by_index(qa.index)
db.queuetableDB.DeleteByIndex(qa.index.toInt())
db.Add_Log(
"AAS",
"Cancelled SOUNDBANK message with index ${qa.index} due to ANN_ID $ann_id not found in Messagebank"
@@ -735,7 +737,7 @@ class MainExtension01 {
"Broadcast started TIMER message with generated file '$targetfile' to zones: ${qa.BroadcastZones}"
Logger.info { logmsg }
db.Add_Log("AAS", logmsg)
db.Delete_Queue_Table_by_index(qa.index)
db.queuetableDB.DeleteByIndex(qa.index.toInt())
}
}
db.Add_Log("AAS", message)
@@ -744,13 +746,13 @@ class MainExtension01 {
{
err ->
db.Add_Log("AAS", err)
db.Delete_Queue_Table_by_index(qa.index)
db.queuetableDB.DeleteByIndex(qa.index.toInt())
})
}
} else {
// tidak ada messagebank dengan ann_id ini, delete from queue table
db.Delete_Queue_Table_by_index(qa.index)
db.queuetableDB.DeleteByIndex(qa.index.toInt())
db.Add_Log(
"AAS",
"Cancelled TIMER with index ${qa.index} due to ANN_ID $ann_id not found in Messagebank"
@@ -758,7 +760,7 @@ class MainExtension01 {
}
} else {
// invalid ann_id, delete from queue table
db.Delete_Queue_Table_by_index(qa.index)
db.queuetableDB.DeleteByIndex(qa.index.toInt())
db.Add_Log(
"AAS",
"Cancelled TIMER with index ${qa.index} due to invalid ANN_ID"
@@ -769,7 +771,7 @@ class MainExtension01 {
}
} else {
// ada broadcast zone yang tidak valid, delete from queue table
db.Delete_Queue_Table_by_index(qa.index)
db.queuetableDB.DeleteByIndex(qa.index.toInt())
db.Add_Log(
"AAS",
"Cancelled table message with index ${qa.index} due to invalid broadcast zone"
@@ -777,7 +779,7 @@ class MainExtension01 {
}
} else {
// invalid broadcast zone, delete from queue table
db.Delete_Queue_Table_by_index(qa.index)
db.queuetableDB.DeleteByIndex(qa.index.toInt())
db.Add_Log("AAS", "Cancelled table message with index ${qa.index} due to empty broadcast zone")
}
}
@@ -794,7 +796,7 @@ class MainExtension01 {
// detik harus 00
if (localtime.second != 0) return
val timestring = timeformat2.format(localtime)
val sch = db.SchedulebankList.filter {
val sch = db.scheduleDB.List.filter {
it.Time == timestring && it.Enable
}
// tidak ada schedule dengan time sekarang dan enable=true

View File

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

View File

@@ -0,0 +1,3 @@
package database
data class BroadcastZonesHtml(var index: UInt, var description: String, var SoundChannel: String, var Box: String, var Relay: String)

View File

@@ -7,4 +7,17 @@ data class Log(
val timenya: String,
val machine: String,
val description : String
)
){
companion object{
fun NewLog(
machine: String,
description: String
) : Log {
val current = java.time.LocalDateTime.now()
val date = current.toLocalDate().toString() // format YYYY-MM-DD
val time = current.toLocalTime().withNano(0).toString() // format HH:MM:SS
return Log(0u, date, time, machine, description)
}
}
}

File diff suppressed because it is too large Load Diff

View File

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

View File

@@ -1,20 +1,106 @@
package database
import org.apache.poi.xssf.usermodel.XSSFWorkbook
import org.tinylog.Logger
import java.sql.Connection
@Suppress("unused", "SqlDialectInspection", "SqlSourceToSinkFlow")
abstract class dbFunctions<T>(val dbName: String, val connection: Connection) {
var List : ArrayList<T> = ArrayList()
fun Clear(){
/**
* Clear all entries in the table
* @return true if successful, false otherwise
*/
open fun Clear() : Boolean{
try {
val statement = connection.createStatement()
// use TRUNCATE to reset auto increment index
statement?.executeUpdate("TRUNCATE TABLE $dbName")
Logger.info("$dbName table cleared" as Any)
List.clear()
return true
} catch (e: Exception) {
Logger.error("Error clearing $dbName table: ${e.message}" as Any)
}
return false
}
fun DeleteByIndex(index: Int) {
/**
* Delete entry by index
* @param index The index of the entry to delete
* @return true if successful, false otherwise
*/
open fun DeleteByIndex(index: Int) : Boolean{
try {
val statement = connection.prepareStatement("DELETE FROM $dbName WHERE `index` = ?")
statement?.setLong(1, index.toLong())
val rowsAffected = statement?.executeUpdate()
if (rowsAffected != null && rowsAffected > 0) {
Logger.info("Deleted $rowsAffected row(s) from $dbName with index $index" as Any)
return true
} else {
Logger.warn("No rows deleted from $dbName with index $index" as Any)
}
} catch (e: Exception) {
Logger.error("Error deleting from $dbName with index $index: ${e.message}" as Any)
}
return false
}
/**
* Create the table if it does not exist
*/
abstract fun Create()
abstract fun Get(): ArrayList<T>
protected fun Create(tableDefinition: String) {
try {
val statement = connection.createStatement()
statement?.executeUpdate(tableDefinition)
Logger.info("$dbName table ensured to exists" as Any)
} catch (e: Exception) {
Logger.error("Error creating $dbName table: ${e.message}" as Any)
}
}
/**
* Get all entries from the table and populate the List
*/
abstract fun Get()
/**
* Add a new entry to the table
* @param data The data to add
* @return true if successful, false otherwise
*/
abstract fun Add(data: T): Boolean
/**
* Add multiple entries to the table
* @param data The list of data to add
* @return true if successful, false otherwise
*/
abstract fun AddAll(data: ArrayList<T>): Boolean
/**
* Update an existing entry by index
* @param index The index of the entry to update
* @param data The new data
* @return true if successful, false otherwise
*/
abstract fun UpdateByIndex(index: Int, data: T): Boolean
abstract fun Resort(): Boolean
/**
* Import the table from XLSX format
* @param workbook The XSSFWorkbook object to import from
* @return true if successful, false otherwise
*/
abstract fun Import_XLSX(workbook: XSSFWorkbook) : Boolean
/**
* Export the table to XLSX format
* @return XSSFWorkbook object if successful, null otherwise
*/
abstract fun Export_XLSX() : XSSFWorkbook?
}

View File

@@ -16,6 +16,7 @@ import content.Language
import content.ScheduleDay
import content.VoiceType
import database.BroadcastZones
import database.BroadcastZonesHtml
import database.LanguageLink
import database.MariaDB
import database.Messagebank
@@ -129,11 +130,11 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
}
"getPagingQueue" ->{
SendReply(wsMessageContext, cmd.command, objectmapper.writeValueAsString(db.Read_Queue_Paging()))
SendReply(wsMessageContext, cmd.command, objectmapper.writeValueAsString(db.queuepagingDB.List))
}
"getAASQueue" ->{
SendReply(wsMessageContext, cmd.command, objectmapper.writeValueAsString(db.Read_Queue_Table()))
SendReply(wsMessageContext, cmd.command, objectmapper.writeValueAsString(db.queuetableDB.List))
}
"getStreamerOutputs" -> {
@@ -197,7 +198,7 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
}
path("SoundBank") {
get("List") {
it.result(MariaDB.ArrayListtoString(db.SoundbankList))
it.result(MariaDB.ArrayListtoString(db.soundDB.List))
}
get("ListFiles"){
it.result(objectmapper.writeValueAsString(ListAudioFiles("C:\\soundbank")))
@@ -211,13 +212,13 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
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 ->
val exists = db.soundDB.List.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)) {
db.Resort_Soundbank_by_Description()
if (db.soundDB.Add(addvalue)) {
db.soundDB.Resort()
it.result(objectmapper.writeValueAsString(resultMessage("OK")))
} else it.status(500)
.result(objectmapper.writeValueAsString(resultMessage("Failed to add soundbank to database")))
@@ -236,8 +237,8 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
}
delete("List") {
// truncate soundbank table
if (db.Clear_Soundbank()) {
db.Reload_Soundbank()
if (db.soundDB.Clear()) {
db.soundDB.Get()
it.result(objectmapper.writeValueAsString(resultMessage("OK")))
} else {
it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to truncate soundbank table")))
@@ -249,8 +250,8 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
if (index == null) {
it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid index")))
} else {
if (db.Delete_Soundbank_by_index(index)) {
db.Resort_Soundbank_by_Description()
if (db.soundDB.DeleteByIndex(index.toInt())) {
db.soundDB.Resort()
it.result(objectmapper.writeValueAsString(resultMessage("OK")))
} else {
it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to delete soundbank with index $index")))
@@ -264,7 +265,7 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
// tidak ada path param index
it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid index")))
} else {
val sb = db.SoundbankList.find { xx -> xx.index == index }
val sb = db.soundDB.List.find { xx -> xx.index == index }
if (sb == null) {
// soundbank dengan index tersebut tidak ditemukan
it.status(404).result(objectmapper.writeValueAsString(resultMessage("Soundbank with index $index not found")))
@@ -313,8 +314,8 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
}
}
if (changed) {
if (db.Update_Soundbank_by_index(index, sb)) {
db.Resort_Soundbank_by_Description()
if (db.soundDB.UpdateByIndex(index.toInt(), sb)) {
db.soundDB.Resort()
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)
@@ -324,7 +325,7 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
}
}
get("ExportXLSX") {
val xlsxdata = db.Export_Soundbank_XLSX()
val xlsxdata = db.soundDB.Export_XLSX()
if (xlsxdata != null) {
it.header(
"Content-Type",
@@ -346,8 +347,8 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
}
try {
val xlsx = XSSFWorkbook(uploaded.content())
if (db.Import_Soundbank_XLSX(xlsx)) {
db.Resort_Soundbank_by_Description()
if (db.soundDB.Import_XLSX(xlsx)) {
db.soundDB.Resort()
it.result(objectmapper.writeValueAsString(resultMessage("OK")))
} else {
it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to import soundbank from XLSX")))
@@ -360,7 +361,7 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
path("MessageBank") {
get("List") {
// get messagebank list
it.result(MariaDB.ArrayListtoString(db.MessagebankList))
it.result(MariaDB.ArrayListtoString(db.messageDB.List))
}
post("Add"){
val json : JsonNode = objectmapper.readTree(it.body())
@@ -377,8 +378,8 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
if (message_detail.isNotEmpty()){
if (message_tags.isNotEmpty()){
val mb = Messagebank(0u, description, language, ann_id, voice_type, message_detail, message_tags)
if (db.Add_Messagebank(mb)){
db.Resort_Messagebank_by_ANN_ID()
if (db.messageDB.Add(mb)){
db.messageDB.Resort()
it.result(objectmapper.writeValueAsString(resultMessage("OK")))
} else it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to add messagebank to database")))
} else it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Message_TAGS")))
@@ -390,8 +391,8 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
}
delete("List") {
// truncate messagebank table
if (db.Clear_Messagebank()) {
db.Reload_Messagebank()
if (db.messageDB.Clear()) {
db.messageDB.Get()
it.result(objectmapper.writeValueAsString(resultMessage("OK")))
} else {
it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to truncate messagebank table")))
@@ -403,8 +404,8 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
if (index == null) {
it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid index")))
} else {
if (db.Delete_Messagebank_by_index(index)) {
db.Resort_Messagebank_by_ANN_ID()
if (db.messageDB.DeleteByIndex(index.toInt())) {
db.messageDB.Resort()
it.result(objectmapper.writeValueAsString(resultMessage("OK")))
} else {
it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to delete messagebank with index $index")))
@@ -417,7 +418,7 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
if (index == null) {
it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid index")))
} else {
val mb = db.MessagebankList.find { xx -> xx.index == index }
val mb = db.messageDB.List.find { xx -> xx.index == index }
if (mb == null) {
it.status(404).result(objectmapper.writeValueAsString(resultMessage("Messagebank with index $index not found")))
} else {
@@ -463,8 +464,8 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
changed = true
}
if (changed) {
if (db.Update_Messagebank_by_index(index, mb)) {
db.Resort_Messagebank_by_ANN_ID()
if (db.messageDB.UpdateByIndex(index.toInt(), mb)) {
db.messageDB.Resort()
it.result(objectmapper.writeValueAsString(resultMessage("OK")))
} else it.status(500)
.result(objectmapper.writeValueAsString(resultMessage("Failed to update messagebank with index $index")))
@@ -475,7 +476,7 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
}
}
get("ExportXLSX") {
val xlsxdata = db.Export_Messagebank_XLSX()
val xlsxdata = db.messageDB.Export_XLSX()
if (xlsxdata != null) {
it.header(
"Content-Type",
@@ -497,8 +498,8 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
}
try {
val xlsx = XSSFWorkbook(uploaded.content())
if (db.Import_Messagebank_XLSX(xlsx)) {
db.Resort_Messagebank_by_ANN_ID()
if (db.messageDB.Import_XLSX(xlsx)) {
db.messageDB.Resort()
it.result(objectmapper.writeValueAsString(resultMessage("OK")))
} else {
it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to import messagebank from XLSX")))
@@ -511,7 +512,7 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
path("LanguageLink") {
get("List") {
// get language link list
it.result(MariaDB.ArrayListtoString(db.LanguageLinkList))
it.result(MariaDB.ArrayListtoString(db.languageDB.List))
}
post("Add"){
// Parse JSON from request body
@@ -521,10 +522,10 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
println("Add Language Link, tag=$tag, languages=$languages")
if (ValidString(tag)){
if (languages.all { xx -> Language.entries.any { yy -> yy.name.equals(xx,true)} }){
if (!db.LanguageLinkList.any { ll -> ll.TAG.equals(tag,true) }) {
if (!db.languageDB.List.any { ll -> ll.TAG.equals(tag,true) }) {
val newvalue = LanguageLink(0u, tag, languages.joinToString(";"))
if (db.Add_LanguageLink(newvalue)){
db.Resort_LanguageLink_by_TAG()
if (db.languageDB.Add(newvalue)){
db.languageDB.Resort()
it.result(objectmapper.writeValueAsString(resultMessage("OK")))
} else {
it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to add language link to database")))
@@ -545,8 +546,8 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
}
delete("List") {
// truncate language link table
if (db.Clear_LanguageLink()) {
db.Reload_LanguageLink()
if (db.languageDB.Clear()) {
db.languageDB.Resort()
it.result(objectmapper.writeValueAsString(resultMessage("OK")))
} else {
it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to truncate language link table")))
@@ -558,8 +559,8 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
if (index == null) {
it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid index")))
} else {
if (db.Delete_LanguageLink_by_index(index)) {
db.Resort_LanguageLink_by_TAG()
if (db.languageDB.DeleteByIndex(index.toInt())) {
db.languageDB.Resort()
it.result(objectmapper.writeValueAsString(resultMessage("OK")))
} else {
it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to delete language link with index $index")))
@@ -572,7 +573,7 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
if (index == null) {
it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid index")))
} else {
val ll = db.LanguageLinkList.find { xx -> xx.index == index }
val ll = db.languageDB.List.find { xx -> xx.index == index }
if (ll == null) {
it.status(404).result(objectmapper.writeValueAsString(resultMessage("Language link with index $index not found")))
} else {
@@ -592,8 +593,8 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
changed = true
}
if (changed) {
if (db.Update_LanguageLink_by_index(index, ll)) {
db.Resort_LanguageLink_by_TAG()
if (db.languageDB.UpdateByIndex(index.toInt(), ll)) {
db.languageDB.Resort()
it.result(objectmapper.writeValueAsString(resultMessage("OK")))
} else it.status(500)
.result(objectmapper.writeValueAsString(resultMessage("Failed to update language link with index $index")))
@@ -604,7 +605,7 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
}
}
get("ExportXLSX") {
val xlsxdata = db.Export_LanguageLink_XLSX()
val xlsxdata = db.languageDB.Export_XLSX()
if (xlsxdata != null) {
it.header(
"Content-Type",
@@ -626,8 +627,8 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
}
try {
val xlsx = XSSFWorkbook(uploaded.content())
if (db.Import_LanguageLink_XLSX(xlsx)) {
db.Resort_LanguageLink_by_TAG()
if (db.languageDB.Import_XLSX(xlsx)) {
db.languageDB.Resort()
it.result(objectmapper.writeValueAsString(resultMessage("OK")))
} else {
it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to import language link from XLSX")))
@@ -640,12 +641,12 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
path("ScheduleBank") {
get("List") {
// get timer list
it.result(MariaDB.ArrayListtoString(db.SchedulebankList))
it.result(MariaDB.ArrayListtoString(db.scheduleDB.List))
}
delete("List") {
// truncate timer table
if (db.Clear_Schedulebank()) {
db.Reload_Schedulebank()
if (db.scheduleDB.Clear()) {
db.scheduleDB.Get()
it.result(objectmapper.writeValueAsString(resultMessage("OK")))
} else {
it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to truncate schedulebank table")))
@@ -657,8 +658,8 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
if (index == null) {
it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid index")))
} else {
if (db.Delete_Schedulebank_by_index(index)) {
db.Resort_Schedulebank_by_Day_Time()
if (db.scheduleDB.DeleteByIndex(index.toInt())) {
db.scheduleDB.Resort()
it.result(objectmapper.writeValueAsString(resultMessage("OK")))
} else {
it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to delete schedule with index $index")))
@@ -671,7 +672,7 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
if (index == null) {
it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid index")))
} else {
val sb = db.SchedulebankList.find { xx -> xx.index == index }
val sb = db.scheduleDB.List.find { xx -> xx.index == index }
if (sb == null) {
it.status(404).result(objectmapper.writeValueAsString(resultMessage("Schedule with index $index not found")))
} else {
@@ -736,8 +737,8 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
}
}
if (changed) {
if (db.Update_Schedulebank_by_index(index, sb)) {
db.Resort_Schedulebank_by_Day_Time()
if (db.scheduleDB.UpdateByIndex(index.toInt(), sb)) {
db.scheduleDB.Resort()
it.result(objectmapper.writeValueAsString(resultMessage("OK")))
} else it.status(500)
.result(objectmapper.writeValueAsString(resultMessage("Failed to update schedule with index $index")))
@@ -748,7 +749,7 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
}
}
get("ExportXLSX") {
val xlsxdata = db.Export_Schedulebank_XLSX()
val xlsxdata = db.scheduleDB.Export_XLSX()
if (xlsxdata != null) {
it.header(
"Content-Type",
@@ -770,8 +771,8 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
}
try {
val xlsx = XSSFWorkbook(uploaded.content())
if (db.Import_Schedulebank_XLSX(xlsx)) {
db.Resort_Schedulebank_by_Day_Time()
if (db.scheduleDB.Import_XLSX(xlsx)) {
db.scheduleDB.Resort()
it.result(objectmapper.writeValueAsString(resultMessage("OK")))
} else {
it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to import schedulebank from XLSX")))
@@ -788,6 +789,7 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
if (ValiDateForLogHtml(logdate)) {
if (ValidString(logfilter)) {
// ada log filter
db.GetLogForHtml(logdate, logfilter) {
get1.result(MariaDB.ArrayListtoString(it))
}
@@ -828,13 +830,23 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
}
path("BroadcastZones"){
get("List") {
// get broadcast zones list
it.result(MariaDB.ArrayListtoString(db.BroadcastZoneList))
// TODO : temporary, convert BroadcastZones to BroadcastZonesHtml, karena harus revisi javascript di Bootstrap Studio
val newlist: ArrayList<BroadcastZonesHtml> = db.broadcastDB.List.map { xx ->
BroadcastZonesHtml(
xx.index,
xx.description,
xx.SoundChannel,
xx.id,
xx.bp
)
} as ArrayList<BroadcastZonesHtml>
it.result(MariaDB.ArrayListtoString(newlist))
}
delete("List"){
// truncate broadcast zones table
if (db.Clear_BroadcastZones()) {
db.GetBroadcastZones()
if (db.broadcastDB.Clear()) {
db.broadcastDB.Get()
it.result(objectmapper.writeValueAsString(resultMessage("OK")))
} else {
it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to truncate broadcast zones table")))
@@ -851,8 +863,8 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
if (ValidString(_box)){
if (ValidString(_relay)){
val newbp = BroadcastZones(0u,_description,_soundchannel,_box,_relay)
if (db.Add_BroadcastZones(newbp)){
db.Resort_BroadcastZones_by_description()
if (db.broadcastDB.Add(newbp)){
db.broadcastDB.Resort()
it.result(objectmapper.writeValueAsString(resultMessage("OK")))
} else it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to add broadcast zone to database")))
} else it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Relay")))
@@ -866,8 +878,8 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
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()
if (db.broadcastDB.DeleteByIndex(index.toInt())) {
db.broadcastDB.Resort()
it.result(objectmapper.writeValueAsString(resultMessage("OK")))
} else {
it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to delete broadcast zone with index $index")))
@@ -880,7 +892,7 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
if (index == null) {
it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid index")))
} else {
val bz = db.BroadcastZoneList.find { xx -> xx.index == index }
val bz = db.broadcastDB.List.find { xx -> xx.index == index }
if (bz == null) {
it.status(404).result(objectmapper.writeValueAsString(resultMessage("Broadcast zone with index $index not found")))
} else {
@@ -901,17 +913,17 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
bz.SoundChannel = _soundchannel
changed = true
}
if (ValidString(_box) && _box != bz.Box) {
bz.Box = _box
if (ValidString(_box) && _box != bz.id) {
bz.id = _box
changed = true
}
if (ValidString(_relay) && _relay != bz.Relay) {
bz.Relay = _relay
if (ValidString(_relay) && _relay != bz.bp) {
bz.bp = _relay
changed = true
}
if (changed) {
if (db.Update_BroadcastZones_by_index(index, bz)) {
db.Resort_BroadcastZones_by_description()
if (db.broadcastDB.UpdateByIndex(index.toInt(), bz)) {
db.broadcastDB.Resort()
it.result(objectmapper.writeValueAsString(resultMessage("OK")))
} else it.status(500)
.result(objectmapper.writeValueAsString(resultMessage("Failed to update broadcast zone with index $index")))
@@ -923,7 +935,7 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
}
get("ExportXLSX") {
val xlsxdata = db.Export_BroadcastZones_XLSX()
val xlsxdata = db.broadcastDB.Export_XLSX()
if (xlsxdata != null) {
it.header(
"Content-Type",
@@ -945,8 +957,8 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
}
try {
val xlsx = XSSFWorkbook(uploaded.content())
if (db.Import_BroadcastZones_XLSX(xlsx)) {
db.Resort_BroadcastZones_by_description()
if (db.broadcastDB.Import_XLSX(xlsx)) {
db.broadcastDB.Resort()
it.result(objectmapper.writeValueAsString(resultMessage("OK")))
} else {
it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to import broadcast zones from XLSX")))
@@ -959,12 +971,12 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
}
path("SoundChannel"){
get("List"){
it.result(MariaDB.ArrayListtoString(db.SoundChannelList))
it.result(MariaDB.ArrayListtoString(db.soundchannelDB.List))
}
delete("List"){
// truncate sound channel table
if (db.Clear_SoundChannel()) {
db.GetSoundChannel()
if (db.soundchannelDB.Clear()) {
db.soundchannelDB.Get()
it.result(objectmapper.writeValueAsString(resultMessage("OK")))
} else {
it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to truncate sound channel table")))
@@ -976,7 +988,7 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
if (index == null) {
it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid index")))
} else {
val sc = db.SoundChannelList.find { xx -> xx.index == index }
val sc = db.soundchannelDB.List.find { xx -> xx.index == index }
if (sc == null) {
println("Sound channel with index $index not found")
it.status(404).result(objectmapper.writeValueAsString(resultMessage("Sound channel with index $index not found")))
@@ -999,7 +1011,7 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
} else {
// cek apakah ada soundchannel lain yang pakai ip dan channel yang sama
if (db.SoundChannelList.any { xx -> xx.index != index && _ip.equals(xx.ip) && _channel.equals(xx.channel, true) }) {
if (db.soundchannelDB.List.any { xx -> xx.index != index && _ip.equals(xx.ip) && _channel.equals(xx.channel, true) }) {
println("Another sound channel already uses IP $_ip and channel $_channel")
it.status(400).result(objectmapper.writeValueAsString(resultMessage("Another sound channel already uses IP $_ip and channel $_channel")))
return@patch
@@ -1007,9 +1019,9 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
// ada sesuatu yang ganti
val newsc = SoundChannel(0u, _channel, _ip)
if (db.Update_SoundChannel_by_index(index,newsc)){
if (db.soundchannelDB.UpdateByIndex(index.toInt(),newsc)){
println("Updated sound channel with index $index")
db.Resort_SoundChannel_by_index()
db.soundchannelDB.Resort()
it.result(objectmapper.writeValueAsString(resultMessage("OK")))
} else {
println("Failed to update sound channel with index $index")
@@ -1035,7 +1047,7 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
}
get("ExportXLSX"){
val xlsxdata = db.Export_SoundChannel_XLSX()
val xlsxdata = db.soundchannelDB.Export_XLSX()
if (xlsxdata != null) {
it.header(
"Content-Type",
@@ -1057,8 +1069,8 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
}
try {
val xlsx = XSSFWorkbook(uploaded.content())
if (db.Import_SoundChannel_XLSX(xlsx)) {
db.Resort_SoundChannel_by_index()
if (db.soundchannelDB.Import_XLSX(xlsx)) {
db.soundchannelDB.Resort()
it.result(objectmapper.writeValueAsString(resultMessage("OK")))
} else {
it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to import sound channel from XLSX")))