commit 21/01/2026

This commit is contained in:
2026-01-21 17:19:19 +07:00
parent 38f3fd54b7
commit 34cf8c97df
24 changed files with 495 additions and 42 deletions

View File

@@ -0,0 +1,12 @@
<component name="libraryTable">
<library name="fasterxml.jackson.core.databind" type="repository">
<properties maven-id="com.fasterxml.jackson.core:jackson-databind:2.17.2" />
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-databind/2.17.2/jackson-databind-2.17.2.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-annotations/2.17.2/jackson-annotations-2.17.2.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-core/2.17.2/jackson-core-2.17.2.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

View File

@@ -0,0 +1,17 @@
<component name="libraryTable">
<library name="fasterxml.jackson.module.kotlin" type="repository">
<properties maven-id="com.fasterxml.jackson.module:jackson-module-kotlin:2.17.2" />
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/module/jackson-module-kotlin/2.17.2/jackson-module-kotlin-2.17.2.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-databind/2.17.2/jackson-databind-2.17.2.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-core/2.17.2/jackson-core-2.17.2.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-annotations/2.17.2/jackson-annotations-2.17.2.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-reflect/1.7.22/kotlin-reflect-1.7.22.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib/1.7.22/kotlin-stdlib-1.7.22.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-common/1.7.22/kotlin-stdlib-common-1.7.22.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/annotations/13.0/annotations-13.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

11
.idea/libraries/slf4j_simple.xml generated Normal file
View File

@@ -0,0 +1,11 @@
<component name="libraryTable">
<library name="slf4j.simple" type="repository">
<properties maven-id="org.slf4j:slf4j-simple:2.0.16" />
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/slf4j/slf4j-simple/2.0.16/slf4j-simple-2.0.16.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/slf4j/slf4j-api/2.0.16/slf4j-api-2.0.16.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

View File

@@ -0,0 +1,12 @@
<component name="libraryTable">
<library name="tools.jackson.core.databind" type="repository">
<properties maven-id="tools.jackson.core:jackson-databind:3.0.3" />
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/tools/jackson/core/jackson-databind/3.0.3/jackson-databind-3.0.3.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-annotations/2.20/jackson-annotations-2.20.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/tools/jackson/core/jackson-core/3.0.3/jackson-core-3.0.3.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

View File

@@ -0,0 +1,16 @@
<component name="libraryTable">
<library name="tools.jackson.module.kotlin" type="repository">
<properties maven-id="tools.jackson.module:jackson-module-kotlin:3.0.3" />
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/tools/jackson/module/jackson-module-kotlin/3.0.3/jackson-module-kotlin-3.0.3.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/tools/jackson/core/jackson-databind/3.0.3/jackson-databind-3.0.3.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/tools/jackson/core/jackson-core/3.0.3/jackson-core-3.0.3.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-annotations/2.20/jackson-annotations-2.20.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-reflect/2.1.21/kotlin-reflect-2.1.21.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib/2.1.21/kotlin-stdlib-2.1.21.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/annotations/13.0/annotations-13.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

View File

@@ -16,5 +16,8 @@
<orderEntry type="library" name="apache.activemq.client" level="project" /> <orderEntry type="library" name="apache.activemq.client" level="project" />
<orderEntry type="library" name="tinylog.impl" level="project" /> <orderEntry type="library" name="tinylog.impl" level="project" />
<orderEntry type="library" name="mysql.connector.j" level="project" /> <orderEntry type="library" name="mysql.connector.j" level="project" />
<orderEntry type="library" name="slf4j.simple" level="project" />
<orderEntry type="library" name="fasterxml.jackson.core.databind" level="project" />
<orderEntry type="library" name="fasterxml.jackson.module.kotlin" level="project" />
</component> </component>
</module> </module>

18
config.properties Normal file
View File

@@ -0,0 +1,18 @@
#Configuration saved on 2026-01-21T17:17:53.684082100
#Wed Jan 21 17:17:53 WIB 2026
activemq_brokerurl=tcp\://localhost\:61616
activemq_password=admin
activemq_queuename=TEST.QUEUE
activemq_username=admin
mysql_aas1=jdbc\:mysql\://192.168.10.10\:3306/aas
mysql_aas1_password=admin
mysql_aas1_username=admin
mysql_aas2=jdbc\:mysql\://192.168.10.11\:3306/aas
mysql_aas2_password=admin
mysql_aas2_username=admin
mysql_aas3=\ jdbc\:mysql\://192.168.10.12\:3306/aas
mysql_aas3_password=admin
mysql_aas3_username=admin
webpassword=admin
webport=7000
webusername=admin

15
html/assets/js/home.js Normal file
View File

@@ -0,0 +1,15 @@
$(document).ready(function() {
// Your code here
console.log("home.js is loaded and ready.");
$('#logoutbtn').on('click', function() {
// Clear session storage on logout
fetch('/logout').then(() => {
window.location.href = '/login.html';
});
});
});
$(window).on('beforeunload', function() {
console.log("User is leaving home.html");
// Your cleanup code here
});

15
html/assets/js/log.js Normal file
View File

@@ -0,0 +1,15 @@
$(document).ready(function() {
// Your code here
console.log("log.js is loaded and ready.");
$('#logoutbtn').on('click', function() {
// Clear session storage on logout
fetch('/logout').then(() => {
window.location.href = '/login.html';
});
});
});
$(window).on('beforeunload', function() {
console.log("User is leaving log.html");
// Your cleanup code here
});

13
html/assets/js/login.js Normal file
View File

@@ -0,0 +1,13 @@
$(document).ready(function() {
// Your code here
console.log("login.js is loaded and ready.");
const params = new URLSearchParams(window.location.search);
if (params.get("error")) {
alert("Login failed. Please try again.");
}
});
$(window).on('beforeunload', function() {
console.log("User is leaving login.html");
// Your cleanup code here
});

77
html/assets/js/script.js Normal file
View File

@@ -0,0 +1,77 @@
/**
* Checks if a string is valid (not null and not empty)
* @param {string} str
* @returns true if valid, false otherwise
*/
function ValidString(str) {
if (str) {
if (str.length > 0) {
return true;
}
}
return false;
}
/**
* Performs a POST request to the specified URL with the given data.
* @param {string} url Service endpoint URL
* @param {object} data Data to be sent in the request body
* @param {function} onSuccess callback for successful response
* @param {function} onError callback for error response
*/
function Post(url, data, onSuccess, onError) {
fetch(url, {
method: "POST",
body: JSON.stringify(data)
}).then(response => {
if (response.ok) {
return response.json();
} else {
let str = `POST request to ${url} failed. Status: ${response.statusText}`;
throw new Error(str);
}
}).then(data => {
if (onSuccess) {
onSuccess(data);
}
}).catch(error => {
if (ValidString(error.message)) {
if (onError) {
onError(error.message);
} else {
console.error(error.message);
}
} else console.log("An unknown error occurred during POST request.");
});
}
/**
* Performs a GET request to the specified URL.
* @param {string} url Service endpoint URL
* @param {function} onSuccess callback for successful response
* @param {function} onError callback for error response
*/
function Get(url, onSuccess, onError) {
fetch(url).then(response => {
if (response.ok) {
return response.json();
} else {
let str = `GET request to ${url} failed. Status: ${response.statusText}`;
throw new Error(str);
}
}).then(data => {
if (onSuccess) {
onSuccess(data);
}
}).catch(error => {
if (ValidString(error.message)) {
if (onError) {
onError(error.message);
} else {
console.error(error.message);
}
}
else console.log("An unknown error occurred during GET request.");
});
}

168
html/assets/js/setting.js Normal file
View File

@@ -0,0 +1,168 @@
$(document).ready(function () {
// Your code here
console.log("setting.js is loaded and ready.");
loadSetting();
$('#logoutbtn').on('click', function () {
// Clear session storage on logout
fetch('/logout').then(() => {
window.location.href = '/login.html';
});
});
$('#savefarm').on('click', function () {
saveFarmParameter();
});
$('#saveaas').on('click', function () {
saveAASParameter();
});
});
$(window).on('beforeunload', function () {
console.log("User is leaving setting.html");
// Your cleanup code here
});
function loadSetting() {
Get("getSetting", function (data) {
if (data) {
if (data.farm) {
if (data.aas1) {
if (data.aas2) {
if (data.aas3) {
// all good
$('#brokerurl').val(data.farm.url);
$('#brokerusername').val(data.farm.username);
$('#brokerpassword').val(data.farm.password);
$('#brokerqueue').val(data.farm.queue);
$('#aas1url').val(data.aas1.url);
$('#aas1username').val(data.aas1.username);
$('#aas1password').val(data.aas1.password);
$('#aas2url').val(data.aas2.url);
$('#aas2username').val(data.aas2.username);
$('#aas2password').val(data.aas2.password);
$('#aas3url').val(data.aas3.url);
$('#aas3username').val(data.aas3.username);
$('#aas3password').val(data.aas3.password);
} else console.log("No AAS 3 data received");
} else console.log("No AAS 2 data received");
} else console.log("No AAS 1 data received");
} else console.log("No FARM data received");
} else console.log("No data received");
}, function (error) {
alert(error);
})
}
function saveFarmParameter() {
let url = $('#brokerurl').val();
let username = $('#brokerusername').val();
let password = $('#brokerpassword').val();
let queue = $('#brokerqueue').val();
if (ValidString(url) == false) {
alert("FARM Broker URL is required.");
return;
}
if (ValidString(username) == false) {
alert("FARM Broker Username is required.");
return;
}
if (ValidString(password) == false) {
alert("FARM Broker Password is required.");
return;
}
if (ValidString(queue) == false) {
alert("FARM Broker Queue is required.");
return;
}
Post("saveFARM", {
farm: {
url: url,
username: username,
password: password,
queue: queue
}
}, function (data) {
alert(data.message);
}, function (error) {
alert(error);
});
}
function saveAASParameter() {
let aas1URL = $('#aas1url').val();
let aas1username = $('#aas1username').val();
let aas1password = $('#aas1password').val();
let aas2URL = $('#aas2url').val();
let aas2username = $('#aas2username').val();
let aas2password = $('#aas2password').val();
let aas3URL = $('#aas3url').val();
let aas3username = $('#aas3username').val();
let aas3password = $('#aas3password').val();
if (ValidString(aas1URL) == false) {
alert("AAS1 URL is required.");
return;
}
if (ValidString(aas1username) == false) {
alert("AAS1 Username is required.");
return;
}
if (ValidString(aas1password) == false) {
alert("AAS1 Password is required.");
return;
}
if (ValidString(aas2URL) == false) {
alert("AAS2 URL is required.");
return;
}
if (ValidString(aas2username) == false) {
alert("AAS2 Username is required.");
return;
}
if (ValidString(aas2password) == false) {
alert("AAS2 Password is required.");
return;
}
if (ValidString(aas3URL) == false) {
alert("AAS3 URL is required.");
return;
}
if (ValidString(aas3username) == false) {
alert("AAS3 Username is required.");
return;
}
if (ValidString(aas3password) == false) {
alert("AAS3 Password is required.");
return;
}
Post("saveAAS", {
aas1: {
url: aas1URL,
username: aas1username,
password: aas1password
},
aas2: {
url: aas2URL,
username: aas2username,
password: aas2password
},
aas3: {
url: aas3URL,
username: aas3username,
password: aas3password
}
}, function (data) {
alert(data.message);
}, function (error) {
alert(error)
});
}

View File

@@ -15,9 +15,9 @@
<div class="collapse navbar-collapse" id="navcol-1"> <div class="collapse navbar-collapse" id="navcol-1">
<ul class="navbar-nav me-auto"> <ul class="navbar-nav me-auto">
<li class="nav-item"><a class="nav-link active" href="#">Overview</a></li> <li class="nav-item"><a class="nav-link active" href="#">Overview</a></li>
<li class="nav-item"><a class="nav-link" href="#">Setting</a></li> <li class="nav-item"><a class="nav-link" href="setting.html">Setting</a></li>
<li class="nav-item"><a class="nav-link" href="#">Log</a></li> <li class="nav-item"><a class="nav-link" href="log.html">Log</a></li>
</ul><button class="btn btn-primary" type="button">Logout</button> </ul><button class="btn btn-primary" id="logoutbtn" type="button">Logout</button>
</div> </div>
</div> </div>
</nav> </nav>
@@ -30,6 +30,8 @@
<div class="row"></div> <div class="row"></div>
<script src="assets/bootstrap/js/bootstrap.min.js"></script> <script src="assets/bootstrap/js/bootstrap.min.js"></script>
<script src="assets/js/jquery-3.7.1.min.js"></script> <script src="assets/js/jquery-3.7.1.min.js"></script>
<script src="assets/js/home.js"></script>
<script src="assets/js/script.js"></script>
</body> </body>
</html> </html>

View File

@@ -14,10 +14,10 @@
<div class="container"><a class="navbar-brand d-flex align-items-center" href="#"><span class="bs-icon-sm bs-icon-rounded bs-icon-primary d-flex justify-content-center align-items-center me-2 bs-icon"><img class="img-fluid" width="80" height="80" src="assets/img/gtc%20icon%2080x80.png"></span><span>Farm To AAS</span></a><button data-bs-toggle="collapse" class="navbar-toggler" data-bs-target="#navcol-1"><span class="visually-hidden">Toggle navigation</span><span class="navbar-toggler-icon"></span></button> <div class="container"><a class="navbar-brand d-flex align-items-center" href="#"><span class="bs-icon-sm bs-icon-rounded bs-icon-primary d-flex justify-content-center align-items-center me-2 bs-icon"><img class="img-fluid" width="80" height="80" src="assets/img/gtc%20icon%2080x80.png"></span><span>Farm To AAS</span></a><button data-bs-toggle="collapse" class="navbar-toggler" data-bs-target="#navcol-1"><span class="visually-hidden">Toggle navigation</span><span class="navbar-toggler-icon"></span></button>
<div class="collapse navbar-collapse" id="navcol-1"> <div class="collapse navbar-collapse" id="navcol-1">
<ul class="navbar-nav me-auto"> <ul class="navbar-nav me-auto">
<li class="nav-item"><a class="nav-link" href="#">Overview</a></li> <li class="nav-item"><a class="nav-link" href="home.html">Overview</a></li>
<li class="nav-item"><a class="nav-link" href="#">Setting</a></li> <li class="nav-item"><a class="nav-link" href="setting.html">Setting</a></li>
<li class="nav-item"><a class="nav-link active" href="#">Log</a></li> <li class="nav-item"><a class="nav-link active" href="#">Log</a></li>
</ul><button class="btn btn-primary" type="button">Logout</button> </ul><button class="btn btn-primary" id="logoutbtn" type="button">Logout</button>
</div> </div>
</div> </div>
</nav> </nav>
@@ -45,6 +45,8 @@
</div> </div>
<script src="assets/bootstrap/js/bootstrap.min.js"></script> <script src="assets/bootstrap/js/bootstrap.min.js"></script>
<script src="assets/js/jquery-3.7.1.min.js"></script> <script src="assets/js/jquery-3.7.1.min.js"></script>
<script src="assets/js/log.js"></script>
<script src="assets/js/script.js"></script>
</body> </body>
</html> </html>

View File

@@ -28,7 +28,6 @@
<div class="mb-3"><input class="form-control" type="text" name="username" placeholder="Username"></div> <div class="mb-3"><input class="form-control" type="text" name="username" placeholder="Username"></div>
<div class="mb-3"><input class="form-control" type="password" name="password" placeholder="Password"></div> <div class="mb-3"><input class="form-control" type="password" name="password" placeholder="Password"></div>
<div class="mb-3"><button class="btn btn-primary w-100 d-block" type="submit">Login</button></div> <div class="mb-3"><button class="btn btn-primary w-100 d-block" type="submit">Login</button></div>
<p class="text-muted">Forgot your password?</p>
</form> </form>
</div> </div>
</div> </div>
@@ -38,6 +37,8 @@
</section> </section>
<script src="assets/bootstrap/js/bootstrap.min.js"></script> <script src="assets/bootstrap/js/bootstrap.min.js"></script>
<script src="assets/js/jquery-3.7.1.min.js"></script> <script src="assets/js/jquery-3.7.1.min.js"></script>
<script src="assets/js/login.js"></script>
<script src="assets/js/script.js"></script>
</body> </body>
</html> </html>

View File

@@ -14,10 +14,10 @@
<div class="container"><a class="navbar-brand d-flex align-items-center" href="#"><span class="bs-icon-sm bs-icon-rounded bs-icon-primary d-flex justify-content-center align-items-center me-2 bs-icon"><img class="img-fluid" width="80" height="80" src="assets/img/gtc%20icon%2080x80.png"></span><span>Farm To AAS</span></a><button data-bs-toggle="collapse" class="navbar-toggler" data-bs-target="#navcol-1"><span class="visually-hidden">Toggle navigation</span><span class="navbar-toggler-icon"></span></button> <div class="container"><a class="navbar-brand d-flex align-items-center" href="#"><span class="bs-icon-sm bs-icon-rounded bs-icon-primary d-flex justify-content-center align-items-center me-2 bs-icon"><img class="img-fluid" width="80" height="80" src="assets/img/gtc%20icon%2080x80.png"></span><span>Farm To AAS</span></a><button data-bs-toggle="collapse" class="navbar-toggler" data-bs-target="#navcol-1"><span class="visually-hidden">Toggle navigation</span><span class="navbar-toggler-icon"></span></button>
<div class="collapse navbar-collapse" id="navcol-1"> <div class="collapse navbar-collapse" id="navcol-1">
<ul class="navbar-nav me-auto"> <ul class="navbar-nav me-auto">
<li class="nav-item"><a class="nav-link" href="#">Overview</a></li> <li class="nav-item"><a class="nav-link" href="home.html">Overview</a></li>
<li class="nav-item"><a class="nav-link active" href="#">Setting</a></li> <li class="nav-item"><a class="nav-link active" href="#">Setting</a></li>
<li class="nav-item"><a class="nav-link" href="#">Log</a></li> <li class="nav-item"><a class="nav-link" href="log.html">Log</a></li>
</ul><button class="btn btn-primary" type="button">Logout</button> </ul><button class="btn btn-primary" id="logoutbtn" type="button">Logout</button>
</div> </div>
</div> </div>
</nav> </nav>
@@ -49,25 +49,27 @@
<h4 class="card-title">AAS Setting</h4> <h4 class="card-title">AAS Setting</h4>
<div class="col"> <div class="col">
<div class="row mb-1"> <div class="row mb-1">
<div class="col-6"><input class="w-100 h-100 ms-1 me-1" type="text" placeholder="AAS IP 1"></div> <div class="col-6"><input class="w-100 h-100 ms-1 me-1" type="text" id="aas1url" placeholder="AAS IP 1"></div>
<div class="col-3"><input class="w-100 h-100 ms-1 me-1" type="text" placeholder="DB Username"></div> <div class="col-3"><input class="w-100 h-100 ms-1 me-1" type="text" id="aas1username" placeholder="DB Username"></div>
<div class="col-3"><input class="w-100 h-100 ms-1 me-1" type="password" placeholder="DB Password"></div> <div class="col-3"><input class="w-100 h-100 ms-1 me-1" type="password" id="aas1password" placeholder="DB Password"></div>
</div> </div>
<div class="row mb-1"> <div class="row mb-1">
<div class="col-6"><input class="w-100 h-100 ms-1 me-1" type="text" placeholder="AAS IP 2"></div> <div class="col-6"><input class="w-100 h-100 ms-1 me-1" type="text" id="aas2url" placeholder="AAS IP 2"></div>
<div class="col-3"><input class="w-100 h-100 ms-1 me-1" type="text" placeholder="DB Username"></div> <div class="col-3"><input class="w-100 h-100 ms-1 me-1" type="text" id="aas2username" placeholder="DB Username"></div>
<div class="col-3"><input class="w-100 h-100 ms-1 me-1" type="password" placeholder="DB Password"></div> <div class="col-3"><input class="w-100 h-100 ms-1 me-1" type="password" id="aas2password" placeholder="DB Password"></div>
</div> </div>
<div class="row mb-1"> <div class="row mb-1">
<div class="col-6"><input class="w-100 h-100 ms-1 me-1" type="text" placeholder="AAS IP 3"></div> <div class="col-6"><input class="w-100 h-100 ms-1 me-1" type="text" id="aas3url" placeholder="AAS IP 3"></div>
<div class="col-3"><input class="w-100 h-100 ms-1 me-1" type="text" placeholder="DB Username"></div> <div class="col-3"><input class="w-100 h-100 ms-1 me-1" type="text" id="aas3username" placeholder="DB Username"></div>
<div class="col-3"><input class="w-100 h-100 ms-1 me-1" type="password" placeholder="DB Password"></div> <div class="col-3"><input class="w-100 h-100 ms-1 me-1" type="password" id="aas3password" placeholder="DB Password"></div>
</div> </div>
</div><button class="btn btn-primary btn-lg mt-2" id="saveaas" type="button">Save</button> </div><button class="btn btn-primary btn-lg mt-2" id="saveaas" type="button">Save</button>
</div> </div>
</div> </div>
<script src="assets/bootstrap/js/bootstrap.min.js"></script> <script src="assets/bootstrap/js/bootstrap.min.js"></script>
<script src="assets/js/jquery-3.7.1.min.js"></script> <script src="assets/js/jquery-3.7.1.min.js"></script>
<script src="assets/js/script.js"></script>
<script src="assets/js/setting.js"></script>
</body> </body>
</html> </html>

View File

@@ -11,7 +11,7 @@ fun main() {
val webUI = WebUI() val webUI = WebUI()
webUI.Start() webUI.Start()
val activeclient = ActiveMQClient() val activeclient = ActiveMQClient()
activeclient.Start() //activeclient.Start()
val mysql = MySQLInjector() val mysql = MySQLInjector()
mysql.Start() mysql.Start()

View File

@@ -2,6 +2,7 @@ package Web
import config import config
import io.javalin.Javalin import io.javalin.Javalin
import io.javalin.apibuilder.ApiBuilder.before
import io.javalin.apibuilder.ApiBuilder.get import io.javalin.apibuilder.ApiBuilder.get
import io.javalin.apibuilder.ApiBuilder.path import io.javalin.apibuilder.ApiBuilder.path
import io.javalin.apibuilder.ApiBuilder.post import io.javalin.apibuilder.ApiBuilder.post
@@ -14,49 +15,99 @@ import org.tinylog.Logger
*/ */
class WebUI{ class WebUI{
private var app : Javalin = Javalin.create { cfg -> private var app : Javalin = Javalin.create { cfg ->
cfg.staticFiles.add("/html") cfg.staticFiles.add("/")
cfg.router.apiBuilder { cfg.router.apiBuilder {
path("/"){ path("/"){
get { get {
if (config.WebUsername==it.cookie("username")){ if (config.WebUsername==it.cookie("username")){
Logger.info{"${it.ip()} logged in as ${it.cookie("username")}, forward to home.html"}
it.redirect("home.html") it.redirect("home.html")
} else{ } else{
Logger.info{"${it.ip()} have not logged in, forward to login.html"}
it.redirect("login.html") it.redirect("login.html")
} }
} }
} }
path("login"){ path("login.html"){
post{ post{
val username = it.formParam("username") val username = it.formParam("username")
val password = it.formParam("password") val password = it.formParam("password")
if (config.WebUsername==username && config.WebPassword==password) { if (config.WebUsername==username && config.WebPassword==password) {
Logger.info { "${it.ip()} login successful for user $username" }
it.cookie("username", username) it.cookie("username", username)
it.redirect("home.html") it.redirect("home.html")
} else { } else {
Logger.info { "${it.ip()} Login failed for user $username" }
it.redirect("/login.html?error=1") it.redirect("/login.html?error=1")
} }
} }
} }
path("logout"){ path("logout"){
get { get {
Logger.info{"${it.ip()} User ${it.cookie("username")} logged out"}
it.removeCookie("username") it.removeCookie("username")
it.redirect("login.html") it.redirect("login.html")
} }
} }
path("login.html"){
get { get("getSetting"){
it.removeCookie("username") val fd = farmData(config.ActiveMQ_BrokerURL, config.ActiveMQ_Username, config.ActiveMQ_Password, config.ActiveMQ_QueueName)
val aas1 = aasData(config.MySQL_AAS1, config.MySQL_AAS1_Username, config.MySQL_AAS1_Password)
val aas2 = aasData(config.MySQL_AAS2, config.MySQL_AAS2_Username, config.MySQL_AAS2_Password)
val aas3 = aasData(config.MySQL_AAS3, config.MySQL_AAS3_Username, config.MySQL_AAS3_Password)
val setting = getSetting(fd, aas1, aas2, aas3)
it.json(setting)
}
post("saveFARM"){
try{
val fd = it.bodyAsClass(saveFARM::class.java)
config.ActiveMQ_BrokerURL = fd.farm.url
config.ActiveMQ_Username = fd.farm.username
config.ActiveMQ_Password = fd.farm.password
config.ActiveMQ_QueueName = fd.farm.queue
config.Save()
it.json(webReply("success"))
} catch (e: Exception){
val str = "Error saving FARM settings: ${e.message}"
Logger.error { str }
it.status(500).json(webReply(str))
} }
} }
post("saveAAS"){
try {
val ax = it.bodyAsClass(saveAAS::class.java)
config.MySQL_AAS1 = ax.aas1.url
config.MySQL_AAS1_Username = ax.aas1.username
config.MySQL_AAS1_Password = ax.aas1.password
config.MySQL_AAS2 = ax.aas2.url
config.MySQL_AAS2_Username = ax.aas2.username
config.MySQL_AAS2_Password = ax.aas2.password
config.MySQL_AAS3 = ax.aas3.url
config.MySQL_AAS3_Username = ax.aas3.username
config.MySQL_AAS3_Password = ax.aas3.password
config.Save()
it.json(webReply("success"))
} catch (e: Exception){
val str = "Error saving AAS settings: ${e.message}"
Logger.error { str }
it.status(500).json(webReply(str))
}
}
path("home.html"){ path("home.html"){
before{
get {
if (config.WebUsername!=it.cookie("username")){ if (config.WebUsername!=it.cookie("username")){
Logger.info {"${it.ip()} Have not logged in, forward to login.html"}
it.redirect("login.html") it.redirect("login.html")
return@get return@before
}
} }
}
ws("/ws"){ ws -> ws("/ws"){ ws ->
ws.onConnect { wsconnectcontext -> Logger.info { "WebSocket connected: ${wsconnectcontext.sessionId()}"; wsconnectcontext.enableAutomaticPings() } } ws.onConnect { wsconnectcontext -> Logger.info { "WebSocket connected: ${wsconnectcontext.sessionId()}"; wsconnectcontext.enableAutomaticPings() } }
ws.onClose { wsclosecontext -> Logger.info { "WebSocket closed: ${wsclosecontext.sessionId()}" } } ws.onClose { wsclosecontext -> Logger.info { "WebSocket closed: ${wsclosecontext.sessionId()}" } }
@@ -68,27 +119,26 @@ class WebUI{
} }
path("log.html"){ path("log.html"){
get { before{
if (config.WebUsername!=it.cookie("username")){ if (config.WebUsername!=it.cookie("username")){
Logger.info{"${it.ip()} Have not logged in, forward to login.html"}
it.redirect("login.html") it.redirect("login.html")
return@get return@before
} }
val logdate = it.queryParam("logdate") }
if (logdate.isNullOrEmpty()) return@get
} }
}
path("setting.html"){ path("setting.html"){
get { before{
if (config.WebUsername!=it.cookie("username")){ if (config.WebUsername!=it.cookie("username")){
Logger.info{"${it.ip()} Have not logged in, forward to login.html"}
it.redirect("login.html") it.redirect("login.html")
return@get return@before
} }
// TODO send config values in JSON format
}
post {
// TODO save config values from form parameters
} }
} }
} }

3
src/Web/aasData.kt Normal file
View File

@@ -0,0 +1,3 @@
package Web
data class aasData(val url: String, val username: String, val password: String)

3
src/Web/farmData.kt Normal file
View File

@@ -0,0 +1,3 @@
package Web
data class farmData(val url: String, val username: String, val password: String, val queue: String)

3
src/Web/getSetting.kt Normal file
View File

@@ -0,0 +1,3 @@
package Web
data class getSetting(val farm: farmData, val aas1: aasData, val aas2: aasData, val aas3: aasData)

3
src/Web/saveAAS.kt Normal file
View File

@@ -0,0 +1,3 @@
package Web
data class saveAAS(val aas1: aasData, val aas2: aasData, val aas3: aasData)

3
src/Web/saveFARM.kt Normal file
View File

@@ -0,0 +1,3 @@
package Web
data class saveFARM(val farm: farmData)

4
src/Web/webReply.kt Normal file
View File

@@ -0,0 +1,4 @@
package Web
class webReply(val message: String) {
}