diff --git a/html/webpage/assets/js/broadcastzones.js b/html/webpage/assets/js/broadcastzones.js index adb4a0f..d730642 100644 --- a/html/webpage/assets/js/broadcastzones.js +++ b/html/webpage/assets/js/broadcastzones.js @@ -228,7 +228,7 @@ $(document).ready(function () { let cells = window.selectedBroadcastZoneRow.find('td'); /** @type {BroadcastZone} */ let bz = { - index: cells.eq(0).text(), + index: Number(cells.eq(0).text()), description: cells.eq(1).text(), SoundChannel: cells.eq(2).text(), Box: cells.eq(3).text(), @@ -250,7 +250,7 @@ $(document).ready(function () { let cells = window.selectedBroadcastZoneRow.find('td'); /** @type {BroadcastZone} */ let bz = { - index: cells.eq(0).text(), + index: Number(cells.eq(0).text()), description: cells.eq(1).text(), SoundChannel: cells.eq(2).text(), Box: cells.eq(3).text(), diff --git a/html/webpage/assets/js/languagelink.js b/html/webpage/assets/js/languagelink.js index d48b31c..913f3a6 100644 --- a/html/webpage/assets/js/languagelink.js +++ b/html/webpage/assets/js/languagelink.js @@ -175,7 +175,7 @@ $(document).ready(function () { let cells = window.selectedlanguagerow.find('td'); /** @type {Language} */ let ll = { - index: cells.eq(0).text(), + index: Number(cells.eq(0).text()), tag: cells.eq(1).text(), language: cells.eq(2).text() } @@ -194,7 +194,7 @@ $(document).ready(function () { let cells = window.selectedlanguagerow.find('td'); /** @type {Language} */ let ll = { - index: cells.eq(0).text(), + index: Number(cells.eq(0).text()), tag: cells.eq(1).text(), language: cells.eq(2).text() } diff --git a/html/webpage/assets/js/messagebank.js b/html/webpage/assets/js/messagebank.js index 1acf321..5de0112 100644 --- a/html/webpage/assets/js/messagebank.js +++ b/html/webpage/assets/js/messagebank.js @@ -305,7 +305,7 @@ $(document).ready(function () { let cells = window.selectedmessagerow.find('td'); /** @type {MessageBank} */ let mb = { - index: cells.eq(0).text(), + index: Number(cells.eq(0).text()), description: cells.eq(1).text(), language: cells.eq(2).text(), aNN_ID: parseInt(cells.eq(3).text()), @@ -329,7 +329,7 @@ $(document).ready(function () { let cells = window.selectedmessagerow.find('td'); /** @type {MessageBank} */ let mb = { - index: cells.eq(0).text(), + index: Number(cells.eq(0).text()), description: cells.eq(1).text(), language: cells.eq(2).text(), aNN_ID: parseInt(cells.eq(3).text()), diff --git a/html/webpage/assets/js/schedulebank.js b/html/webpage/assets/js/schedulebank.js index 5975d02..a93d0dd 100644 --- a/html/webpage/assets/js/schedulebank.js +++ b/html/webpage/assets/js/schedulebank.js @@ -252,7 +252,7 @@ $(document).ready(function () { let cells = window.selectedschedulerow.find('td'); /** @type {ScheduleBank} */ let sr = { - index: cells.eq(0).text(), + index: Number(cells.eq(0).text()), description: cells.eq(1).text(), day: cells.eq(2).text(), time: cells.eq(3).text(), @@ -277,7 +277,7 @@ $(document).ready(function () { let cells = window.selectedschedulerow.find('td'); /** @type {ScheduleBank} */ let sr = { - index: cells.eq(0).text(), + index: Number(cells.eq(0).text()), description: cells.eq(1).text(), day: cells.eq(2).text(), time: cells.eq(3).text(), diff --git a/html/webpage/assets/js/soundbank.js b/html/webpage/assets/js/soundbank.js index 081f3e2..c0f07c9 100644 --- a/html/webpage/assets/js/soundbank.js +++ b/html/webpage/assets/js/soundbank.js @@ -98,8 +98,9 @@ function fill_soundbanktablebody(vv) { * @param {String} language * @param {String} category * @param {String} voiceType + * @param {Function} cb callback function when done */ -function reloadSoundbankFiles(language, category, voiceType) { +function reloadSoundbankFiles(language, category, voiceType, cb=null) { window.select2data = []; $('#modalpath').empty().trigger('change'); if (language && language.length > 0) { @@ -117,6 +118,7 @@ function reloadSoundbankFiles(language, category, voiceType) { width: '100%', dropdownParent: $('#soundbankmodal') }); + if (cb) cb(); } }, (errdata) => { alert("Error loading soundbank files : " + errdata.message); @@ -278,6 +280,7 @@ $(document).ready(function () { * @type {SoundBank} */ let nsb = { + index: 0, Description: description, TAG: tag, Category: category, @@ -302,7 +305,7 @@ $(document).ready(function () { let cells = window.selectedsoundrow.find('td'); /** @type {SoundBank} */ let sb = { - index: cells.eq(0).text(), + index: Number(cells.eq(0).text()), description: cells.eq(1).text(), tag: cells.eq(2).text(), category: cells.eq(3).text(), @@ -325,7 +328,7 @@ $(document).ready(function () { let cells = window.selectedsoundrow.find('td'); /** @type {SoundBank} */ let sb = { - index: cells.eq(0).text(), + index: Number(cells.eq(0).text()), Description: cells.eq(1).text(), TAG: cells.eq(2).text(), Category: cells.eq(3).text(), @@ -336,16 +339,24 @@ $(document).ready(function () { if (confirm(`Are you sure to edit soundbank [${sb.index}] Description=${sb.Description} Tag=${sb.TAG}?`)) { $modal.modal('show'); clearSoundbankModal(); + SetupEventForCategoryLanguageVoiceType(); $modalindex.val(sb.index).prop('disabled', true); $modaldescription.val(sb.Description); $modaltag.val(sb.TAG); $modalcategory.val(sb.Category); + selected_category = sb.Category; $modallanguage.val(sb.Language); + selected_language = sb.Language; $modalvoicetype.val(sb.VoiceType); - $('#modalpath').val(sb.Path).trigger('change'); + selected_voicetype = sb.VoiceType; + // load soundbank files for selected language, category, voiceType + reloadSoundbankFiles(selected_language, selected_category, selected_voicetype, () => { + // set selected path + $('#modalpath').val(getFilenameFromPath(sb.Path)).trigger('change'); + }); - SetupEventForCategoryLanguageVoiceType(); + // event on Click save button $modal.off('click.soundbanksave').on('click.soundbanksave', '#soundbanksave', function () { let description = $modaldescription.val().trim(); @@ -388,7 +399,7 @@ $(document).ready(function () { sb.Language = language; sb.VoiceType = voiceType; sb.Path = path; - fetchAPI(APIURL + "UpdateByIndex/" + sb.index, "PUT", {}, sb, (okdata) => { + fetchAPI(APIURL + "UpdateByIndex/" + sb.index, "PATCH", {}, sb, (okdata) => { reloadSoundBank(APIURL); alert("Success update soundbank : " + okdata.message); }, (errdata) => { diff --git a/html/webpage/broadcastzones.html b/html/webpage/broadcastzones.html index 55ecd0c..5a033f7 100644 --- a/html/webpage/broadcastzones.html +++ b/html/webpage/broadcastzones.html @@ -7,7 +7,6 @@ AAS_NewGen_08OKT25 - @@ -287,7 +286,6 @@ - \ No newline at end of file diff --git a/html/webpage/language.html b/html/webpage/language.html index 9688879..c0e37d9 100644 --- a/html/webpage/language.html +++ b/html/webpage/language.html @@ -7,7 +7,6 @@ AAS_NewGen_08OKT25 - @@ -92,7 +91,6 @@ - \ No newline at end of file diff --git a/html/webpage/log.html b/html/webpage/log.html index 799ba16..d942a70 100644 --- a/html/webpage/log.html +++ b/html/webpage/log.html @@ -7,7 +7,6 @@ AAS_NewGen_08OKT25 - @@ -54,7 +53,6 @@ - \ No newline at end of file diff --git a/html/webpage/login.html b/html/webpage/login.html index dffff4d..ba46872 100644 --- a/html/webpage/login.html +++ b/html/webpage/login.html @@ -7,7 +7,6 @@ AAS NewGeneration 17092025 - @@ -40,7 +39,6 @@ - \ No newline at end of file diff --git a/html/webpage/messagebank.html b/html/webpage/messagebank.html index d0115c4..e724853 100644 --- a/html/webpage/messagebank.html +++ b/html/webpage/messagebank.html @@ -7,7 +7,6 @@ AAS_NewGen_08OKT25 - @@ -134,7 +133,6 @@ - \ No newline at end of file diff --git a/html/webpage/overview.html b/html/webpage/overview.html index 796c828..ff8c347 100644 --- a/html/webpage/overview.html +++ b/html/webpage/overview.html @@ -7,7 +7,6 @@ AAS_NewGen_08OKT25 - @@ -1325,7 +1324,6 @@ - \ No newline at end of file diff --git a/html/webpage/setting.html b/html/webpage/setting.html index 3b0b628..e17dcd0 100644 --- a/html/webpage/setting.html +++ b/html/webpage/setting.html @@ -7,7 +7,6 @@ AAS_NewGen_08OKT25 - @@ -20,7 +19,6 @@ - \ No newline at end of file diff --git a/html/webpage/soundbank.html b/html/webpage/soundbank.html index 237b587..6db7233 100644 --- a/html/webpage/soundbank.html +++ b/html/webpage/soundbank.html @@ -7,7 +7,6 @@ AAS_NewGen_08OKT25 - @@ -113,7 +112,6 @@ - \ No newline at end of file diff --git a/html/webpage/streamerstatus.html b/html/webpage/streamerstatus.html index 7cdce03..b251933 100644 --- a/html/webpage/streamerstatus.html +++ b/html/webpage/streamerstatus.html @@ -7,7 +7,6 @@ AAS_NewGen_08OKT25 - @@ -32,7 +31,6 @@ - \ No newline at end of file diff --git a/html/webpage/timer.html b/html/webpage/timer.html index a94e861..458b974 100644 --- a/html/webpage/timer.html +++ b/html/webpage/timer.html @@ -7,7 +7,6 @@ AAS_NewGen_08OKT25 - @@ -178,7 +177,6 @@ - \ No newline at end of file diff --git a/html/webpage/usermanagement.html b/html/webpage/usermanagement.html index e98649f..2599c2a 100644 --- a/html/webpage/usermanagement.html +++ b/html/webpage/usermanagement.html @@ -7,7 +7,6 @@ AAS_NewGen_08OKT25 - @@ -200,7 +199,6 @@ - diff --git a/src/Main.kt b/src/Main.kt index 3c2b126..8707c7c 100644 --- a/src/Main.kt +++ b/src/Main.kt @@ -31,7 +31,7 @@ lateinit var audioPlayer: AudioPlayer val StreamerOutputs: MutableMap = HashMap() lateinit var udpreceiver: UDPReceiver lateinit var tcpreceiver: TCPReceiver -const val version = "0.0.5 (09/10/2025)" +const val version = "0.0.6 (14/10/2025)" // AAS 64 channels const val max_channel = 64 diff --git a/src/barix/BarixConnection.kt b/src/barix/BarixConnection.kt index 25c1082..3a7c20e 100644 --- a/src/barix/BarixConnection.kt +++ b/src/barix/BarixConnection.kt @@ -20,7 +20,6 @@ class BarixConnection(val index: UInt, var channel: String, val ipaddress: Strin private var _sd: Int = 0 private var _vu: Int = 0 private var _onlinecounter = 0 - private val udp = DatagramSocket(0) private val inet = InetSocketAddress(ipaddress, port) private val maxUDPsize = 1000 private var _tcp: Socket? = null @@ -105,26 +104,26 @@ class BarixConnection(val index: UInt, var channel: String, val ipaddress: Strin fun SendData(data: ByteArray, cbOK: Consumer, cbFail: Consumer) { if (data.isNotEmpty()) { CoroutineScope(Dispatchers.IO).launch { - - val bb = ByteBuffer.wrap(data) - while(bb.hasRemaining()){ - try { - val chunk = ByteArray(if (bb.remaining() > maxUDPsize) maxUDPsize else bb.remaining()) - bb.get(chunk) - //println("Buffer remain: $bufferRemain, sending chunk size: ${chunk.size}") - while(bufferRemain + val bb = ByteBuffer.wrap(data) + while(bb.hasRemaining()){ + try { + val chunk = ByteArray(if (bb.remaining() > maxUDPsize) maxUDPsize else bb.remaining()) + bb.get(chunk) + //println("Buffer remain: $bufferRemain, sending chunk size: ${chunk.size}") + while(bufferRemain0){ - val bb = ByteArray(din.available()) - din.read(bb) - // B4A format, 4 bytes di depan adalah size - val str = String(bb, 4, bb.size - 4) - if (ValidString(str)) { - // Valid command from Barix is in format $"STATUSBARIX;VU;BuffRemain;StatusData"$ - pattern.find(str)?.let { matchResult -> - val (vu, buffremain, statusdata) = matchResult.destructured - val status = BarixStatus( - socket.inetAddress.hostAddress, - vu.toInt(), - buffremain.toInt(), - statusdata.toIntOrNull() ?: 0 - ) - //Logger.info { "Received valid command from $key : $status" } - cb.accept(status) - } ?: run { - Logger.warn { "Invalid command format from $key : $str" } - } + val din = DataInputStream(socket.getInputStream()) + while (isActive) { + val length = ByteArray(4) + din.readFully(length) + val readlength = ByteBuffer.wrap(length).getInt() + //println("Read Length : $readlength") + val bb = ByteArray(readlength) + din.readFully(bb) + // B4A format, 4 bytes di depan adalah size + val str = String(bb) + //println("Received from $key : $str") + if (ValidString(str)) { + // Valid command from Barix is in format $"STATUSBARIX;VU;BuffRemain;StatusData"$ + pattern.find(str)?.let { matchResult -> + val (vu, buffremain, statusdata) = matchResult.destructured + val status = BarixStatus( + socket.inetAddress.hostAddress, + vu.toInt(), + buffremain.toInt(), + statusdata.toIntOrNull() ?: 0 + ) + //Logger.info { "Received valid command from $key : $status" } + cb.accept(status) + } ?: run { + Logger.warn { "Invalid command format from $key : $str" } } } + } } catch (ex:Exception){ Logger.error { "Error in communication with Streamer Output with IP $key, Message : ${ex.message}" } diff --git a/src/codes/Somecodes.kt b/src/codes/Somecodes.kt index 595a02d..a62121c 100644 --- a/src/codes/Somecodes.kt +++ b/src/codes/Somecodes.kt @@ -62,6 +62,14 @@ class Somecodes { return Soundbank_directory.resolve(language.name).resolve(voice.name).resolve(category.name) } + fun SoundbankDirectory(language: String, voice: String, category: String) : Path{ + return SoundbankDirectory( + Language.valueOf(language), + VoiceType.valueOf(voice), + Category.valueOf(category) + ) + } + fun ExtractFilesFromClassPath(resourcePath: String, outputDir: Path) { try { val resource = Somecodes::class.java.getResource(resourcePath) diff --git a/src/database/MariaDB.kt b/src/database/MariaDB.kt index bbf8125..a064c3f 100644 --- a/src/database/MariaDB.kt +++ b/src/database/MariaDB.kt @@ -104,7 +104,7 @@ class MariaDB( List.clear() try { val statement = connection.createStatement() - val resultSet = statement?.executeQuery("SELECT * FROM ${super.dbName}") + val resultSet = statement?.executeQuery("SELECT * FROM ${super.dbName} ORDER BY Category, Language, VoiceType, TAG") while (resultSet?.next() == true) { val soundbank = Soundbank( resultSet.getLong("index").toUInt(), @@ -225,7 +225,7 @@ class MariaDB( // use a temporary table to reorder the 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 (Description, TAG, Category, Language, VoiceType, Path) SELECT Description, TAG, Category, Language, VoiceType, Path FROM ${super.dbName} ORDER BY Description ") + statement?.executeUpdate("INSERT INTO $tempdb_name (Description, TAG, Category, Language, VoiceType, Path) SELECT Description, TAG, Category, Language, VoiceType, Path FROM ${super.dbName} ORDER BY Category, Language, VoiceType, TAG ") 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 $tempdb_name") statement?.executeUpdate("DROP TABLE $tempdb_name") @@ -1250,9 +1250,9 @@ class MariaDB( // use a temporary table to reorder the 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("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 $tempdb_name") + 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 diff --git a/src/database/Soundbank.kt b/src/database/Soundbank.kt index 00c18b7..8f38c9f 100644 --- a/src/database/Soundbank.kt +++ b/src/database/Soundbank.kt @@ -1,5 +1,7 @@ package database +import content.Category + data class Soundbank( var index: UInt, var Description: String, @@ -8,4 +10,45 @@ data class Soundbank( var Language: String, var VoiceType: String, var Path: String, - ) + ){ + + /** + * Check if all fields are not empty + */ + fun isNotEmpty(): Boolean{ + if (Description.isNotEmpty()){ + if (TAG.isNotEmpty()){ + if (Category.isNotEmpty()){ + if (Language.isNotEmpty()){ + if (VoiceType.isNotEmpty()){ + if (Path.isNotEmpty()){ + return true + } + } + } + } + } + } + return false + } + + /** + * Check if Category is valid + */ + fun ValidCategory() : Boolean{ + return content.Category.entries.any{ it.name == this.Category} + } + + /** + * Check if VoiceType is valid + */ + fun ValidVoiceType() : Boolean{ + return content.VoiceType.entries.any{ it.name == this.VoiceType} + } + /** + * Check if Language is valid + */ + fun ValidLanguage() : Boolean{ + return content.Language.entries.any{ it.name == this.Language} + } +} diff --git a/src/web/WebApp.kt b/src/web/WebApp.kt index 98c538e..adeea79 100644 --- a/src/web/WebApp.kt +++ b/src/web/WebApp.kt @@ -254,33 +254,28 @@ class WebApp(val listenPort: Int, val userlist: List>) { post("Add") { try { val addvalue = objectmapper.readValue(it.body(), Soundbank::class.java) - if (ValidString(addvalue.Description)) { - if (ValidString(addvalue.TAG)) { - if (ValidString(addvalue.Category)) { - if (ValidString(addvalue.Language)) { - if (ValidString(addvalue.Path)) { - // check apakah TAG sudah ada untuk language dan category yang sama - val exists = db.soundDB.List.any { sb -> - sb.TAG == addvalue.TAG && sb.Language == addvalue.Language && sb.Category == addvalue.Category - } - if (!exists) { - if (ValidFile(addvalue.Path)) { - 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"))) - } else it.status(400) - .result(objectmapper.writeValueAsString(resultMessage("Invalid Path, file does not exist"))) - } else it.status(400) - .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(objectmapper.writeValueAsString(resultMessage("Invalid request body"))) + if (addvalue.isNotEmpty()){ + // check apakah TAG sudah ada untuk language, category dan voicetype yang sama + val exists = db.soundDB.List.any { sb -> + sb.TAG == addvalue.TAG && sb.Language == addvalue.Language && sb.Category == addvalue.Category && sb.VoiceType == addvalue.VoiceType + } + if (!exists) { + val absolutepath = Somecodes.SoundbankDirectory(Language.valueOf(addvalue.Language), VoiceType.valueOf(addvalue.VoiceType), Category.valueOf(addvalue.Category)).resolve(addvalue.Path) + if (Files.isRegularFile(absolutepath)) { + addvalue.Path = absolutepath.toAbsolutePath().toString() + 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"))) + } else it.status(400) + .result(objectmapper.writeValueAsString(resultMessage("Invalid Path, file does not exist"))) + } else it.status(400) + .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("Some fields are empty"))) + + } catch (e: Exception) { + it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid request body, Message: ${e.message}"))) } } delete("List") { @@ -309,68 +304,78 @@ class WebApp(val listenPort: Int, val userlist: List>) { patch("UpdateByIndex/{index}") { // update by index val index = it.pathParam("index").toUIntOrNull() - if (index == null) { - // tidak ada path param index - it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid index"))) - } else { + if (index!=null){ 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"))) - } else { - // soundbank dengan index tersebut ditemukan, sekarang update - val json: JsonNode = objectmapper.readTree(it.body()) - if (json.isEmpty) { - 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("") - val _category = json.get("Category").asText("") - val _language = json.get("Language").asText("") - val _path = json.get("Path").asText("") - var changed = false - if (ValidString(_description) && _description != sb.Description) { - sb.Description = _description - changed = true - } - if (ValidString(_tag) && _tag != sb.TAG) { - sb.TAG = _tag - changed = true - } - if (ValidString(_category) && _category != sb.Category) { - if (Category.entries.any { cat -> - cat.name == _category - }) { - sb.Category = _category - changed = true + if (sb!=null){ + try{ + //println("index=$index, body=${it.body()}") + val newsb = objectmapper.readValue(it.body(), Soundbank::class.java) + //println("newsb=$newsb") + if (newsb.isNotEmpty()){ + var varchanged = false + if (newsb.Description != sb.Description) { + sb.Description = newsb.Description + varchanged = true + } + if (newsb.TAG != sb.TAG) { + sb.TAG = newsb.TAG + varchanged = true + } + if (newsb.ValidCategory()) { + if (newsb.Category != sb.Category){ + sb.Category = newsb.Category + varchanged = true + } } else { it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Category"))) return@patch } - } - if (ValidString(_language) && _language != sb.Language) { - sb.Language = _language - changed = true - } - if (ValidString(_path) && _path != sb.Path) { - if (ValidFile(_path)) { - sb.Path = _path - changed = true + if (newsb.ValidLanguage()) { + if (newsb.Language != sb.Language){ + sb.Language = newsb.Language + varchanged = true + } } else { - it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Path, file does not exist"))) + it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Language"))) return@patch } - } - if (changed) { - 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) - .result(objectmapper.writeValueAsString(resultMessage("Nothing has changed for soundbank with index $index"))) + if (newsb.ValidVoiceType()) { + if (newsb.VoiceType != sb.VoiceType){ + sb.VoiceType = newsb.VoiceType + varchanged = true + } + } else { + it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid VoiceType"))) + return@patch + } + + val newpath = Somecodes.SoundbankDirectory(newsb.Language, newsb.VoiceType, newsb.Category).resolve(newsb.Path) + if (Files.isRegularFile(newpath)){ + if (newpath.toAbsolutePath().toString() != sb.Path) { + sb.Path = newpath.toAbsolutePath().toString() + varchanged = true + } + } else { + it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid path"))) + return@patch + } + + if (varchanged) { + //println("Some fields changed for index=$index, updating...") + 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) + .result(objectmapper.writeValueAsString(resultMessage("Nothing has changed for soundbank with index $index"))) + } else Exception("Some fields are empty") + } catch(e: Exception){ + it.status(400).result(objectmapper.writeValueAsString(resultMessage("Unable to parse request body to Soundbank, Message: ${e.message}"))) } - } - } + + } else it.status(404).result(objectmapper.writeValueAsString(resultMessage("Soundbank with index $index not found"))) + } else it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid index"))) + } get("ExportXLSX") { val xlsxdata = db.soundDB.Export_XLSX()