From 09d074aa031956fecf163279aba0295c62d30f32 Mon Sep 17 00:00:00 2001 From: rdkartono Date: Fri, 12 Sep 2025 16:31:25 +0700 Subject: [PATCH] commit 12/09/2025 --- html/webpage/assets/js/script.js | 438 +++++++++++++++++++++++++++---- html/webpage/soundbank.html | 6 +- src/content/Category.kt | 4 +- src/content/Language.kt | 12 +- src/content/VoiceType.kt | 6 +- src/web/WebApp.kt | 28 +- 6 files changed, 433 insertions(+), 61 deletions(-) diff --git a/html/webpage/assets/js/script.js b/html/webpage/assets/js/script.js index f9577dd..7d45816 100644 --- a/html/webpage/assets/js/script.js +++ b/html/webpage/assets/js/script.js @@ -56,6 +56,15 @@ * @property {string} text */ +/** + * @typedef {Object} BroadcastZone + * @property {number} index + * @property {string} description + * @property {String} SoundChannel + * @property {String} Box + * @property {String} Relay + */ + /** * List of Soundbank data loaded from server * @type {SoundBank[]} @@ -106,12 +115,9 @@ let soundbankfiles = []; /** * Select2 data source * See https://select2.org/data-sources/formats - * @type {Object} - * @property {Select2item[]} results + * @type {Select2item[]} */ -let select2results = { - results: [] -}; +let select2data = []; /** * List of voice types available @@ -135,6 +141,21 @@ let languages = []; */ let scheduledays = [] +/** + * List of broadcast zones available + * @type {BroadcastZone[]} + */ +let BroadcastZoneList = []; + +/** + * Create a list item element + * @param {String} text Text Content for the list item + * @param {String} className Specific class name for the list item + * @returns {JQuery} + */ +function ListItem(text, className=""){ + return $('
  • ').addClass(className).text(text); +} /** * Fill soundbank table body with values @@ -368,9 +389,9 @@ function fetchAPI(endpoint, method, headers = {}, body = null, cbOK, cbError) { /** * Reload sound bank from server - * @param {String} APIURL API URL endpoint + * @param {String} APIURL API URL endpoint, default "SoundBank/" */ -function reloadSoundBank(APIURL) { +function reloadSoundBank(APIURL = "SoundBank/") { soundbankdata = []; fetchAPI(APIURL + "List", "GET", {}, null, (okdata) => { if (Array.isArray(okdata)) { @@ -385,9 +406,9 @@ function reloadSoundBank(APIURL) { /** * Reload message bank from server -* @param {string} APIURL API URL endpoint +* @param {string} APIURL API URL endpoint, default "MessageBank/" */ -function reloadMessageBank(APIURL) { +function reloadMessageBank(APIURL = "MessageBank/") { messagebankdata = []; fetchAPI(APIURL + "List", "GET", {}, null, (okdata) => { if (Array.isArray(okdata)) { @@ -402,9 +423,9 @@ function reloadMessageBank(APIURL) { /** * Reload language bank from server - * @param {string} APIURL API URL endpoint + * @param {string} APIURL API URL endpoint, default "LanguageLink/" */ -function reloadLanguageBank(APIURL) { +function reloadLanguageBank(APIURL = "LanguageLink/") { languagebankdata = []; fetchAPI(APIURL + "List", "GET", {}, null, (okdata) => { if (Array.isArray(okdata)) { @@ -419,9 +440,9 @@ function reloadLanguageBank(APIURL) { /** * Reload timer bank from server - * @param {string} APIURL API URL endpoint + * @param {string} APIURL API URL endpoint, default "ScheduleBank/" */ -function reloadTimerBank(APIURL) { +function reloadTimerBank(APIURL = "ScheduleBank/") { schedulebankdata = []; fetchAPI(APIURL + "List", "GET", {}, null, (okdata) => { if (Array.isArray(okdata)) { @@ -436,11 +457,11 @@ function reloadTimerBank(APIURL) { /** * Reload logs from server with date and filter - * @param {String} APIURL API URL endpoint + * @param {String} APIURL API URL endpoint , default "Log/" * @param {String} date date in format dd-mm-yyyy * @param {String} filter log filter text */ -function reloadLogs(APIURL, date, filter) { +function reloadLogs(APIURL = "Log/", date, filter) { const params = new URLSearchParams({ date: date, filter: filter @@ -460,22 +481,38 @@ function reloadLogs(APIURL, date, filter) { * Reload soundbank files from server * @param {String} APIURL API URL endpoint (default "SoundBank/") */ -function regetSoundbankFiles(APIURL = "SoundBank/") { +function reloadSoundbankFiles(APIURL = "SoundBank/") { soundbankfiles = []; fetchAPI(APIURL + "ListFiles", "GET", {}, null, (okdata) => { // okdata is a string contains elements separated by semicolon ; if (Array.isArray(okdata)) { soundbankfiles = okdata.filter(item => item.trim().length > 0); - //console.log("Loaded " + soundbankfiles.length + " sound files : " + soundbankfiles.join(", ") ); - - // refill select2results - select2results.results = soundbankfiles.map((item, index) => ({ id: index + 1, text: item })); - } else console.log("regetSoundbankFiles: okdata is not array"); + // refill select2data + select2data = soundbankfiles.map((item, index) => ({ id: index + 1, text: item })); + } else console.log("reloadSoundbankFiles: okdata is not array"); }, (errdata) => { alert("Error loading soundbank files : " + errdata.message); }); } +/** + * Reload broadcast zones from server + * @param {String} APIURL API URL endpoint (default "BroadcastZones/") + */ +function reloadBroadcastZones(APIURL = "BroadcastZones/") { + BroadcastZoneList = []; + fetchAPI(APIURL + "List", "GET", {}, null, (okdata) => { + if (Array.isArray(okdata)) { + BroadcastZoneList = okdata; + fill_broadcastzonetablebody(BroadcastZoneList); + } else console.log("reloadBroadcastZones: okdata is not array"); + }, (errdata) => { + alert("Error loading broadcast zones : " + errdata.message); + }); +} + + + /** * Reload voice types from server */ @@ -646,7 +683,7 @@ $(document).ready(function () { getCategories(); getLanguages(); getScheduledDays(); - regetSoundbankFiles(); + reloadSoundbankFiles(); // Initialize WebSocket connection ws = new WebSocket(window.location.pathname + '/ws'); @@ -723,11 +760,50 @@ $(document).ready(function () { let $btnEdit = $('#btnEdit'); let $btnExport = $('#btnExport'); let $btnImport = $('#btnImport'); - let $modal = $('#soundbankmodal'); $btnRemove.prop('disabled', true); $btnEdit.prop('disabled', true); let APIURL = "SoundBank/"; + let $modal = $('#soundbankmodal'); + let $modalindex = $modal.find('#modalindex'); + let $modaldescription = $modal.find('#modaldescription'); + let $modaltag = $modal.find('#modaltag'); + let $modalcategory = $modal.find('#modalcategory'); + let $modallanguage = $modal.find('#modallanguage'); + let $modalvoicetype = $modal.find('#modalvoicetype'); + let $modalpath = $modal.find('#modalpath'); + /** + * Clear soundbank modal inputs + */ + function clearSoundbankModal() { + $modalindex.val('').prop('disabled', true); + $modaldescription.val(''); + $modaltag.val(''); + // fill modalcategory options from categories[] + $modalcategory.empty(); + categories.forEach(cat => { + $modalcategory.append(new Option(cat, cat)); + }); + $modalcategory.val(null); + // fill modallanguage options from languages[] + $modallanguage.empty(); + languages.forEach(lang => { + $modallanguage.append(new Option(lang, lang)); + }); + $modallanguage.val(null); + // fill modalvoicetype options from voiceTypes[] + $modalvoicetype.empty(); + voiceTypes.forEach(vt => { + $modalvoicetype.append(new Option(vt, vt)); + }); + $modalvoicetype.val(null); + // fill modalpath options from soundbankfiles[] + // TODO read https://jeesite.com/front/jquery-select2/4.0/index.htm + console.log("select2data has " + select2data.length + " items"); + $('#modalpath').select2({ + data: select2data + }) + } reloadSoundBank(APIURL); $('#findsoundbank').on('input', function () { @@ -751,14 +827,12 @@ $(document).ready(function () { }); $btnAdd.click(() => { - $('.js-example-basic-single').select2({ - placeholder: 'Select a sound file', - closeOnSelect: true, - data: select2results, - }); + $modal.modal('show'); + clearSoundbankModal(); // event on Click save button $modal.off('click.soundbanksave').on('click.soundbanksave', '#soundbanksave', function () { + //TODO Add soundbank save process here $modal.modal('hide'); }); // event on Click close button @@ -805,9 +879,16 @@ $(document).ready(function () { if (confirm(`Are you sure to edit soundbank [${sb.index}] Description=${sb.description} Tag=${sb.tag}?`)) { $modal.modal('show'); $modal.off('hidden.bs.modal').on('hidden.bs.modal', function () { - const desc = $('#description').val(); - console.log('Description input value:', desc); - // You can use desc here (e.g., send to server) + + // event on Click save button + $modal.off('click.soundbanksave').on('click.soundbanksave', '#soundbanksave', function () { + //TODO Add soundbank save process here + $modal.modal('hide'); + }); + // event on Click close button + $modal.off('click.soundbankclose').on('click.soundbankclose', '#soundbankclose', function () { + $modal.modal('hide'); + }); }); } } @@ -848,6 +929,110 @@ $(document).ready(function () { let APIURL = "MessageBank/"; let $findmessage = $('#findmessage'); + // modal for add / edit messagebank + let $modal = $('#messagebankmodal'); + // text input, disabled by default + let $messageindex = $modal.find('#messageindex'); + // text input + let $messagedescription = $modal.find('#messagedescription'); + // select input, options loaded from languages[] + let $messagelanguage = $modal.find('#messagelanguage'); + // number input from 1 to 100 + let $messageannid = $modal.find('#messageannid'); + // select input, options loaded from voiceTypes[] + let $messagevoicetype = $modal.find('#messagevoicetype'); + // list
      of available categories and phrases + let $messageavailablevariables = $modal.find('#messageavailablevariables'); + // list
        of selected categories and phrases + let $messageselectedvariables = $modal.find('#messageselectedvariables'); + // for clearing messageselectedvariables + let $btnclearlist = $modal.find('#btnclearlist'); + // for removing selected item from messageselectedvariables + let $btnremovefromlist = $modal.find('#btnremovefromlist'); + // for adding selected item from messageavailablevariables to messageselectedvariables + let $btnaddtolist = $modal.find('#btnaddtolist'); + + /** + * Refill messageavailablevariables options from categories[] + * and soundbankdata with category "Phrase" if messagelanguage and messagevoicetype are selected + */ + function refill_messageavailablevariables() { + $messageavailablevariables.empty(); + categories.forEach(cat => { + $messageavailablevariables.append(ListItem(`{${cat}}`)); + }); + if ($messagelanguage.val() && $messagevoicetype.val()) { + soundbankdata + .filter(sb => sb.language.toLowerCase() === $messagelanguage.val().toLowerCase()) + .filter(sb => sb.voiceType.toLowerCase() === $messagevoicetype.val().toLowerCase()) + .filter(sb => sb.category.toLowerCase() === "phrase") + .forEach(sb => { + $messageavailablevariables.append(ListItem(`[${sb.Description}]`)); + }); + } + + } + + /** + * Clear message modal to default state + */ + function clearMessageModal() { + $messageindex.val('').prop('disabled', true); + $messagedescription.val(''); + // fill messagelanguage options from languages[] + $messagelanguage.empty(); + languages.forEach(lang => { + $messagelanguage.append(new Option(lang, lang)); + }); + $messagelanguage.val(null); + $messagelanguage.on('change', function () { + refill_messageavailablevariables(); + }); + // set default annid to 1 + $messageannid.val(1); + // fill messagevoicetype options from voiceTypes[] + $messagevoicetype.empty(); + voiceTypes.forEach(vt => { + $messagevoicetype.append(new Option(vt, vt)); + }); + $messagevoicetype.val(null); + $messagevoicetype.on('change', function () { + refill_messageavailablevariables(); + }); + + refill_messageavailablevariables(); + $messageselectedvariables.empty(); + + // event on btnclearlist + $btnclearlist.off('click').on('click', function () { + if ($messageselectedvariables.children().length > 0) { + if (confirm("Are you sure want to clear selected variables list?")) { + $messageselectedvariables.empty(); + } + } + }); + + // event on btnremovefromlist + $btnremovefromlist.off('click').on('click', function () { + let $selected = $messageselectedvariables.find('option:selected'); + if ($selected.length > 0) { + $selected.remove(); + } + + }); + + // event on btnaddtolist + $btnaddtolist.off('click').on('click', function () { + let $selected = $messageavailablevariables.find('option:selected'); + if ($selected.length > 0) { + $selected.each(function () { + $messageselectedvariables.append($(this).clone()); + }); + } + }); + } + + $findmessage.on('input', function () { let searchTerm = $findmessage.val().toLowerCase(); if (searchTerm.length > 0) { @@ -872,18 +1057,83 @@ $(document).ready(function () { }); $btnAdd.click(() => { - let $modal = $('#messagebankmodal'); - $modal.modal('show'); - $modal.off('click.messagebanksave').on('click.messagebanksave', '#messagebanksave', function () { - const index = $('#messageindex').val(); - const description = $('#messagedescription').val(); - const language = $('#messagelanguage').val(); - const ann_id = parseInt($('#messageannid').val()); - const voice_type = $('#messagevoicetype').val(); + $modal.modal('show'); + clearMessageModal(); + + // event on Click save button + $modal.off('click.messagebanksave').on('click.messagebanksave', '#messagebanksave', function () { + let description = $messagedescription.val().trim(); + let language = $messagelanguage.val(); + let annid = parseInt($messageannid.val()); + let voicetype = $messagevoicetype.val(); + let messagedetail = ""; + let messagetags = ""; + + // iterate messageselectedvariables children + $messageselectedvariables.children().each(function () { + let val = $(this).text().trim(); + if (val.length > 0) { + if (val.startsWith('[') && val.endsWith(']')) { + // categories + messagetags += (messagetags.length > 0 ? " " : "") + val; + messagedetail += (messagedetail.length > 0 ? " " : "") + val; + } else { + // phrases + // find in soundbankdata by description with specified language and voicetype + let sb = soundbankdata + .filter(sb => sb.language.toLowerCase() === language.toLowerCase()) + .filter(sb => sb.voiceType.toLowerCase() === voicetype.toLowerCase()) + .find(sb => sb.Description.toLowerCase() === val.toLowerCase()); + if (sb) { + messagedetail += (messagedetail.length > 0 ? " " : "") + sb.Description; + messagetags += (messagetags.length > 0 ? " " : "") + sb.tag; + } + } + } + }); + + if (description.length === 0) { + alert("Description cannot be empty"); + return; + } + if (!language) { + alert("Language cannot be empty"); + return; + } + if (isNaN(annid) || annid < 1 || annid > 100) { + alert("ANN_ID must be a number between 1 and 100"); + return; + } + if (!voicetype) { + alert("Voice Type cannot be empty"); + return; + } + if (messagedetail.length === 0 || messagetags.length === 0) { + alert("Message haven't been constructed, please add categories and phrases"); + return; + } + + + let mb = { + Description: description, + Language: language, + ANN_ID: annid, + Voice_Type: voicetype, + Message_Detail: messagedetail, + Message_TAGS: messagetags + }; + // send to server using fetchAPI + fetchAPI(APIURL + "Add", "POST", mb, null, (okdata) => { + reloadMessageBank(APIURL); + alert("Success add new messagebank : " + okdata.message); + }, (errdata) => { + alert("Error add new messagebank : " + errdata.message); + }); $modal.modal('hide'); }); + // event on Click close button $modal.off('click.messagebankclose').on('click.messagebankclose', '#messagebankclose', function () { $modal.modal('hide'); }); @@ -926,7 +1176,103 @@ $(document).ready(function () { message_TAGS: cells.eq(6).text() } if (confirm(`Are you sure to edit messagebank [${mb.index}] Description=${mb.description} ANN_ID=${mb.aNN_ID} Language=${mb.language} Voice_Type=${mb.voice_Type} `)) { - //TODO send edit command + $modal.modal('show'); + + clearMessageModal(); + // Fill modal fields with selected messagebank data + $messageindex.val(mb.index).prop('disabled', true); + $messagedescription.val(mb.description); + // Fill messagelanguage options and select current + $messagelanguage.empty(); + languages.forEach(lang => { + $messagelanguage.append(new Option(lang, lang)); + }); + $messagelanguage.val(mb.language); + // Fill messagevoicetype options and select current + $messagevoicetype.empty(); + voiceTypes.forEach(vt => { + $messagevoicetype.append(new Option(vt, vt)); + }); + $messagevoicetype.val(mb.voice_Type); + // Set annid + $messageannid.val(mb.aNN_ID); + // Refill message available variables + refill_messageavailablevariables(); + // Fill messageselectedvariables from message_Detail and message_TAGS + $messageselectedvariables.empty(); + if (mb.message_Detail) { + mb.message_Detail.split(' ').forEach(val => { + $messageselectedvariables.append(ListItem(val)); + }); + } + + // Save button event + $modal.off('click.messagebanksave').on('click.messagebanksave', '#messagebanksave', function () { + let description = $messagedescription.val().trim(); + let language = $messagelanguage.val(); + let annid = parseInt($messageannid.val()); + let voicetype = $messagevoicetype.val(); + let messagedetail = ""; + let messagetags = ""; + $messageselectedvariables.children().each(function () { + let val = $(this).text().trim(); + if (val.length > 0) { + if (val.startsWith('[') && val.endsWith(']')) { + messagetags += (messagetags.length > 0 ? " " : "") + val; + messagedetail += (messagedetail.length > 0 ? " " : "") + val; + } else { + let sb = soundbankdata + .filter(sb => sb.language.toLowerCase() === language.toLowerCase()) + .filter(sb => sb.voiceType.toLowerCase() === voicetype.toLowerCase()) + .find(sb => sb.Description && sb.Description.toLowerCase() === val.toLowerCase()); + if (sb) { + messagedetail += (messagedetail.length > 0 ? " " : "") + sb.Description; + messagetags += (messagetags.length > 0 ? " " : "") + sb.tag; + } + } + } + }); + if (description.length === 0) { + alert("Description cannot be empty"); + return; + } + if (!language) { + alert("Language cannot be empty"); + return; + } + if (isNaN(annid) || annid < 1 || annid > 100) { + alert("ANN_ID must be a number between 1 and 100"); + return; + } + if (!voicetype) { + alert("Voice Type cannot be empty"); + return; + } + if (messagedetail.length === 0 || messagetags.length === 0) { + alert("Message haven't been constructed, please add categories and phrases"); + return; + } + let mbUpdate = { + Description: description, + Language: language, + ANN_ID: annid, + Voice_Type: voicetype, + Message_Detail: messagedetail, + Message_TAGS: messagetags + }; + fetchAPI(APIURL + "UpdateByIndex/" + mb.index, "PATCH", mbUpdate, null, (okdata) => { + reloadMessageBank(APIURL); + alert("Success edit messagebank : " + okdata.message); + }, (errdata) => { + alert("Error edit messagebank : " + errdata.message); + }); + $modal.modal('hide'); + }); + // Close button event + $modal.off('click.messagebankclose').on('click.messagebankclose', '#messagebankclose', function () { + $modal.modal('hide'); + }); + } } }); @@ -1082,7 +1428,7 @@ $(document).ready(function () { language: cells.eq(2).text() } if (confirm(`Are you sure to edit language [${ll.index}] Tag=${ll.tag} Language=${ll.language}?`)) { - + clearLanguageModal(); $langid.val(ll.index); $langtag.val(ll.tag); @@ -1233,7 +1579,7 @@ $(document).ready(function () { $schedulesaturday.prop('checked', false); $schedulespecialdate.prop('checked', false); $scheduledate.prop('disabled', true).val(''); - + } @@ -1242,7 +1588,10 @@ $(document).ready(function () { let searchTerm = $findschedule.val().toLowerCase(); if (searchTerm.length > 0) { selectedtimerow = null; - let filtered = schedulebankdata.filter(item => item.description.toLowerCase().includes(searchTerm) || item.soundpath.toLowerCase().includes(searchTerm) || item.broadcastZones.toLowerCase().includes(searchTerm)); + let filtered = schedulebankdata.filter(item => + item.description.toLowerCase().includes(searchTerm) + || item.soundpath.toLowerCase().includes(searchTerm) + || item.broadcastZones.toLowerCase().includes(searchTerm)); fill_schedulebanktablebody(filtered); } else { selectedtimerow = null; @@ -1250,7 +1599,7 @@ $(document).ready(function () { } }); - + reloadTimerBank(APIURL); $btnClear.click(() => { DoClear(APIURL, "Timerbank", (okdata) => { @@ -1262,7 +1611,6 @@ $(document).ready(function () { }); $btnAdd.click(() => { - //TODO form add timer $schedulemodal.modal('show'); clearScheduleModal(); diff --git a/html/webpage/soundbank.html b/html/webpage/soundbank.html index 4223a34..8d47760 100644 --- a/html/webpage/soundbank.html +++ b/html/webpage/soundbank.html @@ -89,7 +89,7 @@

        Language

        -
        +
        @@ -97,11 +97,11 @@
        -
        +

        Path

        -
        +
        diff --git a/src/content/Category.kt b/src/content/Category.kt index 6bb0af3..7ee74ae 100644 --- a/src/content/Category.kt +++ b/src/content/Category.kt @@ -2,8 +2,8 @@ package content @Suppress("unused") enum class Category(name: String) { - AirlineCode("Airline_Code"), - AirplaneName("Airplane_Name"), + Airline_Code("Airline_Code"), + Airplane_Name("Airplane_Name"), AlphabetNumeric("AlphabetNumeric"), City("City"), Phrase("Phrase"), diff --git a/src/content/Language.kt b/src/content/Language.kt index c7ea77f..9308031 100644 --- a/src/content/Language.kt +++ b/src/content/Language.kt @@ -7,10 +7,10 @@ package content */ @Suppress("unused") enum class Language(name: String) { - Indonesia("INDONESIA"), - English("ENGLISH"), - Local("LOCAL"), - Japanese("JAPANESE"), - Chinese("CHINESE"), - Arabic("ARABIC"); + INDONESIA("Indonesia"), + ENGLISH("English"), + LOCAL("Local"), + JAPANESE("Japanese"), + CHINESE("Chinese"), + ARABIC("Arabic"); } \ No newline at end of file diff --git a/src/content/VoiceType.kt b/src/content/VoiceType.kt index 639f46d..2bfdcff 100644 --- a/src/content/VoiceType.kt +++ b/src/content/VoiceType.kt @@ -7,7 +7,7 @@ package content */ @Suppress("unused") enum class VoiceType(voicename: String) { - Voice1("VOICE_1"), - Voice2("VOICE_2"), - Voice3("VOICE_3"); + VOICE_1("VOICE_1"), + VOICE_2("VOICE_2"), + VOICE_3("VOICE_3"); } \ No newline at end of file diff --git a/src/web/WebApp.kt b/src/web/WebApp.kt index 48e9b7f..327d3fa 100644 --- a/src/web/WebApp.kt +++ b/src/web/WebApp.kt @@ -15,6 +15,7 @@ import content.ScheduleDay import content.VoiceType import database.LanguageLink import database.MariaDB +import database.Messagebank import database.Soundbank import io.javalin.Javalin import io.javalin.apibuilder.ApiBuilder.before @@ -172,7 +173,7 @@ class WebApp(val listenPort: Int, val userlist: List>, val } path("Category") { get { - it.result(objectmapper.writeValueAsString(Category.entries.map { cat -> cat.name }) ) + it.result(objectmapper.writeValueAsString(Category.entries.map { cat -> cat.name}) ) } } path("Language") { @@ -353,7 +354,30 @@ class WebApp(val listenPort: Int, val userlist: List>, val it.result(MariaDB.ArrayListtoString(db.MessagebankList)) } post("Add"){ - // TODO add new messagebank + val json : JsonNode = objectmapper.readTree(it.body()) + val description = json.get("Description")?.asText() ?: "" + val language = json.get("Language")?.asText() ?: "" + val ann_id = json.get("ANN_ID")?.asInt()?.toUInt() ?: 0u + val voice_type = json.get("Voice_Type")?.asText() ?: "" + val message_detail = json.get("Message_Detail")?.asText() ?: "" + val message_tags = json.get("Message_TAGS")?.asText() ?: "" + if (description.isNotEmpty()){ + if (language.isNotEmpty() && Language.entries.any{ lang -> lang.name == language }){ + if (ann_id>0u){ + if (voice_type.isNotEmpty() && VoiceType.entries.any{ vt -> vt.name == voice_type }){ + if (message_detail.isNotEmpty()){ + if (message_tags.isNotEmpty()){ + val mb = Messagebank(0u, description, language, ann_id, voice_type, message_detail, message_tags) + if (db.Add_Messagebank(mb)){ + db.Resort_Messagebank_by_ANN_ID() + it.result(objectmapper.writeValueAsString(resultMessage("OK"))) + } else it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to add messagebank to database"))) + } else it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Message_TAGS"))) + } else it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Message_Detail"))) + } else it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Voice_Type"))) + } else it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid ANN_ID"))) + } else it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Language"))) + } else it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Description"))) } delete("List") { // truncate messagebank table