commit 12/09/2025

This commit is contained in:
2025-09-12 16:31:25 +07:00
parent b692e2c2c9
commit 09d074aa03
6 changed files with 433 additions and 61 deletions

View File

@@ -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<HTMLElement>}
*/
function ListItem(text, className=""){
return $('<li>').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 <ul> of available categories and phrases
let $messageavailablevariables = $modal.find('#messageavailablevariables');
// list <ul> 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();

View File

@@ -89,7 +89,7 @@
<div class="col-4 col-sm-3">
<p class="text-add">Language</p>
</div>
<div class="col" id="modallanguage"><select class="input-add form-select"></select></div>
<div class="col"><select id="modallanguage" class="input-add form-select"></select></div>
</div>
<div class="row">
<div class="col-4 col-sm-3">
@@ -97,11 +97,11 @@
</div>
<div class="col"><select id="modalvoicetype" class="input-add form-select"></select></div>
</div>
<div class="row">
<div class="row" style="height: 100px;">
<div class="col-4 col-sm-3">
<p class="text-add">Path</p>
</div>
<div class="col"><select id="modalpath" class="js-example-basic-single" name="modalpath"></select></div>
<div class="col"><select class="w-100 js-example-basic-single" id="modalpath" name="modalpath"></select></div>
</div>
</div>
<div class="modal-footer"><button class="btn btn-round-basic color-edit class25" id="soundbankclose" type="button" data-bs-dismiss="modal">Close</button><button class="btn btn-round-basic color-add class25" id="soundbanksave" type="button">Save</button></div>

View File

@@ -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"),

View File

@@ -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");
}

View File

@@ -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");
}

View File

@@ -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<Pair<String, String>>, 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<Pair<String, String>>, 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