Compare commits
12 Commits
master
...
8bd57f216a
| Author | SHA1 | Date | |
|---|---|---|---|
| 8bd57f216a | |||
| 8978a0986d | |||
| e5d8d8059e | |||
| 1b84ec133b | |||
| 4da5a2fb05 | |||
| 1563e233d6 | |||
| a53270aaed | |||
| d2a2626fd5 | |||
| 8c49bb827f | |||
| b15470845e | |||
| e426522380 | |||
| 470f61c79d |
@@ -101,6 +101,8 @@ $(document).ready(function () {
|
||||
let $schedulehour = $schedulemodal.find('#schedulehour');
|
||||
// number input 0-59
|
||||
let $scheduleminute = $schedulemodal.find('#scheduleminute');
|
||||
|
||||
//TODO ganti dropdown with list of messages from MessageBank
|
||||
// text input
|
||||
let $schedulesoundpath = $schedulemodal.find('#schedulesoundpath');
|
||||
// number input 0-5
|
||||
|
||||
@@ -9,7 +9,6 @@ import codes.Somecodes.Companion.ValidIPV4
|
||||
import codes.Somecodes.Companion.ValidScheduleDay
|
||||
import codes.Somecodes.Companion.ValidScheduleTime
|
||||
import codes.Somecodes.Companion.ValidString
|
||||
import codes.Somecodes.Companion.ValidStrings
|
||||
import com.fasterxml.jackson.databind.JsonNode
|
||||
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
|
||||
import content.Category
|
||||
@@ -24,6 +23,7 @@ import database.ScheduleBank
|
||||
import database.SoundChannel
|
||||
import database.Soundbank
|
||||
import database.UserDB
|
||||
//>>>>>>>>> Temporary merge branch 2
|
||||
import db
|
||||
import io.javalin.Javalin
|
||||
import io.javalin.apibuilder.ApiBuilder.before
|
||||
@@ -40,6 +40,7 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook
|
||||
import java.nio.file.Files
|
||||
import java.time.LocalDateTime
|
||||
|
||||
|
||||
@Suppress("unused")
|
||||
class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
|
||||
|
||||
@@ -430,13 +431,6 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
|
||||
// get messagebank list
|
||||
it.result(MariaDB.ArrayListtoString(db.messageDB.List))
|
||||
}
|
||||
get("MessageIDs") { ctx ->
|
||||
val value = db.messageDB.List
|
||||
.distinctBy { it.ANN_ID }
|
||||
.sortedBy { it.ANN_ID }
|
||||
.map { KeyValueMessage(it.ANN_ID.toString(), it.Description) }
|
||||
ctx.result(objectmapper.writeValueAsString(value))
|
||||
}
|
||||
post("Add"){
|
||||
val json : JsonNode = objectmapper.readTree(it.body())
|
||||
val description = json.get("Description")?.asText("") ?: ""
|
||||
@@ -741,7 +735,8 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
|
||||
if (ValidString(description)){
|
||||
if (ValidString(day) && ValidScheduleDay(day)){
|
||||
if (ValidString(time) && ValidScheduleTime(time)){
|
||||
if (ValidString(soundpath) && ValidFile(soundpath)){
|
||||
//soundpath is a messagebank desc and aan_id
|
||||
if (ValidString(soundpath)) {
|
||||
if (repeat in 0u..127u){
|
||||
if (ValidString(broadcast_zones)){
|
||||
val zones = broadcast_zones.split(";")
|
||||
@@ -759,6 +754,7 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
|
||||
language
|
||||
)
|
||||
if (db.scheduleDB.Add(newvalue)){
|
||||
|
||||
db.scheduleDB.Resort()
|
||||
it.result(objectmapper.writeValueAsString(resultMessage("OK")))
|
||||
} else it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to add schedule to database")))
|
||||
@@ -894,191 +890,34 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
|
||||
db.scheduleDB.Resort()
|
||||
it.result(objectmapper.writeValueAsString(resultMessage("OK")))
|
||||
} else {
|
||||
it.status(500)
|
||||
.result(objectmapper.writeValueAsString(resultMessage("Failed to import schedulebank from XLSX")))
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
it.status(400)
|
||||
.result(objectmapper.writeValueAsString(resultMessage("Invalid XLSX file")))
|
||||
}
|
||||
}
|
||||
}
|
||||
path("UserManagement") {
|
||||
get("List") {
|
||||
it.result(objectmapper.writeValueAsString(db.userDB.List))
|
||||
}
|
||||
delete("List") {
|
||||
if (db.userDB.Clear()) {
|
||||
db.userDB.Get()
|
||||
it.result(objectmapper.writeValueAsString(resultMessage("OK")))
|
||||
} else {
|
||||
it.status(500)
|
||||
.result(objectmapper.writeValueAsString(resultMessage("Failed to truncate user table")))
|
||||
}
|
||||
}
|
||||
post("Add") { ctx ->
|
||||
val json: JsonNode = objectmapper.readTree(ctx.body())
|
||||
val username = json.get("username").asText("")
|
||||
val password = json.get("password").asText("")
|
||||
val location = json.get("location").asText("")
|
||||
val airline_tags = json.get("airline_tags").asText("")
|
||||
val city_tags = json.get("city_tags").asText("")
|
||||
val messagebank_ann_id = json.get("messagebank_ann_id").asText("")
|
||||
val broadcastzones = json.get("broadcastzones").asText("")
|
||||
if (ValidStrings(listOf(username, password, location, airline_tags, city_tags, messagebank_ann_id, broadcastzones))) {
|
||||
if (!db.Username_exists(username)) {
|
||||
// check apakah ada airline tag yang tidak ada di soundbank
|
||||
val atags = airline_tags.split(";").map { it.trim() }
|
||||
.filter { it.isNotEmpty() }.distinct()
|
||||
val airlinetags = db.Get_AirlineCode_Tags()
|
||||
if (atags.all { tag -> airlinetags.any { it == tag } }) {
|
||||
// check apakah ada city tag yang tidak ada di soundbank
|
||||
val ctags = city_tags.split(";").map { it.trim() }
|
||||
.filter { it.isNotEmpty() }.distinct()
|
||||
val citytags = db.Get_City_Tags()
|
||||
if (ctags.all { tag -> citytags.any { it == tag } }) {
|
||||
val bzdesc =
|
||||
broadcastzones.split(";").map { it.trim() }
|
||||
.filter { it.isNotEmpty() }.distinct()
|
||||
val bzlist = db.Get_BroadcastZone_List()
|
||||
if (bzdesc.all { desc -> bzlist.any { it == desc } }) {
|
||||
val mbids = messagebank_ann_id.split(";")
|
||||
.map { it.trim() }
|
||||
.filter { it.isNotEmpty() }.distinct()
|
||||
.mapNotNull { it.toUIntOrNull() }
|
||||
val mbankids = db.Get_MessageID_List()
|
||||
if (mbids.all { id -> mbankids.any { it == id } }) {
|
||||
// semua valid, tambain ke database
|
||||
val newuser = UserDB(
|
||||
0u,
|
||||
username,
|
||||
password,
|
||||
location,
|
||||
airline_tags,
|
||||
city_tags,
|
||||
messagebank_ann_id,
|
||||
broadcastzones
|
||||
)
|
||||
if (db.userDB.Add(newuser)) {
|
||||
db.userDB.Resort()
|
||||
ctx.result(objectmapper.writeValueAsString(resultMessage("OK") ))
|
||||
} else ctx.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to add user to database")))
|
||||
} else ctx.status(400).result(objectmapper.writeValueAsString(resultMessage("Some ANN_ID not found in Messagebank") ))
|
||||
} else ctx.status(400).result(objectmapper.writeValueAsString(resultMessage("Some broadcast zone tags not found in soundbank")) )
|
||||
} else ctx.status(400).result(objectmapper.writeValueAsString(resultMessage("Some city tags not found in soundbank")))
|
||||
} else ctx.status(400).result(objectmapper.writeValueAsString(resultMessage("Some airline tags not found in soundbank")))
|
||||
} else ctx.status(400).result(objectmapper.writeValueAsString("Username already exists"))
|
||||
} else ctx.status(400).result(objectmapper.writeValueAsString(resultMessage("Not all fields have value")))
|
||||
}
|
||||
delete("DeleteByIndex/{index}") {
|
||||
// delete by index
|
||||
val index = it.pathParam("index").toUIntOrNull()
|
||||
if (index == null) {
|
||||
it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid index")))
|
||||
} else {
|
||||
if (db.userDB.DeleteByIndex(index.toInt())) {
|
||||
db.userDB.Resort()
|
||||
it.result(objectmapper.writeValueAsString(resultMessage("OK")))
|
||||
} else it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to delete user with index $index")))
|
||||
}
|
||||
}
|
||||
patch("UpdateByIndex/{index}"){ ctx ->
|
||||
// update by index
|
||||
val index = ctx.pathParam("index").toUIntOrNull()
|
||||
if (index!=null){
|
||||
val user = db.userDB.List.find { xx -> xx.index == index }
|
||||
if (user!=null){
|
||||
val json : JsonNode = objectmapper.readTree(ctx.body())
|
||||
if (!json.isEmpty){
|
||||
val _username = json.get("username").asText("")
|
||||
val _password = json.get("password").asText("")
|
||||
val _location = json.get("location").asText("")
|
||||
val _airline_tags = json.get("airline_tags").asText("")
|
||||
val _city_tags = json.get("city_tags").asText("")
|
||||
val _messagebank_ann_id = json.get("messagebank_ann_id").asText("")
|
||||
val _broadcastzones = json.get("broadcastzones").asText("")
|
||||
if (ValidStrings(listOf(_username, _password, _location, _airline_tags, _city_tags, _messagebank_ann_id, _broadcastzones))) {
|
||||
val _otherusername = db.userDB.List.find { xx -> xx.username.equals(_username, true) && xx.index != index }
|
||||
if (_otherusername == null) {
|
||||
// belum ada user lain yang pakai username ini
|
||||
val atags = _airline_tags.split(";").map { it.trim() }.filter { it.isNotEmpty() }.distinct()
|
||||
val ctags = _city_tags.split(";").map { it.trim() }.filter { it.isNotEmpty() }.distinct()
|
||||
val msgids = _messagebank_ann_id.split(";").map { it.trim() }.filter { it.isNotEmpty() }.distinct().mapNotNull { it.toUIntOrNull() }
|
||||
val bzdesc = _broadcastzones.split(";").map { it.trim() }.filter { it.isNotEmpty() }.distinct()
|
||||
|
||||
val airline_tags = db.Get_AirlineCode_Tags()
|
||||
val city_tags = db.Get_City_Tags()
|
||||
val msgbankids = db.Get_MessageID_List()
|
||||
val bzlist = db.Get_BroadcastZone_List()
|
||||
if (atags.all { tag -> airline_tags.any { it == tag } }) {
|
||||
if (ctags.all { tag -> city_tags.any { it == tag } }) {
|
||||
if (msgids.all { tag -> msgbankids.any { it == tag } }) {
|
||||
if (bzdesc.all { tag -> bzlist.any { it == tag } }) {
|
||||
val editeduser = UserDB(index, _username, _password, _location, _airline_tags, _city_tags, _messagebank_ann_id, _broadcastzones)
|
||||
if (!user.isEqual(editeduser)){
|
||||
if (db.userDB.UpdateByIndex(index.toInt(), editeduser)){
|
||||
db.userDB.Resort()
|
||||
ctx.result(objectmapper.writeValueAsString(resultMessage("OK")))
|
||||
|
||||
} else ctx.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to update user with index $index")))
|
||||
} else ctx.status(400).result(objectmapper.writeValueAsString(resultMessage("Nothing has changed for user with index $index")))
|
||||
} else ctx.status(400).result(objectmapper.writeValueAsString(resultMessage("Some broadcast zone is not found in Broadcast Zone list")))
|
||||
} else ctx.status(400).result(objectmapper.writeValueAsString(resultMessage("Some ANN_ID not found in Messagebank")))
|
||||
} else ctx.status(400).result(objectmapper.writeValueAsString(resultMessage("Some city tags not found in soundbank")))
|
||||
} else ctx.status(400).result(objectmapper.writeValueAsString("Some airline tags not found in soundbank"))
|
||||
} else ctx.status(400).result(objectmapper.writeValueAsString(resultMessage("Username already exists for another user")))
|
||||
} else ctx.status(400).result(objectmapper.writeValueAsString(resultMessage("Not all fiels have value")))
|
||||
} else ctx.status(400).result(objectmapper.writeValueAsString(resultMessage("UpdateByIndex with index=$index has empty body")))
|
||||
} else ctx.status(400).result(objectmapper.writeValueAsString(resultMessage("User with index $index not found")))
|
||||
} else ctx.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid index")))
|
||||
}
|
||||
get("ExportXLSX") {
|
||||
val xlsxdata = db.userDB.Export_XLSX()
|
||||
if (xlsxdata != null) {
|
||||
it.header(
|
||||
"Content-Type",
|
||||
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
|
||||
)
|
||||
it.header("Content-Disposition", "attachment; filename=\"userdb.xlsx\"")
|
||||
it.outputStream().use { out ->
|
||||
xlsxdata.write(out)
|
||||
}
|
||||
} else {
|
||||
it.status(500)
|
||||
.result(objectmapper.writeValueAsString(resultMessage("Failed to export user table to XLSX")))
|
||||
}
|
||||
}
|
||||
post("ImportXLSX") {
|
||||
val uploaded = it.uploadedFile("file")
|
||||
if (uploaded == null) {
|
||||
it.status(400)
|
||||
.result(objectmapper.writeValueAsString(resultMessage("No file uploaded")))
|
||||
return@post
|
||||
}
|
||||
try {
|
||||
val xlsx = XSSFWorkbook(uploaded.content())
|
||||
if (db.userDB.Import_XLSX(xlsx)) {
|
||||
db.userDB.Resort()
|
||||
it.result(objectmapper.writeValueAsString(resultMessage("OK")))
|
||||
} else {
|
||||
it.status(500)
|
||||
.result(objectmapper.writeValueAsString(resultMessage("Failed to import user table from XLSX")))
|
||||
it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to import schedulebank from XLSX")))
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid XLSX file")))
|
||||
}
|
||||
}
|
||||
|
||||
//TODO kirim list message dan broadcast zones untuk ADD/Edit schedule
|
||||
//Kirim list message dan broadcast zones untuk ADD/Edit schedule
|
||||
//TODO add at js file for messagebank and broadcast zones values
|
||||
get("GetMessageAndBroadcastZones") {
|
||||
val result = object {
|
||||
//TODO filter message without input variable
|
||||
val messages = db.messageDB.List
|
||||
.filter { mb -> !mb.Message_Detail.contains("[") && !mb.Message_Detail.contains("]")}
|
||||
.map { mb -> "${mb.Description} [${mb.ANN_ID}]" }
|
||||
val broadcastzones = db.broadcastDB.List.map { it.description }
|
||||
|
||||
val broadcastzones = db.broadcastDB.List
|
||||
}
|
||||
it.result(objectmapper.writeValueAsString(result))
|
||||
}
|
||||
|
||||
// Kirim list language dari Messagebank berdasarkan ANN_ID
|
||||
get("GetLanguageList/{ANN_ID}") { get1 ->
|
||||
//kirim list language dari Messagebank
|
||||
val langlist = db.messageDB.List
|
||||
.filter { it.ANN_ID == get1.pathParam("ANN_ID").toInt().toUInt() }
|
||||
.map { it.Language }.distinct()
|
||||
get1.result(objectmapper.writeValueAsString(langlist))
|
||||
}
|
||||
}
|
||||
path("Log") {
|
||||
get("List") { get1 ->
|
||||
@@ -1128,14 +967,19 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
|
||||
}
|
||||
path("BroadcastZones"){
|
||||
get("List") {
|
||||
// TODO : temporary, convert BroadcastZones to BroadcastZonesHtml, karena harus revisi javascript di Bootstrap Studio
|
||||
// val newlist: ArrayList<BroadcastZonesHtml> = db.broadcastDB.List.map { xx ->
|
||||
// BroadcastZonesHtml(
|
||||
// xx.index,
|
||||
// xx.description,
|
||||
// xx.SoundChannel,
|
||||
// xx.id,
|
||||
// xx.bp
|
||||
// )
|
||||
// } as ArrayList<BroadcastZonesHtml>
|
||||
|
||||
it.result(MariaDB.ArrayListtoString(db.broadcastDB.List))
|
||||
}
|
||||
get("BroadcastZoneDescriptions") { ctx ->
|
||||
val value = db.broadcastDB.List
|
||||
.distinctBy { it.description }
|
||||
.map { it.description }
|
||||
ctx.result(objectmapper.writeValueAsString(value))
|
||||
}
|
||||
delete("List"){
|
||||
// truncate broadcast zones table
|
||||
if (db.broadcastDB.Clear()) {
|
||||
@@ -1266,9 +1110,6 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
|
||||
get("List"){
|
||||
it.result(MariaDB.ArrayListtoString(db.soundchannelDB.List))
|
||||
}
|
||||
get("SoundChannelDescriptions") {
|
||||
it.result(objectmapper.writeValueAsString(db.Get_SoundChannel_List()))
|
||||
}
|
||||
delete("List"){
|
||||
// truncate sound channel table
|
||||
if (db.soundchannelDB.Clear()) {
|
||||
@@ -1307,10 +1148,12 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
|
||||
} else {
|
||||
|
||||
// cek apakah ada soundchannel lain yang pakai ip dan channel yang sama
|
||||
val othersc = db.soundchannelDB.List.filter { sc -> sc.ip == _ip }.filter { sc -> sc.index != index }
|
||||
if (othersc.isNotEmpty()){
|
||||
it.status(400).result(objectmapper.writeValueAsString(resultMessage("This IP address is already used by another sound channel")))
|
||||
} else {
|
||||
if (db.soundchannelDB.List.any { xx -> xx.index != index && _ip.equals(xx.ip) && _channel.equals(xx.channel, true) }) {
|
||||
println("Another sound channel already uses IP $_ip and channel $_channel")
|
||||
it.status(400).result(objectmapper.writeValueAsString(resultMessage("Another sound channel already uses IP $_ip and channel $_channel")))
|
||||
return@patch
|
||||
}
|
||||
|
||||
// ada sesuatu yang ganti
|
||||
val newsc = SoundChannel(0u, _channel, _ip)
|
||||
if (db.soundchannelDB.UpdateByIndex(index.toInt(),newsc)){
|
||||
@@ -1319,14 +1162,11 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
|
||||
it.result(objectmapper.writeValueAsString(resultMessage("OK")))
|
||||
} else {
|
||||
println("Failed to update sound channel with index $index")
|
||||
it.status(500)
|
||||
.result(objectmapper.writeValueAsString(resultMessage("Failed to update sound channel with index $index")))
|
||||
it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to update sound channel with index $index")))
|
||||
return@patch
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
} else {
|
||||
println("Invalid IP address")
|
||||
it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid IP address")))
|
||||
@@ -1341,6 +1181,7 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
get("ExportXLSX"){
|
||||
val xlsxdata = db.soundchannelDB.Export_XLSX()
|
||||
@@ -1372,17 +1213,18 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
|
||||
it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to import sound channel from XLSX")))
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
it.status(400)
|
||||
.result(objectmapper.writeValueAsString(resultMessage("Invalid XLSX file")))
|
||||
it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid XLSX file")))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Steph : coba tambah untuk QueuePaging Table. Belum ada di JS file(?)
|
||||
path("QueuePaging"){
|
||||
|
||||
get("List"){
|
||||
it.result(MariaDB.ArrayListtoString(db.queuepagingDB.List))
|
||||
}
|
||||
|
||||
delete("List"){
|
||||
// truncate queue paging table
|
||||
if (db.queuepagingDB.Clear()) {
|
||||
@@ -1412,9 +1254,11 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
|
||||
|
||||
// Steph : coba tambah untuk QueueTable Table. Belum ada di JS file(?)
|
||||
path("QueueTable"){
|
||||
|
||||
get("List"){
|
||||
it.result(MariaDB.ArrayListtoString(db.queuetableDB.List))
|
||||
}
|
||||
|
||||
delete("List"){
|
||||
// truncate queue table
|
||||
if (db.queuetableDB.Clear()) {
|
||||
@@ -1424,6 +1268,7 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
|
||||
it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to truncate queue sound table")))
|
||||
}
|
||||
}
|
||||
|
||||
delete("DeleteByIndex/{index}") {
|
||||
// delete by index
|
||||
val index = it.pathParam("index").toUIntOrNull()
|
||||
|
||||
Reference in New Issue
Block a user