Merge branch 'master' of https://gitea.rdkartono.my.id/rdkartono/AAS_NewGeneration into feature-webapp
# Conflicts: # src/web/WebApp.kt
This commit is contained in:
16
src/Main.kt
16
src/Main.kt
@@ -7,6 +7,7 @@ import barix.TCP_Barix_Command_Server
|
||||
import codes.Somecodes
|
||||
import com.sun.jna.Platform
|
||||
import commandServer.TCP_Android_Command_Server
|
||||
import content.Category
|
||||
import content.Language
|
||||
import content.VoiceType
|
||||
import database.Log
|
||||
@@ -21,6 +22,7 @@ import org.tinylog.provider.ProviderRegistry
|
||||
import oshi.util.GlobalConfig
|
||||
import web.WebApp
|
||||
import java.nio.file.Files
|
||||
import java.nio.file.Paths
|
||||
import kotlin.concurrent.fixedRateTimer
|
||||
import kotlin.io.path.absolutePathString
|
||||
|
||||
@@ -29,7 +31,7 @@ lateinit var audioPlayer: AudioPlayer
|
||||
val StreamerOutputs: MutableMap<String, BarixConnection> = HashMap()
|
||||
lateinit var udpreceiver: UDPReceiver
|
||||
lateinit var tcpreceiver: TCPReceiver
|
||||
const val version = "0.0.2 (23/09/2025)"
|
||||
const val version = "0.0.5 (09/10/2025)"
|
||||
// AAS 64 channels
|
||||
const val max_channel = 64
|
||||
|
||||
@@ -52,11 +54,17 @@ val contentCache = ContentCache()
|
||||
* Create necessary folders if not exist
|
||||
*/
|
||||
fun folder_preparation(){
|
||||
// sementara diset begini, nanti pake config file
|
||||
Somecodes.Soundbank_directory = Paths.get("c:\\soundbank")
|
||||
Files.createDirectories(Somecodes.SoundbankResult_directory)
|
||||
Files.createDirectories(Somecodes.PagingResult_directory)
|
||||
Files.createDirectories(Somecodes.Soundbank_directory)
|
||||
Somecodes.Soundbank_Languages_directory.forEach {
|
||||
Files.createDirectories(it)
|
||||
Language.entries.forEach { language ->
|
||||
VoiceType.entries.forEach { voice ->
|
||||
Category.entries.forEach { category ->
|
||||
Files.createDirectories(Somecodes.SoundbankDirectory(language, voice, category) )
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -176,7 +184,7 @@ fun main() {
|
||||
|
||||
StreamerOutputs[cmd.ipaddress] = _bc
|
||||
Logger.info { "Created new Streamer Output for channel ${_sc.channel} with IP ${cmd.ipaddress}" }
|
||||
} else Logger.warn { "soundChannelDB doesn't have soundchannel with IP ${cmd.ipaddress}" }
|
||||
}
|
||||
|
||||
} else {
|
||||
// sudah ada, update data
|
||||
|
||||
@@ -2,8 +2,10 @@ package codes
|
||||
|
||||
import com.fasterxml.jackson.databind.JsonNode
|
||||
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
|
||||
import content.Category
|
||||
import content.Language
|
||||
import content.ScheduleDay
|
||||
import content.VoiceType
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.delay
|
||||
@@ -25,15 +27,8 @@ import kotlin.io.path.name
|
||||
class Somecodes {
|
||||
companion object {
|
||||
val current_directory : String = System.getProperty("user.dir")
|
||||
val Soundbank_directory : Path = Path.of(current_directory,"Soundbank")
|
||||
val Soundbank_Languages_directory : List<Path> = listOf(
|
||||
Soundbank_directory.resolve(Language.INDONESIA.name),
|
||||
Soundbank_directory.resolve(Language.LOCAL.name),
|
||||
Soundbank_directory.resolve(Language.ENGLISH.name),
|
||||
Soundbank_directory.resolve(Language.CHINESE.name),
|
||||
Soundbank_directory.resolve(Language.JAPANESE.name),
|
||||
Soundbank_directory.resolve(Language.ARABIC.name)
|
||||
)
|
||||
var Soundbank_directory : Path = Path.of(current_directory,"Soundbank")
|
||||
|
||||
val SoundbankResult_directory : Path = Path.of(current_directory,"SoundbankResult")
|
||||
val PagingResult_directory : Path = Path.of(current_directory,"PagingResult")
|
||||
|
||||
@@ -56,6 +51,17 @@ class Somecodes {
|
||||
// regex for getting ann_id from Message, which is the number inside []
|
||||
private val ann_id_regex = Regex("\\[(\\d+)]")
|
||||
|
||||
/**
|
||||
* Get the directory path for a specific language, voice type, and category.
|
||||
* @param language The language.
|
||||
* @param voice The voice type.
|
||||
* @param category The category.
|
||||
* @return The path to the directory.
|
||||
*/
|
||||
fun SoundbankDirectory(language: Language, voice: VoiceType, category: Category) : Path{
|
||||
return Soundbank_directory.resolve(language.name).resolve(voice.name).resolve(category.name)
|
||||
}
|
||||
|
||||
fun ExtractFilesFromClassPath(resourcePath: String, outputDir: Path) {
|
||||
try {
|
||||
val resource = Somecodes::class.java.getResource(resourcePath)
|
||||
@@ -157,14 +163,13 @@ class Somecodes {
|
||||
/**
|
||||
* List all audio files (.mp3 and .wav) in the specified directory and its subdirectories.
|
||||
* Only files larger than 1KB are included.
|
||||
* @param dir The directory to search in (default is the current working directory).
|
||||
* @param p The directory Path to search in
|
||||
* @return A list of absolute paths to the audio files found.
|
||||
*/
|
||||
fun ListAudioFiles(dir: String = current_directory) : List<String>{
|
||||
fun ListAudioFiles(p: Path) : List<String>{
|
||||
return try{
|
||||
// find all files that ends with .mp3 or .wav
|
||||
// and find them recursively
|
||||
val p = Path.of(dir)
|
||||
if (Files.exists(p) && Files.isDirectory(p)){
|
||||
Files.walk(p)
|
||||
// cari file regular saja
|
||||
@@ -286,6 +291,23 @@ class Somecodes {
|
||||
return value is String && value.isNotBlank()
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if all strings in a list are valid non-blank strings.
|
||||
* @param values The list of strings to check.
|
||||
* @return True if all strings in the list are valid non-blank strings, false otherwise.
|
||||
*/
|
||||
fun ValidStrings(values: List<String>) : Boolean{
|
||||
if (values.isNotEmpty()){
|
||||
for (v in values){
|
||||
if (!ValidString(v)){
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a string is a valid file path and the file exists.
|
||||
* @param value The string to check.
|
||||
|
||||
@@ -12,7 +12,6 @@ import org.tinylog.Logger
|
||||
import java.sql.Connection
|
||||
import java.sql.DriverManager
|
||||
import java.util.function.Consumer
|
||||
import kotlin.math.max
|
||||
|
||||
/**
|
||||
* A class to manage a connection to a MariaDB database.
|
||||
@@ -221,13 +220,15 @@ class MariaDB(
|
||||
override fun Resort(): Boolean {
|
||||
try {
|
||||
val statement = connection.createStatement()
|
||||
val tempdb_name = "temp_${super.dbName}"
|
||||
|
||||
// use a temporary table to reorder the index
|
||||
statement?.executeUpdate("CREATE TABLE IF NOT EXISTS temp_${super.dbName} LIKE ${super.dbName}")
|
||||
statement?.executeUpdate("INSERT INTO temp_${super.dbName} (Description, TAG, Category, Language, VoiceType, Path) SELECT Description, TAG, Category, Language, VoiceType, Path FROM ${super.dbName} ORDER BY Description ")
|
||||
statement?.executeUpdate("CREATE TABLE IF NOT EXISTS $tempdb_name LIKE ${super.dbName}")
|
||||
statement?.executeUpdate("TRUNCATE TABLE $tempdb_name")
|
||||
statement?.executeUpdate("INSERT INTO $tempdb_name (Description, TAG, Category, Language, VoiceType, Path) SELECT Description, TAG, Category, Language, VoiceType, Path FROM ${super.dbName} ORDER BY Description ")
|
||||
statement?.executeUpdate("TRUNCATE TABLE ${super.dbName}")
|
||||
statement?.executeUpdate("INSERT INTO ${super.dbName} (Description, TAG, Category, Language, VoiceType, Path) SELECT Description, TAG, Category, Language, VoiceType, Path FROM temp_${super.dbName}")
|
||||
statement?.executeUpdate("DROP TABLE temp_${super.dbName}")
|
||||
statement?.executeUpdate("INSERT INTO ${super.dbName} (Description, TAG, Category, Language, VoiceType, Path) SELECT Description, TAG, Category, Language, VoiceType, Path FROM $tempdb_name")
|
||||
statement?.executeUpdate("DROP TABLE $tempdb_name")
|
||||
Logger.info("${super.dbName} table resorted by Description" as Any)
|
||||
// reload the local list
|
||||
Get()
|
||||
@@ -421,12 +422,14 @@ class MariaDB(
|
||||
override fun Resort(): Boolean {
|
||||
try {
|
||||
val statement = connection.createStatement()
|
||||
val tempdb_name = "temp_${super.dbName}"
|
||||
// use a temporary table to reorder the index
|
||||
statement?.executeUpdate("CREATE TABLE IF NOT EXISTS temp_${super.dbName} LIKE ${super.dbName}")
|
||||
statement?.executeUpdate("INSERT INTO temp_${super.dbName} (Description, Language, ANN_ID, Voice_Type, Message_Detail, Message_TAGS) SELECT Description, Language, ANN_ID, Voice_Type, Message_Detail, Message_TAGS FROM ${super.dbName} ORDER BY ANN_ID ")
|
||||
statement?.executeUpdate("CREATE TABLE IF NOT EXISTS $tempdb_name LIKE ${super.dbName}")
|
||||
statement?.executeUpdate("TRUNCATE TABLE $tempdb_name")
|
||||
statement?.executeUpdate("INSERT INTO $tempdb_name (Description, Language, ANN_ID, Voice_Type, Message_Detail, Message_TAGS) SELECT Description, Language, ANN_ID, Voice_Type, Message_Detail, Message_TAGS FROM ${super.dbName} ORDER BY ANN_ID ")
|
||||
statement?.executeUpdate("TRUNCATE TABLE ${super.dbName}")
|
||||
statement?.executeUpdate("INSERT INTO ${super.dbName} (Description, Language, ANN_ID, Voice_Type, Message_Detail, Message_TAGS) SELECT Description, Language, ANN_ID, Voice_Type, Message_Detail, Message_TAGS FROM temp_${super.dbName}")
|
||||
statement?.executeUpdate("DROP TABLE temp_${super.dbName}")
|
||||
statement?.executeUpdate("INSERT INTO ${super.dbName} (Description, Language, ANN_ID, Voice_Type, Message_Detail, Message_TAGS) SELECT Description, Language, ANN_ID, Voice_Type, Message_Detail, Message_TAGS FROM $tempdb_name")
|
||||
statement?.executeUpdate("DROP TABLE $tempdb_name")
|
||||
Logger.info("${super.dbName} table resorted by Description" as Any)
|
||||
// reload the local list
|
||||
Get()
|
||||
@@ -616,12 +619,14 @@ class MariaDB(
|
||||
override fun Resort(): Boolean {
|
||||
try {
|
||||
val statement = connection.createStatement()
|
||||
val tempdb_name = "temp_${super.dbName}"
|
||||
// use a temporary table to reorder the index
|
||||
statement?.executeUpdate("CREATE TABLE IF NOT EXISTS temp_${super.dbName} LIKE ${super.dbName}")
|
||||
statement?.executeUpdate("INSERT INTO temp_${super.dbName} (TAG, Language) SELECT TAG, Language FROM ${super.dbName} ORDER BY TAG")
|
||||
statement?.executeUpdate("CREATE TABLE IF NOT EXISTS $tempdb_name LIKE ${super.dbName}")
|
||||
statement?.executeUpdate("TRUNCATE TABLE $tempdb_name")
|
||||
statement?.executeUpdate("INSERT INTO $tempdb_name (TAG, Language) SELECT TAG, Language FROM ${super.dbName} ORDER BY TAG")
|
||||
statement?.executeUpdate("TRUNCATE TABLE ${super.dbName}")
|
||||
statement?.executeUpdate("INSERT INTO ${super.dbName} (TAG, Language) SELECT TAG, Language FROM temp_${super.dbName}")
|
||||
statement?.executeUpdate("DROP TABLE temp_${super.dbName}")
|
||||
statement?.executeUpdate("INSERT INTO ${super.dbName} (TAG, Language) SELECT TAG, Language FROM $tempdb_name")
|
||||
statement?.executeUpdate("DROP TABLE $tempdb_name")
|
||||
Logger.info("${super.dbName} table resorted by TAG" as Any)
|
||||
// reload the local list
|
||||
Get()
|
||||
@@ -834,12 +839,14 @@ class MariaDB(
|
||||
override fun Resort(): Boolean {
|
||||
try {
|
||||
val statement = connection.createStatement()
|
||||
val tempdb_name = "temp_${super.dbName}"
|
||||
// use a temporary table to reorder the index
|
||||
statement?.executeUpdate("CREATE TABLE IF NOT EXISTS temp_${super.dbName} LIKE ${super.dbName}")
|
||||
statement?.executeUpdate("INSERT INTO temp_${super.dbName} (Description, Day, Time, Soundpath, Repeat, Enable, BroadcastZones, Language) SELECT Description, Day, Time, Soundpath, Repeat, Enable, BroadcastZones, Language FROM ${super.dbName} ORDER BY Day , Time ")
|
||||
statement?.executeUpdate("CREATE TABLE IF NOT EXISTS $tempdb_name LIKE ${super.dbName}")
|
||||
statement?.executeUpdate("TRUNCATE TABLE $tempdb_name")
|
||||
statement?.executeUpdate("INSERT INTO $tempdb_name (Description, Day, Time, Soundpath, Repeat, Enable, BroadcastZones, Language) SELECT Description, Day, Time, Soundpath, Repeat, Enable, BroadcastZones, Language FROM ${super.dbName} ORDER BY Day , Time ")
|
||||
statement?.executeUpdate("TRUNCATE TABLE ${super.dbName}")
|
||||
statement?.executeUpdate("INSERT INTO ${super.dbName} (Description, Day, Time, Soundpath, Repeat, Enable, BroadcastZones, Language) SELECT Description, Day, Time, Soundpath, Repeat, Enable, BroadcastZones, Language FROM temp_${super.dbName}")
|
||||
statement?.executeUpdate("DROP TABLE temp_${super.dbName}")
|
||||
statement?.executeUpdate("INSERT INTO ${super.dbName} (Description, Day, Time, Soundpath, Repeat, Enable, BroadcastZones, Language) SELECT Description, Day, Time, Soundpath, Repeat, Enable, BroadcastZones, Language FROM $tempdb_name")
|
||||
statement?.executeUpdate("DROP TABLE $tempdb_name")
|
||||
Logger.info("${super.dbName} table resorted by Day and Time" as Any)
|
||||
// reload the local list
|
||||
Get()
|
||||
@@ -988,7 +995,7 @@ class MariaDB(
|
||||
override fun Add(data: BroadcastZones): Boolean {
|
||||
try {
|
||||
val statement =
|
||||
connection.prepareStatement("INSERT INTO ${super.dbName} (description, SoundChannel, Box, Relay) VALUES (?, ?, ?, ?)")
|
||||
connection.prepareStatement("INSERT INTO ${super.dbName} (description, SoundChannel, id, bp) VALUES (?, ?, ?, ?)")
|
||||
statement?.setString(1, data.description)
|
||||
statement?.setString(2, data.SoundChannel)
|
||||
statement?.setString(3, data.id)
|
||||
@@ -1010,7 +1017,7 @@ class MariaDB(
|
||||
try {
|
||||
connection.autoCommit = false
|
||||
val sql =
|
||||
"INSERT INTO ${super.dbName} (description, SoundChannel, Box, Relay) VALUES (?, ?, ?, ?)"
|
||||
"INSERT INTO ${super.dbName} (description, SoundChannel, id, bp) VALUES (?, ?, ?, ?)"
|
||||
val statement = connection.prepareStatement(sql)
|
||||
for (bz in data) {
|
||||
statement.setString(1, bz.description)
|
||||
@@ -1033,7 +1040,7 @@ class MariaDB(
|
||||
override fun UpdateByIndex(index: Int, data: BroadcastZones): Boolean {
|
||||
try {
|
||||
val statement =
|
||||
connection.prepareStatement("UPDATE ${super.dbName} SET description = ?, SoundChannel = ?, Box = ?, Relay = ? WHERE `index` = ?")
|
||||
connection.prepareStatement("UPDATE ${super.dbName} SET description = ?, SoundChannel = ?, id = ?, bp = ? WHERE `index` = ?")
|
||||
statement?.setString(1, data.description)
|
||||
statement?.setString(2, data.SoundChannel)
|
||||
statement?.setString(3, data.id)
|
||||
@@ -1055,12 +1062,14 @@ class MariaDB(
|
||||
override fun Resort(): Boolean {
|
||||
try {
|
||||
val statement = connection.createStatement()
|
||||
val tempdb_name = "temp_${super.dbName}"
|
||||
// use a temporary table to reorder the index
|
||||
statement?.executeUpdate("CREATE TABLE IF NOT EXISTS temp_${super.dbName} LIKE ${super.dbName}")
|
||||
statement?.executeUpdate("INSERT INTO temp_${super.dbName} (description, SoundChannel, Box, Relay) SELECT description, SoundChannel, Box, Relay FROM ${super.dbName} ORDER BY description ")
|
||||
statement?.executeUpdate("CREATE TABLE IF NOT EXISTS $tempdb_name LIKE ${super.dbName}")
|
||||
statement?.executeUpdate("TRUNCATE TABLE $tempdb_name")
|
||||
statement?.executeUpdate("INSERT INTO $tempdb_name (description, SoundChannel, id, bp) SELECT description, SoundChannel, id, bp FROM ${super.dbName} ORDER BY description ")
|
||||
statement?.executeUpdate("TRUNCATE TABLE ${super.dbName}")
|
||||
statement?.executeUpdate("INSERT INTO ${super.dbName} (description, SoundChannel, Box, Relay) SELECT description, SoundChannel, Box, Relay FROM temp_${super.dbName}")
|
||||
statement?.executeUpdate("DROP TABLE temp_${super.dbName}")
|
||||
statement?.executeUpdate("INSERT INTO ${super.dbName} (description, SoundChannel, id, bp) SELECT description, SoundChannel, id, bp FROM $tempdb_name")
|
||||
statement?.executeUpdate("DROP TABLE $tempdb_name")
|
||||
Logger.info("${super.dbName} table resorted by description" as Any)
|
||||
// reload the local list
|
||||
Get()
|
||||
@@ -1076,7 +1085,7 @@ class MariaDB(
|
||||
val sheet = workbook.getSheet("BroadcastZones")
|
||||
?: throw Exception("No sheet named 'BroadcastZones' found")
|
||||
val headerRow = sheet.getRow(0) ?: throw Exception("No header row found")
|
||||
val headers = arrayOf("Index", "description", "SoundChannel", "Box", "Relay")
|
||||
val headers = arrayOf("Index", "description", "SoundChannel", "id", "bp")
|
||||
for ((colIndex, header) in headers.withIndex()) {
|
||||
val cell = headerRow.getCell(colIndex) ?: throw Exception("Header '$header' not found")
|
||||
if (cell.stringCellValue != header) throw Exception("Header '$header' not found")
|
||||
@@ -1089,9 +1098,9 @@ class MariaDB(
|
||||
val row = sheet.getRow(rowIndex) ?: continue
|
||||
val description = row.getCell(1)?.stringCellValue ?: continue
|
||||
val soundChannel = row.getCell(2)?.stringCellValue ?: continue
|
||||
val box = row.getCell(3)?.stringCellValue ?: continue
|
||||
val relay = row.getCell(4)?.stringCellValue ?: continue
|
||||
val broadcastZone = BroadcastZones(0u, description, soundChannel, box, relay)
|
||||
val id = row.getCell(3)?.stringCellValue ?: continue
|
||||
val bp = row.getCell(4)?.stringCellValue ?: continue
|
||||
val broadcastZone = BroadcastZones(0u, description, soundChannel, id, bp)
|
||||
_broadcastZonesList.add(broadcastZone)
|
||||
}
|
||||
return AddAll(_broadcastZonesList)
|
||||
@@ -1108,7 +1117,7 @@ class MariaDB(
|
||||
val workbook = XSSFWorkbook()
|
||||
val sheet = workbook.createSheet("BroadcastZones")
|
||||
val headerRow = sheet.createRow(0)
|
||||
val headers = arrayOf("Index", "description", "SoundChannel", "Box", "Relay")
|
||||
val headers = arrayOf("Index", "description", "SoundChannel", "id", "bp")
|
||||
for ((colIndex, header) in headers.withIndex()) {
|
||||
val cell = headerRow.createCell(colIndex)
|
||||
cell.setCellValue(header)
|
||||
@@ -1119,8 +1128,8 @@ class MariaDB(
|
||||
row.createCell(0).setCellValue(resultSet.getString("index"))
|
||||
row.createCell(1).setCellValue(resultSet.getString("description"))
|
||||
row.createCell(2).setCellValue(resultSet.getString("SoundChannel"))
|
||||
row.createCell(3).setCellValue(resultSet.getString("Box"))
|
||||
row.createCell(4).setCellValue(resultSet.getString("Relay"))
|
||||
row.createCell(3).setCellValue(resultSet.getString("id"))
|
||||
row.createCell(4).setCellValue(resultSet.getString("bp"))
|
||||
}
|
||||
for (i in headers.indices) {
|
||||
sheet.autoSizeColumn(i)
|
||||
@@ -1237,12 +1246,14 @@ class MariaDB(
|
||||
override fun Resort(): Boolean {
|
||||
try {
|
||||
val statement = connection.createStatement()
|
||||
val tempdb_name = "temp_${super.dbName}"
|
||||
// use a temporary table to reorder the index
|
||||
statement?.executeUpdate("CREATE TABLE IF NOT EXISTS temp_${super.dbName} LIKE ${super.dbName}")
|
||||
statement?.executeUpdate("INSERT INTO temp_${super.dbName} (Date_Time, Source, Type, Message, SB_TAGS, BroadcastZones, Repeat, Language) SELECT Date_Time, Source, Type, Message, SB_TAGS, BroadcastZones, Repeat, Language FROM ${super.dbName} ORDER BY `index` ")
|
||||
statement?.executeUpdate("CREATE TABLE IF NOT EXISTS $tempdb_name LIKE ${super.dbName}")
|
||||
statement?.executeUpdate("TRUNCATE TABLE $tempdb_name")
|
||||
statement?.executeUpdate("INSERT INTO $tempdb_name (Date_Time, Source, Type, Message, SB_TAGS, BroadcastZones, Repeat, Language) SELECT Date_Time, Source, Type, Message, SB_TAGS, BroadcastZones, Repeat, Language FROM ${super.dbName} ORDER BY `index` ")
|
||||
statement?.executeUpdate("TRUNCATE TABLE ${super.dbName}")
|
||||
statement?.executeUpdate("INSERT INTO ${super.dbName} (Date_Time, Source, Type, Message, SB_TAGS, BroadcastZones, Repeat, Language) SELECT Date_Time, Source, Type, Message, SB_TAGS, BroadcastZones, Repeat, Language FROM temp_${super.dbName}")
|
||||
statement?.executeUpdate("DROP TABLE temp_${super.dbName}")
|
||||
statement?.executeUpdate("INSERT INTO ${super.dbName} (Date_Time, Source, Type, Message, SB_TAGS, BroadcastZones, Repeat, Language) SELECT Date_Time, Source, Type, Message, SB_TAGS, BroadcastZones, Repeat, Language FROM $tempdb_name")
|
||||
statement?.executeUpdate("DROP TABLE $tempdb_name")
|
||||
Logger.info("${super.dbName} table resorted by index" as Any)
|
||||
// reload the local list
|
||||
Get()
|
||||
@@ -1396,12 +1407,14 @@ class MariaDB(
|
||||
override fun Resort(): Boolean {
|
||||
try {
|
||||
val statement = connection.createStatement()
|
||||
val tempdb_name = "temp_${super.dbName}"
|
||||
// use a temporary table to reorder the index
|
||||
statement?.executeUpdate("CREATE TABLE IF NOT EXISTS temp_${super.dbName} LIKE ${super.dbName}")
|
||||
statement?.executeUpdate("INSERT INTO temp_${super.dbName} (Date_Time, Source, Type, Message, SB_TAGS) SELECT Date_Time, Source, Type, Message, SB_TAGS FROM ${super.dbName} ORDER BY `index` ")
|
||||
statement?.executeUpdate("CREATE TABLE IF NOT EXISTS $tempdb_name LIKE ${super.dbName}")
|
||||
statement?.executeUpdate("TRUNCATE TABLE $tempdb_name")
|
||||
statement?.executeUpdate("INSERT INTO $tempdb_name (Date_Time, Source, Type, Message, SB_TAGS) SELECT Date_Time, Source, Type, Message, SB_TAGS FROM ${super.dbName} ORDER BY `index` ")
|
||||
statement?.executeUpdate("TRUNCATE TABLE ${super.dbName}")
|
||||
statement?.executeUpdate("INSERT INTO ${super.dbName} (Date_Time, Source, Type, Message, SB_TAGS) SELECT Date_Time, Source, Type, Message, SB_TAGS FROM temp_${super.dbName}")
|
||||
statement?.executeUpdate("DROP TABLE temp_${super.dbName}")
|
||||
statement?.executeUpdate("INSERT INTO ${super.dbName} (Date_Time, Source, Type, Message, SB_TAGS) SELECT Date_Time, Source, Type, Message, SB_TAGS FROM $tempdb_name")
|
||||
statement?.executeUpdate("DROP TABLE $tempdb_name")
|
||||
Logger.info("${super.dbName} table resorted by index" as Any)
|
||||
// reload the local list
|
||||
Get()
|
||||
@@ -1557,12 +1570,14 @@ class MariaDB(
|
||||
override fun Resort(): Boolean {
|
||||
try {
|
||||
val statement = connection.createStatement()
|
||||
val tempdb_name = "temp_${super.dbName}"
|
||||
// use a temporary table to reorder the index
|
||||
statement?.executeUpdate("CREATE TABLE IF NOT EXISTS temp_${super.dbName} LIKE ${super.dbName}")
|
||||
statement?.executeUpdate("INSERT INTO temp_${super.dbName} (channel, ip) SELECT channel, ip FROM ${super.dbName} ORDER BY `index` ")
|
||||
statement?.executeUpdate("CREATE TABLE IF NOT EXISTS $tempdb_name LIKE ${super.dbName}")
|
||||
statement?.executeUpdate("TRUNCATE TABLE $tempdb_name")
|
||||
statement?.executeUpdate("INSERT INTO $tempdb_name (channel, ip) SELECT channel, ip FROM ${super.dbName} ORDER BY `index` ")
|
||||
statement?.executeUpdate("TRUNCATE TABLE ${super.dbName}")
|
||||
statement?.executeUpdate("INSERT INTO ${super.dbName} (channel, ip) SELECT channel, ip FROM temp_${super.dbName}")
|
||||
statement?.executeUpdate("DROP TABLE temp_${super.dbName}")
|
||||
statement?.executeUpdate("INSERT INTO ${super.dbName} (channel, ip) SELECT channel, ip FROM $tempdb_name")
|
||||
statement?.executeUpdate("DROP TABLE $tempdb_name")
|
||||
Logger.info("${super.dbName} table resorted by index" as Any)
|
||||
// reload the local list
|
||||
Get()
|
||||
@@ -1770,19 +1785,21 @@ class MariaDB(
|
||||
override fun Resort(): Boolean {
|
||||
try {
|
||||
val statement = connection.createStatement()
|
||||
val tempdb_name = "temp_${super.dbName}"
|
||||
// use a temporary table to reorder the index
|
||||
statement?.executeUpdate("CREATE TABLE IF NOT EXISTS temp_${super.dbName} LIKE ${super.dbName}")
|
||||
statement?.executeUpdate("CREATE TABLE IF NOT EXISTS $tempdb_name LIKE ${super.dbName}")
|
||||
statement?.executeUpdate("TRUNCATE TABLE $tempdb_name")
|
||||
statement?.executeUpdate(
|
||||
"INSERT INTO temp_${super.dbName} (datenya, timenya, machine, description) " +
|
||||
"INSERT INTO $tempdb_name (datenya, timenya, machine, description) " +
|
||||
"SELECT datenya, timenya, machine, description FROM ${super.dbName} " +
|
||||
"ORDER BY datenya , timenya , machine "
|
||||
)
|
||||
statement?.executeUpdate("TRUNCATE TABLE ${super.dbName}")
|
||||
statement?.executeUpdate(
|
||||
"INSERT INTO ${super.dbName} (datenya, timenya, machine, description) " +
|
||||
"SELECT datenya, timenya, machine, description FROM temp_${super.dbName}"
|
||||
"SELECT datenya, timenya, machine, description FROM $tempdb_name"
|
||||
)
|
||||
statement?.executeUpdate("DROP TABLE temp_${super.dbName}")
|
||||
statement?.executeUpdate("DROP TABLE $tempdb_name")
|
||||
Logger.info("${super.dbName} table resorted by datenya, timenya, machine" as Any)
|
||||
// reload the local list
|
||||
Get()
|
||||
@@ -1947,12 +1964,14 @@ class MariaDB(
|
||||
override fun Resort(): Boolean {
|
||||
try {
|
||||
val statement = connection.createStatement()
|
||||
val tempdb_name = "temp_${super.dbName}"
|
||||
// use a temporary table to reorder the index
|
||||
statement?.executeUpdate("CREATE TABLE IF NOT EXISTS temp_${super.dbName} LIKE ${super.dbName}")
|
||||
statement?.executeUpdate("INSERT INTO temp_${super.dbName} (username, password, location, soundbank_tags, messagebank_ann_id, broadcastzones) SELECT username, password, location, soundbank_tags, messagebank_ann_id, broadcastzones FROM ${super.dbName} ORDER BY username ")
|
||||
statement?.executeUpdate("CREATE TABLE IF NOT EXISTS $tempdb_name LIKE ${super.dbName}")
|
||||
statement?.executeUpdate("TRUNCATE TABLE $tempdb_name")
|
||||
statement?.executeUpdate("INSERT INTO $tempdb_name (username, password, location, airline_tags, city_tags, messagebank_ann_id, broadcastzones) SELECT username, password, location, airline_tags, city_tags, messagebank_ann_id, broadcastzones FROM ${super.dbName} ORDER BY username ")
|
||||
statement?.executeUpdate("TRUNCATE TABLE ${super.dbName}")
|
||||
statement?.executeUpdate("INSERT INTO ${super.dbName} (username, password, location, soundbank_tags, messagebank_ann_id, broadcastzones) SELECT username, password, location, soundbank_tags, messagebank_ann_id, broadcastzones FROM temp_${super.dbName}")
|
||||
statement?.executeUpdate("DROP TABLE temp_${super.dbName}")
|
||||
statement?.executeUpdate("INSERT INTO ${super.dbName} (username, password, location, airline_tags, city_tags, messagebank_ann_id, broadcastzones) SELECT username, password, location, airline_tags, city_tags, messagebank_ann_id, broadcastzones FROM $tempdb_name")
|
||||
statement?.executeUpdate("DROP TABLE $tempdb_name")
|
||||
Logger.info("${super.dbName} table resorted by index" as Any)
|
||||
// reload the local list
|
||||
Get()
|
||||
@@ -2254,24 +2273,21 @@ class MariaDB(
|
||||
* @return a list of Soundbank with Category City and matching tag
|
||||
*/
|
||||
fun Find_Soundbank_City(tag: String) : List<Soundbank>{
|
||||
val lowerTag = tag.lowercase()
|
||||
return soundDB.List
|
||||
.filter{ it.Category== Category.City.name }
|
||||
.filter { it.TAG.lowercase()==lowerTag}
|
||||
.filter { it.TAG.equals(tag,true)}
|
||||
}
|
||||
|
||||
fun Find_Soundbank_AirplaneName(tag: String) : List<Soundbank>{
|
||||
val lowerTag = tag.lowercase()
|
||||
return soundDB.List
|
||||
.filter{ it.Category== Category.Airplane_Name.name }
|
||||
.filter { it.TAG.lowercase()==lowerTag}
|
||||
.filter { it.TAG.equals(tag,true)}
|
||||
}
|
||||
|
||||
fun Find_Soundbank_Places(tag: String) : List<Soundbank>{
|
||||
val lowerTag = tag.lowercase()
|
||||
return soundDB.List
|
||||
.filter{ it.Category== Category.Places.name }
|
||||
.filter { it.TAG.lowercase()==lowerTag}
|
||||
.filter { it.TAG.equals(tag,true)}
|
||||
}
|
||||
|
||||
fun Find_Soundbank_Shalat(tag: String) : List<Soundbank>{
|
||||
@@ -2282,25 +2298,85 @@ class MariaDB(
|
||||
}
|
||||
|
||||
fun Find_Soundbank_Sequence(tag: String) : List<Soundbank>{
|
||||
val lowerTag = tag.lowercase()
|
||||
|
||||
return soundDB.List
|
||||
.filter{ it.Category== Category.Sequence.name }
|
||||
.filter { it.TAG.lowercase()==lowerTag}
|
||||
.filter { it.TAG.equals(tag,true)}
|
||||
}
|
||||
|
||||
fun Find_Soundbank_Reason(tag: String) : List<Soundbank>{
|
||||
val lowerTag = tag.lowercase()
|
||||
return soundDB.List
|
||||
.filter{ it.Category== Category.Reason.name }
|
||||
.filter { it.TAG.lowercase()==lowerTag}
|
||||
.filter { it.TAG.equals(tag,true)}
|
||||
}
|
||||
|
||||
fun Find_Soundbank_Procedure(tag: String) : List<Soundbank> {
|
||||
val lowerTag = tag.lowercase()
|
||||
return soundDB.List
|
||||
.filter { it.Category == Category.Procedure.name }
|
||||
.filter { it.TAG.lowercase() == lowerTag }
|
||||
.filter { it.TAG.equals(tag,true) }
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all distinct airline code tags from soundbank
|
||||
* @return a list of distinct airline code tags sorted alphabetically
|
||||
*/
|
||||
fun Get_AirlineCode_Tags(): List<String> {
|
||||
return soundDB.List
|
||||
.filter { it.Category == Category.Airline_Code.name }
|
||||
.map { it.TAG }
|
||||
.distinct()
|
||||
.sorted()
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all distinct city tags from soundbank
|
||||
* @return a list of distinct city tags sorted alphabetically
|
||||
*/
|
||||
fun Get_City_Tags(): List<String> {
|
||||
return soundDB.List
|
||||
.filter { it.Category == Category.City.name }
|
||||
.map { it.TAG }
|
||||
.distinct()
|
||||
.sorted()
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all distinct message ID from messagebank
|
||||
* @return a list of distinct ANN_ID sorted numerically
|
||||
*/
|
||||
fun Get_MessageID_List(): List<UInt> {
|
||||
return messageDB.List
|
||||
.distinctBy { it.ANN_ID }
|
||||
.map { it.ANN_ID }
|
||||
.sorted()
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all distinct broadcast zone descriptions from broadcastDB
|
||||
* @return a list of distinct broadcast zone descriptions sorted alphabetically
|
||||
*/
|
||||
fun Get_BroadcastZone_List(): List<String> {
|
||||
return broadcastDB.List
|
||||
.distinctBy { it.description }
|
||||
.map { it.description }
|
||||
.sorted()
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all distinct sound channel from soundchannelDB
|
||||
* @return a list of distinct sound channel sorted alphabetically
|
||||
*/
|
||||
fun Get_SoundChannel_List(): List<String> {
|
||||
return soundchannelDB.List
|
||||
.distinctBy { it.channel }
|
||||
.map { it.channel }
|
||||
.sorted()
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a username already exists in the userDB (case-insensitive)
|
||||
*/
|
||||
fun Username_exists(username: String): Boolean {
|
||||
return userDB.List.any { it.username.equals(username, ignoreCase = true) }
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -5,6 +5,22 @@ data class UserDB(var index: UInt, var username: String, var password: String, v
|
||||
override fun toString(): String {
|
||||
return "UserDB(index=$index, username='$username', location='$location', airline_tags='$airline_tags', city_tags='$city_tags', messagebank_ann_id='$messagebank_ann_id', broadcastzones='$broadcastzones')"
|
||||
}
|
||||
|
||||
/**
|
||||
* Compares this UserDB object with another UserDB object for equality.
|
||||
* Two UserDB objects are considered equal if all their properties are equal, except for the index property.
|
||||
*/
|
||||
fun isEqual(other: UserDB?): Boolean {
|
||||
if (other == null) return false
|
||||
return this.username == other.username &&
|
||||
this.password == other.password &&
|
||||
this.location == other.location &&
|
||||
this.airline_tags == other.airline_tags &&
|
||||
this.city_tags == other.city_tags &&
|
||||
this.messagebank_ann_id == other.messagebank_ann_id &&
|
||||
this.broadcastzones == other.broadcastzones
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
4
src/web/KeyValueMessage.kt
Normal file
4
src/web/KeyValueMessage.kt
Normal file
@@ -0,0 +1,4 @@
|
||||
package web
|
||||
|
||||
class KeyValueMessage(val key: String, val value: String) {
|
||||
}
|
||||
@@ -15,7 +15,12 @@ import content.Category
|
||||
import content.Language
|
||||
import content.ScheduleDay
|
||||
import content.VoiceType
|
||||
import database.*
|
||||
import database.BroadcastZones
|
||||
import database.LanguageLink
|
||||
import database.MariaDB
|
||||
import database.Messagebank
|
||||
import database.SoundChannel
|
||||
import database.Soundbank
|
||||
import db
|
||||
import io.javalin.Javalin
|
||||
import io.javalin.apibuilder.ApiBuilder.before
|
||||
@@ -639,7 +644,6 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
|
||||
// get timer list
|
||||
it.result(MariaDB.ArrayListtoString(db.scheduleDB.List))
|
||||
}
|
||||
|
||||
delete("List") {
|
||||
// truncate timer table
|
||||
if (db.scheduleDB.Clear()) {
|
||||
@@ -651,38 +655,6 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
|
||||
}
|
||||
post("Add"){
|
||||
// TODO add new schedule
|
||||
// recheck lagi tambahan steph
|
||||
val json: JsonNode = objectmapper.readTree(it.body())
|
||||
val description = json.get("Description")?.asText("") ?: ""
|
||||
val day = json.get("Day")?.asText("") ?: ""
|
||||
val time = json.get("Time")?.asText("") ?: ""
|
||||
val soundpath = json.get("Soundpath")?.asText("") ?: ""
|
||||
val repeat = json.get("Repeat")?.asInt()?.toUByte() ?: 0u
|
||||
val enable = json.get("Enable")?.asBoolean() ?: false
|
||||
val broadcast_zones = json.get("BroadcastZones")?.asText("") ?: ""
|
||||
val language = json.get("Language")?.asText("") ?: ""
|
||||
if (ValidString(description)){
|
||||
if (ValidString(day) && ValidScheduleDay(day)){
|
||||
if (ValidString(time) && ValidScheduleTime(time)){
|
||||
if (ValidString(soundpath) && ValidFile(soundpath)){
|
||||
if (repeat in 0u..127u){
|
||||
if (ValidString(broadcast_zones)){
|
||||
val zones = broadcast_zones.split(";")
|
||||
if (zones.all { zz -> db.broadcastDB.List.any { xx -> xx.description.equals(zz,true) } }){
|
||||
if (ValidString(language) && Language.entries.any{ lang -> lang.name == language }){
|
||||
val newvalue = ScheduleBank(0u, description, day, time, soundpath, repeat, enable, broadcast_zones, language)
|
||||
if (db.scheduleDB.Add(newvalue)){
|
||||
db.scheduleDB.Resort()
|
||||
it.result(objectmapper.writeValueAsString(resultMessage("OK")))
|
||||
} else it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to add schedule to database")))
|
||||
} else it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Language")))
|
||||
} else it.status(400).result(objectmapper.writeValueAsString(resultMessage("Contains unsupported BroadcastZones")))
|
||||
} else it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid BroadcastZones")))
|
||||
} else it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Repeat, must be between 0-127")))
|
||||
} else it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Soundpath")))
|
||||
} else it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Time format, must be HH:mm")))
|
||||
} else it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Day format")))
|
||||
} else it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Description")))
|
||||
}
|
||||
delete("DeleteByIndex/{index}") {
|
||||
// delete by index
|
||||
@@ -813,17 +785,6 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
|
||||
it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid XLSX file")))
|
||||
}
|
||||
}
|
||||
|
||||
//TODO kirim list message dan broadcast zones untuk ADD/Edit schedule
|
||||
get("GetMessageAndBroadcastZones") {
|
||||
val result = object {
|
||||
//TODO filter message without input variable
|
||||
val messages = db.messageDB.List
|
||||
|
||||
val broadcastzones = db.broadcastDB.List
|
||||
}
|
||||
it.result(objectmapper.writeValueAsString(result))
|
||||
}
|
||||
}
|
||||
path("Log") {
|
||||
get("List") { get1 ->
|
||||
@@ -1123,68 +1084,6 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Steph : coba tambah untuk QueuePaging Table. Belum ada di JS file(?)
|
||||
path("QueuePaging"){
|
||||
get("List"){
|
||||
it.result(MariaDB.ArrayListtoString(db.queuepagingDB.List))
|
||||
}
|
||||
delete("List"){
|
||||
// truncate queue paging table
|
||||
if (db.queuepagingDB.Clear()) {
|
||||
db.queuepagingDB.Get()
|
||||
it.result(objectmapper.writeValueAsString(resultMessage("OK")))
|
||||
} else {
|
||||
it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to truncate queue paging table")))
|
||||
}
|
||||
}
|
||||
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.queuepagingDB.DeleteByIndex(index.toInt())) {
|
||||
db.queuepagingDB.Resort()
|
||||
it.result(objectmapper.writeValueAsString(resultMessage("OK")))
|
||||
} else {
|
||||
it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to delete queue paging with index $index")))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Steph : coba tambah untuk QueueTable Table. Belum ada di JS file(?)
|
||||
path("QueueTable"){
|
||||
get("List"){
|
||||
it.result(MariaDB.ArrayListtoString(db.queuetableDB.List))
|
||||
}
|
||||
delete("List"){
|
||||
// truncate queue table
|
||||
if (db.queuetableDB.Clear()) {
|
||||
db.queuetableDB.Get()
|
||||
it.result(objectmapper.writeValueAsString(resultMessage("OK")))
|
||||
} else {
|
||||
it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to truncate queue sound table")))
|
||||
}
|
||||
}
|
||||
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.queuetableDB.DeleteByIndex(index.toInt())) {
|
||||
db.queuetableDB.Resort()
|
||||
it.result(objectmapper.writeValueAsString(resultMessage("OK")))
|
||||
} else {
|
||||
it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to delete queue sound with index $index")))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}.start(listenPort)
|
||||
|
||||
Reference in New Issue
Block a user