commit 10/09/2025

This commit is contained in:
2025-09-10 16:08:24 +07:00
parent f48ead1b44
commit 34fc71cfbc
4 changed files with 159 additions and 148 deletions

View File

@@ -323,8 +323,6 @@ let ws = null;
function sendCommand(command, data) { function sendCommand(command, data) {
if (ws.readyState === WebSocket.OPEN) { if (ws.readyState === WebSocket.OPEN) {
ws.send(JSON.stringify({ command, data })); ws.send(JSON.stringify({ command, data }));
} else {
console.error('WebSocket is not open');
} }
} }
@@ -561,13 +559,19 @@ function DoClear(APIURL, whattoclear, cbOK, cbError) {
* Export mechanism to XLSX file * Export mechanism to XLSX file
* @param {String} APIURL API URL endpoint * @param {String} APIURL API URL endpoint
* @param {String} filename target filename * @param {String} filename target filename
* @param {Object} queryParams additional query parameters as object
*/ */
function DoExport(APIURL, filename) { function DoExport(APIURL, filename, queryParams = {}) {
// send GET request to APIURL + "ExportXLSX" // send GET request to APIURL + "ExportXLSX"
// reply Content-Type is application/vnd.openxmlformats-officedocument.spreadsheetml.sheet // reply Content-Type is application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
// reply Content-Disposition: attachment; filename=filename // reply Content-Disposition: attachment; filename=filename
// Use fetch to download the XLSX file as a blob and trigger download // Use fetch to download the XLSX file as a blob and trigger download
fetch("/api/" + APIURL + "ExportXLSX", { let url = "/api/" + APIURL + "ExportXLSX";
if (queryParams && Object.keys(queryParams).length > 0) {
url += "?" + new URLSearchParams(queryParams).toString();
}
fetch(url, {
method: "GET", method: "GET",
headers: {} headers: {}
}) })
@@ -809,7 +813,7 @@ $(document).ready(function () {
} }
}); });
$btnExport.click(() => { $btnExport.click(() => {
DoExport(APIURL, "soundbank.xlsx"); DoExport(APIURL, "soundbank.xlsx",{});
}); });
$btnImport.click(() => { $btnImport.click(() => {
DoImport(APIURL, (okdata) => { DoImport(APIURL, (okdata) => {
@@ -917,7 +921,7 @@ $(document).ready(function () {
} }
}); });
$btnExport.click(() => { $btnExport.click(() => {
DoExport(APIURL, "messagebank.xlsx"); DoExport(APIURL, "messagebank.xlsx",{});
}); });
$btnImport.click(() => { $btnImport.click(() => {
DoImport(APIURL, (okdata) => { DoImport(APIURL, (okdata) => {
@@ -952,6 +956,7 @@ $(document).ready(function () {
reloadLanguageBank(APIURL); reloadLanguageBank(APIURL);
$btnClear.click(() => { $btnClear.click(() => {
DoClear(APIURL, "LanguageLink", (okdata) => { DoClear(APIURL, "LanguageLink", (okdata) => {
@@ -968,16 +973,24 @@ $(document).ready(function () {
// show modal with id 'languagemodal' // show modal with id 'languagemodal'
let $modal = $('#languagemodal'); let $modal = $('#languagemodal');
$modal.modal('show'); $modal.modal('show');
let $langtag = $modal.find('#languagelinktag');
let $cbInd = $modal.find('#langId');
let $cbLocal = $modal.find('#langLocal');
let $cbEn = $modal.find('#langEn');
let $cbArb = $modal.find('#langArb');
let $cbJap = $modal.find('#langJap');
let $cbChi = $modal.find('#langChi');
// save button click event // save button click event
$modal.off('click.languagelinksave').on('click.languagelinksave', '#languagelinksave', function () { $modal.off('click.languagelinksave').on('click.languagelinksave', '#languagelinksave', function () {
const tag = $('#languagelinktag').val(); const tag = $langtag.val();
const langs = []; const langs = [];
if ($('#langID').is(':checked')) langs.push('INDONESIA'); if ($cbInd.is(':checked')) langs.push('INDONESIA');
if ($('#langLocal').is(':checked')) langs.push('LOCAL'); if ($cbLocal.is(':checked')) langs.push('LOCAL');
if ($('#langEN').is(':checked')) langs.push('ENGLISH'); if ($cbEn.is(':checked')) langs.push('ENGLISH');
if ($('#langARB').is(':checked')) langs.push('ARABIC'); if ($cbArb.is(':checked')) langs.push('ARABIC');
if ($('#langJAP').is(':checked')) langs.push('JAPANESE'); if ($cbJap.is(':checked')) langs.push('JAPANESE');
if ($('#langCHI').is(':checked')) langs.push('CHINESE'); if ($cbChi.is(':checked')) langs.push('CHINESE');
if (tag.length === 0) { if (tag.length === 0) {
alert("Tag cannot be empty"); alert("Tag cannot be empty");
@@ -1040,26 +1053,34 @@ $(document).ready(function () {
} }
if (confirm(`Are you sure to edit language [${ll.index}] Tag=${ll.tag} Language=${ll.language}?`)) { if (confirm(`Are you sure to edit language [${ll.index}] Tag=${ll.tag} Language=${ll.language}?`)) {
let $modal = $('#languagemodal'); let $modal = $('#languagemodal');
$modal.find('#languagelinkindex').val(ll.index); let $cbInd = $modal.find('#langId');
$modal.find('#languagelinktag').val(ll.tag); let $cbLocal = $modal.find('#langLocal');
let langs = ll.language.split(';'); let $cbEn = $modal.find('#langEn');
$modal.find('#langID').prop('checked', langs.includes('INDONESIA')); let $cbArb = $modal.find('#langArb');
$modal.find('#langLocal').prop('checked', langs.includes('LOCAL')); let $cbJap = $modal.find('#langJap');
$modal.find('#langEN').prop('checked', langs.includes('ENGLISH')); let $cbChi = $modal.find('#langChi');
$modal.find('#langARB').prop('checked', langs.includes('ARABIC')); let $langtag = $modal.find('#languagelinktag');
$modal.find('#langJAP').prop('checked', langs.includes('JAPANESE')); let $langid = $modal.find('#languagelinkindex');
$modal.find('#langCHI').prop('checked', langs.includes('CHINESE')); $langid.val(ll.index);
$langtag.val(ll.tag);
let langs = ll.language.toUpperCase().split(';');
$cbInd.prop('checked', langs.includes('INDONESIA'));
$cbLocal.prop('checked', langs.includes('LOCAL'));
$cbEn.prop('checked', langs.includes('ENGLISH'));
$cbArb.prop('checked', langs.includes('ARABIC'));
$cbJap.prop('checked', langs.includes('JAPANESE'));
$cbChi.prop('checked', langs.includes('CHINESE'));
$modal.modal('show'); $modal.modal('show');
// save button click event // save button click event
$modal.off('click.languagelinksave').on('click.languagelinksave', '#languagelinksave', function () { $modal.off('click.languagelinksave').on('click.languagelinksave', '#languagelinksave', function () {
const tag = $('#languagelinktag').val(); const tag = $langtag.val();
const langs = []; const langs = [];
if ($('#langID').is(':checked')) langs.push('INDONESIA'); if ($cbInd.is(':checked')) langs.push('INDONESIA');
if ($('#langLocal').is(':checked')) langs.push('LOCAL'); if ($cbLocal.is(':checked')) langs.push('LOCAL');
if ($('#langEN').is(':checked')) langs.push('ENGLISH'); if ($cbEn.is(':checked')) langs.push('ENGLISH');
if ($('#langARB').is(':checked')) langs.push('ARABIC'); if ($cbArb.is(':checked')) langs.push('ARABIC');
if ($('#langJAP').is(':checked')) langs.push('JAPANESE'); if ($cbJap.is(':checked')) langs.push('JAPANESE');
if ($('#langCHI').is(':checked')) langs.push('CHINESE'); if ($cbChi.is(':checked')) langs.push('CHINESE');
if (tag.length === 0) { if (tag.length === 0) {
alert("Tag cannot be empty"); alert("Tag cannot be empty");
return; return;
@@ -1096,7 +1117,7 @@ $(document).ready(function () {
} }
}); });
$btnExport.click(() => { $btnExport.click(() => {
DoExport(APIURL, "languagebank.xlsx"); DoExport(APIURL, "languagebank.xlsx",{});
}); });
$btnImport.click(() => { $btnImport.click(() => {
@@ -1194,7 +1215,7 @@ $(document).ready(function () {
} }
}); });
$btnExport.click(() => { $btnExport.click(() => {
DoExport(APIURL, "schedulebank.xlsx"); DoExport(APIURL, "schedulebank.xlsx",{});
}); });
$btnImport.click(() => { $btnImport.click(() => {
DoImport(APIURL, (okdata) => { DoImport(APIURL, (okdata) => {
@@ -1216,6 +1237,7 @@ $(document).ready(function () {
const $logdate = $('#logdate'); const $logdate = $('#logdate');
const $searchfilter = $('#searchfilter'); const $searchfilter = $('#searchfilter');
const $logtable = $('#logtablebody') const $logtable = $('#logtablebody')
const $btnExport = $('#btnExport');
let selectedlogdate = ""; let selectedlogdate = "";
let logfilter = ""; let logfilter = "";
let APIURL = "Log/"; let APIURL = "Log/";
@@ -1244,6 +1266,9 @@ $(document).ready(function () {
logfilter = $(this).val(); logfilter = $(this).val();
reloadLogs(APIURL, selectedlogdate, logfilter); reloadLogs(APIURL, selectedlogdate, logfilter);
}); });
$btnExport.off('click').on('click', function () {
DoExport(APIURL, "log.xlsx",{date:selectedlogdate,filter:logfilter});
});
} else { } else {
console.error("Error loading log content:", xhr.status, xhr.statusText); console.error("Error loading log content:", xhr.status, xhr.statusText);
@@ -1265,25 +1290,4 @@ $(document).ready(function () {
window.location.href = "login.html" window.location.href = "login.html"
}) })
/**
* Create log Request Data
* @param {String} logdate in format dd/mm/yyyy
* @param {String} logfilter
* @returns JSON string of log Request data
*/
function logRequstData(logdate, logfilter) {
if (logdate && logdate.length > 0) {
const dateRegex = /^(0[1-9]|[12][0-9]|3[01])\/(0[1-9]|1[0-2])\/\d{4}$/;
if (dateRegex.test(logdate)) {
// logdate is valid
return JSON.stringify({
date: logdate,
filter: logfilter
})
}
}
return ""
}
}); });

View File

@@ -21,7 +21,7 @@
<p class="text-add">Select Log Date</p> <p class="text-add">Select Log Date</p>
</div> </div>
<div class="col-6 col-sm col-md-2 col-lg-2 col-xl-2"><input id="logdate" class="form-control" type="date"></div> <div class="col-6 col-sm col-md-2 col-lg-2 col-xl-2"><input id="logdate" class="form-control" type="date"></div>
<div class="col-md-4 col-lg-4 col-xl-4"></div> <div class="col-md-4 col-lg-4 col-xl-4"><button class="btn btn-primary w-100 h-100" id="btnExport" type="button">Export</button></div>
<div class="col-6 col-sm col-md-2 col-lg-2 col-xl-2"> <div class="col-6 col-sm col-md-2 col-lg-2 col-xl-2">
<p class="text-add">Search</p> <p class="text-add">Search</p>
</div> </div>

View File

@@ -126,7 +126,7 @@ class MariaDB(
try { try {
val statement = val statement =
connection?.prepareStatement("INSERT INTO log (datenya, timenya, machine, description) VALUES (?, ?, ?, ?)") connection?.prepareStatement("INSERT INTO logs (datenya, timenya, machine, description) VALUES (?, ?, ?, ?)")
statement?.setString(1, dateString) statement?.setString(1, dateString)
statement?.setString(2, timeString) statement?.setString(2, timeString)
statement?.setString(3, machine) statement?.setString(3, machine)
@@ -152,16 +152,15 @@ class MariaDB(
try { try {
val statement = connection?.prepareStatement( val statement = connection?.prepareStatement(
if (logFilter.isBlank()) { if (logFilter.isBlank()) {
"SELECT * FROM log WHERE datenya = ?" "SELECT * FROM logs WHERE datenya = ?"
} else { } else {
"SELECT * FROM log WHERE datenya = ? AND (description LIKE ? OR machine LIKE ?)" "SELECT * FROM logs WHERE datenya = ? AND (description LIKE ?)"
} }
) )
statement?.setString(1, logDate) statement?.setString(1, logDate)
if (!logFilter.isBlank()) { if (!logFilter.isBlank()) {
val filter = "%$logFilter%" val filter = "%$logFilter%"
statement?.setString(2, filter) statement?.setString(2, filter)
statement?.setString(3, filter)
} }
val resultSet = statement?.executeQuery() val resultSet = statement?.executeQuery()
val workbook = XSSFWorkbook() val workbook = XSSFWorkbook()
@@ -223,12 +222,15 @@ class MariaDB(
*/ */
fun GetLogForHtml(date: String, consumer: Consumer<ArrayList<Log>>) { fun GetLogForHtml(date: String, consumer: Consumer<ArrayList<Log>>) {
val logList = ArrayList<Log>() val logList = ArrayList<Log>()
println("GetLogForHtml Date: $date" )
if (ValiDateForLogHtml(date)) { if (ValiDateForLogHtml(date)) {
try { try {
// must convert from DD-MM-YYYY to DD/MM/YYYY, because in database we use DD/MM/YYYY // must convert from DD-MM-YYYY to DD/MM/YYYY, because in database we use DD/MM/YYYY
val adjusteddate = date.replace("-", "/") val adjusteddate = date.replace("-", "/")
val statement = connection?.prepareStatement("SELECT * FROM logs WHERE datenya = ?") val statement = connection?.prepareStatement("SELECT * FROM logs WHERE datenya = ?")
statement?.setString(1, adjusteddate) statement?.setString(1, adjusteddate)
println("GetLogForHtml Date: $adjusteddate" )
println("GetLogForHtml SQL: " +statement?.toString())
val resultSet = statement?.executeQuery() val resultSet = statement?.executeQuery()
while (resultSet?.next() == true) { while (resultSet?.next() == true) {
val log = Log( val log = Log(
@@ -256,6 +258,8 @@ class MariaDB(
*/ */
fun GetLogForHtml(date: String, filter: String, consumer: Consumer<ArrayList<Log>>) { fun GetLogForHtml(date: String, filter: String, consumer: Consumer<ArrayList<Log>>) {
val logList = ArrayList<Log>() val logList = ArrayList<Log>()
println("GetLogForHtml Date: $date Filter: $filter" )
if (ValiDateForLogHtml(date)) { if (ValiDateForLogHtml(date)) {
try { try {
// must convert from DD-MM-YYYY to DD/MM/YYYY, because in database we use DD/MM/YYYY // must convert from DD-MM-YYYY to DD/MM/YYYY, because in database we use DD/MM/YYYY
@@ -264,6 +268,8 @@ class MariaDB(
connection?.prepareStatement("SELECT * FROM logs WHERE datenya = ? AND description LIKE ?") connection?.prepareStatement("SELECT * FROM logs WHERE datenya = ? AND description LIKE ?")
statement?.setString(1, adjusteddate) statement?.setString(1, adjusteddate)
statement?.setString(2, "%$filter%") statement?.setString(2, "%$filter%")
println("GetLogForHtml Date: $adjusteddate , Filter=$filter" )
println("GetLogForHtml SQL: " +statement?.toString())
val resultSet = statement?.executeQuery() val resultSet = statement?.executeQuery()
while (resultSet?.next() == true) { while (resultSet?.next() == true) {
val log = Log( val log = Log(
@@ -594,7 +600,7 @@ class MariaDB(
*/ */
fun Add_LanguageLink(languageLink: LanguageLink): Boolean { fun Add_LanguageLink(languageLink: LanguageLink): Boolean {
try { try {
val statement = connection?.prepareStatement("INSERT INTO languagelink (TAG, Language) VALUES (?, ?)") val statement = connection?.prepareStatement("INSERT INTO languagelinking (TAG, Language) VALUES (?, ?)")
statement?.setString(1, languageLink.TAG) statement?.setString(1, languageLink.TAG)
statement?.setString(2, languageLink.Language) statement?.setString(2, languageLink.Language)
val rowsAffected = statement?.executeUpdate() val rowsAffected = statement?.executeUpdate()
@@ -620,7 +626,7 @@ class MariaDB(
try { try {
if (connection != null) { if (connection != null) {
connection!!.autoCommit = false connection!!.autoCommit = false
val sql = "INSERT INTO languagelink (TAG, Language) VALUES (?, ?)" val sql = "INSERT INTO languagelinking (TAG, Language) VALUES (?, ?)"
val statement = connection!!.prepareStatement(sql) val statement = connection!!.prepareStatement(sql)
for (ll in languageLinkList) { for (ll in languageLinkList) {
statement.setString(1, ll.TAG) statement.setString(1, ll.TAG)
@@ -629,12 +635,12 @@ class MariaDB(
} }
statement.executeBatch() statement.executeBatch()
connection!!.commit() connection!!.commit()
Logger.info("Bulk languagelink insert successful: ${languageLinkList.size} entries" as Any) Logger.info("Bulk languagelinking insert successful: ${languageLinkList.size} entries" as Any)
connection!!.autoCommit = true connection!!.autoCommit = true
return true return true
} }
} catch (e: Exception) { } catch (e: Exception) {
Logger.error("Error adding languagelink entries: ${e.message}" as Any) Logger.error("Error adding languagelinking entries: ${e.message}" as Any)
} }
} }
return false return false
@@ -650,7 +656,7 @@ class MariaDB(
fun Update_LanguageLink_by_index(index: UInt, languageLink: LanguageLink): Boolean { fun Update_LanguageLink_by_index(index: UInt, languageLink: LanguageLink): Boolean {
try { try {
val statement = val statement =
connection?.prepareStatement("UPDATE languagelink SET TAG = ?, Language = ? WHERE `index` = ?") connection?.prepareStatement("UPDATE languagelinking SET TAG = ?, Language = ? WHERE `index` = ?")
statement?.setString(1, languageLink.TAG) statement?.setString(1, languageLink.TAG)
statement?.setString(2, languageLink.Language) statement?.setString(2, languageLink.Language)
statement?.setLong(3, index.toLong()) statement?.setLong(3, index.toLong())
@@ -674,17 +680,17 @@ class MariaDB(
*/ */
fun Delete_LanguageLink_by_index(index: UInt): Boolean { fun Delete_LanguageLink_by_index(index: UInt): Boolean {
try { try {
val statement = connection?.prepareStatement("DELETE FROM languagelink WHERE `index` = ?") val statement = connection?.prepareStatement("DELETE FROM languagelinking WHERE `index` = ?")
statement?.setLong(1, index.toLong()) statement?.setLong(1, index.toLong())
val rowsAffected = statement?.executeUpdate() val rowsAffected = statement?.executeUpdate()
if (rowsAffected != null && rowsAffected > 0) { if (rowsAffected != null && rowsAffected > 0) {
Logger.info("Deleted $rowsAffected row(s) from languagelink with index $index" as Any) Logger.info("Deleted $rowsAffected row(s) from languagelinking with index $index" as Any)
return true return true
} else { } else {
Logger.warn("No rows deleted from languagelink with index $index" as Any) Logger.warn("No rows deleted from languagelinking with index $index" as Any)
} }
} catch (e: Exception) { } catch (e: Exception) {
Logger.error("Error deleting from languagelink with index $index: ${e.message}" as Any) Logger.error("Error deleting from languagelinking with index $index: ${e.message}" as Any)
} }
return false return false
} }
@@ -696,12 +702,12 @@ class MariaDB(
try { try {
val statement = connection?.createStatement() val statement = connection?.createStatement()
// use TRUNCATE to reset auto increment index // use TRUNCATE to reset auto increment index
statement?.executeUpdate("TRUNCATE TABLE languagelink") statement?.executeUpdate("TRUNCATE TABLE languagelinking")
Logger.info("LanguageLink table cleared" as Any) Logger.info("languagelinking table cleared" as Any)
LanguageLinkList.clear() LanguageLinkList.clear()
return true return true
} catch (e: Exception) { } catch (e: Exception) {
Logger.error("Error clearing LanguageLink table: ${e.message}" as Any) Logger.error("Error clearing languagelinking table: ${e.message}" as Any)
} }
return false return false
} }
@@ -713,9 +719,9 @@ class MariaDB(
fun Export_LanguageLink_XLSX(): XSSFWorkbook? { fun Export_LanguageLink_XLSX(): XSSFWorkbook? {
try { try {
val statement = connection?.createStatement() val statement = connection?.createStatement()
val resultSet = statement?.executeQuery("SELECT * FROM languagelink") val resultSet = statement?.executeQuery("SELECT * FROM languagelinking")
val workbook = XSSFWorkbook() val workbook = XSSFWorkbook()
val sheet = workbook.createSheet("LanguageLink") val sheet = workbook.createSheet("languagelinking")
val headerRow = sheet.createRow(0) val headerRow = sheet.createRow(0)
val headers = arrayOf("Index", "TAG", "Language") val headers = arrayOf("Index", "TAG", "Language")
for ((colIndex, header) in headers.withIndex()) { for ((colIndex, header) in headers.withIndex()) {
@@ -734,7 +740,7 @@ class MariaDB(
} }
return workbook return workbook
} catch (e: Exception) { } catch (e: Exception) {
Logger.error { "Error exporting LanguageLink, Msg: ${e.message}" } Logger.error { "Error exporting languagelinking, Msg: ${e.message}" }
} }
return null return null
} }

View File

@@ -208,7 +208,7 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>, val
if (!exists) { if (!exists) {
if (ValidFile(addvalue.Path)) { if (ValidFile(addvalue.Path)) {
if (db.Add_Soundbank(addvalue)) { if (db.Add_Soundbank(addvalue)) {
it.result("OK") it.result(objectmapper.writeValueAsString(mapOf("message" to "OK")))
} else it.status(500) } else it.status(500)
.result("Failed to add soundbank to database") .result("Failed to add soundbank to database")
} else it.status(400) } else it.status(400)
@@ -216,10 +216,10 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>, val
} else it.status(400) } else it.status(400)
.result("TAG=${addvalue.TAG} already exists for the same Language=${addvalue.Language} and Category=${addvalue.Category}") .result("TAG=${addvalue.TAG} already exists for the same Language=${addvalue.Language} and Category=${addvalue.Category}")
} else it.status(400).result("Invalid Path") } else it.status(400).result("Invalid Path")
} else it.status(400).result("Invalid Language") } else it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "Invalid Language")))
} else it.status(400).result("Invalid Category") } else it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "Invalid Category")))
} else it.status(400).result("Invalid TAG") } else it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "Invalid TAG")))
} else it.status(400).result("Invalid Description") } else it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "Invalid Description")))
} catch (_: Exception) { } catch (_: Exception) {
it.status(400).result("Invalid request body") it.status(400).result("Invalid request body")
} }
@@ -227,7 +227,7 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>, val
delete("List") { delete("List") {
// truncate soundbank table // truncate soundbank table
if (db.Clear_Soundbank()) { if (db.Clear_Soundbank()) {
it.result("OK") it.result(objectmapper.writeValueAsString(mapOf("message" to "OK")))
} else { } else {
it.status(500).result("Failed to truncate soundbank table") it.status(500).result("Failed to truncate soundbank table")
} }
@@ -236,10 +236,10 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>, val
// delete by index // delete by index
val index = it.pathParam("index").toUIntOrNull() val index = it.pathParam("index").toUIntOrNull()
if (index == null) { if (index == null) {
it.status(400).result("Invalid index") it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "Invalid index")))
} else { } else {
if (db.Delete_Soundbank_by_index(index)) { if (db.Delete_Soundbank_by_index(index)) {
it.result("OK") it.result(objectmapper.writeValueAsString(mapOf("message" to "OK")))
} else { } else {
it.status(500).result("Failed to delete soundbank with index $index") it.status(500).result("Failed to delete soundbank with index $index")
} }
@@ -250,7 +250,7 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>, val
val index = it.pathParam("index").toUIntOrNull() val index = it.pathParam("index").toUIntOrNull()
if (index == null) { if (index == null) {
// tidak ada path param index // tidak ada path param index
it.status(400).result("Invalid index") it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "Invalid index")))
} else { } else {
val sb = db.SoundbankList.find { xx -> xx.index == index } val sb = db.SoundbankList.find { xx -> xx.index == index }
if (sb == null) { if (sb == null) {
@@ -260,7 +260,7 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>, val
// soundbank dengan index tersebut ditemukan, sekarang update // soundbank dengan index tersebut ditemukan, sekarang update
val json: JsonNode = objectmapper.readTree(it.body()) val json: JsonNode = objectmapper.readTree(it.body())
if (json.isEmpty) { if (json.isEmpty) {
it.status(400).result("UpdateByIndex with index=$index has empty body") it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "UpdateByIndex with index=$index has empty body")))
} else { } else {
val _description = json.get("Description").asText() val _description = json.get("Description").asText()
val _tag = json.get("TAG").asText() val _tag = json.get("TAG").asText()
@@ -283,7 +283,7 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>, val
sb.Category = _category sb.Category = _category
changed = true changed = true
} else { } else {
it.status(400).result("Invalid Category") it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "Invalid Category")))
return@patch return@patch
} }
} }
@@ -302,7 +302,7 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>, val
} }
if (changed) { if (changed) {
if (db.Update_Soundbank_by_index(index, sb)) { if (db.Update_Soundbank_by_index(index, sb)) {
it.result("OK") it.result(objectmapper.writeValueAsString(mapOf("message" to "OK")))
} else it.status(500).result("Failed to update soundbank with index $index") } else it.status(500).result("Failed to update soundbank with index $index")
} else it.status(400) } else it.status(400)
.result("Nothing has changed for soundbank with index $index") .result("Nothing has changed for soundbank with index $index")
@@ -328,18 +328,18 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>, val
post("ImportXLSX") { post("ImportXLSX") {
val uploaded = it.uploadedFile("file") val uploaded = it.uploadedFile("file")
if (uploaded == null) { if (uploaded == null) {
it.status(400).result("No file uploaded") it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "No file uploaded")))
return@post return@post
} }
try { try {
val xlsx = XSSFWorkbook(uploaded.content()) val xlsx = XSSFWorkbook(uploaded.content())
if (db.Import_Soundbank_XLSX(xlsx)) { if (db.Import_Soundbank_XLSX(xlsx)) {
it.result("OK") it.result(objectmapper.writeValueAsString(mapOf("message" to "OK")))
} else { } else {
it.status(500).result("Failed to import soundbank from XLSX") it.status(500).result("Failed to import soundbank from XLSX")
} }
} catch (e: Exception) { } catch (e: Exception) {
it.status(400).result("Invalid XLSX file") it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "Invalid XLSX file")))
} }
} }
} }
@@ -354,21 +354,21 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>, val
delete("List") { delete("List") {
// truncate messagebank table // truncate messagebank table
if (db.Clear_Messagebank()) { if (db.Clear_Messagebank()) {
it.result("OK") it.result(objectmapper.writeValueAsString(mapOf("message" to "OK")))
} else { } else {
it.status(500).result("Failed to truncate messagebank table") it.status(500).result(objectmapper.writeValueAsString(mapOf("message" to "Failed to truncate messagebank table")))
} }
} }
delete("DeleteByIndex/{index}") { delete("DeleteByIndex/{index}") {
// delete by index // delete by index
val index = it.pathParam("index").toUIntOrNull() val index = it.pathParam("index").toUIntOrNull()
if (index == null) { if (index == null) {
it.status(400).result("Invalid index") it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "Invalid index")))
} else { } else {
if (db.Delete_Messagebank_by_index(index)) { if (db.Delete_Messagebank_by_index(index)) {
it.result("OK") it.result(objectmapper.writeValueAsString(mapOf("message" to "OK")))
} else { } else {
it.status(500).result("Failed to delete messagebank with index $index") it.status(500).result(objectmapper.writeValueAsString(mapOf("message" to "Failed to delete messagebank with index $index")))
} }
} }
} }
@@ -376,15 +376,15 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>, val
// update messagebank by index // update messagebank by index
val index = it.pathParam("index").toUIntOrNull() val index = it.pathParam("index").toUIntOrNull()
if (index == null) { if (index == null) {
it.status(400).result("Invalid index") it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "Invalid index")))
} else { } else {
val mb = db.MessagebankList.find { xx -> xx.index == index } val mb = db.MessagebankList.find { xx -> xx.index == index }
if (mb == null) { if (mb == null) {
it.status(404).result("Messagebank with index $index not found") it.status(404).result(objectmapper.writeValueAsString(mapOf("message" to "Messagebank with index $index not found")))
} else { } else {
val json: JsonNode = objectmapper.readTree(it.body()) val json: JsonNode = objectmapper.readTree(it.body())
if (json.isEmpty) { if (json.isEmpty) {
it.status(400).result("UpdateByIndex with index=$index has empty body") it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "UpdateByIndex with index=$index has empty body")))
} else { } else {
val _description = json.get("Description").asText() val _description = json.get("Description").asText()
val _language = json.get("Language").asText() val _language = json.get("Language").asText()
@@ -411,7 +411,7 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>, val
mb.Voice_Type = _voice_type mb.Voice_Type = _voice_type
changed = true changed = true
} else { } else {
it.status(400).result("Invalid Voice_Type") it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "Invalid Voice_Type")))
return@patch return@patch
} }
} }
@@ -425,11 +425,11 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>, val
} }
if (changed) { if (changed) {
if (db.Update_Messagebank_by_index(index, mb)) { if (db.Update_Messagebank_by_index(index, mb)) {
it.result("OK") it.result(objectmapper.writeValueAsString(mapOf("message" to "OK")))
} else it.status(500) } else it.status(500)
.result("Failed to update messagebank with index $index") .result(objectmapper.writeValueAsString(mapOf("message" to "Failed to update messagebank with index $index")))
} else it.status(400) } else it.status(400)
.result("Nothing has changed for messagebank with index $index") .result(objectmapper.writeValueAsString(mapOf("message" to "Nothing has changed for messagebank with index $index")))
} }
} }
} }
@@ -446,24 +446,24 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>, val
xlsxdata.write(out) xlsxdata.write(out)
} }
} else { } else {
it.status(500).result("Failed to export messagebank to XLSX") it.status(500).result(objectmapper.writeValueAsString(mapOf("message" to "Failed to export messagebank to XLSX")))
} }
} }
post("ImportXLSX") { post("ImportXLSX") {
val uploaded = it.uploadedFile("file") val uploaded = it.uploadedFile("file")
if (uploaded == null) { if (uploaded == null) {
it.status(400).result("No file uploaded") it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "No file uploaded")))
return@post return@post
} }
try { try {
val xlsx = XSSFWorkbook(uploaded.content()) val xlsx = XSSFWorkbook(uploaded.content())
if (db.Import_Messagebank_XLSX(xlsx)) { if (db.Import_Messagebank_XLSX(xlsx)) {
it.result("OK") it.result(objectmapper.writeValueAsString(mapOf("message" to "OK")))
} else { } else {
it.status(500).result("Failed to import messagebank from XLSX") it.status(500).result(objectmapper.writeValueAsString(mapOf("message" to "Failed to import messagebank from XLSX")))
} }
} catch (e: Exception) { } catch (e: Exception) {
it.status(400).result("Invalid XLSX file") it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "Invalid XLSX file")))
} }
} }
} }
@@ -482,30 +482,30 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>, val
if (db.LanguageLinkList.any { ll -> ll.TAG==tag }){ if (db.LanguageLinkList.any { ll -> ll.TAG==tag }){
val newvalue = LanguageLink(0u, tag, languages.joinToString(";")) val newvalue = LanguageLink(0u, tag, languages.joinToString(";"))
if (db.Add_LanguageLink(newvalue)){ if (db.Add_LanguageLink(newvalue)){
it.result("OK") it.result(objectmapper.writeValueAsString(mapOf("message" to "OK")))
} else it.status(500).result("Failed to add language link to database") } else it.status(500).result(objectmapper.writeValueAsString(mapOf("message" to "Failed to add language link to database")))
} else it.status(400).result("TAG=$tag already exists" ) } else it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "TAG=$tag already exists")))
} else it.status(400).result("Contains unsupported language" ) } else it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "Contains unsupported language")))
} else it.status(400).result("Invalid tag or language") } else it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "Invalid tag or language")))
} }
delete("List") { delete("List") {
// truncate language link table // truncate language link table
if (db.Clear_LanguageLink()) { if (db.Clear_LanguageLink()) {
it.result("OK") it.result(objectmapper.writeValueAsString(mapOf("message" to "OK")))
} else { } else {
it.status(500).result("Failed to truncate language link table") it.status(500).result(objectmapper.writeValueAsString(mapOf("message" to "Failed to truncate language link table")))
} }
} }
delete("DeleteByIndex/{index}") { delete("DeleteByIndex/{index}") {
// delete by index // delete by index
val index = it.pathParam("index").toUIntOrNull() val index = it.pathParam("index").toUIntOrNull()
if (index == null) { if (index == null) {
it.status(400).result("Invalid index") it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "Invalid index")))
} else { } else {
if (db.Delete_LanguageLink_by_index(index)) { if (db.Delete_LanguageLink_by_index(index)) {
it.result("OK") it.result(objectmapper.writeValueAsString(mapOf("message" to "OK")))
} else { } else {
it.status(500).result("Failed to delete language link with index $index") it.status(500).result(objectmapper.writeValueAsString(mapOf("message" to "Failed to delete language link with index $index")))
} }
} }
} }
@@ -513,18 +513,18 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>, val
// update by index // update by index
val index = it.pathParam("index").toUIntOrNull() val index = it.pathParam("index").toUIntOrNull()
if (index == null) { if (index == null) {
it.status(400).result("Invalid index") it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "Invalid index")))
} else { } else {
val ll = db.LanguageLinkList.find { xx -> xx.index == index } val ll = db.LanguageLinkList.find { xx -> xx.index == index }
if (ll == null) { if (ll == null) {
it.status(404).result("Language link with index $index not found") it.status(404).result(objectmapper.writeValueAsString(mapOf("message" to "Language link with index $index not found")))
} else { } else {
val json: JsonNode = objectmapper.readTree(it.body()) val json: JsonNode = objectmapper.readTree(it.body())
if (json.isEmpty) { if (json.isEmpty) {
it.status(400).result("UpdateByIndex with index=$index has empty body") it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "UpdateByIndex with index=$index has empty body")))
} else { } else {
val _tag = json.get("TAG").asText() val _tag = json.get("tag").asText()
val _language = json.get("Language").asText() val _language = json.get("language").asText()
var changed = false var changed = false
if (ValidString(_language) && _language != ll.Language) { if (ValidString(_language) && _language != ll.Language) {
ll.Language = _language ll.Language = _language
@@ -536,11 +536,11 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>, val
} }
if (changed) { if (changed) {
if (db.Update_LanguageLink_by_index(index, ll)) { if (db.Update_LanguageLink_by_index(index, ll)) {
it.result("OK") it.result(objectmapper.writeValueAsString(mapOf("message" to "OK")))
} else it.status(500) } else it.status(500)
.result("Failed to update language link with index $index") .result(objectmapper.writeValueAsString(mapOf("message" to "Failed to update language link with index $index")))
} else it.status(400) } else it.status(400)
.result("Nothing has changed for language link with index $index") .result(objectmapper.writeValueAsString(mapOf("message" to "Nothing has changed for language link with index $index")))
} }
} }
} }
@@ -557,24 +557,24 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>, val
xlsxdata.write(out) xlsxdata.write(out)
} }
} else { } else {
it.status(500).result("Failed to export language link to XLSX") it.status(500).result(objectmapper.writeValueAsString(mapOf("message" to "Failed to export language link to XLSX")))
} }
} }
post("ImportXLSX") { post("ImportXLSX") {
val uploaded = it.uploadedFile("file") val uploaded = it.uploadedFile("file")
if (uploaded == null) { if (uploaded == null) {
it.status(400).result("No file uploaded") it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "No file uploaded")))
return@post return@post
} }
try { try {
val xlsx = XSSFWorkbook(uploaded.content()) val xlsx = XSSFWorkbook(uploaded.content())
if (db.Import_LanguageLink_XLSX(xlsx)) { if (db.Import_LanguageLink_XLSX(xlsx)) {
it.result("OK") it.result(objectmapper.writeValueAsString(mapOf("message" to "OK")))
} else { } else {
it.status(500).result("Failed to import language link from XLSX") it.status(500).result(objectmapper.writeValueAsString(mapOf("message" to "Failed to import language link from XLSX")))
} }
} catch (e: Exception) { } catch (e: Exception) {
it.status(400).result("Invalid XLSX file") it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "Invalid XLSX file")))
} }
} }
} }
@@ -586,19 +586,19 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>, val
delete("List") { delete("List") {
// truncate timer table // truncate timer table
if (db.Clear_Schedulebank()) { if (db.Clear_Schedulebank()) {
it.result("OK") it.result(objectmapper.writeValueAsString(mapOf("message" to "OK")))
} else { } else {
it.status(500).result("Failed to truncate schedulebank table") it.status(500).result(objectmapper.writeValueAsString(mapOf("message" to "Failed to truncate schedulebank table")))
} }
} }
delete("DeleteByIndex/{index}") { delete("DeleteByIndex/{index}") {
// delete by index // delete by index
val index = it.pathParam("index").toUIntOrNull() val index = it.pathParam("index").toUIntOrNull()
if (index == null) { if (index == null) {
it.status(400).result("Invalid index") it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "Invalid index")))
} else { } else {
if (db.Delete_Schedulebank_by_index(index)) { if (db.Delete_Schedulebank_by_index(index)) {
it.result("OK") it.result(objectmapper.writeValueAsString(mapOf("message" to "OK")))
} else { } else {
it.status(500).result("Failed to delete schedule with index $index") it.status(500).result("Failed to delete schedule with index $index")
} }
@@ -608,7 +608,7 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>, val
// update by index // update by index
val index = it.pathParam("index").toUIntOrNull() val index = it.pathParam("index").toUIntOrNull()
if (index == null) { if (index == null) {
it.status(400).result("Invalid index") it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "Invalid index")))
} else { } else {
val sb = db.SchedulebankList.find { xx -> xx.index == index } val sb = db.SchedulebankList.find { xx -> xx.index == index }
if (sb == null) { if (sb == null) {
@@ -616,7 +616,7 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>, val
} else { } else {
val json: JsonNode = objectmapper.readTree(it.body()) val json: JsonNode = objectmapper.readTree(it.body())
if (json.isEmpty) { if (json.isEmpty) {
it.status(400).result("UpdateByIndex with index=$index has empty body") it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "UpdateByIndex with index=$index has empty body")))
} else { } else {
val _description = json.get("Description").asText() val _description = json.get("Description").asText()
val _time = json.get("Time").asText() val _time = json.get("Time").asText()
@@ -670,17 +670,17 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>, val
sb.Language = _language sb.Language = _language
changed = true changed = true
} else { } else {
it.status(400).result("Invalid Language") it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "Invalid Language")))
return@patch return@patch
} }
} }
if (changed) { if (changed) {
if (db.Update_Schedulebank_by_index(index, sb)) { if (db.Update_Schedulebank_by_index(index, sb)) {
it.result("OK") it.result(objectmapper.writeValueAsString(mapOf("message" to "OK")))
} else it.status(500) } else it.status(500)
.result("Failed to update schedule with index $index") .result(objectmapper.writeValueAsString(mapOf("message" to "Failed to update schedule with index $index")))
} else it.status(400) } else it.status(400)
.result("Nothing has changed for schedule with index $index") .result(objectmapper.writeValueAsString(mapOf("message" to "Nothing has changed for schedule with index $index")))
} }
} }
} }
@@ -697,24 +697,24 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>, val
xlsxdata.write(out) xlsxdata.write(out)
} }
} else { } else {
it.status(500).result("Failed to export schedulebank to XLSX") it.status(500).result(objectmapper.writeValueAsString(mapOf("message" to "Failed to export schedulebank to XLSX")))
} }
} }
post("ImportXLSX") { post("ImportXLSX") {
val uploaded = it.uploadedFile("file") val uploaded = it.uploadedFile("file")
if (uploaded == null) { if (uploaded == null) {
it.status(400).result("No file uploaded") it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "No file uploaded")))
return@post return@post
} }
try { try {
val xlsx = XSSFWorkbook(uploaded.content()) val xlsx = XSSFWorkbook(uploaded.content())
if (db.Import_Schedulebank_XLSX(xlsx)) { if (db.Import_Schedulebank_XLSX(xlsx)) {
it.result("OK") it.result(objectmapper.writeValueAsString(mapOf("message" to "OK")))
} else { } else {
it.status(500).result("Failed to import schedulebank from XLSX") it.status(500).result("Failed to import schedulebank from XLSX")
} }
} catch (e: Exception) { } catch (e: Exception) {
it.status(400).result("Invalid XLSX file") it.status(400).result(objectmapper.writeValueAsString(mapOf("message" to "Invalid XLSX file")))
} }
} }
} }
@@ -738,14 +738,15 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>, val
get1.status(400).result("Invalid logdate") get1.status(400).result("Invalid logdate")
} }
} }
get("ExportXLSX/<logdate>/<logfilter>") { get1 -> get("ExportXLSX") { get1 ->
val logdate = get1.pathParam("logdate") val logdate = get1.queryParam("date") ?: ""
val logfilter = get1.pathParam("logfilter") val logfilter = get1.queryParam("filter") ?: ""
if (ValidDate(logdate)) { println("Export log to XLSX, date=$logdate, filter=$logfilter")
if (ValiDateForLogHtml(logdate)) {
val xlsxdata = if (ValidString(logfilter)) { val xlsxdata = if (ValidString(logfilter)) {
db.Export_Log_XLSX(logdate, logfilter) db.Export_Log_XLSX(logdate.replace('-','/'), logfilter)
} else { } else {
db.Export_Log_XLSX(logdate, "") db.Export_Log_XLSX(logdate.replace('-','/'), "")
} }
if (xlsxdata != null) { if (xlsxdata != null) {
get1.header( get1.header(