Commit 96ee7f0b by Mac Stephens

Finished web core client, values are displayed in test form upon login. for…

Finished web core client, values are displayed in test form upon login. for login, run this on your database:

INSERT INTO users (user_name, user_fullname, user_password, group_id, agency_id)
VALUES ('emsys1', 'emsys', 'emsys01', 3, 0);

Then login with emsys1 as the username and emsys01 as the password.
parent 97545def
...@@ -10,3 +10,11 @@ templateAppServer/Win32/Debug/ ...@@ -10,3 +10,11 @@ templateAppServer/Win32/Debug/
*.identcache *.identcache
*.local *.local
webTemplateApp/__history/
webTemplateApp/css/__history/
webTemplateApp/Win32/Debug/
*.zip
<div class="container-fluid min-vh-100 d-flex align-items-center justify-content-center bg-secondary py-5">
<div class="col-12 col-sm-10 col-md-6 col-lg-4 col-xl-3">
<div class="card border-0 shadow-lg rounded-4 bg-body-secondary">
<div class="card-body p-4 p-md-5">
<div class="text-center mb-4">
<div id="lbl_app_title" class="h4 fw-semibold mb-1">EM Systems Template App</div>
<div id="lbl_sign_in" class="text-muted small">Please Sign In</div>
</div>
<div id="pnl_message" class="alert alert-danger d-none">
<button id="btn_close_notification" type="button" class="btn-close" aria-label="Close"></button>
<span id="lbl_message"></span>
</div>
<div class="mb-3">
<input id="edt_username" class="form-control form-control-lg w-100" type="text" autofocus placeholder="Username">
</div>
<div class="mb-3">
<input id="edt_password" class="form-control form-control-lg w-100" type="password" placeholder="Password">
</div>
<div class="mb-3">
<button id="btn_login" class="btn btn-primary btn-lg w-100">Login</button>
</div>
<div class="text-end text-muted small mt-1">
<span id="lbl_client_version"></span>
</div>
</div>
</div>
</div>
</div>
<div id="div_wrapper">
<nav class="navbar navbar-expand-lg bg-body-tertiary border-bottom shadow-sm">
<div class="container-fluid">
<div class="d-flex align-items-center gap-2">
<a id="lbl_app_title" class="navbar-brand fw-semibold" href="index.html">Koehler-Gibson Orders</a>
<span id="lbl_version" class="badge text-bg-light border text-muted fw-normal"></span>
</div>
<div class="collapse navbar-collapse show" id="pnl_navbar_nav_dropdown">
<ul class="navbar-nav ms-auto">
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle d-flex align-items-center gap-2" id="lnk_navbar_dropdown_menu_link"
role="button" data-bs-toggle="dropdown" aria-expanded="false">
<i class="fa fa-user fa-fw"></i>
<span id="lbl_username" class="fw-semibold">Username</span>
</a>
<ul class="dropdown-menu dropdown-menu-end shadow-sm" aria-labelledby="lnk_navbar_dropdown_menu_link">
<li>
<a class="dropdown-item d-flex align-items-center gap-2" id="lbl_home" href="#">
<i class="fa fa-home fa-fw"></i><span>Home</span>
</a>
</li>
<li>
<a class="dropdown-item d-flex align-items-center gap-2" id="lbl_user_profile" href="#">
<i class="fa fa-user fa-fw"></i><span>User Profile</span>
</a>
</li>
<li><hr class="dropdown-divider"></li>
<li>
<a class="dropdown-item d-flex align-items-center gap-2 text-danger" id="lbl_logout" href="#">
<i class="fa fa-sign-out fa-fw"></i><span>Logout</span>
</a>
</li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
<!-- Toast -->
<div id="pnl_toast_wrapper" class="position-fixed top-0 start-0 mt-5 ms-4"
style="z-index: 1080; min-width: 300px; max-width: 500px;">
<div id="toast_bootstrap" class="toast align-items-center text-white bg-success border-0 shadow" role="alert"
aria-live="assertive" aria-atomic="true">
<div class="d-flex">
<div class="toast-body" id="lbl_bootstrap_toast_body">
Success message
</div>
<button type="button" class="btn-close btn-close-white me-2 m-auto" data-bs-dismiss="toast"
aria-label="Close"></button>
</div>
</div>
</div>
<!-- Main Panel (where all forms display) -->
<div class="container-fluid py-3">
<div class="row">
<div id="pnl_main" class="col-12"></div>
</div>
<div class="row mt-3">
<div class="col-12">
<textarea class="form-control font-monospace" id="memo_debug" rows="4" placeholder="Debug output..."></textarea>
</div>
</div>
</div>
<!-- Spinner Modal -->
<div id="div_spinner" class="position-absolute top-50 start-50 translate-middle d-none">
<div class="lds-roller">
<div></div><div></div><div></div><div></div>
<div></div><div></div><div></div><div></div>
</div>
</div>
<!-- Error Modal -->
<div class="modal fade" id="mdl_error" tabindex="-1" aria-labelledby="lbl_modal_title" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content shadow-lg">
<div class="modal-header">
<h5 class="modal-title" id="lbl_modal_title">Error</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body fs-6 fw-bold" id="lbl_modal_body">
Please contact EMSystems to solve the issue.
</div>
<div class="modal-footer justify-content-center">
<button type="button" id="btn_modal_restart" class="btn btn-primary">Back to Orders</button>
</div>
</div>
</div>
</div>
<!-- Confirmation Modal -->
<div class="modal fade" id="mdl_confirmation" tabindex="-1" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content shadow-lg">
<div class="modal-header">
<h5 class="modal-title">Confirm</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body fw-bold" id="lbl_confirmation_body">
Placeholder text
</div>
<div class="modal-footer justify-content-center">
<button type="button" class="btn btn-primary me-3" id="btn_confirm_left">Cancel</button>
<button type="button" class="btn btn-secondary" id="btn_confirm_right">Confirm</button>
</div>
</div>
</div>
</div>
<!-- Notification Modal -->
<div class="modal fade" id="mdl_notification" tabindex="-1" aria-labelledby="lbl_notification_title"
aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content shadow-lg">
<div class="modal-header">
<h5 class="modal-title" id="lbl_notification_title">Info</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body fs-6 fw-bold" id="lbl_notification_body">
Please contact EMSystems to solve the issue.
</div>
<div class="modal-footer justify-content-center">
<button type="button" id="btn_modal_close" class="btn btn-primary">Close</button>
</div>
</div>
</div>
</div>
</div>
<div class="container py-4">
<div class="d-flex flex-wrap align-items-center justify-content-between gap-3 mb-4">
<div>
<div id="lbl_test" class="h2 fw-semibold mb-1">Test Form</div>
<div class="text-muted">Quick API + JWT/version diagnostics</div>
</div>
<button id="btn_test_api" class="btn btn-primary">Test API</button>
</div>
<div class="card border-0 shadow-sm">
<div class="card-header bg-body-tertiary d-flex align-items-center justify-content-between">
<div class="fw-semibold">Debug Output</div>
</div>
<div class="card-body" style="min-height: 70vh;">
<textarea id="memo_test_debug"
class="form-control font-monospace h-100"
style="min-height: 65vh;"
rows="28"
placeholder="Click “Test API” to populate diagnostics..."></textarea>
</div>
</div>
</div>
{
"AuthUrl" : "http://localhost:2004/emsys/template/auth/",
"ApiUrl" : "http://localhost:2004/emsys/template/api/"
}
is-invalid .form-check-input {
border: 1px solid #dc3545 !important;
}
.is-invalid .form-check-label {
color: #dc3545 !important;
}
.btn-primary {
background-color: #286090 !important;
border-color: #286090 !important;
color: #fff !important;
}
.btn-primary:hover {
background-color: #204d74 !important;
border-color: #204d74 !important;
}
@keyframes slideInLeft {
from {
transform: translateX(-120%);
opacity: 0;
}
to {
transform: translateX(0);
opacity: 1;
}
}
.toast.slide-in {
animation: slideInLeft 0.4s ease-out forwards;
}
#spinner {
position: fixed !important;
z-index: 9999 !important;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.lds-roller {
display: inline-block;
position: relative;
width: 80px;
height: 80px;
}
.lds-roller div {
animation: lds-roller 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;
transform-origin: 40px 40px;
}
.lds-roller div:after {
content: " ";
display: block;
position: absolute;
width: 10px;
height: 10px;
border-radius: 50%;
background: #204d74;
margin: -5px 0 0 -5px;
}
.lds-roller div:nth-child(1) {
animation-delay: -0.036s;
}
.lds-roller div:nth-child(1):after {
top: 63px;
left: 63px;
}
.lds-roller div:nth-child(2) {
animation-delay: -0.072s;
}
.lds-roller div:nth-child(2):after {
top: 68px;
left: 56px;
}
.lds-roller div:nth-child(3) {
animation-delay: -0.108s;
}
.lds-roller div:nth-child(3):after {
top: 71px;
left: 48px;
}
.lds-roller div:nth-child(4) {
animation-delay: -0.144s;
}
.lds-roller div:nth-child(4):after {
top: 72px;
left: 40px;
}
.lds-roller div:nth-child(5) {
animation-delay: -0.18s;
}
.lds-roller div:nth-child(5):after {
top: 71px;
left: 32px;
}
.lds-roller div:nth-child(6) {
animation-delay: -0.216s;
}
.lds-roller div:nth-child(6):after {
top: 68px;
left: 24px;
}
.lds-roller div:nth-child(7) {
animation-delay: -0.252s;
}
.lds-roller div:nth-child(7):after {
top: 63px;
left: 17px;
}
.lds-roller div:nth-child(8) {
animation-delay: -0.288s;
}
.lds-roller div:nth-child(8):after {
top: 56px;
left: 12px;
}
@keyframes lds-roller {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta content="width=device-width, initial-scale=1" name="viewport"/>
<link href="data:;base64,=" rel="icon"/>
<title>EM Systems Template App</title>
<link href="https://cdnjs.cloudflare.com/ajax/libs/flag-icon-css/2.3.1/css/flag-icon.min.css" rel="stylesheet"/>
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"/>
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.0/css/all.min.css" rel="stylesheet"/>
<link href="css/app.css" rel="stylesheet"/>
<link href="css/spinner.css" rel="stylesheet"/>
<script crossorigin="anonymous" integrity="sha256-eKhayi8LEQwp4NKxN+CfCh+3qOVUtJn3QNZ0TciWLP4=" src="https://code.jquery.com/jquery-3.7.1.js"></script>
<link crossorigin="anonymous" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/js/bootstrap.bundle.min.js"></script>
<script src="webTemplateApp.js"></script>
</head>
<body>
<noscript>Your browser does not support JavaScript!</noscript>
<script>rtl.run();</script>
</body>
</html>
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
[2026-01-09 14:04:04.595][1] --LoadServerConfig - start
[2026-01-09 14:04:04.597][1] -- Config file: C:\Projects\emWebAppTemplate\templateAppServer\bin\templateXDataServer.json
[2026-01-09 14:04:04.606][1] -- Config file found.
[2026-01-09 14:04:04.614][1] --TServerConfig.Create - start
[2026-01-09 14:04:04.620][1] --TServerConfig.Create - end
[2026-01-09 14:04:04.627][1] -- localConfig loaded from config file
[2026-01-09 14:04:04.637][1] -- serverConfig.Free - called
[2026-01-09 14:04:04.645][1] -- serverConfig := localConfig - called
[2026-01-09 14:04:04.652][1] --- Server Config Values ---
[2026-01-09 14:04:04.658][1] -- url: http://localhost:2004/emsys/template/ [default]
[2026-01-09 14:04:04.664][1] -- adminPassword: whatisthisusedfor [default]
[2026-01-09 14:04:04.671][1] -- jwtTokenSecret: [from config/default]
[2026-01-09 14:04:04.680][1] -- webAppFolder: static [default]
[2026-01-09 14:04:04.685][1] -- reportsFolder: static\reports\ [default]
[2026-01-09 14:04:04.691][1] --LoadServerConfig - end
[2026-01-09 14:04:04.704][1] ******************************************************
[2026-01-09 14:04:04.710][1] template Server
[2026-01-09 14:04:04.720][1] Version: 1.0.0.0
[2026-01-09 14:04:04.724][1]
[2026-01-09 14:04:04.733][1] by EM Systems, Inc.
[2026-01-09 14:04:04.739][1] ******************************************************
[2026-01-09 14:04:04.754][1] --- Database ---
[2026-01-09 14:04:04.759][1] --Database->Server: 10.208.1.13
[2026-01-09 14:04:04.769][1] --Database->Port: 0
[2026-01-09 14:04:04.775][1] --Database->Database: sleepdb
[2026-01-09 14:04:04.781][1] --Database->Username: hstuser
[2026-01-09 14:04:04.787][1] --Database->Password: emsys!01
[2026-01-09 14:04:04.801][1] --- Settings ---
[2026-01-09 14:04:04.807][1] --Settings->ConsoleLogLevel: 3
[2026-01-09 14:04:04.817][1] --Settings->FileLogLevel: 5
[2026-01-09 14:04:04.821][1] --Settings->LogFileNum: 2
[2026-01-09 14:04:04.869][1] Auth server module listening at "http://localhost:2004/emsys/template/auth"
[2026-01-09 14:04:04.894][1] Api server module listening at "http://localhost:2004/emsys/template/api"
[2026-01-09 14:04:04.920][1] App server module listening at "http://localhost:2004/emsys/template/app", rootDir: static
[2026-01-09 14:14:12.421][1] --LoadServerConfig - start
[2026-01-09 14:14:12.423][1] -- Config file: C:\Projects\emWebAppTemplate\templateAppServer\bin\templateXDataServer.json
[2026-01-09 14:14:12.437][1] -- Config file found.
[2026-01-09 14:14:12.445][1] --TServerConfig.Create - start
[2026-01-09 14:14:12.457][1] --TServerConfig.Create - end
[2026-01-09 14:14:12.473][1] -- localConfig loaded from config file
[2026-01-09 14:14:12.475][1] -- serverConfig.Free - called
[2026-01-09 14:14:12.485][1] -- serverConfig := localConfig - called
[2026-01-09 14:14:12.492][1] --- Server Config Values ---
[2026-01-09 14:14:12.503][1] -- url: http://localhost:2004/emsys/template/ [default]
[2026-01-09 14:14:12.511][1] -- adminPassword: whatisthisusedfor [default]
[2026-01-09 14:14:12.523][1] -- jwtTokenSecret: [from config/default]
[2026-01-09 14:14:12.530][1] -- webAppFolder: static [default]
[2026-01-09 14:14:12.538][1] -- reportsFolder: static\reports\ [default]
[2026-01-09 14:14:12.548][1] --LoadServerConfig - end
[2026-01-09 14:14:12.568][1] ******************************************************
[2026-01-09 14:14:12.580][1] template Server
[2026-01-09 14:14:12.588][1] Version: 1.0.0.0
[2026-01-09 14:14:12.598][1]
[2026-01-09 14:14:12.607][1] by EM Systems, Inc.
[2026-01-09 14:14:12.614][1] ******************************************************
[2026-01-09 14:14:12.633][1] --- Database ---
[2026-01-09 14:14:12.638][1] --Database->Server: 10.208.1.13
[2026-01-09 14:14:12.645][1] --Database->Port: 0
[2026-01-09 14:14:12.654][1] --Database->Database: sleepdb
[2026-01-09 14:14:12.660][1] --Database->Username: hstuser
[2026-01-09 14:14:12.667][1] --Database->Password: emsys!01
[2026-01-09 14:14:12.681][1] --- Settings ---
[2026-01-09 14:14:12.688][1] --Settings->ConsoleLogLevel: 3
[2026-01-09 14:14:12.696][1] --Settings->FileLogLevel: 5
[2026-01-09 14:14:12.705][1] --Settings->LogFileNum: 3
[2026-01-09 14:14:12.813][1] Auth server module listening at "http://localhost:2004/emsys/template/auth"
[2026-01-09 14:14:12.873][1] Api server module listening at "http://localhost:2004/emsys/template/api"
[2026-01-09 14:14:12.894][1] App server module listening at "http://localhost:2004/emsys/template/app", rootDir: static
[2026-01-09 14:14:15.126][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:14:15.147][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/swaggerui HTTP/1.1
[2026-01-09 14:14:15.156][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/swaggerui HTTP/1.1
[2026-01-09 14:14:15.624][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:14:15.658][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/openapi/swagger.json HTTP/1.1
[2026-01-09 14:14:15.661][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/openapi/swagger.json HTTP/1.1
[2026-01-09 14:14:24.128][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:14:24.128][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/auth/AuthService/Login HTTP/1.1
[2026-01-09 14:14:24.142][5] TAuthDatabase.DataModuleCreate
[2026-01-09 14:15:20.954][1] --LoadServerConfig - start
[2026-01-09 14:15:20.956][1] -- Config file: C:\Projects\emWebAppTemplate\templateAppServer\bin\templateXDataServer.json
[2026-01-09 14:15:20.966][1] -- Config file found.
[2026-01-09 14:15:20.974][1] --TServerConfig.Create - start
[2026-01-09 14:15:20.981][1] --TServerConfig.Create - end
[2026-01-09 14:15:20.985][1] -- localConfig loaded from config file
[2026-01-09 14:15:20.992][1] -- serverConfig.Free - called
[2026-01-09 14:15:21.007][1] -- serverConfig := localConfig - called
[2026-01-09 14:15:21.018][1] --- Server Config Values ---
[2026-01-09 14:15:21.027][1] -- url: http://localhost:2004/emsys/template/ [default]
[2026-01-09 14:15:21.037][1] -- adminPassword: whatisthisusedfor [default]
[2026-01-09 14:15:21.048][1] -- jwtTokenSecret: [from config/default]
[2026-01-09 14:15:21.058][1] -- webAppFolder: static [default]
[2026-01-09 14:15:21.069][1] -- reportsFolder: static\reports\ [default]
[2026-01-09 14:15:21.077][1] --LoadServerConfig - end
[2026-01-09 14:15:21.096][1] ******************************************************
[2026-01-09 14:15:21.104][1] template Server
[2026-01-09 14:15:21.113][1] Version: 1.0.0.0
[2026-01-09 14:15:21.122][1]
[2026-01-09 14:15:21.131][1] by EM Systems, Inc.
[2026-01-09 14:15:21.140][1] ******************************************************
[2026-01-09 14:15:21.163][1] --- Database ---
[2026-01-09 14:15:21.173][1] --Database->Server: 192.168.102.129
[2026-01-09 14:15:21.183][1] --Database->Port: 0
[2026-01-09 14:15:21.193][1] --Database->Database: sleepdb
[2026-01-09 14:15:21.202][1] --Database->Username: hstuser
[2026-01-09 14:15:21.212][1] --Database->Password: emsys!01
[2026-01-09 14:15:21.230][1] --- Settings ---
[2026-01-09 14:15:21.239][1] --Settings->ConsoleLogLevel: 3
[2026-01-09 14:15:21.250][1] --Settings->FileLogLevel: 5
[2026-01-09 14:15:21.263][1] --Settings->LogFileNum: 4
[2026-01-09 14:15:21.345][1] Auth server module listening at "http://localhost:2004/emsys/template/auth"
[2026-01-09 14:15:21.373][1] Api server module listening at "http://localhost:2004/emsys/template/api"
[2026-01-09 14:15:21.408][1] App server module listening at "http://localhost:2004/emsys/template/app", rootDir: static
[2026-01-09 14:15:23.781][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:15:23.808][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/swaggerui HTTP/1.1
[2026-01-09 14:15:23.830][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/swaggerui HTTP/1.1
[2026-01-09 14:15:24.303][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:15:24.307][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/openapi/swagger.json HTTP/1.1
[2026-01-09 14:15:24.315][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/openapi/swagger.json HTTP/1.1
[2026-01-09 14:15:33.453][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:15:33.456][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/auth/AuthService/Login HTTP/1.1
[2026-01-09 14:15:33.466][5] TAuthDatabase.DataModuleCreate
[2026-01-09 14:15:44.625][2] --TAuthDatabase.DataModuleCreate -Error connecting to database: #42000Access denied for user 'hstuser'@'192.168.%' to database 'sleepdb'
[2026-01-09 14:15:44.627][5] TAuthService.AfterConstruction - AuthDb created
[2026-01-09 14:15:44.688][3] AuthService.Login - User: "elias"
[2026-01-09 14:15:53.895][1] --LoadServerConfig - start
[2026-01-09 14:15:53.895][1] -- Config file: C:\Projects\emWebAppTemplate\templateAppServer\bin\templateXDataServer.json
[2026-01-09 14:15:53.904][1] -- Config file found.
[2026-01-09 14:15:53.910][1] --TServerConfig.Create - start
[2026-01-09 14:15:53.918][1] --TServerConfig.Create - end
[2026-01-09 14:15:53.924][1] -- localConfig loaded from config file
[2026-01-09 14:15:53.933][1] -- serverConfig.Free - called
[2026-01-09 14:15:53.939][1] -- serverConfig := localConfig - called
[2026-01-09 14:15:53.947][1] --- Server Config Values ---
[2026-01-09 14:15:53.955][1] -- url: http://localhost:2004/emsys/template/ [default]
[2026-01-09 14:15:53.961][1] -- adminPassword: whatisthisusedfor [default]
[2026-01-09 14:15:53.973][1] -- jwtTokenSecret: [from config/default]
[2026-01-09 14:15:53.980][1] -- webAppFolder: static [default]
[2026-01-09 14:15:53.991][1] -- reportsFolder: static\reports\ [default]
[2026-01-09 14:15:54.003][1] --LoadServerConfig - end
[2026-01-09 14:15:54.015][1] ******************************************************
[2026-01-09 14:15:54.025][1] template Server
[2026-01-09 14:15:54.033][1] Version: 1.0.0.0
[2026-01-09 14:15:54.041][1]
[2026-01-09 14:15:54.050][1] by EM Systems, Inc.
[2026-01-09 14:15:54.057][1] ******************************************************
[2026-01-09 14:15:54.076][1] --- Database ---
[2026-01-09 14:15:54.089][1] --Database->Server: 192.168.102.129
[2026-01-09 14:15:54.100][1] --Database->Port: 0
[2026-01-09 14:15:54.107][1] --Database->Database: sleepdb
[2026-01-09 14:15:54.116][1] --Database->Username: hstuser
[2026-01-09 14:15:54.126][1] --Database->Password: emsys!01
[2026-01-09 14:15:54.142][1] --- Settings ---
[2026-01-09 14:15:54.154][1] --Settings->ConsoleLogLevel: 3
[2026-01-09 14:15:54.161][1] --Settings->FileLogLevel: 5
[2026-01-09 14:15:54.170][1] --Settings->LogFileNum: 5
[2026-01-09 14:15:54.293][1] Auth server module listening at "http://localhost:2004/emsys/template/auth"
[2026-01-09 14:15:54.347][1] Api server module listening at "http://localhost:2004/emsys/template/api"
[2026-01-09 14:15:54.389][1] App server module listening at "http://localhost:2004/emsys/template/app", rootDir: static
[2026-01-09 14:16:05.071][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:16:05.090][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/swaggerui HTTP/1.1
[2026-01-09 14:16:05.090][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/swaggerui HTTP/1.1
[2026-01-09 14:16:05.377][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:16:05.384][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/openapi/swagger.json HTTP/1.1
[2026-01-09 14:16:05.400][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/openapi/swagger.json HTTP/1.1
[2026-01-09 14:16:14.447][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:16:14.451][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/auth/AuthService/Login HTTP/1.1
[2026-01-09 14:16:14.462][5] TAuthDatabase.DataModuleCreate
[2026-01-09 14:16:20.791][2] --TAuthDatabase.DataModuleCreate -Error connecting to database: #42000Access denied for user 'hstuser'@'192.168.%' to database 'sleepdb'
[2026-01-09 14:16:20.795][5] TAuthService.AfterConstruction - AuthDb created
[2026-01-09 14:16:20.820][3] AuthService.Login - User: "Elias"
[2026-01-09 14:16:23.088][1] Login failed due to database error: #42000Access denied for user 'hstuser'@'192.168.%' to database 'sleepdb'
[2026-01-09 14:16:23.434][5] TAuthService.BeforeDestruction - AuthDb freed
[2026-01-09 14:16:23.488][1] --Resp.StatusCode: 500 Resp.StatusReason: Internal Server Error on POST /emsys/template/auth/AuthService/Login HTTP/1.1
[2026-01-09 14:16:38.282][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:16:38.303][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/auth/AuthService/Login HTTP/1.1
[2026-01-09 14:16:38.305][5] TAuthDatabase.DataModuleCreate
[2026-01-09 14:16:40.921][2] --TAuthDatabase.DataModuleCreate -Error connecting to database: #42000Access denied for user 'hstuser'@'192.168.%' to database 'sleepdb'
[2026-01-09 14:16:40.934][5] TAuthService.AfterConstruction - AuthDb created
[2026-01-09 14:16:40.948][3] AuthService.Login - User: "Elias"
[2026-01-09 14:16:43.290][1] Login failed due to database error: #42000Access denied for user 'hstuser'@'192.168.%' to database 'sleepdb'
[2026-01-09 14:16:43.871][5] TAuthService.BeforeDestruction - AuthDb freed
[2026-01-09 14:16:43.896][1] --Resp.StatusCode: 500 Resp.StatusReason: Internal Server Error on POST /emsys/template/auth/AuthService/Login HTTP/1.1
[2026-01-09 14:16:53.346][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:16:53.348][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/auth/AuthService/Login HTTP/1.1
[2026-01-09 14:16:53.362][5] TAuthDatabase.DataModuleCreate
[2026-01-09 14:16:55.658][2] --TAuthDatabase.DataModuleCreate -Error connecting to database: #42000Access denied for user 'hstuser'@'192.168.%' to database 'sleepdb'
[2026-01-09 14:16:55.660][5] TAuthService.AfterConstruction - AuthDb created
[2026-01-09 14:16:55.672][3] AuthService.Login - User: "elias"
[2026-01-09 14:16:57.577][1] Login failed due to database error: #42000Access denied for user 'hstuser'@'192.168.%' to database 'sleepdb'
[2026-01-09 14:16:58.080][5] TAuthService.BeforeDestruction - AuthDb freed
[2026-01-09 14:16:58.102][1] --Resp.StatusCode: 500 Resp.StatusReason: Internal Server Error on POST /emsys/template/auth/AuthService/Login HTTP/1.1
[2026-01-09 14:18:02.525][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:18:02.539][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/auth/AuthService/Login HTTP/1.1
[2026-01-09 14:18:02.544][5] TAuthDatabase.DataModuleCreate
[2026-01-09 14:18:09.728][2] --TAuthDatabase.DataModuleCreate -Error connecting to database: #42000Access denied for user 'hstuser'@'192.168.%' to database 'sleepdb'
[2026-01-09 14:18:09.744][5] TAuthService.AfterConstruction - AuthDb created
[2026-01-09 14:18:09.753][3] AuthService.Login - User: "emsys"
[2026-01-09 14:18:12.114][1] Login failed due to database error: #42000Access denied for user 'hstuser'@'192.168.%' to database 'sleepdb'
[2026-01-09 14:18:12.736][5] TAuthService.BeforeDestruction - AuthDb freed
[2026-01-09 14:18:12.769][1] --Resp.StatusCode: 500 Resp.StatusReason: Internal Server Error on POST /emsys/template/auth/AuthService/Login HTTP/1.1
[2026-01-09 14:18:18.121][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:18:18.130][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/auth/AuthService/Login HTTP/1.1
[2026-01-09 14:18:18.137][5] TAuthDatabase.DataModuleCreate
[2026-01-09 14:18:20.563][2] --TAuthDatabase.DataModuleCreate -Error connecting to database: #42000Access denied for user 'hstuser'@'192.168.%' to database 'sleepdb'
[2026-01-09 14:18:20.566][5] TAuthService.AfterConstruction - AuthDb created
[2026-01-09 14:18:20.616][3] AuthService.Login - User: "emsys"
[2026-01-09 14:18:22.090][1] Login failed due to database error: #42000Access denied for user 'hstuser'@'192.168.%' to database 'sleepdb'
[2026-01-09 14:18:22.443][5] TAuthService.BeforeDestruction - AuthDb freed
[2026-01-09 14:18:22.487][1] --Resp.StatusCode: 500 Resp.StatusReason: Internal Server Error on POST /emsys/template/auth/AuthService/Login HTTP/1.1
[2026-01-09 14:23:30.684][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:23:30.693][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/auth/AuthService/Login HTTP/1.1
[2026-01-09 14:23:30.700][5] TAuthDatabase.DataModuleCreate
[2026-01-09 14:25:23.076][1] --LoadServerConfig - start
[2026-01-09 14:25:23.078][1] -- Config file: C:\Projects\emWebAppTemplate\templateAppServer\bin\templateXDataServer.json
[2026-01-09 14:25:23.078][1] -- Config file found.
[2026-01-09 14:25:23.092][1] --TServerConfig.Create - start
[2026-01-09 14:25:23.096][1] --TServerConfig.Create - end
[2026-01-09 14:25:23.113][1] -- localConfig loaded from config file
[2026-01-09 14:25:23.115][1] -- serverConfig.Free - called
[2026-01-09 14:25:23.120][1] -- serverConfig := localConfig - called
[2026-01-09 14:25:23.128][1] --- Server Config Values ---
[2026-01-09 14:25:23.135][1] -- url: http://localhost:2004/emsys/template/ [default]
[2026-01-09 14:25:23.146][1] -- adminPassword: whatisthisusedfor [default]
[2026-01-09 14:25:23.151][1] -- jwtTokenSecret: [from config/default]
[2026-01-09 14:25:23.160][1] -- webAppFolder: static [default]
[2026-01-09 14:25:23.168][1] -- reportsFolder: static\reports\ [default]
[2026-01-09 14:25:23.178][1] --LoadServerConfig - end
[2026-01-09 14:25:23.199][1] ******************************************************
[2026-01-09 14:25:23.208][1] template Server
[2026-01-09 14:25:23.216][1] Version: 1.0.0.0
[2026-01-09 14:25:23.228][1]
[2026-01-09 14:25:23.235][1] by EM Systems, Inc.
[2026-01-09 14:25:23.244][1] ******************************************************
[2026-01-09 14:25:23.264][1] --- Database ---
[2026-01-09 14:25:23.273][1] --Database->Server: 192.168.102.129
[2026-01-09 14:25:23.287][1] --Database->Port: 0
[2026-01-09 14:25:23.300][1] --Database->Database: sleepdb
[2026-01-09 14:25:23.314][1] --Database->Username: hstuser
[2026-01-09 14:25:23.323][1] --Database->Password: emsys!01
[2026-01-09 14:25:23.342][1] --- Settings ---
[2026-01-09 14:25:23.350][1] --Settings->ConsoleLogLevel: 3
[2026-01-09 14:25:23.359][1] --Settings->FileLogLevel: 5
[2026-01-09 14:25:23.368][1] --Settings->LogFileNum: 6
[2026-01-09 14:25:23.436][1] Auth server module listening at "http://localhost:2004/emsys/template/auth"
[2026-01-09 14:25:23.468][1] Api server module listening at "http://localhost:2004/emsys/template/api"
[2026-01-09 14:25:23.528][1] App server module listening at "http://localhost:2004/emsys/template/app", rootDir: static
[2026-01-09 14:25:25.468][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:25:25.500][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/auth/AuthService/Login HTTP/1.1
[2026-01-09 14:25:25.500][5] TAuthDatabase.DataModuleCreate
[2026-01-09 14:25:30.389][2] --TAuthDatabase.DataModuleCreate -Error connecting to database: #42000Access denied for user 'hstuser'@'192.168.%' to database 'sleepdb'
[2026-01-09 14:25:30.391][5] TAuthService.AfterConstruction - AuthDb created
[2026-01-09 14:25:30.416][3] AuthService.Login - User: "emsys1"
[2026-01-09 14:25:37.669][1] --LoadServerConfig - start
[2026-01-09 14:25:37.671][1] -- Config file: C:\Projects\emWebAppTemplate\templateAppServer\bin\templateXDataServer.json
[2026-01-09 14:25:37.686][1] -- Config file found.
[2026-01-09 14:25:37.694][1] --TServerConfig.Create - start
[2026-01-09 14:25:37.706][1] --TServerConfig.Create - end
[2026-01-09 14:25:37.715][1] -- localConfig loaded from config file
[2026-01-09 14:25:37.725][1] -- serverConfig.Free - called
[2026-01-09 14:25:37.737][1] -- serverConfig := localConfig - called
[2026-01-09 14:25:37.751][1] --- Server Config Values ---
[2026-01-09 14:25:37.769][1] -- url: http://localhost:2004/emsys/template/ [default]
[2026-01-09 14:25:37.785][1] -- adminPassword: whatisthisusedfor [default]
[2026-01-09 14:25:37.800][1] -- jwtTokenSecret: [from config/default]
[2026-01-09 14:25:37.814][1] -- webAppFolder: static [default]
[2026-01-09 14:25:37.827][1] -- reportsFolder: static\reports\ [default]
[2026-01-09 14:25:37.835][1] --LoadServerConfig - end
[2026-01-09 14:25:37.858][1] ******************************************************
[2026-01-09 14:25:37.869][1] template Server
[2026-01-09 14:25:37.881][1] Version: 1.0.0.0
[2026-01-09 14:25:37.891][1]
[2026-01-09 14:25:37.902][1] by EM Systems, Inc.
[2026-01-09 14:25:37.915][1] ******************************************************
[2026-01-09 14:25:37.939][1] --- Database ---
[2026-01-09 14:25:37.948][1] --Database->Server: 192.168.102.129
[2026-01-09 14:25:37.962][1] --Database->Port: 0
[2026-01-09 14:25:37.975][1] --Database->Database: sleepdb
[2026-01-09 14:25:37.985][1] --Database->Username: hstuser
[2026-01-09 14:25:37.995][1] --Database->Password: emsys!01
[2026-01-09 14:25:38.015][1] --- Settings ---
[2026-01-09 14:25:38.027][1] --Settings->ConsoleLogLevel: 3
[2026-01-09 14:25:38.039][1] --Settings->FileLogLevel: 5
[2026-01-09 14:25:38.052][1] --Settings->LogFileNum: 7
[2026-01-09 14:25:38.148][1] Auth server module listening at "http://localhost:2004/emsys/template/auth"
[2026-01-09 14:25:38.169][1] Api server module listening at "http://localhost:2004/emsys/template/api"
[2026-01-09 14:25:38.193][1] App server module listening at "http://localhost:2004/emsys/template/app", rootDir: static
[2026-01-09 14:25:40.376][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:25:40.391][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/swaggerui HTTP/1.1
[2026-01-09 14:25:40.393][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/swaggerui HTTP/1.1
[2026-01-09 14:25:41.127][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:25:41.145][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/openapi/swagger.json HTTP/1.1
[2026-01-09 14:25:41.162][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/openapi/swagger.json HTTP/1.1
[2026-01-09 14:25:52.380][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:25:52.388][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/auth/AuthService/Login HTTP/1.1
[2026-01-09 14:25:52.393][5] TAuthDatabase.DataModuleCreate
...@@ -12,3 +12,51 @@ ...@@ -12,3 +12,51 @@
[2026-01-08 16:55:35.370][1] -- jwtTokenSecret: [from config/default] [2026-01-08 16:55:35.370][1] -- jwtTokenSecret: [from config/default]
[2026-01-08 16:55:35.382][1] -- webAppFolder: static [default] [2026-01-08 16:55:35.382][1] -- webAppFolder: static [default]
[2026-01-08 16:55:35.396][1] -- reportsFolder: static\reports\ [default] [2026-01-08 16:55:35.396][1] -- reportsFolder: static\reports\ [default]
[2026-01-09 14:26:04.322][1] --LoadServerConfig - start
[2026-01-09 14:26:04.333][1] -- Config file: C:\Projects\emWebAppTemplate\templateAppServer\bin\templateXDataServer.json
[2026-01-09 14:26:04.345][1] -- Config file found.
[2026-01-09 14:26:04.358][1] --TServerConfig.Create - start
[2026-01-09 14:26:04.365][1] --TServerConfig.Create - end
[2026-01-09 14:26:04.376][1] -- localConfig loaded from config file
[2026-01-09 14:26:04.388][1] -- serverConfig.Free - called
[2026-01-09 14:26:04.394][1] -- serverConfig := localConfig - called
[2026-01-09 14:26:04.402][1] --- Server Config Values ---
[2026-01-09 14:26:04.409][1] -- url: http://localhost:2004/emsys/template/ [default]
[2026-01-09 14:26:04.416][1] -- adminPassword: whatisthisusedfor [default]
[2026-01-09 14:26:04.426][1] -- jwtTokenSecret: [from config/default]
[2026-01-09 14:26:04.435][1] -- webAppFolder: static [default]
[2026-01-09 14:26:04.443][1] -- reportsFolder: static\reports\ [default]
[2026-01-09 14:26:04.452][1] --LoadServerConfig - end
[2026-01-09 14:26:04.472][1] ******************************************************
[2026-01-09 14:26:04.480][1] template Server
[2026-01-09 14:26:04.487][1] Version: 1.0.0.0
[2026-01-09 14:26:04.497][1]
[2026-01-09 14:26:04.505][1] by EM Systems, Inc.
[2026-01-09 14:26:04.512][1] ******************************************************
[2026-01-09 14:26:04.528][1] --- Database ---
[2026-01-09 14:26:04.535][1] --Database->Server: 192.168.102.129
[2026-01-09 14:26:04.543][1] --Database->Port: 0
[2026-01-09 14:26:04.551][1] --Database->Database: sleepdb
[2026-01-09 14:26:04.558][1] --Database->Username: hstuser
[2026-01-09 14:26:04.565][1] --Database->Password: emsys!01
[2026-01-09 14:26:04.581][1] --- Settings ---
[2026-01-09 14:26:04.590][1] --Settings->ConsoleLogLevel: 3
[2026-01-09 14:26:04.596][1] --Settings->FileLogLevel: 5
[2026-01-09 14:26:04.606][1] --Settings->LogFileNum: 8
[2026-01-09 14:26:04.694][1] Auth server module listening at "http://localhost:2004/emsys/template/auth"
[2026-01-09 14:26:04.724][1] Api server module listening at "http://localhost:2004/emsys/template/api"
[2026-01-09 14:26:04.746][1] App server module listening at "http://localhost:2004/emsys/template/app", rootDir: static
[2026-01-09 14:26:05.721][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:26:05.753][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/swaggerui HTTP/1.1
[2026-01-09 14:26:05.776][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/swaggerui HTTP/1.1
[2026-01-09 14:26:06.475][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:26:06.488][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/openapi/swagger.json HTTP/1.1
[2026-01-09 14:26:06.503][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/openapi/swagger.json HTTP/1.1
[2026-01-09 14:26:15.528][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:26:15.533][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/auth/AuthService/Login HTTP/1.1
[2026-01-09 14:26:15.545][5] TAuthDatabase.DataModuleCreate
...@@ -14,3 +14,48 @@ ...@@ -14,3 +14,48 @@
[2026-01-08 17:02:00.949][1] -- jwtTokenSecret: [from config/default] [2026-01-08 17:02:00.949][1] -- jwtTokenSecret: [from config/default]
[2026-01-08 17:02:00.958][1] -- webAppFolder: static [default] [2026-01-08 17:02:00.958][1] -- webAppFolder: static [default]
[2026-01-08 17:02:00.971][1] -- reportsFolder: static\reports\ [default] [2026-01-08 17:02:00.971][1] -- reportsFolder: static\reports\ [default]
[2026-01-09 14:31:23.981][1] --LoadServerConfig - start
[2026-01-09 14:31:23.993][1] -- Config file: C:\Projects\emWebAppTemplate\templateAppServer\bin\templateXDataServer.json
[2026-01-09 14:31:24.004][1] -- Config file found.
[2026-01-09 14:31:24.015][1] --TServerConfig.Create - start
[2026-01-09 14:31:24.023][1] --TServerConfig.Create - end
[2026-01-09 14:31:24.034][1] -- localConfig loaded from config file
[2026-01-09 14:31:24.046][1] -- serverConfig.Free - called
[2026-01-09 14:31:24.054][1] -- serverConfig := localConfig - called
[2026-01-09 14:31:24.066][1] --- Server Config Values ---
[2026-01-09 14:31:24.076][1] -- url: http://localhost:2004/emsys/template/ [default]
[2026-01-09 14:31:24.088][1] -- adminPassword: whatisthisusedfor [default]
[2026-01-09 14:31:24.098][1] -- jwtTokenSecret: [from config/default]
[2026-01-09 14:31:24.110][1] -- webAppFolder: static [default]
[2026-01-09 14:31:24.121][1] -- reportsFolder: static\reports\ [default]
[2026-01-09 14:31:24.131][1] --LoadServerConfig - end
[2026-01-09 14:31:24.159][1] ******************************************************
[2026-01-09 14:31:24.166][1] template Server
[2026-01-09 14:31:24.176][1] Version: 1.0.0.0
[2026-01-09 14:31:24.186][1]
[2026-01-09 14:31:24.197][1] by EM Systems, Inc.
[2026-01-09 14:31:24.208][1] ******************************************************
[2026-01-09 14:31:24.227][1] --- Database ---
[2026-01-09 14:31:24.240][1] --Database->Server: 192.168.102.129
[2026-01-09 14:31:24.251][1] --Database->Port: 0
[2026-01-09 14:31:24.259][1] --Database->Database: sleepdb
[2026-01-09 14:31:24.271][1] --Database->Username: hstuser
[2026-01-09 14:31:24.283][1] --Database->Password: emsys!01
[2026-01-09 14:31:24.304][1] --- Settings ---
[2026-01-09 14:31:24.312][1] --Settings->ConsoleLogLevel: 3
[2026-01-09 14:31:24.322][1] --Settings->FileLogLevel: 5
[2026-01-09 14:31:24.332][1] --Settings->LogFileNum: 9
[2026-01-09 14:31:24.401][1] Auth server module listening at "http://localhost:2004/emsys/template/auth"
[2026-01-09 14:31:24.443][1] Api server module listening at "http://localhost:2004/emsys/template/api"
[2026-01-09 14:31:24.465][1] App server module listening at "http://localhost:2004/emsys/template/app", rootDir: static
[2026-01-09 14:31:33.973][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:31:34.053][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/swaggerui HTTP/1.1
[2026-01-09 14:31:34.058][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/swaggerui HTTP/1.1
[2026-01-09 14:31:34.570][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:31:34.572][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/openapi/swagger.json HTTP/1.1
[2026-01-09 14:31:34.586][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/openapi/swagger.json HTTP/1.1
...@@ -37,3 +37,51 @@ ...@@ -37,3 +37,51 @@
[2026-01-08 17:04:58.193][1] --Settings->JWTSecret: [2026-01-08 17:04:58.193][1] --Settings->JWTSecret:
[2026-01-08 17:04:58.252][1] Auth server module listening at "http://localhost:2004/emsys/template/auth" [2026-01-08 17:04:58.252][1] Auth server module listening at "http://localhost:2004/emsys/template/auth"
[2026-01-09 14:38:10.207][1] --LoadServerConfig - start
[2026-01-09 14:38:10.217][1] -- Config file: C:\Projects\emWebAppTemplate\templateAppServer\bin\templateXDataServer.json
[2026-01-09 14:38:10.227][1] -- Config file found.
[2026-01-09 14:38:10.236][1] --TServerConfig.Create - start
[2026-01-09 14:38:10.245][1] --TServerConfig.Create - end
[2026-01-09 14:38:10.253][1] -- localConfig loaded from config file
[2026-01-09 14:38:10.264][1] -- serverConfig.Free - called
[2026-01-09 14:38:10.273][1] -- serverConfig := localConfig - called
[2026-01-09 14:38:10.285][1] --- Server Config Values ---
[2026-01-09 14:38:10.297][1] -- url: http://localhost:2004/emsys/template/ [default]
[2026-01-09 14:38:10.308][1] -- adminPassword: whatisthisusedfor [default]
[2026-01-09 14:38:10.319][1] -- jwtTokenSecret: [from config/default]
[2026-01-09 14:38:10.328][1] -- webAppFolder: static [default]
[2026-01-09 14:38:10.339][1] -- reportsFolder: static\reports\ [default]
[2026-01-09 14:38:10.346][1] --LoadServerConfig - end
[2026-01-09 14:38:10.367][1] ******************************************************
[2026-01-09 14:38:10.375][1] template Server
[2026-01-09 14:38:10.385][1] Version: 1.0.0.0
[2026-01-09 14:38:10.399][1]
[2026-01-09 14:38:10.409][1] by EM Systems, Inc.
[2026-01-09 14:38:10.419][1] ******************************************************
[2026-01-09 14:38:10.438][1] --- Database ---
[2026-01-09 14:38:10.447][1] --Database->Server: 192.168.102.129
[2026-01-09 14:38:10.454][1] --Database->Port: 0
[2026-01-09 14:38:10.463][1] --Database->Database: sleepdb
[2026-01-09 14:38:10.472][1] --Database->Username: hstuser
[2026-01-09 14:38:10.479][1] --Database->Password: emsys!01
[2026-01-09 14:38:10.497][1] --- Settings ---
[2026-01-09 14:38:10.503][1] --Settings->ConsoleLogLevel: 3
[2026-01-09 14:38:10.510][1] --Settings->FileLogLevel: 5
[2026-01-09 14:38:10.520][1] --Settings->LogFileNum: 10
[2026-01-09 14:38:10.571][1] Auth server module listening at "http://localhost:2004/emsys/template/auth"
[2026-01-09 14:38:10.633][1] Api server module listening at "http://localhost:2004/emsys/template/api"
[2026-01-09 14:38:10.656][1] App server module listening at "http://localhost:2004/emsys/template/app", rootDir: static
[2026-01-09 14:38:14.052][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:38:14.072][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/swaggerui HTTP/1.1
[2026-01-09 14:38:14.099][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/swaggerui HTTP/1.1
[2026-01-09 14:38:14.892][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:38:14.934][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/openapi/swagger.json HTTP/1.1
[2026-01-09 14:38:14.939][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/openapi/swagger.json HTTP/1.1
[2026-01-09 14:38:41.477][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:38:41.479][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/auth/AuthService/Login HTTP/1.1
[2026-01-09 14:38:41.488][5] TAuthDatabase.DataModuleCreate
...@@ -37,3 +37,53 @@ ...@@ -37,3 +37,53 @@
[2026-01-08 17:06:43.713][1] --Settings->JWTSecret: [2026-01-08 17:06:43.713][1] --Settings->JWTSecret:
[2026-01-08 17:06:43.755][1] Auth server module listening at "http://localhost:2004/emsys/template/auth" [2026-01-08 17:06:43.755][1] Auth server module listening at "http://localhost:2004/emsys/template/auth"
[2026-01-09 14:46:58.811][1] --LoadServerConfig - start
[2026-01-09 14:46:58.828][1] -- Config file: C:\Projects\emWebAppTemplate\templateAppServer\bin\templateXDataServer.json
[2026-01-09 14:46:58.834][1] -- Config file found.
[2026-01-09 14:46:58.845][1] --TServerConfig.Create - start
[2026-01-09 14:46:58.849][1] --TServerConfig.Create - end
[2026-01-09 14:46:58.858][1] -- localConfig loaded from config file
[2026-01-09 14:46:58.864][1] -- serverConfig.Free - called
[2026-01-09 14:46:58.871][1] -- serverConfig := localConfig - called
[2026-01-09 14:46:58.881][1] --- Server Config Values ---
[2026-01-09 14:46:58.889][1] -- url: http://localhost:2004/emsys/template/ [default]
[2026-01-09 14:46:58.898][1] -- adminPassword: whatisthisusedfor [default]
[2026-01-09 14:46:58.907][1] -- jwtTokenSecret: [from config/default]
[2026-01-09 14:46:58.914][1] -- webAppFolder: static [default]
[2026-01-09 14:46:58.921][1] -- reportsFolder: static\reports\ [default]
[2026-01-09 14:46:58.931][1] --LoadServerConfig - end
[2026-01-09 14:46:58.947][1] ******************************************************
[2026-01-09 14:46:58.954][1] template Server
[2026-01-09 14:46:58.965][1] Version: 1.0.0.0
[2026-01-09 14:46:58.970][1]
[2026-01-09 14:46:58.979][1] by EM Systems, Inc.
[2026-01-09 14:46:58.989][1] ******************************************************
[2026-01-09 14:46:59.004][1] --- Database ---
[2026-01-09 14:46:59.012][1] --Database->Server: 192.168.102.129
[2026-01-09 14:46:59.018][1] --Database->Port: 0
[2026-01-09 14:46:59.027][1] --Database->Database: sleepdb
[2026-01-09 14:46:59.034][1] --Database->Username: hstuser
[2026-01-09 14:46:59.043][1] --Database->Password: emsys!01
[2026-01-09 14:46:59.058][1] --- Settings ---
[2026-01-09 14:46:59.067][1] --Settings->ConsoleLogLevel: 3
[2026-01-09 14:46:59.078][1] --Settings->FileLogLevel: 5
[2026-01-09 14:46:59.087][1] --Settings->LogFileNum: 11
[2026-01-09 14:46:59.167][1] Auth server module listening at "http://localhost:2004/emsys/template/auth"
[2026-01-09 14:46:59.212][1] Api server module listening at "http://localhost:2004/emsys/template/api"
[2026-01-09 14:46:59.243][1] App server module listening at "http://localhost:2004/emsys/template/app", rootDir: static
[2026-01-09 14:47:02.976][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:47:03.003][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/swaggerui HTTP/1.1
[2026-01-09 14:47:03.005][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/swaggerui HTTP/1.1
[2026-01-09 14:47:03.520][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:47:03.521][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/openapi/swagger.json HTTP/1.1
[2026-01-09 14:47:03.553][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/openapi/swagger.json HTTP/1.1
[2026-01-09 14:47:14.094][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:47:14.096][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/auth/AuthService/Login HTTP/1.1
[2026-01-09 14:47:14.113][5] TAuthDatabase.DataModuleCreate
[2026-01-09 14:47:14.183][5] TAuthService.AfterConstruction - AuthDb created
[2026-01-09 14:47:14.183][3] AuthService.Login - User: "emsys1"
...@@ -37,3 +37,53 @@ ...@@ -37,3 +37,53 @@
[2026-01-08 17:07:51.816][1] --Settings->JWTSecret: [2026-01-08 17:07:51.816][1] --Settings->JWTSecret:
[2026-01-08 17:07:51.904][1] Auth server module listening at "http://localhost:2004/emsys/template/auth" [2026-01-08 17:07:51.904][1] Auth server module listening at "http://localhost:2004/emsys/template/auth"
[2026-01-09 14:47:40.032][1] --LoadServerConfig - start
[2026-01-09 14:47:40.043][1] -- Config file: C:\Projects\emWebAppTemplate\templateAppServer\bin\templateXDataServer.json
[2026-01-09 14:47:40.054][1] -- Config file found.
[2026-01-09 14:47:40.067][1] --TServerConfig.Create - start
[2026-01-09 14:47:40.073][1] --TServerConfig.Create - end
[2026-01-09 14:47:40.082][1] -- localConfig loaded from config file
[2026-01-09 14:47:40.093][1] -- serverConfig.Free - called
[2026-01-09 14:47:40.102][1] -- serverConfig := localConfig - called
[2026-01-09 14:47:40.114][1] --- Server Config Values ---
[2026-01-09 14:47:40.123][1] -- url: http://localhost:2004/emsys/template/ [default]
[2026-01-09 14:47:40.134][1] -- adminPassword: whatisthisusedfor [default]
[2026-01-09 14:47:40.146][1] -- jwtTokenSecret: [from config/default]
[2026-01-09 14:47:40.158][1] -- webAppFolder: static [default]
[2026-01-09 14:47:40.168][1] -- reportsFolder: static\reports\ [default]
[2026-01-09 14:47:40.178][1] --LoadServerConfig - end
[2026-01-09 14:47:40.196][1] ******************************************************
[2026-01-09 14:47:40.209][1] template Server
[2026-01-09 14:47:40.225][1] Version: 1.0.0.0
[2026-01-09 14:47:40.234][1]
[2026-01-09 14:47:40.244][1] by EM Systems, Inc.
[2026-01-09 14:47:40.252][1] ******************************************************
[2026-01-09 14:47:40.275][1] --- Database ---
[2026-01-09 14:47:40.283][1] --Database->Server: 192.168.102.129
[2026-01-09 14:47:40.294][1] --Database->Port: 0
[2026-01-09 14:47:40.303][1] --Database->Database: sleepdb
[2026-01-09 14:47:40.314][1] --Database->Username: hstuser
[2026-01-09 14:47:40.326][1] --Database->Password: emsys!01
[2026-01-09 14:47:40.343][1] --- Settings ---
[2026-01-09 14:47:40.352][1] --Settings->ConsoleLogLevel: 3
[2026-01-09 14:47:40.361][1] --Settings->FileLogLevel: 5
[2026-01-09 14:47:40.370][1] --Settings->LogFileNum: 12
[2026-01-09 14:47:40.460][1] Auth server module listening at "http://localhost:2004/emsys/template/auth"
[2026-01-09 14:47:40.504][1] Api server module listening at "http://localhost:2004/emsys/template/api"
[2026-01-09 14:47:40.533][1] App server module listening at "http://localhost:2004/emsys/template/app", rootDir: static
[2026-01-09 14:47:42.781][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:47:42.802][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/swaggerui HTTP/1.1
[2026-01-09 14:47:42.809][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/swaggerui HTTP/1.1
[2026-01-09 14:47:43.377][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:47:43.384][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/openapi/swagger.json HTTP/1.1
[2026-01-09 14:47:43.406][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/openapi/swagger.json HTTP/1.1
[2026-01-09 14:47:51.950][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:47:51.956][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/auth/AuthService/Login HTTP/1.1
[2026-01-09 14:47:51.964][5] TAuthDatabase.DataModuleCreate
[2026-01-09 14:47:52.103][5] TAuthService.AfterConstruction - AuthDb created
[2026-01-09 14:47:52.119][3] AuthService.Login - User: "emsys1"
...@@ -37,3 +37,53 @@ ...@@ -37,3 +37,53 @@
[2026-01-08 17:09:19.824][1] --Settings->JWTSecret: [2026-01-08 17:09:19.824][1] --Settings->JWTSecret:
[2026-01-08 17:09:19.886][1] Auth server module listening at "http://localhost:2004/emsys/template/auth" [2026-01-08 17:09:19.886][1] Auth server module listening at "http://localhost:2004/emsys/template/auth"
[2026-01-09 14:49:07.035][1] --LoadServerConfig - start
[2026-01-09 14:49:07.046][1] -- Config file: C:\Projects\emWebAppTemplate\templateAppServer\bin\templateXDataServer.json
[2026-01-09 14:49:07.053][1] -- Config file found.
[2026-01-09 14:49:07.062][1] --TServerConfig.Create - start
[2026-01-09 14:49:07.073][1] --TServerConfig.Create - end
[2026-01-09 14:49:07.080][1] -- localConfig loaded from config file
[2026-01-09 14:49:07.088][1] -- serverConfig.Free - called
[2026-01-09 14:49:07.096][1] -- serverConfig := localConfig - called
[2026-01-09 14:49:07.104][1] --- Server Config Values ---
[2026-01-09 14:49:07.112][1] -- url: http://localhost:2004/emsys/template/ [default]
[2026-01-09 14:49:07.121][1] -- adminPassword: whatisthisusedfor [default]
[2026-01-09 14:49:07.130][1] -- jwtTokenSecret: [from config/default]
[2026-01-09 14:49:07.141][1] -- webAppFolder: static [default]
[2026-01-09 14:49:07.150][1] -- reportsFolder: static\reports\ [default]
[2026-01-09 14:49:07.160][1] --LoadServerConfig - end
[2026-01-09 14:49:07.180][1] ******************************************************
[2026-01-09 14:49:07.186][1] template Server
[2026-01-09 14:49:07.197][1] Version: 1.0.0.0
[2026-01-09 14:49:07.204][1]
[2026-01-09 14:49:07.213][1] by EM Systems, Inc.
[2026-01-09 14:49:07.222][1] ******************************************************
[2026-01-09 14:49:07.237][1] --- Database ---
[2026-01-09 14:49:07.248][1] --Database->Server: 192.168.102.129
[2026-01-09 14:49:07.257][1] --Database->Port: 0
[2026-01-09 14:49:07.266][1] --Database->Database: sleepdb
[2026-01-09 14:49:07.274][1] --Database->Username: hstuser
[2026-01-09 14:49:07.284][1] --Database->Password: emsys!01
[2026-01-09 14:49:07.301][1] --- Settings ---
[2026-01-09 14:49:07.311][1] --Settings->ConsoleLogLevel: 3
[2026-01-09 14:49:07.319][1] --Settings->FileLogLevel: 5
[2026-01-09 14:49:07.327][1] --Settings->LogFileNum: 13
[2026-01-09 14:49:07.385][1] Auth server module listening at "http://localhost:2004/emsys/template/auth"
[2026-01-09 14:49:07.461][1] Api server module listening at "http://localhost:2004/emsys/template/api"
[2026-01-09 14:49:07.489][1] App server module listening at "http://localhost:2004/emsys/template/app", rootDir: static
[2026-01-09 14:49:08.980][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:49:09.003][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/swaggerui HTTP/1.1
[2026-01-09 14:49:09.007][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/swaggerui HTTP/1.1
[2026-01-09 14:49:09.695][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:49:09.700][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/openapi/swagger.json HTTP/1.1
[2026-01-09 14:49:09.715][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/openapi/swagger.json HTTP/1.1
[2026-01-09 14:49:18.203][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:49:18.206][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/auth/AuthService/Login HTTP/1.1
[2026-01-09 14:49:18.214][5] TAuthDatabase.DataModuleCreate
[2026-01-09 14:49:18.355][5] TAuthService.AfterConstruction - AuthDb created
[2026-01-09 14:49:18.370][3] AuthService.Login - User: "emsys1"
...@@ -40,3 +40,88 @@ ...@@ -40,3 +40,88 @@
[2026-01-08 17:09:58.782][1] Api server module listening at "http://localhost:2004/emsys/template/api" [2026-01-08 17:09:58.782][1] Api server module listening at "http://localhost:2004/emsys/template/api"
[2026-01-08 17:09:58.805][1] App server module listening at "http://localhost:2004/emsys/template/app", rootDir: static [2026-01-08 17:09:58.805][1] App server module listening at "http://localhost:2004/emsys/template/app", rootDir: static
[2026-01-09 14:51:24.310][1] --LoadServerConfig - start
[2026-01-09 14:51:24.320][1] -- Config file: C:\Projects\emWebAppTemplate\templateAppServer\bin\templateXDataServer.json
[2026-01-09 14:51:24.331][1] -- Config file found.
[2026-01-09 14:51:24.340][1] --TServerConfig.Create - start
[2026-01-09 14:51:24.348][1] --TServerConfig.Create - end
[2026-01-09 14:51:24.363][1] -- localConfig loaded from config file
[2026-01-09 14:51:24.365][1] -- serverConfig.Free - called
[2026-01-09 14:51:24.365][1] -- serverConfig := localConfig - called
[2026-01-09 14:51:24.367][1] --- Server Config Values ---
[2026-01-09 14:51:24.369][1] -- url: http://localhost:2004/emsys/template/ [default]
[2026-01-09 14:51:24.377][1] -- adminPassword: whatisthisusedfor [default]
[2026-01-09 14:51:24.389][1] -- jwtTokenSecret: [from config/default]
[2026-01-09 14:51:24.398][1] -- webAppFolder: static [default]
[2026-01-09 14:51:24.408][1] -- reportsFolder: static\reports\ [default]
[2026-01-09 14:51:24.416][1] --LoadServerConfig - end
[2026-01-09 14:51:24.434][1] ******************************************************
[2026-01-09 14:51:24.443][1] template Server
[2026-01-09 14:51:24.451][1] Version: 1.0.0.0
[2026-01-09 14:51:24.458][1]
[2026-01-09 14:51:24.466][1] by EM Systems, Inc.
[2026-01-09 14:51:24.475][1] ******************************************************
[2026-01-09 14:51:24.493][1] --- Database ---
[2026-01-09 14:51:24.500][1] --Database->Server: 192.168.102.129
[2026-01-09 14:51:24.510][1] --Database->Port: 0
[2026-01-09 14:51:24.518][1] --Database->Database: sleepdb
[2026-01-09 14:51:24.528][1] --Database->Username: hstuser
[2026-01-09 14:51:24.535][1] --Database->Password: emsys!01
[2026-01-09 14:51:24.552][1] --- Settings ---
[2026-01-09 14:51:24.559][1] --Settings->ConsoleLogLevel: 3
[2026-01-09 14:51:24.568][1] --Settings->FileLogLevel: 5
[2026-01-09 14:51:24.574][1] --Settings->LogFileNum: 14
[2026-01-09 14:51:24.617][1] Auth server module listening at "http://localhost:2004/emsys/template/auth"
[2026-01-09 14:51:24.658][1] Api server module listening at "http://localhost:2004/emsys/template/api"
[2026-01-09 14:51:24.694][1] App server module listening at "http://localhost:2004/emsys/template/app", rootDir: static
[2026-01-09 14:51:27.260][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:51:27.353][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/swaggerui HTTP/1.1
[2026-01-09 14:51:27.356][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/swaggerui HTTP/1.1
[2026-01-09 14:51:27.913][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:51:27.937][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/openapi/swagger.json HTTP/1.1
[2026-01-09 14:51:27.962][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/openapi/swagger.json HTTP/1.1
[2026-01-09 14:51:30.946][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:51:30.953][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/auth/AuthService/Login HTTP/1.1
[2026-01-09 14:51:30.969][5] TAuthDatabase.DataModuleCreate
[2026-01-09 14:51:31.317][5] TAuthService.AfterConstruction - AuthDb created
[2026-01-09 14:51:31.321][3] AuthService.Login - User: "emsys1"
[2026-01-09 14:51:31.350][2] Login Error: Invalid username or password
[2026-01-09 14:51:38.905][5] TAuthService.BeforeDestruction - AuthDb freed
[2026-01-09 14:51:38.932][1] --Resp.StatusCode: 401 Resp.StatusReason: Unauthorized on POST /emsys/template/auth/AuthService/Login HTTP/1.1
[2026-01-09 14:51:48.360][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:51:48.366][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/auth/AuthService/Login HTTP/1.1
[2026-01-09 14:51:48.380][5] TAuthDatabase.DataModuleCreate
[2026-01-09 14:51:48.491][5] TAuthService.AfterConstruction - AuthDb created
[2026-01-09 14:51:48.491][3] AuthService.Login - User: "emsys"
[2026-01-09 14:51:48.514][2] Login Error: Invalid username or password
[2026-01-09 14:51:53.029][5] TAuthService.BeforeDestruction - AuthDb freed
[2026-01-09 14:51:53.039][1] --Resp.StatusCode: 401 Resp.StatusReason: Unauthorized on POST /emsys/template/auth/AuthService/Login HTTP/1.1
[2026-01-09 14:52:13.899][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:52:13.924][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/auth/AuthService/Login HTTP/1.1
[2026-01-09 14:52:13.924][5] TAuthDatabase.DataModuleCreate
[2026-01-09 14:52:14.071][5] TAuthService.AfterConstruction - AuthDb created
[2026-01-09 14:52:14.079][3] AuthService.Login - User: "emsys"
[2026-01-09 14:52:14.098][2] Login Error: Invalid username or password
[2026-01-09 14:52:15.876][5] TAuthService.BeforeDestruction - AuthDb freed
[2026-01-09 14:52:15.894][1] --Resp.StatusCode: 401 Resp.StatusReason: Unauthorized on POST /emsys/template/auth/AuthService/Login HTTP/1.1
[2026-01-09 14:52:24.251][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:52:24.263][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/auth/AuthService/Login HTTP/1.1
[2026-01-09 14:52:24.271][5] TAuthDatabase.DataModuleCreate
[2026-01-09 14:52:24.372][5] TAuthService.AfterConstruction - AuthDb created
[2026-01-09 14:52:24.376][3] AuthService.Login - User: "emsys1"
[2026-01-09 14:52:24.392][2] Login Error: Invalid username or password
[2026-01-09 14:52:25.746][5] TAuthService.BeforeDestruction - AuthDb freed
[2026-01-09 14:52:25.771][1] --Resp.StatusCode: 401 Resp.StatusReason: Unauthorized on POST /emsys/template/auth/AuthService/Login HTTP/1.1
[2026-01-09 14:53:37.974][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:53:37.974][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/auth/AuthService/Login HTTP/1.1
[2026-01-09 14:53:37.997][5] TAuthDatabase.DataModuleCreate
[2026-01-09 14:53:38.077][5] TAuthService.AfterConstruction - AuthDb created
[2026-01-09 14:53:38.090][3] AuthService.Login - User: "emsys21"
[2026-01-09 14:53:38.123][2] Login Error: Invalid username or password
[2026-01-09 14:53:42.805][5] TAuthService.BeforeDestruction - AuthDb freed
[2026-01-09 14:53:42.822][1] --Resp.StatusCode: 401 Resp.StatusReason: Unauthorized on POST /emsys/template/auth/AuthService/Login HTTP/1.1
...@@ -39,3 +39,56 @@ ...@@ -39,3 +39,56 @@
[2026-01-08 17:25:33.925][1] Api server module listening at "http://localhost:2004/emsys/template/api" [2026-01-08 17:25:33.925][1] Api server module listening at "http://localhost:2004/emsys/template/api"
[2026-01-08 17:25:33.949][1] App server module listening at "http://localhost:2004/emsys/template/app", rootDir: static [2026-01-08 17:25:33.949][1] App server module listening at "http://localhost:2004/emsys/template/app", rootDir: static
[2026-01-09 14:54:06.741][1] --LoadServerConfig - start
[2026-01-09 14:54:06.756][1] -- Config file: C:\Projects\emWebAppTemplate\templateAppServer\bin\templateXDataServer.json
[2026-01-09 14:54:06.767][1] -- Config file found.
[2026-01-09 14:54:06.782][1] --TServerConfig.Create - start
[2026-01-09 14:54:06.793][1] --TServerConfig.Create - end
[2026-01-09 14:54:06.803][1] -- localConfig loaded from config file
[2026-01-09 14:54:06.817][1] -- serverConfig.Free - called
[2026-01-09 14:54:06.832][1] -- serverConfig := localConfig - called
[2026-01-09 14:54:06.844][1] --- Server Config Values ---
[2026-01-09 14:54:06.858][1] -- url: http://localhost:2004/emsys/template/ [default]
[2026-01-09 14:54:06.868][1] -- adminPassword: whatisthisusedfor [default]
[2026-01-09 14:54:06.880][1] -- jwtTokenSecret: [from config/default]
[2026-01-09 14:54:06.892][1] -- webAppFolder: static [default]
[2026-01-09 14:54:06.903][1] -- reportsFolder: static\reports\ [default]
[2026-01-09 14:54:06.915][1] --LoadServerConfig - end
[2026-01-09 14:54:06.940][1] ******************************************************
[2026-01-09 14:54:06.949][1] template Server
[2026-01-09 14:54:06.959][1] Version: 1.0.0.0
[2026-01-09 14:54:06.969][1]
[2026-01-09 14:54:06.980][1] by EM Systems, Inc.
[2026-01-09 14:54:06.989][1] ******************************************************
[2026-01-09 14:54:07.014][1] --- Database ---
[2026-01-09 14:54:07.028][1] --Database->Server: 192.168.102.129
[2026-01-09 14:54:07.030][1] --Database->Port: 0
[2026-01-09 14:54:07.034][1] --Database->Database: sleepdb
[2026-01-09 14:54:07.036][1] --Database->Username: hstuser
[2026-01-09 14:54:07.038][1] --Database->Password: emsys!01
[2026-01-09 14:54:07.043][1] --- Settings ---
[2026-01-09 14:54:07.056][1] --Settings->ConsoleLogLevel: 3
[2026-01-09 14:54:07.067][1] --Settings->FileLogLevel: 5
[2026-01-09 14:54:07.078][1] --Settings->LogFileNum: 15
[2026-01-09 14:54:07.153][1] Auth server module listening at "http://localhost:2004/emsys/template/auth"
[2026-01-09 14:54:07.208][1] Api server module listening at "http://localhost:2004/emsys/template/api"
[2026-01-09 14:54:07.227][1] App server module listening at "http://localhost:2004/emsys/template/app", rootDir: static
[2026-01-09 14:54:09.286][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:54:09.393][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/swaggerui HTTP/1.1
[2026-01-09 14:54:09.398][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/swaggerui HTTP/1.1
[2026-01-09 14:54:09.926][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:54:09.930][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/openapi/swagger.json HTTP/1.1
[2026-01-09 14:54:09.945][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/openapi/swagger.json HTTP/1.1
[2026-01-09 14:54:22.917][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:54:22.920][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/auth/AuthService/Login HTTP/1.1
[2026-01-09 14:54:22.934][5] TAuthDatabase.DataModuleCreate
[2026-01-09 14:54:23.023][5] TAuthService.AfterConstruction - AuthDb created
[2026-01-09 14:54:23.024][3] AuthService.Login - User: "emsys21"
[2026-01-09 14:54:23.040][2] Login Error: Invalid username or password
[2026-01-09 14:54:25.105][5] TAuthService.BeforeDestruction - AuthDb freed
[2026-01-09 14:54:25.120][1] --Resp.StatusCode: 401 Resp.StatusReason: Unauthorized on POST /emsys/template/auth/AuthService/Login HTTP/1.1
[2026-01-09 12:49:31.094][1] --LoadServerConfig - start
[2026-01-09 12:49:31.096][1] -- Config file: C:\Projects\emWebAppTemplate\templateAppServer\bin\templateXDataServer.json
[2026-01-09 12:49:31.110][1] -- Config file found.
[2026-01-09 12:49:31.131][1] --TServerConfig.Create - start
[2026-01-09 12:49:31.140][1] --TServerConfig.Create - end
[2026-01-09 12:49:31.151][1] -- localConfig loaded from config file
[2026-01-09 12:49:31.162][1] -- serverConfig.Free - called
[2026-01-09 12:49:31.173][1] -- serverConfig := localConfig - called
[2026-01-09 12:49:31.184][1] --- Server Config Values ---
[2026-01-09 12:49:31.206][1] -- url: http://localhost:2004/emsys/template/ [default]
[2026-01-09 12:49:31.218][1] -- adminPassword: whatisthisusedfor [default]
[2026-01-09 12:49:31.221][1] -- jwtTokenSecret: [from config/default]
[2026-01-09 12:49:31.223][1] -- webAppFolder: static [default]
[2026-01-09 12:49:31.225][1] -- reportsFolder: static\reports\ [default]
[2026-01-09 12:49:31.237][1] --LoadServerConfig - end
[2026-01-09 12:49:31.259][1] ******************************************************
[2026-01-09 12:49:31.273][1] template Server
[2026-01-09 12:49:31.287][1] Version: 1.0.0.0
[2026-01-09 12:49:31.313][1]
[2026-01-09 12:49:31.325][1] by EM Systems, Inc.
[2026-01-09 12:49:31.338][1] ******************************************************
[2026-01-09 12:49:31.365][1] --- Database ---
[2026-01-09 12:49:31.379][1] --Database->Server: 10.208.1.13
[2026-01-09 12:49:31.391][1] --Database->Port: 0
[2026-01-09 12:49:31.406][1] --Database->Database: sleepdb
[2026-01-09 12:49:31.417][1] --Database->Username: hstuser
[2026-01-09 12:49:31.427][1] --Database->Password: emsys!01
[2026-01-09 12:49:31.448][1] --- Settings ---
[2026-01-09 12:49:31.462][1] --Settings->ConsoleLogLevel: 3
[2026-01-09 12:49:31.464][1] --Settings->FileLogLevel: 3
[2026-01-09 12:49:31.475][1] --Settings->LogFileNum: 16
[2026-01-09 12:49:31.532][1] Auth server module listening at "http://localhost:2004/emsys/template/auth"
[2026-01-09 12:49:31.577][1] Api server module listening at "http://localhost:2004/emsys/template/api"
[2026-01-09 12:49:31.604][1] App server module listening at "http://localhost:2004/emsys/template/app", rootDir: static
[2026-01-09 15:06:29.524][1] --LoadServerConfig - start
[2026-01-09 15:06:29.524][1] -- Config file: C:\Projects\emWebAppTemplate\templateAppServer\bin\templateXDataServer.json
[2026-01-09 15:06:29.537][1] -- Config file found.
[2026-01-09 15:06:29.553][1] --TServerConfig.Create - start
[2026-01-09 15:06:29.558][1] --TServerConfig.Create - end
[2026-01-09 15:06:29.567][1] -- localConfig loaded from config file
[2026-01-09 15:06:29.574][1] -- serverConfig.Free - called
[2026-01-09 15:06:29.583][1] -- serverConfig := localConfig - called
[2026-01-09 15:06:29.592][1] --- Server Config Values ---
[2026-01-09 15:06:29.600][1] -- url: http://localhost:2004/emsys/template/ [default]
[2026-01-09 15:06:29.609][1] -- adminPassword: whatisthisusedfor [default]
[2026-01-09 15:06:29.621][1] -- jwtTokenSecret: [from config/default]
[2026-01-09 15:06:29.624][1] -- webAppFolder: static [default]
[2026-01-09 15:06:29.626][1] -- reportsFolder: static\reports\ [default]
[2026-01-09 15:06:29.628][1] --LoadServerConfig - end
[2026-01-09 15:06:29.632][1] ******************************************************
[2026-01-09 15:06:29.642][1] template Server
[2026-01-09 15:06:29.658][1] Version: 1.0.0.0
[2026-01-09 15:06:29.660][1]
[2026-01-09 15:06:29.662][1] by EM Systems, Inc.
[2026-01-09 15:06:29.674][1] ******************************************************
[2026-01-09 15:06:29.694][1] --- Database ---
[2026-01-09 15:06:29.700][1] --Database->Server: 192.168.102.129
[2026-01-09 15:06:29.709][1] --Database->Port: 0
[2026-01-09 15:06:29.716][1] --Database->Database: sleepdb
[2026-01-09 15:06:29.726][1] --Database->Username: hstuser
[2026-01-09 15:06:29.738][1] --Database->Password: emsys!01
[2026-01-09 15:06:29.752][1] --- Settings ---
[2026-01-09 15:06:29.761][1] --Settings->ConsoleLogLevel: 3
[2026-01-09 15:06:29.770][1] --Settings->FileLogLevel: 5
[2026-01-09 15:06:29.772][1] --Settings->LogFileNum: 16
[2026-01-09 15:06:29.820][1] Auth server module listening at "http://localhost:2004/emsys/template/auth"
[2026-01-09 15:06:29.852][1] Api server module listening at "http://localhost:2004/emsys/template/api"
[2026-01-09 15:06:29.898][1] App server module listening at "http://localhost:2004/emsys/template/app", rootDir: static
[2026-01-09 15:06:32.336][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 15:06:32.345][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/swaggerui HTTP/1.1
[2026-01-09 15:06:32.375][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/swaggerui HTTP/1.1
[2026-01-09 15:06:33.179][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 15:06:33.186][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/openapi/swagger.json HTTP/1.1
[2026-01-09 15:06:33.244][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/openapi/swagger.json HTTP/1.1
[2026-01-09 15:06:41.235][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 15:06:41.237][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/auth/AuthService/Login HTTP/1.1
[2026-01-09 15:06:41.252][5] TAuthDatabase.DataModuleCreate
[2026-01-09 15:06:41.356][5] TAuthService.AfterConstruction - AuthDb created
[2026-01-09 15:06:41.358][3] AuthService.Login - User: "emsys"
[2026-01-09 15:06:41.391][2] Login Error: Invalid username or password
[2026-01-09 15:06:46.540][5] TAuthService.BeforeDestruction - AuthDb freed
[2026-01-09 15:06:46.589][1] --Resp.StatusCode: 401 Resp.StatusReason: Unauthorized on POST /emsys/template/auth/AuthService/Login HTTP/1.1
[2026-01-09 13:33:23.606][1] --LoadServerConfig - start
[2026-01-09 13:33:23.608][1] -- Config file: C:\Projects\emWebAppTemplate\templateAppServer\bin\templateXDataServer.json
[2026-01-09 13:33:23.617][1] -- Config file found.
[2026-01-09 13:33:23.625][1] --TServerConfig.Create - start
[2026-01-09 13:33:23.634][1] --TServerConfig.Create - end
[2026-01-09 13:33:23.642][1] -- localConfig loaded from config file
[2026-01-09 13:33:23.650][1] -- serverConfig.Free - called
[2026-01-09 13:33:23.658][1] -- serverConfig := localConfig - called
[2026-01-09 13:33:23.665][1] --- Server Config Values ---
[2026-01-09 13:33:23.672][1] -- url: http://localhost:2004/emsys/template/ [default]
[2026-01-09 13:33:23.681][1] -- adminPassword: whatisthisusedfor [default]
[2026-01-09 13:33:23.689][1] -- jwtTokenSecret: [from config/default]
[2026-01-09 13:33:23.696][1] -- webAppFolder: static [default]
[2026-01-09 13:33:23.707][1] -- reportsFolder: static\reports\ [default]
[2026-01-09 13:33:23.718][1] --LoadServerConfig - end
[2026-01-09 13:33:23.737][1] ******************************************************
[2026-01-09 13:33:23.748][1] template Server
[2026-01-09 13:33:23.756][1] Version: 1.0.0.0
[2026-01-09 13:33:23.764][1]
[2026-01-09 13:33:23.768][1] by EM Systems, Inc.
[2026-01-09 13:33:23.770][1] ******************************************************
[2026-01-09 13:33:23.795][1] --- Database ---
[2026-01-09 13:33:23.805][1] --Database->Server: 10.208.1.13
[2026-01-09 13:33:23.812][1] --Database->Port: 0
[2026-01-09 13:33:23.821][1] --Database->Database: sleepdb
[2026-01-09 13:33:23.829][1] --Database->Username: hstuser
[2026-01-09 13:33:23.841][1] --Database->Password: emsys!01
[2026-01-09 13:33:23.860][1] --- Settings ---
[2026-01-09 13:33:23.868][1] --Settings->ConsoleLogLevel: 3
[2026-01-09 13:33:23.877][1] --Settings->FileLogLevel: 3
[2026-01-09 13:33:23.886][1] --Settings->LogFileNum: 17
[2026-01-09 13:33:23.954][1] Auth server module listening at "http://localhost:2004/emsys/template/auth"
[2026-01-09 13:33:24.000][1] Api server module listening at "http://localhost:2004/emsys/template/api"
[2026-01-09 13:33:24.017][1] App server module listening at "http://localhost:2004/emsys/template/app", rootDir: static
[2026-01-09 13:33:26.116][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 13:33:26.128][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/swaggerui HTTP/1.1
[2026-01-09 13:33:26.156][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/swaggerui HTTP/1.1
[2026-01-09 13:33:27.137][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 13:33:27.139][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/openapi/swagger.json HTTP/1.1
[2026-01-09 13:33:27.163][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/openapi/swagger.json HTTP/1.1
[2026-01-09 15:15:05.206][1] --LoadServerConfig - start
[2026-01-09 15:15:05.208][1] -- Config file: C:\Projects\emWebAppTemplate\templateAppServer\bin\templateXDataServer.json
[2026-01-09 15:15:05.220][1] -- Config file found.
[2026-01-09 15:15:05.225][1] --TServerConfig.Create - start
[2026-01-09 15:15:05.237][1] --TServerConfig.Create - end
[2026-01-09 15:15:05.245][1] -- localConfig loaded from config file
[2026-01-09 15:15:05.251][1] -- serverConfig.Free - called
[2026-01-09 15:15:05.251][1] -- serverConfig := localConfig - called
[2026-01-09 15:15:05.272][1] --- Server Config Values ---
[2026-01-09 15:15:05.272][1] -- url: http://localhost:2004/emsys/template/ [default]
[2026-01-09 15:15:05.290][1] -- adminPassword: whatisthisusedfor [default]
[2026-01-09 15:15:05.301][1] -- jwtTokenSecret: [from config/default]
[2026-01-09 15:15:05.308][1] -- webAppFolder: static [default]
[2026-01-09 15:15:05.313][1] -- reportsFolder: static\reports\ [default]
[2026-01-09 15:15:05.323][1] --LoadServerConfig - end
[2026-01-09 15:15:05.327][1] ******************************************************
[2026-01-09 15:15:05.329][1] template Server
[2026-01-09 15:15:05.332][1] Version: 1.0.0.0
[2026-01-09 15:15:05.334][1]
[2026-01-09 15:15:05.336][1] by EM Systems, Inc.
[2026-01-09 15:15:05.336][1] ******************************************************
[2026-01-09 15:15:05.356][1] --- Database ---
[2026-01-09 15:15:05.366][1] --Database->Server: 192.168.102.129
[2026-01-09 15:15:05.373][1] --Database->Port: 0
[2026-01-09 15:15:05.383][1] --Database->Database: sleepdb
[2026-01-09 15:15:05.394][1] --Database->Username: hstuser
[2026-01-09 15:15:05.403][1] --Database->Password: emsys!01
[2026-01-09 15:15:05.419][1] --- Settings ---
[2026-01-09 15:15:05.428][1] --Settings->ConsoleLogLevel: 3
[2026-01-09 15:15:05.438][1] --Settings->FileLogLevel: 5
[2026-01-09 15:15:05.447][1] --Settings->LogFileNum: 17
[2026-01-09 15:15:05.524][1] Auth server module listening at "http://localhost:2004/emsys/template/auth"
[2026-01-09 15:15:05.542][1] Api server module listening at "http://localhost:2004/emsys/template/api"
[2026-01-09 15:15:05.564][1] App server module listening at "http://localhost:2004/emsys/template/app", rootDir: static
[2026-01-09 15:15:07.492][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 15:15:07.498][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/swaggerui HTTP/1.1
[2026-01-09 15:15:07.522][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/swaggerui HTTP/1.1
[2026-01-09 15:15:07.974][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 15:15:07.988][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/openapi/swagger.json HTTP/1.1
[2026-01-09 15:15:08.019][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/openapi/swagger.json HTTP/1.1
[2026-01-09 15:15:16.331][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 15:15:16.334][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/auth/AuthService/Login HTTP/1.1
[2026-01-09 15:15:16.350][5] TAuthDatabase.DataModuleCreate
[2026-01-09 15:15:16.452][5] TAuthService.AfterConstruction - AuthDb created
[2026-01-09 15:15:16.452][3] AuthService.Login - User: "emsys1"
[2026-01-09 15:15:16.468][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on POST /emsys/template/auth/AuthService/Login HTTP/1.1
[2026-01-09 15:15:16.477][5] TAuthService.BeforeDestruction - AuthDb freed
[2026-01-09 14:02:53.929][1] --LoadServerConfig - start
[2026-01-09 14:02:53.932][1] -- Config file: C:\Projects\emWebAppTemplate\templateAppServer\bin\templateXDataServer.json
[2026-01-09 14:02:53.935][1] -- Config file found.
[2026-01-09 14:02:53.945][1] --TServerConfig.Create - start
[2026-01-09 14:02:53.945][1] --TServerConfig.Create - end
[2026-01-09 14:02:53.963][1] -- localConfig loaded from config file
[2026-01-09 14:02:53.972][1] -- serverConfig.Free - called
[2026-01-09 14:02:53.981][1] -- serverConfig := localConfig - called
[2026-01-09 14:02:53.988][1] --- Server Config Values ---
[2026-01-09 14:02:54.001][1] -- url: http://localhost:2004/emsys/template/ [default]
[2026-01-09 14:02:54.012][1] -- adminPassword: whatisthisusedfor [default]
[2026-01-09 14:02:54.020][1] -- jwtTokenSecret: [from config/default]
[2026-01-09 14:02:54.030][1] -- webAppFolder: static [default]
[2026-01-09 14:02:54.038][1] -- reportsFolder: static\reports\ [default]
[2026-01-09 14:02:54.048][1] --LoadServerConfig - end
[2026-01-09 14:02:54.068][1] ******************************************************
[2026-01-09 14:02:54.079][1] template Server
[2026-01-09 14:02:54.089][1] Version: 1.0.0.0
[2026-01-09 14:02:54.097][1]
[2026-01-09 14:02:54.105][1] by EM Systems, Inc.
[2026-01-09 14:02:54.114][1] ******************************************************
[2026-01-09 14:02:54.131][1] --- Database ---
[2026-01-09 14:02:54.139][1] --Database->Server: 10.208.1.13
[2026-01-09 14:02:54.148][1] --Database->Port: 0
[2026-01-09 14:02:54.157][1] --Database->Database: sleepdb
[2026-01-09 14:02:54.163][1] --Database->Username: hstuser
[2026-01-09 14:02:54.174][1] --Database->Password: emsys!01
[2026-01-09 14:02:54.194][1] --- Settings ---
[2026-01-09 14:02:54.203][1] --Settings->ConsoleLogLevel: 3
[2026-01-09 14:02:54.214][1] --Settings->FileLogLevel: 3
[2026-01-09 14:02:54.222][1] --Settings->LogFileNum: 18
[2026-01-09 14:02:54.270][1] Auth server module listening at "http://localhost:2004/emsys/template/auth"
[2026-01-09 14:02:54.322][1] Api server module listening at "http://localhost:2004/emsys/template/api"
[2026-01-09 14:02:54.339][1] App server module listening at "http://localhost:2004/emsys/template/app", rootDir: static
[2026-01-09 14:02:55.998][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:02:56.047][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/swaggerui HTTP/1.1
[2026-01-09 14:02:56.100][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/swaggerui HTTP/1.1
[2026-01-09 14:02:56.622][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:02:56.625][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/openapi/swagger.json HTTP/1.1
[2026-01-09 14:02:56.640][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/openapi/swagger.json HTTP/1.1
[2026-01-09 14:03:05.051][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 14:03:05.057][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/auth/AuthService/Login HTTP/1.1
[2026-01-09 16:37:36.884][1] --LoadServerConfig - start
[2026-01-09 16:37:36.887][1] -- Config file: C:\Projects\emWebAppTemplate\templateAppServer\bin\templateXDataServer.json
[2026-01-09 16:37:36.898][1] -- Config file found.
[2026-01-09 16:37:36.923][1] --TServerConfig.Create - start
[2026-01-09 16:37:36.941][1] --TServerConfig.Create - end
[2026-01-09 16:37:36.959][1] -- localConfig loaded from config file
[2026-01-09 16:37:36.965][1] -- serverConfig.Free - called
[2026-01-09 16:37:36.976][1] -- serverConfig := localConfig - called
[2026-01-09 16:37:36.989][1] --- Server Config Values ---
[2026-01-09 16:37:36.995][1] -- url: http://localhost:2004/emsys/template/ [default]
[2026-01-09 16:37:37.010][1] -- adminPassword: whatisthisusedfor [default]
[2026-01-09 16:37:37.022][1] -- jwtTokenSecret: [from config/default]
[2026-01-09 16:37:37.033][1] -- webAppFolder: static [default]
[2026-01-09 16:37:37.040][1] -- reportsFolder: static\reports\ [default]
[2026-01-09 16:37:37.048][1] --LoadServerConfig - end
[2026-01-09 16:37:37.075][1] ******************************************************
[2026-01-09 16:37:37.119][1] template Server
[2026-01-09 16:37:37.141][1] Version: 1.0.0.0
[2026-01-09 16:37:37.159][1]
[2026-01-09 16:37:37.188][1] by EM Systems, Inc.
[2026-01-09 16:37:37.205][1] ******************************************************
[2026-01-09 16:37:37.219][1] --- Database ---
[2026-01-09 16:37:37.231][1] --Database->Server: 192.168.102.129
[2026-01-09 16:37:37.239][1] --Database->Port: 0
[2026-01-09 16:37:37.255][1] --Database->Database: sleepdb
[2026-01-09 16:37:37.261][1] --Database->Username: hstuser
[2026-01-09 16:37:37.268][1] --Database->Password: emsys!01
[2026-01-09 16:37:37.287][1] --- Settings ---
[2026-01-09 16:37:37.296][1] --Settings->ConsoleLogLevel: 3
[2026-01-09 16:37:37.305][1] --Settings->FileLogLevel: 5
[2026-01-09 16:37:37.311][1] --Settings->LogFileNum: 18
[2026-01-09 16:37:37.364][1] Auth server module listening at "http://localhost:2004/emsys/template/auth"
[2026-01-09 16:37:37.396][1] Api server module listening at "http://localhost:2004/emsys/template/api"
[2026-01-09 16:37:37.409][1] App server module listening at "http://localhost:2004/emsys/template/app", rootDir: static
[2026-01-09 16:52:53.795][1] --LoadServerConfig - start
[2026-01-09 16:52:53.795][1] -- Config file: C:\Projects\emWebAppTemplate\templateAppServer\bin\templateXDataServer.json
[2026-01-09 16:52:53.804][1] -- Config file found.
[2026-01-09 16:52:53.811][1] --TServerConfig.Create - start
[2026-01-09 16:52:53.819][1] --TServerConfig.Create - end
[2026-01-09 16:52:53.828][1] -- localConfig loaded from config file
[2026-01-09 16:52:53.834][1] -- serverConfig.Free - called
[2026-01-09 16:52:53.841][1] -- serverConfig := localConfig - called
[2026-01-09 16:52:53.851][1] --- Server Config Values ---
[2026-01-09 16:52:53.856][1] -- url: http://localhost:2004/emsys/template/ [default]
[2026-01-09 16:52:53.870][1] -- adminPassword: whatisthisusedfor [default]
[2026-01-09 16:52:53.876][1] -- jwtTokenSecret: [from config/default]
[2026-01-09 16:52:53.884][1] -- webAppFolder: static [default]
[2026-01-09 16:52:53.890][1] -- reportsFolder: static\reports\ [default]
[2026-01-09 16:52:53.899][1] --LoadServerConfig - end
[2026-01-09 16:52:53.903][1] ******************************************************
[2026-01-09 16:52:53.905][1] template Server
[2026-01-09 16:52:53.909][1] Version: 1.0.0.0
[2026-01-09 16:52:53.909][1]
[2026-01-09 16:52:53.920][1] by EM Systems, Inc.
[2026-01-09 16:52:53.927][1] ******************************************************
[2026-01-09 16:52:53.944][1] --- Database ---
[2026-01-09 16:52:53.952][1] --Database->Server: 192.168.102.129
[2026-01-09 16:52:53.963][1] --Database->Port: 0
[2026-01-09 16:52:53.970][1] --Database->Database: sleepdb
[2026-01-09 16:52:53.983][1] --Database->Username: hstuser
[2026-01-09 16:52:53.990][1] --Database->Password: emsys!01
[2026-01-09 16:52:54.007][1] --- Settings ---
[2026-01-09 16:52:54.015][1] --Settings->ConsoleLogLevel: 3
[2026-01-09 16:52:54.025][1] --Settings->FileLogLevel: 5
[2026-01-09 16:52:54.030][1] --Settings->LogFileNum: 19
[2026-01-09 16:52:54.087][1] Auth server module listening at "http://localhost:2004/emsys/template/auth"
[2026-01-09 16:52:54.121][1] Api server module listening at "http://localhost:2004/emsys/template/api"
[2026-01-09 16:52:54.143][1] App server module listening at "http://localhost:2004/emsys/template/app", rootDir: static
[2026-01-09 16:58:09.249][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 16:58:09.257][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/$model HTTP/1.1
[2026-01-09 16:58:09.275][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/$model HTTP/1.1
[2026-01-09 16:58:09.310][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 16:58:09.310][1] --Request.RemoteIP: ::1 RequestLogMessage: OPTIONS /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 16:58:09.329][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on OPTIONS /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 16:58:09.339][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 16:58:09.351][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 16:58:09.366][5] TAuthDatabase.DataModuleCreate
[2026-01-09 16:58:09.402][5] TAuthService.AfterConstruction - AuthDb created
[2026-01-09 16:58:09.403][5] TAuthService.VerifyVersion(clientVersion: 0.0.1)
[2026-01-09 16:58:09.415][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on POST /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 16:58:09.430][5] TAuthService.BeforeDestruction - AuthDb freed
[2026-01-09 16:58:24.815][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 16:58:24.826][1] --Request.RemoteIP: ::1 RequestLogMessage: OPTIONS /emsys/template/auth/AuthService/Login/ HTTP/1.1
[2026-01-09 16:58:24.840][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on OPTIONS /emsys/template/auth/AuthService/Login/ HTTP/1.1
[2026-01-09 16:58:24.851][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 16:58:24.867][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/auth/AuthService/Login/ HTTP/1.1
[2026-01-09 16:58:24.872][5] TAuthDatabase.DataModuleCreate
[2026-01-09 16:58:24.908][5] TAuthService.AfterConstruction - AuthDb created
[2026-01-09 16:58:24.909][3] AuthService.Login - User: "emsys"
[2026-01-09 16:58:24.928][2] Login Error: Invalid username or password
[2026-01-09 16:58:31.517][5] TAuthService.BeforeDestruction - AuthDb freed
[2026-01-09 16:58:31.544][1] --Resp.StatusCode: 401 Resp.StatusReason: Unauthorized on POST /emsys/template/auth/AuthService/Login/ HTTP/1.1
[2026-01-09 16:58:43.017][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 16:58:43.019][1] --Request.RemoteIP: ::1 RequestLogMessage: OPTIONS /emsys/template/auth/AuthService/Login/ HTTP/1.1
[2026-01-09 16:58:43.028][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on OPTIONS /emsys/template/auth/AuthService/Login/ HTTP/1.1
[2026-01-09 16:58:43.048][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 16:58:43.061][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/auth/AuthService/Login/ HTTP/1.1
[2026-01-09 16:58:43.068][5] TAuthDatabase.DataModuleCreate
[2026-01-09 16:58:43.103][5] TAuthService.AfterConstruction - AuthDb created
[2026-01-09 16:58:43.106][3] AuthService.Login - User: "emsys1"
[2026-01-09 16:58:43.120][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on POST /emsys/template/auth/AuthService/Login/ HTTP/1.1
[2026-01-09 16:58:43.130][5] TAuthService.BeforeDestruction - AuthDb freed
[2026-01-09 16:58:43.143][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 16:58:43.151][1] --Request.RemoteIP: ::1 RequestLogMessage: OPTIONS /emsys/template/api/$model HTTP/1.1
[2026-01-09 16:58:43.162][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on OPTIONS /emsys/template/api/$model HTTP/1.1
[2026-01-09 16:58:43.175][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 16:58:43.180][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/api/$model HTTP/1.1
[2026-01-09 16:58:43.190][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/api/$model HTTP/1.1
[2026-01-09 16:59:45.186][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 16:59:45.199][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/$model HTTP/1.1
[2026-01-09 16:59:45.210][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/$model HTTP/1.1
[2026-01-09 16:59:45.261][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 16:59:45.279][1] --Request.RemoteIP: ::1 RequestLogMessage: OPTIONS /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 16:59:45.287][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on OPTIONS /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 16:59:45.306][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 16:59:45.332][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 16:59:45.334][5] TAuthDatabase.DataModuleCreate
[2026-01-09 16:59:45.379][5] TAuthService.AfterConstruction - AuthDb created
[2026-01-09 16:59:45.379][5] TAuthService.VerifyVersion(clientVersion: 0.0.1)
[2026-01-09 16:59:45.396][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on POST /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 16:59:45.404][5] TAuthService.BeforeDestruction - AuthDb freed
[2026-01-09 16:59:45.415][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 16:59:45.428][1] --Request.RemoteIP: ::1 RequestLogMessage: OPTIONS /emsys/template/api/$model HTTP/1.1
[2026-01-09 16:59:45.437][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on OPTIONS /emsys/template/api/$model HTTP/1.1
[2026-01-09 16:59:45.467][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 16:59:45.470][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/api/$model HTTP/1.1
[2026-01-09 16:59:45.479][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/api/$model HTTP/1.1
[2026-01-09 16:59:54.138][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 16:59:54.160][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/$model HTTP/1.1
[2026-01-09 16:59:54.177][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/$model HTTP/1.1
[2026-01-09 16:59:54.225][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 16:59:54.230][1] --Request.RemoteIP: ::1 RequestLogMessage: OPTIONS /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 16:59:54.248][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on OPTIONS /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 16:59:54.287][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 16:59:54.290][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 16:59:54.305][5] TAuthDatabase.DataModuleCreate
[2026-01-09 16:59:54.367][5] TAuthService.AfterConstruction - AuthDb created
[2026-01-09 16:59:54.368][5] TAuthService.VerifyVersion(clientVersion: 0.0.1)
[2026-01-09 16:59:54.390][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on POST /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 16:59:54.391][5] TAuthService.BeforeDestruction - AuthDb freed
[2026-01-09 16:59:54.403][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 16:59:54.416][1] --Request.RemoteIP: ::1 RequestLogMessage: OPTIONS /emsys/template/api/$model HTTP/1.1
[2026-01-09 16:59:54.429][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on OPTIONS /emsys/template/api/$model HTTP/1.1
[2026-01-09 16:59:54.457][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 16:59:54.462][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/api/$model HTTP/1.1
[2026-01-09 16:59:54.475][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/api/$model HTTP/1.1
[2026-01-09 17:12:28.253][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:12:28.285][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/$model HTTP/1.1
[2026-01-09 17:12:28.294][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/$model HTTP/1.1
[2026-01-09 17:12:28.325][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:12:28.330][1] --Request.RemoteIP: ::1 RequestLogMessage: OPTIONS /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:12:28.345][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on OPTIONS /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:12:28.368][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:12:28.368][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:12:28.379][5] TAuthDatabase.DataModuleCreate
[2026-01-09 17:12:28.476][5] TAuthService.AfterConstruction - AuthDb created
[2026-01-09 17:12:28.476][5] TAuthService.VerifyVersion(clientVersion: 0.0.1)
[2026-01-09 17:12:28.496][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on POST /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:12:28.505][5] TAuthService.BeforeDestruction - AuthDb freed
[2026-01-09 17:12:28.531][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:12:28.533][1] --Request.RemoteIP: ::1 RequestLogMessage: OPTIONS /emsys/template/api/$model HTTP/1.1
[2026-01-09 17:12:28.540][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on OPTIONS /emsys/template/api/$model HTTP/1.1
[2026-01-09 17:12:28.565][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:12:28.566][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/api/$model HTTP/1.1
[2026-01-09 17:12:28.578][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/api/$model HTTP/1.1
[2026-01-09 17:13:55.613][1] --LoadServerConfig - start
[2026-01-09 17:13:55.617][1] -- Config file: C:\Projects\emWebAppTemplate\templateAppServer\bin\templateXDataServer.json
[2026-01-09 17:13:55.628][1] -- Config file found.
[2026-01-09 17:13:55.636][1] --TServerConfig.Create - start
[2026-01-09 17:13:55.641][1] --TServerConfig.Create - end
[2026-01-09 17:13:55.644][1] -- localConfig loaded from config file
[2026-01-09 17:13:55.651][1] -- serverConfig.Free - called
[2026-01-09 17:13:55.656][1] -- serverConfig := localConfig - called
[2026-01-09 17:13:55.663][1] --- Server Config Values ---
[2026-01-09 17:13:55.667][1] -- url: http://localhost:2004/emsys/template/ [default]
[2026-01-09 17:13:55.675][1] -- adminPassword: whatisthisusedfor [default]
[2026-01-09 17:13:55.684][1] -- jwtTokenSecret: [from config/default]
[2026-01-09 17:13:55.693][1] -- webAppFolder: static [default]
[2026-01-09 17:13:55.699][1] -- reportsFolder: static\reports\ [default]
[2026-01-09 17:13:55.704][1] --LoadServerConfig - end
[2026-01-09 17:13:55.718][1] ******************************************************
[2026-01-09 17:13:55.726][1] template Server
[2026-01-09 17:13:55.734][1] Version: 1.0.0.0
[2026-01-09 17:13:55.743][1]
[2026-01-09 17:13:55.753][1] by EM Systems, Inc.
[2026-01-09 17:13:55.762][1] ******************************************************
[2026-01-09 17:13:55.784][1] --- Database ---
[2026-01-09 17:13:55.793][1] --Database->Server: 192.168.102.129
[2026-01-09 17:13:55.802][1] --Database->Port: 0
[2026-01-09 17:13:55.812][1] --Database->Database: sleepdb
[2026-01-09 17:13:55.820][1] --Database->Username: hstuser
[2026-01-09 17:13:55.826][1] --Database->Password: emsys!01
[2026-01-09 17:13:55.841][1] --- Settings ---
[2026-01-09 17:13:55.849][1] --Settings->ConsoleLogLevel: 3
[2026-01-09 17:13:55.856][1] --Settings->FileLogLevel: 5
[2026-01-09 17:13:55.882][1] --Settings->LogFileNum: 20
[2026-01-09 17:13:55.991][1] Auth server module listening at "http://localhost:2004/emsys/template/auth"
[2026-01-09 17:13:56.024][1] Api server module listening at "http://localhost:2004/emsys/template/api"
[2026-01-09 17:13:56.094][1] App server module listening at "http://localhost:2004/emsys/template/app", rootDir: static
[2026-01-09 17:14:01.818][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:14:01.854][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/$model HTTP/1.1
[2026-01-09 17:14:01.869][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/$model HTTP/1.1
[2026-01-09 17:14:01.897][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:14:01.898][1] --Request.RemoteIP: ::1 RequestLogMessage: OPTIONS /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:14:01.926][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on OPTIONS /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:14:01.948][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:14:01.950][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:14:01.958][5] TAuthDatabase.DataModuleCreate
[2026-01-09 17:14:02.082][5] TAuthService.AfterConstruction - AuthDb created
[2026-01-09 17:14:02.083][5] TAuthService.VerifyVersion(clientVersion: 0.0.1)
[2026-01-09 17:14:02.095][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on POST /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:14:02.101][5] TAuthService.BeforeDestruction - AuthDb freed
[2026-01-09 17:14:02.111][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:14:02.118][1] --Request.RemoteIP: ::1 RequestLogMessage: OPTIONS /emsys/template/api/$model HTTP/1.1
[2026-01-09 17:14:02.127][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on OPTIONS /emsys/template/api/$model HTTP/1.1
[2026-01-09 17:14:02.154][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:14:02.155][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/api/$model HTTP/1.1
[2026-01-09 17:14:02.164][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/api/$model HTTP/1.1
[2026-01-09 17:14:04.112][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:14:04.114][1] --Request.RemoteIP: ::1 RequestLogMessage: OPTIONS /emsys/template/api/ApiService/TestApi/ HTTP/1.1
[2026-01-09 17:14:04.132][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on OPTIONS /emsys/template/api/ApiService/TestApi/ HTTP/1.1
[2026-01-09 17:14:04.154][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:14:04.159][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/api/ApiService/TestApi/ HTTP/1.1
[2026-01-09 17:14:04.166][1] TApiService.Create
[2026-01-09 17:14:04.179][1] TApiDatabase.DataModuleCreate
[2026-01-09 17:15:26.198][1] --LoadServerConfig - start
[2026-01-09 17:15:26.198][1] -- Config file: C:\Projects\emWebAppTemplate\templateAppServer\bin\templateXDataServer.json
[2026-01-09 17:15:26.204][1] -- Config file found.
[2026-01-09 17:15:26.217][1] --TServerConfig.Create - start
[2026-01-09 17:15:26.222][1] --TServerConfig.Create - end
[2026-01-09 17:15:26.229][1] -- localConfig loaded from config file
[2026-01-09 17:15:26.234][1] -- serverConfig.Free - called
[2026-01-09 17:15:26.240][1] -- serverConfig := localConfig - called
[2026-01-09 17:15:26.248][1] --- Server Config Values ---
[2026-01-09 17:15:26.255][1] -- url: http://localhost:2004/emsys/template/ [default]
[2026-01-09 17:15:26.255][1] -- adminPassword: whatisthisusedfor [default]
[2026-01-09 17:15:26.267][1] -- jwtTokenSecret: [from config/default]
[2026-01-09 17:15:26.275][1] -- webAppFolder: static [default]
[2026-01-09 17:15:26.281][1] -- reportsFolder: static\reports\ [default]
[2026-01-09 17:15:26.289][1] --LoadServerConfig - end
[2026-01-09 17:15:26.302][1] ******************************************************
[2026-01-09 17:15:26.311][1] template Server
[2026-01-09 17:15:26.320][1] Version: 1.0.0.0
[2026-01-09 17:15:26.328][1]
[2026-01-09 17:15:26.334][1] by EM Systems, Inc.
[2026-01-09 17:15:26.344][1] ******************************************************
[2026-01-09 17:15:26.357][1] --- Database ---
[2026-01-09 17:15:26.363][1] --Database->Server: 192.168.102.129
[2026-01-09 17:15:26.369][1] --Database->Port: 0
[2026-01-09 17:15:26.376][1] --Database->Database: sleepdb
[2026-01-09 17:15:26.382][1] --Database->Username: hstuser
[2026-01-09 17:15:26.392][1] --Database->Password: emsys!01
[2026-01-09 17:15:26.407][1] --- Settings ---
[2026-01-09 17:15:26.413][1] --Settings->ConsoleLogLevel: 3
[2026-01-09 17:15:26.421][1] --Settings->FileLogLevel: 5
[2026-01-09 17:15:26.427][1] --Settings->LogFileNum: 21
[2026-01-09 17:15:26.483][1] Auth server module listening at "http://localhost:2004/emsys/template/auth"
[2026-01-09 17:15:26.508][1] Api server module listening at "http://localhost:2004/emsys/template/api"
[2026-01-09 17:15:26.527][1] App server module listening at "http://localhost:2004/emsys/template/app", rootDir: static
[2026-01-09 17:15:36.972][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:15:37.006][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/$model HTTP/1.1
[2026-01-09 17:15:37.021][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/$model HTTP/1.1
[2026-01-09 17:15:37.061][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:15:37.067][1] --Request.RemoteIP: ::1 RequestLogMessage: OPTIONS /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:15:37.072][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on OPTIONS /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:15:37.104][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:15:37.115][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:15:37.117][5] TAuthDatabase.DataModuleCreate
[2026-01-09 17:15:37.197][5] TAuthService.AfterConstruction - AuthDb created
[2026-01-09 17:15:37.197][5] TAuthService.VerifyVersion(clientVersion: 0.0.1)
[2026-01-09 17:15:37.215][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on POST /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:15:37.222][5] TAuthService.BeforeDestruction - AuthDb freed
[2026-01-09 17:15:37.245][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:15:37.254][1] --Request.RemoteIP: ::1 RequestLogMessage: OPTIONS /emsys/template/api/$model HTTP/1.1
[2026-01-09 17:15:37.277][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on OPTIONS /emsys/template/api/$model HTTP/1.1
[2026-01-09 17:15:37.309][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:15:37.323][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/api/$model HTTP/1.1
[2026-01-09 17:15:37.351][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/api/$model HTTP/1.1
[2026-01-09 17:15:39.208][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:15:39.209][1] --Request.RemoteIP: ::1 RequestLogMessage: OPTIONS /emsys/template/api/ApiService/TestApi/ HTTP/1.1
[2026-01-09 17:15:39.237][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on OPTIONS /emsys/template/api/ApiService/TestApi/ HTTP/1.1
[2026-01-09 17:15:39.241][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:15:39.245][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/api/ApiService/TestApi/ HTTP/1.1
[2026-01-09 17:15:39.261][1] TApiService.Create
[2026-01-09 17:15:39.269][1] TApiDatabase.DataModuleCreate
[2026-01-09 17:19:48.354][1] --LoadServerConfig - start
[2026-01-09 17:19:48.354][1] -- Config file: C:\Projects\emWebAppTemplate\templateAppServer\bin\templateXDataServer.json
[2026-01-09 17:19:48.363][1] -- Config file found.
[2026-01-09 17:19:48.371][1] --TServerConfig.Create - start
[2026-01-09 17:19:48.375][1] --TServerConfig.Create - end
[2026-01-09 17:19:48.380][1] -- localConfig loaded from config file
[2026-01-09 17:19:48.388][1] -- serverConfig.Free - called
[2026-01-09 17:19:48.393][1] -- serverConfig := localConfig - called
[2026-01-09 17:19:48.398][1] --- Server Config Values ---
[2026-01-09 17:19:48.404][1] -- url: http://localhost:2004/emsys/template/ [default]
[2026-01-09 17:19:48.412][1] -- adminPassword: whatisthisusedfor [default]
[2026-01-09 17:19:48.417][1] -- jwtTokenSecret: [from config/default]
[2026-01-09 17:19:48.423][1] -- webAppFolder: static [default]
[2026-01-09 17:19:48.432][1] -- reportsFolder: static\reports\ [default]
[2026-01-09 17:19:48.437][1] --LoadServerConfig - end
[2026-01-09 17:19:48.451][1] ******************************************************
[2026-01-09 17:19:48.459][1] template Server
[2026-01-09 17:19:48.468][1] Version: 1.0.0.0
[2026-01-09 17:19:48.472][1]
[2026-01-09 17:19:48.478][1] by EM Systems, Inc.
[2026-01-09 17:19:48.485][1] ******************************************************
[2026-01-09 17:19:48.499][1] --- Database ---
[2026-01-09 17:19:48.506][1] --Database->Server: 192.168.102.129
[2026-01-09 17:19:48.514][1] --Database->Port: 0
[2026-01-09 17:19:48.520][1] --Database->Database: sleepdb
[2026-01-09 17:19:48.529][1] --Database->Username: hstuser
[2026-01-09 17:19:48.534][1] --Database->Password: emsys!01
[2026-01-09 17:19:48.548][1] --- Settings ---
[2026-01-09 17:19:48.555][1] --Settings->ConsoleLogLevel: 3
[2026-01-09 17:19:48.563][1] --Settings->FileLogLevel: 5
[2026-01-09 17:19:48.571][1] --Settings->LogFileNum: 22
[2026-01-09 17:19:48.610][1] Auth server module listening at "http://localhost:2004/emsys/template/auth"
[2026-01-09 17:19:48.627][1] Api server module listening at "http://localhost:2004/emsys/template/api"
[2026-01-09 17:19:48.665][1] App server module listening at "http://localhost:2004/emsys/template/app", rootDir: static
[2026-01-09 17:20:47.865][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:20:47.874][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/$model HTTP/1.1
[2026-01-09 17:20:47.895][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/$model HTTP/1.1
[2026-01-09 17:20:47.925][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:20:47.941][1] --Request.RemoteIP: ::1 RequestLogMessage: OPTIONS /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:20:47.942][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on OPTIONS /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:20:47.973][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:20:47.976][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:20:47.982][5] TAuthDatabase.DataModuleCreate
[2026-01-09 17:20:48.112][5] TAuthService.AfterConstruction - AuthDb created
[2026-01-09 17:20:48.113][5] TAuthService.VerifyVersion(clientVersion: 0.0.1)
[2026-01-09 17:20:48.122][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on POST /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:20:48.136][5] TAuthService.BeforeDestruction - AuthDb freed
[2026-01-09 17:20:48.164][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:20:48.166][1] --Request.RemoteIP: ::1 RequestLogMessage: OPTIONS /emsys/template/api/$model HTTP/1.1
[2026-01-09 17:20:48.179][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on OPTIONS /emsys/template/api/$model HTTP/1.1
[2026-01-09 17:20:48.200][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:20:48.202][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/api/$model HTTP/1.1
[2026-01-09 17:20:48.208][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/api/$model HTTP/1.1
[2026-01-09 17:21:15.671][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:21:15.671][1] --Request.RemoteIP: ::1 RequestLogMessage: OPTIONS /emsys/template/api/ApiService/TestApi/ HTTP/1.1
[2026-01-09 17:21:15.693][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on OPTIONS /emsys/template/api/ApiService/TestApi/ HTTP/1.1
[2026-01-09 17:21:15.710][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:21:15.717][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/api/ApiService/TestApi/ HTTP/1.1
[2026-01-09 17:21:15.718][1] TApiService.Create
[2026-01-09 17:21:15.733][5] TApiDatabase.DataModuleCreate
[2026-01-09 17:21:15.814][3] IApiService.TestApi called
[2026-01-09 17:21:15.821][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on POST /emsys/template/api/ApiService/TestApi/ HTTP/1.1
[2026-01-09 17:21:15.825][1] TApiService.Destroy
[2026-01-09 17:30:41.255][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:30:41.280][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/$model HTTP/1.1
[2026-01-09 17:30:41.296][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/$model HTTP/1.1
[2026-01-09 17:30:41.316][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:30:41.322][1] --Request.RemoteIP: ::1 RequestLogMessage: OPTIONS /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:30:41.329][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on OPTIONS /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:30:41.346][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:30:41.358][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:30:41.372][5] TAuthDatabase.DataModuleCreate
[2026-01-09 17:30:41.428][5] TAuthService.AfterConstruction - AuthDb created
[2026-01-09 17:30:41.430][5] TAuthService.VerifyVersion(clientVersion: 0.0.1)
[2026-01-09 17:30:41.454][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on POST /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:30:41.465][5] TAuthService.BeforeDestruction - AuthDb freed
[2026-01-09 17:30:41.485][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:30:41.499][1] --Request.RemoteIP: ::1 RequestLogMessage: OPTIONS /emsys/template/api/$model HTTP/1.1
[2026-01-09 17:30:41.519][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on OPTIONS /emsys/template/api/$model HTTP/1.1
[2026-01-09 17:30:41.537][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:30:41.548][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/api/$model HTTP/1.1
[2026-01-09 17:30:41.580][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/api/$model HTTP/1.1
[2026-01-09 17:33:22.470][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:33:22.473][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/$model HTTP/1.1
[2026-01-09 17:33:22.495][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/$model HTTP/1.1
[2026-01-09 17:33:22.523][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:33:22.545][1] --Request.RemoteIP: ::1 RequestLogMessage: OPTIONS /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:33:22.547][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on OPTIONS /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:33:22.585][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:33:22.587][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:33:22.595][5] TAuthDatabase.DataModuleCreate
[2026-01-09 17:33:22.659][5] TAuthService.AfterConstruction - AuthDb created
[2026-01-09 17:33:22.659][5] TAuthService.VerifyVersion(clientVersion: 0.0.1)
[2026-01-09 17:33:22.677][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on POST /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:33:22.685][5] TAuthService.BeforeDestruction - AuthDb freed
[2026-01-09 17:37:50.755][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:37:50.757][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/$model HTTP/1.1
[2026-01-09 17:37:50.768][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/$model HTTP/1.1
[2026-01-09 17:37:50.818][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:37:50.820][1] --Request.RemoteIP: ::1 RequestLogMessage: OPTIONS /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:37:50.842][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on OPTIONS /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:37:50.850][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:37:50.861][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:37:50.877][5] TAuthDatabase.DataModuleCreate
[2026-01-09 17:37:50.928][5] TAuthService.AfterConstruction - AuthDb created
[2026-01-09 17:37:50.928][5] TAuthService.VerifyVersion(clientVersion: 0.0.1)
[2026-01-09 17:37:50.942][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on POST /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:37:50.951][5] TAuthService.BeforeDestruction - AuthDb freed
[2026-01-09 17:38:01.677][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:38:01.696][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/$model HTTP/1.1
[2026-01-09 17:38:01.714][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/$model HTTP/1.1
[2026-01-09 17:38:01.752][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:38:01.753][1] --Request.RemoteIP: ::1 RequestLogMessage: OPTIONS /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:38:01.769][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on OPTIONS /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:38:01.798][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:38:01.801][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:38:01.816][5] TAuthDatabase.DataModuleCreate
[2026-01-09 17:38:01.871][5] TAuthService.AfterConstruction - AuthDb created
[2026-01-09 17:38:01.871][5] TAuthService.VerifyVersion(clientVersion: 0.0.1)
[2026-01-09 17:38:01.894][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on POST /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:38:01.927][5] TAuthService.BeforeDestruction - AuthDb freed
[2026-01-09 17:38:13.663][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:38:13.667][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/$model HTTP/1.1
[2026-01-09 17:38:13.696][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/$model HTTP/1.1
[2026-01-09 17:38:13.725][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:38:13.765][1] --Request.RemoteIP: ::1 RequestLogMessage: OPTIONS /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:38:13.817][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on OPTIONS /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:38:13.867][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:38:13.878][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:38:13.882][5] TAuthDatabase.DataModuleCreate
[2026-01-09 17:38:14.047][5] TAuthService.AfterConstruction - AuthDb created
[2026-01-09 17:38:14.047][5] TAuthService.VerifyVersion(clientVersion: 0.0.1)
[2026-01-09 17:38:14.079][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on POST /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:38:14.080][5] TAuthService.BeforeDestruction - AuthDb freed
[2026-01-09 17:39:03.896][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:39:03.922][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/$model HTTP/1.1
[2026-01-09 17:39:03.924][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/$model HTTP/1.1
[2026-01-09 17:39:03.972][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:39:03.983][1] --Request.RemoteIP: ::1 RequestLogMessage: OPTIONS /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:39:04.000][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on OPTIONS /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:39:04.023][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:39:04.035][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:39:04.045][5] TAuthDatabase.DataModuleCreate
[2026-01-09 17:39:04.102][5] TAuthService.AfterConstruction - AuthDb created
[2026-01-09 17:39:04.102][5] TAuthService.VerifyVersion(clientVersion: 0.0.1)
[2026-01-09 17:39:04.122][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on POST /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:39:04.136][5] TAuthService.BeforeDestruction - AuthDb freed
[2026-01-09 17:42:29.543][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:42:29.546][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/$model HTTP/1.1
[2026-01-09 17:42:29.583][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/$model HTTP/1.1
[2026-01-09 17:42:29.622][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:42:29.628][1] --Request.RemoteIP: ::1 RequestLogMessage: OPTIONS /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:42:29.636][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on OPTIONS /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:42:29.653][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:42:29.660][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:42:29.668][5] TAuthDatabase.DataModuleCreate
[2026-01-09 17:42:29.743][5] TAuthService.AfterConstruction - AuthDb created
[2026-01-09 17:42:29.743][5] TAuthService.VerifyVersion(clientVersion: 0.0.1)
[2026-01-09 17:42:29.758][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on POST /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:42:29.767][5] TAuthService.BeforeDestruction - AuthDb freed
[2026-01-09 17:42:39.504][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:42:39.505][1] --Request.RemoteIP: ::1 RequestLogMessage: OPTIONS /emsys/template/auth/AuthService/Login/ HTTP/1.1
[2026-01-09 17:42:39.525][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on OPTIONS /emsys/template/auth/AuthService/Login/ HTTP/1.1
[2026-01-09 17:42:39.533][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:42:39.539][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/auth/AuthService/Login/ HTTP/1.1
[2026-01-09 17:42:39.546][5] TAuthDatabase.DataModuleCreate
[2026-01-09 17:42:39.587][5] TAuthService.AfterConstruction - AuthDb created
[2026-01-09 17:42:39.590][3] AuthService.Login - User: "emsys1"
[2026-01-09 17:42:39.604][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on POST /emsys/template/auth/AuthService/Login/ HTTP/1.1
[2026-01-09 17:42:39.607][5] TAuthService.BeforeDestruction - AuthDb freed
[2026-01-09 17:42:39.621][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:42:39.632][1] --Request.RemoteIP: ::1 RequestLogMessage: OPTIONS /emsys/template/api/$model HTTP/1.1
[2026-01-09 17:42:39.638][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on OPTIONS /emsys/template/api/$model HTTP/1.1
[2026-01-09 17:42:39.650][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:42:39.657][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/api/$model HTTP/1.1
[2026-01-09 17:42:39.665][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/api/$model HTTP/1.1
[2026-01-09 17:42:55.361][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:42:55.361][1] --Request.RemoteIP: ::1 RequestLogMessage: OPTIONS /emsys/template/api/ApiService/TestApi/ HTTP/1.1
[2026-01-09 17:42:55.382][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on OPTIONS /emsys/template/api/ApiService/TestApi/ HTTP/1.1
[2026-01-09 17:42:55.415][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:42:55.415][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/api/ApiService/TestApi/ HTTP/1.1
[2026-01-09 17:42:55.429][1] TApiService.Create
[2026-01-09 17:42:55.438][5] TApiDatabase.DataModuleCreate
[2026-01-09 17:42:55.482][3] IApiService.TestApi called
[2026-01-09 17:42:55.500][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on POST /emsys/template/api/ApiService/TestApi/ HTTP/1.1
[2026-01-09 17:42:55.516][1] TApiService.Destroy
[2026-01-09 17:44:18.913][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:44:18.916][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/$model HTTP/1.1
[2026-01-09 17:44:18.944][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/$model HTTP/1.1
[2026-01-09 17:44:18.991][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:44:19.006][1] --Request.RemoteIP: ::1 RequestLogMessage: OPTIONS /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:44:19.023][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on OPTIONS /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:44:19.063][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:44:19.066][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:44:19.077][5] TAuthDatabase.DataModuleCreate
[2026-01-09 17:44:19.148][5] TAuthService.AfterConstruction - AuthDb created
[2026-01-09 17:44:19.161][5] TAuthService.VerifyVersion(clientVersion: 0.0.1)
[2026-01-09 17:44:19.177][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on POST /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:44:19.195][5] TAuthService.BeforeDestruction - AuthDb freed
[2026-01-09 17:44:19.210][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:44:19.224][1] --Request.RemoteIP: ::1 RequestLogMessage: OPTIONS /emsys/template/api/$model HTTP/1.1
[2026-01-09 17:44:19.234][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on OPTIONS /emsys/template/api/$model HTTP/1.1
[2026-01-09 17:44:19.259][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:44:19.270][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/api/$model HTTP/1.1
[2026-01-09 17:44:19.281][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/api/$model HTTP/1.1
[2026-01-09 17:44:21.760][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:44:21.763][1] --Request.RemoteIP: ::1 RequestLogMessage: OPTIONS /emsys/template/api/ApiService/TestApi/ HTTP/1.1
[2026-01-09 17:44:21.781][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on OPTIONS /emsys/template/api/ApiService/TestApi/ HTTP/1.1
[2026-01-09 17:44:21.794][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:44:21.806][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/api/ApiService/TestApi/ HTTP/1.1
[2026-01-09 17:44:21.818][1] TApiService.Create
[2026-01-09 17:44:21.828][5] TApiDatabase.DataModuleCreate
[2026-01-09 17:44:21.975][3] IApiService.TestApi called
[2026-01-09 17:44:21.998][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on POST /emsys/template/api/ApiService/TestApi/ HTTP/1.1
[2026-01-09 17:44:22.012][1] TApiService.Destroy
[2026-01-09 17:45:27.157][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:45:27.177][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/$model HTTP/1.1
[2026-01-09 17:45:27.196][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/$model HTTP/1.1
[2026-01-09 17:45:27.215][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:45:27.231][1] --Request.RemoteIP: ::1 RequestLogMessage: OPTIONS /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:45:27.245][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on OPTIONS /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:45:27.260][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:45:27.260][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:45:27.274][5] TAuthDatabase.DataModuleCreate
[2026-01-09 17:45:27.354][5] TAuthService.AfterConstruction - AuthDb created
[2026-01-09 17:45:27.355][5] TAuthService.VerifyVersion(clientVersion: 0.0.1)
[2026-01-09 17:45:27.369][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on POST /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:45:27.387][5] TAuthService.BeforeDestruction - AuthDb freed
[2026-01-09 17:45:27.420][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:45:27.424][1] --Request.RemoteIP: ::1 RequestLogMessage: OPTIONS /emsys/template/api/$model HTTP/1.1
[2026-01-09 17:45:27.439][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on OPTIONS /emsys/template/api/$model HTTP/1.1
[2026-01-09 17:45:27.464][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:45:27.466][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/api/$model HTTP/1.1
[2026-01-09 17:45:27.476][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/api/$model HTTP/1.1
[2026-01-09 17:46:39.923][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:46:39.940][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/$model HTTP/1.1
[2026-01-09 17:46:39.951][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/$model HTTP/1.1
[2026-01-09 17:46:39.979][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:46:39.996][1] --Request.RemoteIP: ::1 RequestLogMessage: OPTIONS /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:46:40.029][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on OPTIONS /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:46:40.054][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:46:40.057][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:46:40.069][5] TAuthDatabase.DataModuleCreate
[2026-01-09 17:46:40.153][5] TAuthService.AfterConstruction - AuthDb created
[2026-01-09 17:46:40.154][5] TAuthService.VerifyVersion(clientVersion: 0.0.1)
[2026-01-09 17:46:40.170][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on POST /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:46:40.179][5] TAuthService.BeforeDestruction - AuthDb freed
[2026-01-09 17:46:40.195][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:46:40.205][1] --Request.RemoteIP: ::1 RequestLogMessage: OPTIONS /emsys/template/api/$model HTTP/1.1
[2026-01-09 17:46:40.218][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on OPTIONS /emsys/template/api/$model HTTP/1.1
[2026-01-09 17:46:40.247][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:46:40.247][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/api/$model HTTP/1.1
[2026-01-09 17:46:40.260][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/api/$model HTTP/1.1
[2026-01-09 17:46:50.815][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:46:50.821][1] --Request.RemoteIP: ::1 RequestLogMessage: OPTIONS /emsys/template/api/ApiService/TestApi/ HTTP/1.1
[2026-01-09 17:46:50.833][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on OPTIONS /emsys/template/api/ApiService/TestApi/ HTTP/1.1
[2026-01-09 17:46:50.855][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:46:50.864][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/api/ApiService/TestApi/ HTTP/1.1
[2026-01-09 17:46:50.872][1] TApiService.Create
[2026-01-09 17:46:50.885][5] TApiDatabase.DataModuleCreate
[2026-01-09 17:46:50.959][3] IApiService.TestApi called
[2026-01-09 17:46:50.963][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on POST /emsys/template/api/ApiService/TestApi/ HTTP/1.1
[2026-01-09 17:46:50.982][1] TApiService.Destroy
[2026-01-09 17:49:18.659][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:49:18.661][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/auth/$model HTTP/1.1
[2026-01-09 17:49:18.676][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/auth/$model HTTP/1.1
[2026-01-09 17:49:18.707][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:49:18.720][1] --Request.RemoteIP: ::1 RequestLogMessage: OPTIONS /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:49:18.739][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on OPTIONS /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:49:18.748][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:49:18.764][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:49:18.776][5] TAuthDatabase.DataModuleCreate
[2026-01-09 17:49:18.830][5] TAuthService.AfterConstruction - AuthDb created
[2026-01-09 17:49:18.830][5] TAuthService.VerifyVersion(clientVersion: 0.0.1)
[2026-01-09 17:49:18.846][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on POST /emsys/template/auth/AuthService/VerifyVersion/ HTTP/1.1
[2026-01-09 17:49:18.855][5] TAuthService.BeforeDestruction - AuthDb freed
[2026-01-09 17:49:18.885][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:49:18.896][1] --Request.RemoteIP: ::1 RequestLogMessage: OPTIONS /emsys/template/api/$model HTTP/1.1
[2026-01-09 17:49:18.907][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on OPTIONS /emsys/template/api/$model HTTP/1.1
[2026-01-09 17:49:18.938][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:49:18.939][1] --Request.RemoteIP: ::1 RequestLogMessage: GET /emsys/template/api/$model HTTP/1.1
[2026-01-09 17:49:18.950][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on GET /emsys/template/api/$model HTTP/1.1
[2026-01-09 17:49:21.658][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:49:21.661][1] --Request.RemoteIP: ::1 RequestLogMessage: OPTIONS /emsys/template/api/ApiService/TestApi/ HTTP/1.1
[2026-01-09 17:49:21.679][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on OPTIONS /emsys/template/api/ApiService/TestApi/ HTTP/1.1
[2026-01-09 17:49:21.701][1] TLoggingMiddleware.ProcessRequest:
[2026-01-09 17:49:21.701][1] --Request.RemoteIP: ::1 RequestLogMessage: POST /emsys/template/api/ApiService/TestApi/ HTTP/1.1
[2026-01-09 17:49:21.710][1] TApiService.Create
[2026-01-09 17:49:21.719][5] TApiDatabase.DataModuleCreate
[2026-01-09 17:49:21.759][3] IApiService.TestApi called
[2026-01-09 17:49:21.761][1] --Resp.StatusCode: 200 Resp.StatusReason: OK on POST /emsys/template/api/ApiService/TestApi/ HTTP/1.1
[2026-01-09 17:49:21.775][1] TApiService.Destroy
[Settings] [Settings]
LogFileNum=15 MemoLogLevel=5
FileLogLevel=5
LogFileNum=22
DevMode=0
webClientVersion=0.0.1
[Database]
Server=192.168.102.129
--Server=
--Port=
--Database=
--Username=
--Password=
[SMTP]
--Type=useExplicitTLS
--Host=mail.em-sys.net
Port=587
--Username=em-sys\emsys
--Password=Ridge!4043
--FromEmail=emsys@em-sys.net
[Settings]
MemoLogLevel=5
FileLogLevel=5
LogFileNum=1
DevMode=0
webClientVersion=0.0.1
[DB]
Server=192.168.102.129
--Server=
--Port=
--Database=
--Username=
--Password=
[SMTP]
--Type=useExplicitTLS
--Host=mail.em-sys.net
Port=587
--Username=em-sys\emsys
--Password=Ridge!4043
--FromEmail=emsys@em-sys.net
...@@ -2,17 +2,7 @@ object ApiDatabase: TApiDatabase ...@@ -2,17 +2,7 @@ object ApiDatabase: TApiDatabase
OnCreate = DataModuleCreate OnCreate = DataModuleCreate
Height = 358 Height = 358
Width = 519 Width = 519
object ucHST: TUniConnection
ProviderName = 'MySQL'
Database = 'kg_order_entry'
Username = 'root'
LoginPrompt = False
Left = 75
Top = 65
EncryptedPassword = '9AFF92FF8CFF86FF8CFFCFFFCEFF'
end
object UniQuery1: TUniQuery object UniQuery1: TUniQuery
Connection = ucHST
SQL.Strings = ( SQL.Strings = (
'') '')
Left = 73 Left = 73
...@@ -23,10 +13,19 @@ object ApiDatabase: TApiDatabase ...@@ -23,10 +13,19 @@ object ApiDatabase: TApiDatabase
Top = 60 Top = 60
end end
object UniQuery2: TUniQuery object UniQuery2: TUniQuery
Connection = ucHST
SQL.Strings = ( SQL.Strings = (
'') '')
Left = 179 Left = 179
Top = 148 Top = 148
end end
object ucHST: TUniConnection
ProviderName = 'MySQL'
Database = 'sleepdb'
Username = 'hstuser'
Server = '192.168.116.135'
LoginPrompt = False
Left = 81
Top = 59
EncryptedPassword = '9AFF92FF8CFF86FF8CFFDEFFCFFFCEFF'
end
end end
// Where the database is kept. Only used by Lookup.ServiceImpl to retrieve info
// from the data base and send it to the client.
// Author: ???
unit Api.Database; unit Api.Database;
interface interface
...@@ -8,14 +5,14 @@ interface ...@@ -8,14 +5,14 @@ interface
uses uses
System.SysUtils, System.Classes, Data.DB, MemDS, DBAccess, Uni, UniProvider, System.SysUtils, System.Classes, Data.DB, MemDS, DBAccess, Uni, UniProvider,
PostgreSQLUniProvider, System.Variants, System.Generics.Collections, System.IniFiles, PostgreSQLUniProvider, System.Variants, System.Generics.Collections, System.IniFiles,
Common.Logging, Vcl.Forms, MySQLUniProvider; Common.Logging, Vcl.Forms, MySQLUniProvider, Common.Ini;
type type
TApiDatabase = class(TDataModule) TApiDatabase = class(TDataModule)
ucHST: TUniConnection;
UniQuery1: TUniQuery; UniQuery1: TUniQuery;
MySQLUniProvider1: TMySQLUniProvider; MySQLUniProvider1: TMySQLUniProvider;
UniQuery2: TUniQuery; UniQuery2: TUniQuery;
ucHST: TUniConnection;
procedure DataModuleCreate(Sender: TObject); procedure DataModuleCreate(Sender: TObject);
private private
{ Private declarations } { Private declarations }
...@@ -37,13 +34,18 @@ uses ...@@ -37,13 +34,18 @@ uses
procedure TApiDatabase.DataModuleCreate(Sender: TObject); procedure TApiDatabase.DataModuleCreate(Sender: TObject);
begin begin
Logger.Log( 1, 'TApiDatabase.DataModuleCreate' ); Logger.Log(5, 'TApiDatabase.DataModuleCreate');
try try
ucHST.Database := IniEntries.dbDatabase;
ucHST.Server := IniEntries.dbServer;
ucHST.Port := IniEntries.dbPort;
ucHST.Username := IniEntries.dbUsername;
ucHST.Password := IniEntries.dbPassword;
ucHST.Connect; ucHST.Connect;
except except
on E: Exception do on E: Exception do
begin begin
Logger.Log(2, '--TApiDatabase.DataModuleCreate -Error connecting to database: ' + E.Message); Logger.Log(2, '--TAuthDatabase.DataModuleCreate -Error connecting to database: ' + E.Message);
end; end;
end; end;
end; end;
......
...@@ -15,7 +15,7 @@ type ...@@ -15,7 +15,7 @@ type
[ServiceContract, Model(API_MODEL)] [ServiceContract, Model(API_MODEL)]
IApiService = interface(IInvokable) IApiService = interface(IInvokable)
['{793A44B7-2B00-4791-B249-97A681922D76}'] ['{793A44B7-2B00-4791-B249-97A681922D76}']
function TestApi(messageText: string): TJSONObject;
end; end;
implementation implementation
......
...@@ -14,9 +14,11 @@ type ...@@ -14,9 +14,11 @@ type
TApiService = class(TInterfacedObject, IApiService) TApiService = class(TInterfacedObject, IApiService)
private private
FAppVersion: string; FAppVersion: string;
function GetWebClientVersion: string;
public public
FApiDatabase: TApiDatabase; FApiDatabase: TApiDatabase;
function TestApi(messageText: string): TJSONObject;
constructor Create; constructor Create;
destructor Destroy; override; destructor Destroy; override;
end; end;
...@@ -51,6 +53,36 @@ begin ...@@ -51,6 +53,36 @@ begin
end; end;
function TApiService.GetWebClientVersion: string;
var
iniFile: TIniFile;
begin
iniFile := TIniFile.Create(ChangeFileExt(ParamStr(0), '.ini'));
try
Result := iniFile.ReadString('Settings', 'webClientVersion', '');
finally
iniFile.Free;
end;
end;
function TApiService.TestApi(messageText: string): TJSONObject;
var
requiredVersion: string;
begin
Logger.Log(3, 'IApiService.TestApi called');
Result := TJSONObject.Create;
TXDataOperationContext.Current.Handler.ManagedObjects.Add(Result);
requiredVersion := GetWebClientVersion;
Result.AddPair('messageEcho', messageText);
Result.AddPair('serverTime', DateTimeToStr(Now));
Result.AddPair('requiredWebClientVersion', requiredVersion);
Result.AddPair('note', 'If this endpoint is reachable, JWT auth passed. Version enforcement on every API call is a separate step (middleware).');
end;
initialization initialization
RegisterServiceType(TApiService); RegisterServiceType(TApiService);
......
...@@ -3,43 +3,27 @@ object AuthDatabase: TAuthDatabase ...@@ -3,43 +3,27 @@ object AuthDatabase: TAuthDatabase
OnDestroy = DataModuleDestroy OnDestroy = DataModuleDestroy
Height = 249 Height = 249
Width = 433 Width = 433
object uq: TUniQuery
Connection = ucHST
SQL.Strings = (
'select * from users')
FetchRows = 100
Left = 162
Top = 45
end
object ucHST: TUniConnection object ucHST: TUniConnection
ProviderName = 'MySQL' ProviderName = 'MySQL'
Database = 'sleepdb' Database = 'sleepdb'
Username = 'hstuser' Username = 'hstuser'
Server = '192.168.116.135' Server = '192.168.116.135'
LoginPrompt = False LoginPrompt = False
Left = 65 Left = 93
Top = 41 Top = 49
EncryptedPassword = '9AFF92FF8CFF86FF8CFFDEFFCFFFCEFF' EncryptedPassword = '9AFF92FF8CFF86FF8CFFDEFFCFFFCEFF'
end end
object MySQLUniProvider1: TMySQLUniProvider object MySQLUniProvider1: TMySQLUniProvider
Left = 94 Left = 94
Top = 124 Top = 124
end end
object uqSystem: TUniQuery
Connection = ucHST
SQL.Strings = (
'select * from system')
FetchRows = 100
Left = 276
Top = 125
end
object uqUser: TUniQuery object uqUser: TUniQuery
Connection = ucHST Connection = ucHST
SQL.Strings = ( SQL.Strings = (
'select * from users') 'select * from users')
FetchRows = 100 FetchRows = 100
Left = 332 Left = 226
Top = 127 Top = 73
object uqUseruser_id: TIntegerField object uqUseruser_id: TIntegerField
FieldName = 'user_id' FieldName = 'user_id'
end end
...@@ -52,26 +36,5 @@ object AuthDatabase: TAuthDatabase ...@@ -52,26 +36,5 @@ object AuthDatabase: TAuthDatabase
Required = True Required = True
Size = 64 Size = 64
end end
object uqUseruser_fullname: TStringField
FieldName = 'user_fullname'
Required = True
Size = 50
end
object uqUsergroup_id: TIntegerField
FieldName = 'group_id'
Required = True
end
object uqUseragency_id: TIntegerField
FieldName = 'agency_id'
Required = True
end
object uqUseractive: TIntegerField
FieldName = 'active'
Required = True
end
object uqUseremail: TStringField
FieldName = 'email'
Size = 100
end
end end
end end
...@@ -10,19 +10,12 @@ uses ...@@ -10,19 +10,12 @@ uses
type type
TAuthDatabase = class(TDataModule) TAuthDatabase = class(TDataModule)
uq: TUniQuery;
ucHST: TUniConnection; ucHST: TUniConnection;
MySQLUniProvider1: TMySQLUniProvider; MySQLUniProvider1: TMySQLUniProvider;
uqSystem: TUniQuery;
uqUser: TUniQuery; uqUser: TUniQuery;
uqUseruser_id: TIntegerField; uqUseruser_id: TIntegerField;
uqUseruser_name: TStringField; uqUseruser_name: TStringField;
uqUseruser_password: TStringField; uqUseruser_password: TStringField;
uqUseruser_fullname: TStringField;
uqUsergroup_id: TIntegerField;
uqUseragency_id: TIntegerField;
uqUseractive: TIntegerField;
uqUseremail: TStringField;
procedure DataModuleCreate(Sender: TObject); procedure DataModuleCreate(Sender: TObject);
procedure DataModuleDestroy(Sender: TObject); procedure DataModuleDestroy(Sender: TObject);
private private
......
// Auth Interface service declaration
unit Auth.Service; unit Auth.Service;
interface interface
...@@ -18,7 +16,7 @@ type ...@@ -18,7 +16,7 @@ type
[ServiceContract, Model(AUTH_MODEL)] [ServiceContract, Model(AUTH_MODEL)]
IAuthService = interface(IInvokable) IAuthService = interface(IInvokable)
['{AA668BA0-3129-4B02-88BF-4089D45D9249}'] ['{AA668BA0-3129-4B02-88BF-4089D45D9249}']
[HttpPost]function Login(const computer_uid, username, password_hash: string): string; [HttpPost]function Login(const username, password, clientVersion: string): string;
function VerifyVersion(clientVersion: string): TJSONObject; function VerifyVersion(clientVersion: string): TJSONObject;
end; end;
......
...@@ -3,161 +3,168 @@ unit Auth.ServiceImpl; ...@@ -3,161 +3,168 @@ unit Auth.ServiceImpl;
interface interface
uses uses
System.SysUtils,
System.Classes,
System.JSON,
System.IniFiles,
System.DateUtils,
System.Hash,
Data.DB,
XData.Service.Common, XData.Service.Common,
XData.Sys.Exceptions,
XData.Server.Module, XData.Server.Module,
Aurelius.Global.Utils,
Bcl.JOSE.Core.JWT,
Bcl.JOSE.Core.Builder,
Auth.Service, Auth.Service,
Auth.Database, Auth.Database,
Uni, Data.DB, System.Hash, System.IniFiles, System.JSON; Common.Logging,
Common.Config,
uLibrary;
type type
[ServiceImplementation] [ServiceImplementation]
TAuthService = class(TInterfacedObject, IAuthService) TAuthService = class(TInterfacedObject, IAuthService)
strict private strict private
authDB: TAuthDatabase; AuthDb: TAuthDatabase;
private function GetWebClientVersion: string;
public public
[HttpPost]function Login(const computer_uid, username, password_hash: string): string; // Note: CHANGED - Login now takes a plain text password (kgOrders style)
function VerifyVersion(ClientVersion: string): TJSONObject; function Login(const username, password, clientVersion: string): string;
function VerifyVersion(clientVersion: string): TJSONObject;
procedure AfterConstruction; override; procedure AfterConstruction; override;
procedure BeforeDestruction; override; procedure BeforeDestruction; override;
end; end;
implementation implementation
uses
System.SysUtils,
System.DateUtils,
System.Generics.Collections,
Bcl.JOSE.Core.Builder,
Bcl.JOSE.Core.JWT,
Aurelius.Global.Utils,
XData.Sys.Exceptions,
Common.Logging,
Common.Config,
uLibrary;
{ TLoginService }
procedure TAuthService.AfterConstruction; procedure TAuthService.AfterConstruction;
begin begin
inherited; inherited;
try try
authDB := TAuthDatabase.Create(nil); AuthDb := TAuthDatabase.Create(nil);
Logger.Log(5, 'TAuthService.AfterConstruction - authDB = TAuthDatabase.Create(nil)'); Logger.Log(5, 'TAuthService.AfterConstruction - AuthDb created');
except except
on E: Exception do on E: Exception do
begin begin
Logger.Log(1, 'Error connecting to HSTManager database: ' + E.Message); Logger.Log(1, 'Error creating AuthDb: ' + E.Message);
raise EXDataHttpException.Create(500, 'Error connecting to HSTManager database!'); raise EXDataHttpException.Create(500, 'Unable to create Auth database.');
end; end;
end; end;
end; end;
procedure TAuthService.BeforeDestruction; procedure TAuthService.BeforeDestruction;
begin begin
authDB.Free; AuthDb.Free;
inherited; inherited;
Logger.Log(5, 'TAuthService.BeforeDestruction - authDB.Free'); Logger.Log(5, 'TAuthService.BeforeDestruction - AuthDb freed');
end; end;
function TAuthService.GetWebClientVersion: string;
function TAuthService.VerifyVersion(clientVersion: string): TJSONObject;
var var
iniFile: TIniFile; iniFile: TIniFile;
reqClientVersion: string;
begin begin
Result := TJSONObject.Create;
TXDataOperationContext.Current.Handler.ManagedObjects.Add(Result);
iniFile := TIniFile.Create(ChangeFileExt(ParamStr(0), '.ini')); iniFile := TIniFile.Create(ChangeFileExt(ParamStr(0), '.ini'));
try try
reqClientVersion := iniFile.ReadString('Settings', 'reqClientVersion', ''); Result := iniFile.ReadString('Settings', 'webClientVersion', '');
Result.AddPair('reqClientVersion', reqClientVersion);
if reqClientVersion = '' then
begin
Result.AddPair('error', 'reqClientVersion is not configured.');
Exit;
end;
if clientVersion <> reqClientVersion then
begin
Result.AddPair('error',
'Version mismatch' + sLineBreak + ' Client version: ' + clientVersion +
sLineBreak + ' Required version: ' + reqClientVersion +
sLineBreak + 'Please contact system administrator to get the correct version.');
end;
finally finally
iniFile.Free; iniFile.Free;
end; end;
end; end;
function TAuthService.VerifyVersion(clientVersion: string): TJSONObject;
var
webClientVersion: string;
begin
Logger.Log(5, 'TAuthService.VerifyVersion(clientVersion: ' + clientVersion + ')');
Result := TJSONObject.Create;
TXDataOperationContext.Current.Handler.ManagedObjects.Add(Result);
webClientVersion := GetWebClientVersion;
Result.AddPair('webClientVersion', webClientVersion);
function TAuthService.Login(const computer_uid, username, password_hash: string): string; if webClientVersion = '' then
begin
Result.AddPair('error', 'webClientVersion is not configured.');
Exit;
end;
if clientVersion <> webClientVersion then
begin
Logger.Log(1, 'webApp version mismatch client ver: ' + clientVersion + ' required ver: ' + webClientVersion);
Result.AddPair('error',
'webApp version mismatch' + sLineBreak +
' Client version: ' + clientVersion + sLineBreak +
' Server version: ' + webClientVersion + sLineBreak +
'Please clear cache and reload.');
end;
end;
function TAuthService.Login(const username, password, clientVersion: string): string;
var var
sql, resultStr: string; sql: string;
JWT: TJWT; storedHash: string;
passwordHash: string;
webClientVersion: string;
jwt: TJWT;
begin begin
Logger.Log(3, Format('AuthService.Login - User: "%s"', [username])); Logger.Log(3, Format('AuthService.Login - User: "%s"', [username]));
sql := 'select * from phone_home where computer_uid = ' + QuotedStr(computer_uid); try
Logger.Log(5, 'TAuthService.Login - sql: ' + sql); sql := 'select user_id, user_name, user_password from users where user_name = ' + QuotedStr(username) + ' limit 1';
doQuery( authDB.uq, sql ); DoQuery(AuthDb.uqUser, sql);
if not authDB.uq.IsEmpty then except
begin on E: Exception do
sql := 'select * from users where user_name = ' + QuotedStr(username) + ' and user_password = ' + QuotedStr(password_hash);
Logger.Log(5, 'TAuthService.Login - sql: ' + sql);
doQuery(authDB.uqUser, sql);
if not authDB.uqUser.IsEmpty then
begin
if authDB.uqUseractive.AsInteger = 1 then
begin
logger.Log(3, '--login successful');
resultStr := 'success';
end
else
begin
logger.Log(3, '--login failed: inactive user');
resultStr := 'inactive user';
end;
end
else
begin begin
logger.Log(3, '--login failed: invalid user / password'); Logger.Log(1, 'Login failed due to database error: ' + E.Message);
resultStr := 'invalid user / password'; raise EXDataHttpException.Create(500, 'Login failed: Unable to connect to the database.');
end; end;
end end;
else
if AuthDb.uqUser.IsEmpty then
begin begin
logger.Log(3, '--login failed: invalid computer'); Logger.Log(2, 'Login Error: Invalid username or password');
resultStr := 'invalid computer'; raise EXDataHttpUnauthorized.Create('Invalid username or password');
end; end;
if resultStr <> 'success' then // ADD THIS DELETE BEFORE DEPLOY
passwordHash := password.ToUpper;
storedHash := AuthDb.uqUser.FieldByName('user_password').AsString.ToUpper;
// STOP HERE DELETE BEFORE DEPLOY
// REMOVE THIS DELETE BEFORE DEPLOY
// passwordHash := THashSHA2.GetHashString(username + password, THashSHA2.TSHA2Version.SHA256).ToUpper;
// storedHash := AuthDb.uqUser.FieldByName('user_password').AsString.ToUpper;
// STOP HERE DELETE BEFORE DEPLOY
if storedHash <> passwordHash then
begin begin
Logger.Log( 3, 'raise Exception.Create(resultStr)' ); Logger.Log(2, 'Login Error: Invalid username or password');
raise Exception.Create(resultStr); raise EXDataHttpUnauthorized.Create('Invalid username or password');
end; end;
JWT := TJWT.Create; webClientVersion := GetWebClientVersion;
jwt := TJWT.Create;
try try
JWT.Claims.JWTId := LowerCase(Copy(TUtils.GuidToVariant(TUtils.NewGuid), 2, 36)); jwt.Claims.JWTId := LowerCase(Copy(TUtils.GuidToVariant(TUtils.NewGuid), 2, 36));
JWT.Claims.SetClaimOfType<string>('USER_ID', authDB.uqUseruser_id.AsString); jwt.Claims.IssuedAt := Now;
JWT.Claims.IssuedAt := Now; jwt.Claims.Expiration := IncHour(Now, 24);
JWT.Claims.Expiration := IncHour(Now, 24);
JWT.Claims.SetClaimOfType<string>('USER_NAME', username); jwt.Claims.SetClaimOfType<Integer>('user_id', AuthDb.uqUser.FieldByName('user_id').AsInteger);
jwt.Claims.SetClaimOfType<string>('user_name', AuthDb.uqUser.FieldByName('user_name').AsString);
Result := TJOSE.SHA256CompactToken( ServerConfig.jwtTokenSecret, JWT );
Logger.Log(5, 'Returning JWT Token:' + Result) jwt.Claims.SetClaimOfType<string>('client_version', clientVersion);
jwt.Claims.SetClaimOfType<string>('server_version', webClientVersion);
Result := TJOSE.SHA256CompactToken(serverConfig.jwtTokenSecret, jwt);
finally finally
JWT.Free; jwt.Free;
end; end;
Logger.Log(3, 'AuthService.Login - Finished');
Logger.Log(3, '');
end; end;
initialization initialization
RegisterServiceType(TAuthService); RegisterServiceType(TAuthService);
end. end.
...@@ -23,8 +23,6 @@ object FMain: TFMain ...@@ -23,8 +23,6 @@ object FMain: TFMain
Anchors = [akLeft, akTop, akRight, akBottom] Anchors = [akLeft, akTop, akRight, akBottom]
ReadOnly = True ReadOnly = True
TabOrder = 0 TabOrder = 0
ExplicitWidth = 456
ExplicitHeight = 194
end end
object btnSwaggerAuth: TButton object btnSwaggerAuth: TButton
Left = 36 Left = 36
......
...@@ -66,7 +66,6 @@ procedure TFMain.timerStartServerTimer(Sender: TObject); ...@@ -66,7 +66,6 @@ procedure TFMain.timerStartServerTimer(Sender: TObject);
begin begin
timerStartServer.Enabled := False; timerStartServer.Enabled := False;
Caption := Caption + ' ver ' + exeInfoVersion.FileVersion; Caption := Caption + ' ver ' + exeInfoVersion.FileVersion;
ServerConfig := TServerConfig.Create;
LoadIniEntries; LoadIniEntries;
LoadServerConfig; LoadServerConfig;
StartServers; StartServers;
...@@ -121,7 +120,6 @@ end; ...@@ -121,7 +120,6 @@ end;
procedure TFMain.FormClose(Sender: TObject; var Action: TCloseAction); procedure TFMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin begin
ServerConfig.Free;
AuthServerModule.Free; AuthServerModule.Free;
ApiServerModule.Free; ApiServerModule.Free;
AppServerModule.Free; AppServerModule.Free;
......
unit App.Config;
interface
uses
JS,
XData.Web.Connection,
XData.Web.Request,
XData.Web.Response;
type
TAppConfig = class
private
FAuthUrl: string;
FApiUrl: string;
FAppUrl: string;
public
constructor Create;
property AuthUrl: string read FAuthUrl write FAuthUrl;
property ApiUrl: string read FApiUrl write FApiUrl;
property AppUrl: string read FAppUrl write FAppUrl;
end;
TConfigLoadedProc = reference to procedure(Config: TAppConfig);
procedure LoadConfig(LoadProc: TConfigLoadedProc);
implementation
procedure LoadConfig(LoadProc: TConfigLoadedProc);
procedure OnSuccess(Response: IHttpResponse);
var
Obj: TJSObject;
Config: TAppConfig;
begin
Config := TAppConfig.Create;
try
if Response.StatusCode = 200 then
begin
Obj := TJSObject(TJSJSON.parse(Response.ContentAsText));
if JS.toString(Obj['AuthUrl']) <> '' then
Config.AuthUrl := JS.toString(Obj['AuthUrl']);
if JS.toString(Obj['ApiUrl']) <> '' then
Config.ApiUrl := JS.toString(Obj['ApiUrl']);
end;
finally
LoadProc(Config);
Config.Free;
end;
end;
procedure OnError;
var
Config: TAppConfig;
begin
Config := TAppConfig.Create;
try
LoadProc(Config);
finally
Config.Free;
end;
end;
var
Conn: TXDataWebConnection;
begin
Conn := TXDataWebConnection.Create(nil);
try
Conn.SendRequest(THttpRequest.Create('config/config.json'), @OnSuccess, @OnError);
finally
Conn.Free;
end;
end;
{ TAppConfig }
constructor TAppConfig.Create;
begin
FAuthUrl := '';
FApiUrl := '';
FAppUrl := '';
end;
end.
unit App.Types;
interface
uses
Bcl.Rtti.Common;
type
TProc = reference to procedure;
TSuccessProc = reference to procedure;
TLogoutProc = reference to procedure(AMessage: string = '');
TUnauthorizedAccessProc = reference to procedure(AMessage: string);
TVersionCheckCallback = reference to procedure(Success: Boolean; ErrorMessage: string);
TListProc = reference to procedure;
TSelectProc = reference to procedure(AParam: string);
TSelectProc2 = reference to procedure(AParam: string; BParam: string);
TSelectProc3 = reference to procedure(AParam: string; BParam: string; CParam: Boolean);
TSelectProc4 = reference to procedure(AParam: string; BParam: string; CParam: string; DParam: Boolean);
TSearchProc = reference to procedure(AParam: string; BParam: string; CParam: Integer; DParam: Boolean);
TReportProc = reference to procedure(AParam: string);
implementation
end.
unit Auth.Service;
interface
uses
SysUtils, Web, JS,
XData.Web.Client;
const
TOKEN_NAME = 'EMSYS_TEMPLATE_TOKEN';
type
TOnLoginSuccess = reference to procedure;
TOnLoginError = reference to procedure(AMsg: string);
TOnProfileSuccess = reference to procedure;
TOnProfileError = reference to procedure(AMsg: string);
TAuthService = class
private
FClient: TXDataWebClient;
procedure SetToken(AToken: string);
procedure DeleteToken;
public
constructor Create; reintroduce;
destructor Destroy; override;
procedure Login(AUser, APassword, AClientVersion: string; ASuccess: TOnLoginSuccess;
AError: TOnLoginError);
procedure Logout;
function GetToken: string;
function Authenticated: Boolean;
function TokenExpirationDate: TDateTime;
function TokenExpired: Boolean;
function TokenPayload: JS.TJSObject;
end;
TJwtHelper = class
private
class function HasExpirationDate(AToken: string): Boolean;
public
class function TokenExpirationDate(AToken: string): TJSDate;
class function TokenExpired(AToken: string): Boolean;
class function DecodePayload(AToken: string): string;
end;
function AuthService: TAuthService;
implementation
uses
ConnectionModule;
var
_AuthService: TAuthService;
function AuthService: TAuthService;
begin
if not Assigned(_AuthService) then
begin
_AuthService := TAuthService.Create;
end;
Result := _AuthService;
end;
{ TAuthService }
function TAuthService.Authenticated: Boolean;
begin
Result := not isNull(window.localStorage.getItem(TOKEN_NAME)) and
(window.localStorage.getItem(TOKEN_NAME) <> '');
end;
constructor TAuthService.Create;
begin
FClient := TXDataWebClient.Create(nil);
FClient.Connection := DMConnection.AuthConnection;
end;
procedure TAuthService.DeleteToken;
begin
window.localStorage.removeItem(TOKEN_NAME);
end;
destructor TAuthService.Destroy;
begin
FClient.Free;
inherited;
end;
function TAuthService.GetToken: string;
begin
Result := window.localStorage.getItem(TOKEN_NAME);
end;
procedure TAuthService.Login(AUser, APassword, AClientVersion: string; ASuccess: TOnLoginSuccess;
AError: TOnLoginError);
procedure OnLoad(Response: TXDataClientResponse);
var
Token: JS.TJSObject;
begin
Token := JS.TJSObject(Response.Result);
SetToken(JS.toString(Token.Properties['value']));
ASuccess;
end;
procedure OnError(Error: TXDataClientError);
begin
AError(Format('%s: %s', [Error.ErrorCode, Error.ErrorMessage]));
end;
begin
if (AUser = '') or (APassword = '') then
begin
AError('Please enter a username and a password');
Exit;
end;
FClient.RawInvoke(
'IAuthService.Login', [AUser, APassword, AClientVersion],
@OnLoad, @OnError
);
end;
procedure TAuthService.Logout;
begin
DeleteToken;
end;
procedure TAuthService.SetToken(AToken: string);
begin
window.localStorage.setItem(TOKEN_NAME, AToken);
end;
function TAuthService.TokenExpirationDate: TDateTime;
var
ExpirationDate: TJSDate;
begin
if not Authenticated then
Exit(Now);
ExpirationDate := TJwtHelper.TokenExpirationDate(GetToken);
Result := EncodeDate(
ExpirationDate.FullYear,
ExpirationDate.Month + 1,
ExpirationDate.Date
) +
EncodeTime(
ExpirationDate.Hours,
ExpirationDate.Minutes,
ExpirationDate.Seconds,
0
);
end;
function TAuthService.TokenExpired: Boolean;
begin
if not Authenticated then
Exit(False);
Result := TJwtHelper.TokenExpired(GetToken);
end;
function TAuthService.TokenPayload: JS.TJSObject;
begin
if not Authenticated then
Exit(nil);
Result := TJSObject(TJSJSON.parse(TJwtHelper.DecodePayload(GetToken)));
end;
{ TJwtHelper }
class function TJwtHelper.DecodePayload(AToken: string): string;
begin
if Trim(AToken) = '' then
Exit('');
Result := '';
asm
const parts = AToken.split('.');
if (parts.length === 3) { // <- strict compare
// JWTs use url-safe base64; convert before atob
Result = atob(parts[1].replace(/-/g,'+').replace(/_/g,'/'));
}
end;
end;
class function TJwtHelper.HasExpirationDate(AToken: string): Boolean;
var
Payload: string;
Obj: TJSObject;
begin
Payload := DecodePayload(AToken);
Obj := TJSObject(TJSJSON.parse(Payload));
Result := Obj.hasOwnProperty('exp');
end;
class function TJwtHelper.TokenExpirationDate(AToken: string): TJSDate;
var
Payload: string;
Obj: TJSObject;
Epoch: NativeInt;
begin
if not HasExpirationDate(AToken) then
raise Exception.Create('Token has no expiration date');
Payload := DecodePayload(AToken);
Obj := TJSObject(TJSJSON.parse(Payload));
Epoch := toInteger(Obj.Properties['exp']);
Result := TJSDate.New(Epoch * 1000);
end;
class function TJwtHelper.TokenExpired(AToken: string): Boolean;
begin
if not HasExpirationDate(AToken) then
Exit(False);
Result := TJSDate.now > toInteger(TokenExpirationDate(AToken).valueOf);
end;
end.
object DMConnection: TDMConnection
Height = 264
Width = 395
object ApiConnection: TXDataWebConnection
URL = 'http://localhost:2004/emsys/template/api'
OnError = ApiConnectionError
OnRequest = ApiConnectionRequest
OnResponse = ApiConnectionResponse
Left = 48
Top = 80
end
object AuthConnection: TXDataWebConnection
URL = 'http://localhost:2004/emsys/template/auth'
OnError = AuthConnectionError
Left = 48
Top = 16
end
object XDataWebClient1: TXDataWebClient
Connection = AuthConnection
Left = 269
Top = 164
end
end
unit ConnectionModule;
interface
uses
System.SysUtils, System.Classes, WEBLib.Modules, XData.Web.Connection,
App.Types, App.Config, XData.Web.Client, WEBLib.Dialogs;
type
TDMConnection = class(TWebDataModule)
ApiConnection: TXDataWebConnection;
AuthConnection: TXDataWebConnection;
XDataWebClient1: TXDataWebClient;
procedure ApiConnectionError(Error: TXDataWebConnectionError);
procedure ApiConnectionRequest(Args: TXDataWebConnectionRequest);
procedure ApiConnectionResponse(Args: TXDataWebConnectionResponse);
procedure AuthConnectionError(Error: TXDataWebConnectionError);
private
FUnauthorizedAccessProc: TUnauthorizedAccessProc;
public
const clientVersion = '0.0.1';
procedure InitApp(SuccessProc: TSuccessProc;
UnauthorizedAccessProc: TUnauthorizedAccessProc);
procedure SetClientConfig(Callback: TVersionCheckCallback);
end;
var
DMConnection: TDMConnection;
implementation
uses
JS, Web,
XData.Web.Request,
XData.Web.Response,
Auth.Service;
{%CLASSGROUP 'Vcl.Controls.TControl'}
{$R *.dfm}
procedure TDMConnection.ApiConnectionError(Error: TXDataWebConnectionError);
var
errorMsg: string;
begin
errorMsg := Error.ErrorMessage;
if errorMsg = '' then
errorMsg := 'Connection error';
if Assigned(FUnauthorizedAccessProc) then
FUnauthorizedAccessProc(errorMsg)
else
ShowMessage(errorMsg);
end;
procedure TDMConnection.ApiConnectionRequest(Args: TXDataWebConnectionRequest);
begin
if AuthService.Authenticated then
Args.Request.Headers.SetValue('Authorization', 'Bearer ' + AuthService.GetToken);
end;
procedure TDMConnection.ApiConnectionResponse(
Args: TXDataWebConnectionResponse);
begin
if Args.Response.StatusCode = 401 then
FUnauthorizedAccessProc(Format('%d: %s',[Args.Response.StatusCode, Args.Response.ContentAsText]));
end;
procedure TDMConnection.AuthConnectionError(Error: TXDataWebConnectionError);
var
errorMsg: string;
begin
errorMsg := Error.ErrorMessage;
if errorMsg = '' then
errorMsg := 'Connection error';
if Assigned(FUnauthorizedAccessProc) then
FUnauthorizedAccessProc(errorMsg)
else
ShowMessage(errorMsg);
end;
procedure TDMConnection.InitApp(SuccessProc: TSuccessProc;
UnauthorizedAccessProc: TUnauthorizedAccessProc);
procedure ConfigLoaded(Config: TAppConfig);
begin
if Config.AuthUrl <> '' then
AuthConnection.URL := Config.AuthUrl;
if Config.ApiUrl <> '' then
ApiConnection.URL := Config.ApiUrl;
AuthConnection.Open(SuccessProc);
end;
begin
FUnauthorizedAccessProc := UnauthorizedAccessProc;
LoadConfig(@ConfigLoaded);
end;
procedure TDMConnection.SetClientConfig(Callback: TVersionCheckCallback);
begin
XDataWebClient1.Connection := AuthConnection;
XDataWebClient1.RawInvoke('IAuthService.VerifyVersion', [clientVersion],
procedure(Response: TXDataClientResponse)
var
jsonResult: TJSObject;
error: string;
begin
jsonResult := TJSObject(Response.Result);
if jsonResult.HasOwnProperty('error') then
error := string(jsonResult['error'])
else
error := '';
if error <> '' then
Callback(False, error)
else
Callback(True, '');
end);
end;
end.
unit Utils;
interface
uses
System.Classes, SysUtils, JS, Web, WEBLib.Forms, WEBLib.Toast, DateUtils, WebLib.Dialogs;
procedure ShowStatusMessage(const AMessage, AClass: string; const AElementId: string);
procedure HideStatusMessage(const AElementId: string);
procedure ShowSpinner(SpinnerID: string);
procedure HideSpinner(SpinnerID: string);
procedure ShowErrorModal(msg: string);
function CalculateAge(DateOfBirth: TDateTime): Integer;
function FormatPhoneNumber(PhoneNumber: string): string;
procedure ApplyReportTitle(CurrentReportType: string);
procedure ShowToast(const MessageText: string; const ToastType: string = 'success');
procedure ShowConfirmationModal(msg, leftLabel, rightLabel: string; ConfirmProc: TProc<Boolean>);
procedure ShowNotificationModal(msg: string);
// function FormatDollarValue(ValueStr: string): string;
implementation
procedure ShowStatusMessage(const AMessage, AClass: string; const AElementId: string);
var
StatusMessage: TJSHTMLElement;
begin
StatusMessage := TJSHTMLElement(document.getElementById(AElementId));
if Assigned(StatusMessage) then
begin
if AMessage = '' then
begin
StatusMessage.style.setProperty('display', 'none');
StatusMessage.className := '';
StatusMessage.innerHTML := '';
end
else
begin
StatusMessage.innerHTML := AMessage;
StatusMessage.className := 'alert ' + AClass;
StatusMessage.style.setProperty('display', 'block');
end
end
else
console.log('Error: Status message element not found');
end;
procedure HideStatusMessage(const AElementId: string);
var
StatusMessage: TJSHTMLElement;
begin
StatusMessage := TJSHTMLElement(document.getElementById(AElementId));
if Assigned(StatusMessage) then
begin
StatusMessage.style.setProperty('display', 'none');
StatusMessage.className := '';
StatusMessage.innerHTML := '';
end
else
console.log('Error: Status message element not found');
end;
procedure ShowSpinner(SpinnerID: string);
var
SpinnerElement: TJSHTMLElement;
begin
SpinnerElement := TJSHTMLElement(document.getElementById(SpinnerID));
if Assigned(SpinnerElement) then
begin
// Move spinner to the <body> if it's not already there
asm
if (SpinnerElement.parentNode !== document.body) {
document.body.appendChild(SpinnerElement);
}
end;
SpinnerElement.classList.remove('d-none');
SpinnerElement.classList.add('d-block');
end;
end;
procedure HideSpinner(SpinnerID: string);
var
SpinnerElement: TJSHTMLElement;
begin
SpinnerElement := TJSHTMLElement(document.getElementById(SpinnerID));
if Assigned(SpinnerElement) then
begin
SpinnerElement.classList.remove('d-block');
SpinnerElement.classList.add('d-none');
end;
end;
procedure ShowErrorModal(msg: string);
begin
asm
var modal = document.getElementById('main_errormodal');
var label = document.getElementById('main_lblmodal_body');
var reloadBtn = document.getElementById('btn_modal_restart');
if (label) label.innerText = msg;
// Ensure modal is a direct child of <body>
if (modal && modal.parentNode !== document.body) {
document.body.appendChild(modal);
}
// Bind hard reload to button
if (reloadBtn) {
reloadBtn.onclick = function () {
window.location.reload(true); // hard reload, bypass cache
};
}
// Show the Bootstrap modal
var bsModal = new bootstrap.Modal(modal, { keyboard: false });
bsModal.show();
end;
end;
procedure ShowNotificationModal(msg: string);
begin
asm
var modal = document.getElementById('main_notification_modal');
var label = document.getElementById('main_notification_modal_body');
var closeBtn = document.getElementById('btn_modal_close');
if (label) label.innerText = msg;
// Ensure modal is a direct child of <body>
if (modal && modal.parentNode !== document.body) {
document.body.appendChild(modal);
}
// Button simply closes the modal
if (closeBtn) {
closeBtn.onclick = function () {
var existing = bootstrap.Modal.getInstance(modal);
if (existing) {
existing.hide();
}
};
}
// Show the Bootstrap modal
var bsModal = new bootstrap.Modal(modal, { keyboard: false });
bsModal.show();
end;
end;
// ShowConfirmationModal displays a two-button modal with custom labels.
// Params:
// - messageText: text shown in the modal body
// - leftButtonText: label for the left button (e.g., "Cancel")
// - rightButtonText: label for the right button (e.g., "Delete")
// - callback: procedure(confirmed: Boolean); confirmed = True if right button clicked
//
// Example:
// ShowConfirmationModal('Delete this?', 'Cancel', 'Delete',
// procedure(confirmed: Boolean)
// begin
// if confirmed then DeleteOrder();
// end);
// function ShowConfirmationModal(msg, leftLabel, rightLabel: string;): Boolean;
// if ShowConfirmationModal then
// doThing()
// else
// doOtherThing();
procedure ShowConfirmationModal(msg, leftLabel, rightLabel: string; ConfirmProc: TProc<Boolean>);
begin
asm
var modal = document.getElementById('main_confirmation_modal');
var body = document.getElementById('main_modal_body');
var btnLeft = document.getElementById('btn_confirm_left');
var btnRight = document.getElementById('btn_confirm_right');
var bsModal;
if (body) body.innerText = msg;
if (btnLeft) btnLeft.innerText = leftLabel;
if (btnRight) btnRight.innerText = rightLabel;
if (modal && modal.parentNode !== document.body) {
document.body.appendChild(modal);
}
btnLeft.onclick = null;
btnRight.onclick = null;
btnLeft.onclick = function () {
bsModal.hide();
ConfirmProc(true); // user confirmed
};
btnRight.onclick = function () {
bsModal.hide();
ConfirmProc(false); // user canceled
};
bsModal = new bootstrap.Modal(modal, { keyboard: false });
bsModal.show();
end;
end;
function CalculateAge(DateOfBirth: TDateTime): Integer;
var
Today, BirthDate: TJSDate;
Year, Month, Day, BirthYear, BirthMonth, BirthDay: NativeInt;
DOBString: string;
begin
Today := TJSDate.New;
Year := Today.FullYear;
Month := Today.Month + 1;
Day := Today.Date;
// Formats the DateOfBirth as an ISO 8601 date string
DOBString := FormatDateTime('yyyy-mm-dd', DateOfBirth);
BirthDate := TJSDate.New(DOBString);
if BirthDate = nil then
begin
Exit(0); // Exit the function with an age of 0 if the date creation fails
end;
BirthYear := BirthDate.FullYear;
BirthMonth := BirthDate.Month + 1;
BirthDay := BirthDate.Date;
Result := Year - BirthYear;
if (Month < BirthMonth) or ((Month = BirthMonth) and (Day < BirthDay)) then
Dec(Result);
end;
function FormatPhoneNumber(PhoneNumber: string): string;
var
Digits: string;
begin
Digits := PhoneNumber.Replace('(', '').Replace(')', '').Replace('-', '').Replace(' ', '');
case Length(Digits) of
7: Result := Format('%s-%s', [Copy(Digits, 1, 3), Copy(Digits, 4, 4)]);
10: Result := Format('(%s) %s-%s', [Copy(Digits, 1, 3), Copy(Digits, 4, 3), Copy(Digits, 7, 4)]);
else
// If the number does not have 7 or 10 digits, whatever they typed is returned
Result := PhoneNumber;
end;
end;
procedure ShowToast(const MessageText: string; const ToastType: string = 'success');
var
ParsedText, ToastKind, MsgPrefix: string;
Parts: TArray<string>;
begin
ParsedText := MessageText.Trim;
ToastKind := ToastType.ToLower;
// Check for "Success:" or "Failure:" at the start of message
if ParsedText.Contains(':') then
begin
Parts := ParsedText.Split([':'], 2);
MsgPrefix := Parts[0].Trim.ToLower;
if (MsgPrefix = 'success') or (MsgPrefix = 'failure') then
begin
ParsedText := Parts[1].Trim;
if MsgPrefix = 'success' then
ToastKind := 'success'
else
ToastKind := 'danger';
end;
end;
asm
var toastEl = document.getElementById('bootstrapToast');
var toastBody = document.getElementById('bootstrapToastBody');
if (!toastEl || !toastBody) return;
toastBody.innerText = ParsedText;
toastEl.classList.remove('bg-success', 'bg-danger', 'bg-warning', 'bg-primary');
toastEl.classList.remove('slide-in');
switch (ToastKind) {
case 'danger':
toastEl.classList.add('bg-danger');
break;
case 'warning':
toastEl.classList.add('bg-warning');
break;
case 'info':
toastEl.classList.add('bg-primary');
break;
default:
toastEl.classList.add('bg-success');
}
// Add slide-in animation
toastEl.classList.add('slide-in');
var toast = new bootstrap.Toast(toastEl, { delay: 2500 });
toast.show();
// Remove animation class after it's done (so it can be reapplied)
setTimeout(function() {
toastEl.classList.remove('slide-in');
}, 500);
end;
end;
procedure ApplyReportTitle(CurrentReportType: string);
var
CrimeTitleElement: TJSHTMLElement;
begin
CrimeTitleElement := TJSHTMLElement(document.getElementById('crime_title'));
if Assigned(CrimeTitleElement) then
CrimeTitleElement.innerText := CurrentReportType
else
Console.Log('Element with ID "crime_title" not found.');
end;
// Used html number input type to restrict the input instead of this function
// function FormatDollarValue(ValueStr: string): string;
// var
// i: Integer;
// begin
// Result := ''; // Initialize the result
// // Filter out any characters that are not digits or decimal point
// for i := 1 to Length(ValueStr) do
// begin
// if (Pos(ValueStr[i], '0123456789.') > 0) then
// begin
// Result := Result + ValueStr[i];
// end;
// end;
// end;
end.
object FViewLogin: TFViewLogin
Width = 1322
Height = 764
CSSLibrary = cssBootstrap
ElementFont = efCSS
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
ParentFont = False
OnShow = WebFormShow
object lblSignIn: TWebLabel
Left = 240
Top = 112
Width = 67
Height = 13
Caption = 'Please Sign In'
ElementID = 'lbl_sign_in'
ElementPosition = epRelative
Font.Charset = ANSI_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
HeightPercent = 100.000000000000000000
ParentFont = False
Transparent = False
WidthPercent = 100.000000000000000000
end
object lblClientVersion: TWebLabel
Left = 289
Top = 227
Width = 65
Height = 13
Caption = 'Client Version'
ElementID = 'lbl_client_version'
ElementFont = efCSS
ElementPosition = epRelative
HeightStyle = ssAuto
HeightPercent = 100.000000000000000000
WidthPercent = 100.000000000000000000
end
object lblAppTitle: TWebLabel
Left = 42
Top = 12
Width = 126
Height = 13
Caption = 'EM Systems Template App'
ElementID = 'lbl_app_title'
ElementFont = efCSS
HeightStyle = ssAuto
HeightPercent = 100.000000000000000000
WidthPercent = 100.000000000000000000
end
object edtUsername: TWebEdit
Left = 240
Top = 136
Width = 121
Height = 21
ElementID = 'edt_username'
ElementPosition = epRelative
Font.Charset = ANSI_CHARSET
Font.Color = clBlack
Font.Height = -11
Font.Name = 'Arial'
Font.Style = []
HeightPercent = 100.000000000000000000
HideSelection = False
ParentFont = False
TextHint = 'Username'
WidthPercent = 100.000000000000000000
end
object edtPassword: TWebEdit
Left = 240
Top = 163
Width = 121
Height = 21
ElementID = 'edt_password'
ElementPosition = epRelative
Font.Charset = ANSI_CHARSET
Font.Color = clBlack
Font.Height = -11
Font.Name = 'Arial'
Font.Style = []
HeightPercent = 100.000000000000000000
HideSelection = False
ParentFont = False
PasswordChar = '*'
TabOrder = 1
TextHint = 'Password'
WidthPercent = 100.000000000000000000
end
object btnLogin: TWebButton
Left = 240
Top = 190
Width = 121
Height = 25
Caption = 'Login'
ElementID = 'btn_login'
ElementPosition = epRelative
Font.Charset = ANSI_CHARSET
Font.Color = clBlack
Font.Height = -11
Font.Name = 'Arial'
Font.Style = []
HeightPercent = 100.000000000000000000
ParentFont = False
Role = 'null'
TabOrder = 2
WidthPercent = 100.000000000000000000
OnClick = btnLoginClick
end
object pnlMessage: TWebPanel
Left = 240
Top = 65
Width = 121
Height = 33
ElementID = 'pnl_message'
ElementPosition = epRelative
Font.Charset = ANSI_CHARSET
Font.Color = clBlack
Font.Height = -11
Font.Name = 'Arial'
Font.Style = []
ParentFont = False
Role = 'null'
TabOrder = 3
Visible = False
object lblMessage: TWebLabel
Left = 16
Top = 11
Width = 44
Height = 14
Caption = 'Message'
ElementID = 'lbl_message'
HeightPercent = 100.000000000000000000
WidthPercent = 100.000000000000000000
end
object btnCloseNotification: TWebButton
Left = 98
Top = 3
Width = 22
Height = 25
ElementID = 'btn_close_notification'
HeightPercent = 100.000000000000000000
Role = 'null'
WidthPercent = 100.000000000000000000
OnClick = btnCloseNotificationClick
end
end
object xdwcLogin: TXDataWebClient
Connection = DMConnection.AuthConnection
Left = 492
Top = 102
end
end
<div class="container-fluid min-vh-100 d-flex align-items-center justify-content-center bg-secondary py-5">
<div class="col-12 col-sm-10 col-md-6 col-lg-4 col-xl-3">
<div class="card border-0 shadow-lg rounded-4 bg-body-secondary">
<div class="card-body p-4 p-md-5">
<div class="text-center mb-4">
<div id="lbl_app_title" class="h4 fw-semibold mb-1">EM Systems Template App</div>
<div id="lbl_sign_in" class="text-muted small">Please Sign In</div>
</div>
<div id="pnl_message" class="alert alert-danger d-none">
<button id="btn_close_notification" type="button" class="btn-close" aria-label="Close"></button>
<span id="lbl_message"></span>
</div>
<div class="mb-3">
<input id="edt_username" class="form-control form-control-lg w-100" type="text" autofocus placeholder="Username">
</div>
<div class="mb-3">
<input id="edt_password" class="form-control form-control-lg w-100" type="password" placeholder="Password">
</div>
<div class="mb-3">
<button id="btn_login" class="btn btn-primary btn-lg w-100">Login</button>
</div>
<div class="text-end text-muted small mt-1">
<span id="lbl_client_version"></span>
</div>
</div>
</div>
</div>
</div>
unit View.Login;
interface
uses
System.SysUtils, System.Classes, Web, WEBLib.Graphics, WEBLib.Controls, WEBLib.Forms, WEBLib.Dialogs,
Vcl.Controls, Vcl.StdCtrls, WEBLib.StdCtrls, WEBLib.JSON,
XData.Web.Client, WEBLib.ExtCtrls, Vcl.Imaging.pngimage,
JS, XData.Web.Connection,
App.Types, ConnectionModule;
type
TFViewLogin = class(TWebForm)
lblSignIn: TWebLabel;
edtUsername: TWebEdit;
edtPassword: TWebEdit;
btnLogin: TWebButton;
pnlMessage: TWebPanel;
lblMessage: TWebLabel;
btnCloseNotification: TWebButton;
xdwcLogin: TXDataWebClient;
lblClientVersion: TWebLabel;
lblAppTitle: TWebLabel;
procedure btnLoginClick(Sender: TObject);
procedure btnCloseNotificationClick(Sender: TObject);
procedure WebFormShow(Sender: TObject);
private
FLoginProc: TSuccessProc;
FMessage: string;
procedure ShowNotification(Notification: string);
procedure HideNotification;
public
class procedure Display(LoginProc: TSuccessProc); overload;
class procedure Display(LoginProc: TSuccessProc; AMsg: string); overload;
end;
var
FViewLogin: TFViewLogin;
implementation
uses
Auth.Service;
{$R *.dfm}
procedure TFViewLogin.btnLoginClick(Sender: TObject);
procedure LoginSuccess;
begin
FLoginProc;
end;
procedure LoginError(AMsg: string);
begin
ShowNotification('Login Error: ' + AMsg);
end;
var
hashPW: string;
begin
AuthService.Login(
edtUsername.Text, edtPassword.Text, DMConnection.clientVersion,
@LoginSuccess,
@LoginError
);
end;
class procedure TFViewLogin.Display(LoginProc: TSuccessProc);
begin
TFViewLogin.Display(LoginProc, '');
end;
class procedure TFViewLogin.Display(LoginProc: TSuccessProc; AMsg: string);
procedure FormCreate(AForm: TObject);
begin
TFViewLogin(AForm).FMessage := AMsg;
end;
begin
if Assigned(FViewLogin) then
FViewLogin.Free;
FViewLogin := TFViewLogin.CreateNew(@FormCreate);
FViewLogin.FLoginProc := LoginProc;
end;
procedure TFViewLogin.HideNotification;
begin
pnlMessage.ElementHandle.classList.add('d-none');
pnlMessage.Visible := False;
end;
procedure TFViewLogin.ShowNotification(Notification: string);
begin
if Notification <> '' then
begin
lblMessage.Caption := Notification;
pnlMessage.ElementHandle.classList.remove('d-none');
pnlMessage.Visible := True;
end;
end;
procedure TFViewLogin.btnCloseNotificationClick(Sender: TObject);
begin
HideNotification;
end;
procedure TFViewLogin.WebFormShow(Sender: TObject);
begin
console.log(DMConnection.clientVersion);
FViewLogin.lblClientVersion.Caption := 'v' + DMConnection.clientVersion;
if FMessage <> '' then
ShowNotification(FMessage)
else
HideNotification;
end;
end.
object FViewMain: TFViewMain
Width = 1322
Height = 764
CSSLibrary = cssBootstrap
ElementFont = efCSS
Font.Charset = ANSI_CHARSET
Font.Color = clBlack
Font.Height = -11
Font.Name = 'Arial'
Font.Style = []
ParentFont = False
OnCreate = WebFormCreate
object lblUsername: TWebLabel
Left = 536
Top = 4
Width = 49
Height = 14
Caption = 'Username'
ElementID = 'lbl_username'
ElementPosition = epRelative
HeightPercent = 100.000000000000000000
Transparent = False
WidthPercent = 100.000000000000000000
end
object lblUserProfile: TWebLinkLabel
Left = 529
Top = 21
Width = 59
Height = 14
ElementID = 'lbl_user_profile'
HeightPercent = 100.000000000000000000
WidthPercent = 100.000000000000000000
Caption = ' User Profile'
end
object lblLogout: TWebLinkLabel
Left = 547
Top = 55
Width = 36
Height = 14
ElementID = 'lbl_logout'
HeightPercent = 100.000000000000000000
WidthPercent = 100.000000000000000000
OnClick = lblLogoutClick
Caption = ' Logout'
end
object lblHome: TWebLinkLabel
Left = 556
Top = 38
Width = 27
Height = 14
ElementID = 'lbl_home'
HeightPercent = 100.000000000000000000
WidthPercent = 100.000000000000000000
Caption = 'Home'
end
object lblAppTitle: TWebLabel
Left = 57
Top = 33
Width = 42
Height = 14
Caption = 'App Title'
ElementID = 'lbl_app_title'
ElementPosition = epRelative
HeightPercent = 100.000000000000000000
Transparent = False
WidthPercent = 100.000000000000000000
end
object lblVersion: TWebLabel
Left = 536
Top = 71
Width = 47
Height = 14
Caption = 'lblVersion'
ElementID = 'lbl_version'
ElementFont = efCSS
ElementPosition = epRelative
HeightStyle = ssAuto
HeightPercent = 100.000000000000000000
WidthPercent = 100.000000000000000000
end
object pnlMain: TWebPanel
Left = 77
Top = 112
Width = 1322
Height = 0
ElementID = 'pnl_main'
HeightStyle = ssAuto
WidthStyle = ssAuto
ChildOrder = 3
ElementFont = efCSS
ElementPosition = epIgnore
Font.Charset = ANSI_CHARSET
Font.Color = clBlack
Font.Height = -11
Font.Name = 'Arial'
Font.Style = []
ParentFont = False
Role = 'null'
TabOrder = 0
end
object memoDebug: TWebMemo
Left = 45
Top = 361
Width = 471
Height = 83
ElementID = 'memo_debug'
ElementPosition = epRelative
Enabled = False
HeightPercent = 100.000000000000000000
Lines.Strings = (
'WebMemo1')
Role = 'null'
SelLength = 0
SelStart = 0
ShowFocus = False
Visible = False
WidthPercent = 100.000000000000000000
end
object xdwcMain: TXDataWebClient
Connection = DMConnection.ApiConnection
Left = 114
Top = 230
end
end
<div id="div_wrapper">
<nav class="navbar navbar-expand-lg bg-body-tertiary border-bottom shadow-sm">
<div class="container-fluid">
<div class="d-flex align-items-center gap-2">
<a id="lbl_app_title" class="navbar-brand fw-semibold" href="index.html">Koehler-Gibson Orders</a>
<span id="lbl_version" class="badge text-bg-light border text-muted fw-normal"></span>
</div>
<div class="collapse navbar-collapse show" id="pnl_navbar_nav_dropdown">
<ul class="navbar-nav ms-auto">
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle d-flex align-items-center gap-2" id="lnk_navbar_dropdown_menu_link"
role="button" data-bs-toggle="dropdown" aria-expanded="false">
<i class="fa fa-user fa-fw"></i>
<span id="lbl_username" class="fw-semibold">Username</span>
</a>
<ul class="dropdown-menu dropdown-menu-end shadow-sm" aria-labelledby="lnk_navbar_dropdown_menu_link">
<li>
<a class="dropdown-item d-flex align-items-center gap-2" id="lbl_home" href="#">
<i class="fa fa-home fa-fw"></i><span>Home</span>
</a>
</li>
<li>
<a class="dropdown-item d-flex align-items-center gap-2" id="lbl_user_profile" href="#">
<i class="fa fa-user fa-fw"></i><span>User Profile</span>
</a>
</li>
<li><hr class="dropdown-divider"></li>
<li>
<a class="dropdown-item d-flex align-items-center gap-2 text-danger" id="lbl_logout" href="#">
<i class="fa fa-sign-out fa-fw"></i><span>Logout</span>
</a>
</li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
<!-- Toast -->
<div id="pnl_toast_wrapper" class="position-fixed top-0 start-0 mt-5 ms-4"
style="z-index: 1080; min-width: 300px; max-width: 500px;">
<div id="toast_bootstrap" class="toast align-items-center text-white bg-success border-0 shadow" role="alert"
aria-live="assertive" aria-atomic="true">
<div class="d-flex">
<div class="toast-body" id="lbl_bootstrap_toast_body">
Success message
</div>
<button type="button" class="btn-close btn-close-white me-2 m-auto" data-bs-dismiss="toast"
aria-label="Close"></button>
</div>
</div>
</div>
<!-- Main Panel (where all forms display) -->
<div class="container-fluid py-3">
<div class="row">
<div id="pnl_main" class="col-12"></div>
</div>
<div class="row mt-3">
<div class="col-12">
<textarea class="form-control font-monospace" id="memo_debug" rows="4" placeholder="Debug output..."></textarea>
</div>
</div>
</div>
<!-- Spinner Modal -->
<div id="div_spinner" class="position-absolute top-50 start-50 translate-middle d-none">
<div class="lds-roller">
<div></div><div></div><div></div><div></div>
<div></div><div></div><div></div><div></div>
</div>
</div>
<!-- Error Modal -->
<div class="modal fade" id="mdl_error" tabindex="-1" aria-labelledby="lbl_modal_title" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content shadow-lg">
<div class="modal-header">
<h5 class="modal-title" id="lbl_modal_title">Error</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body fs-6 fw-bold" id="lbl_modal_body">
Please contact EMSystems to solve the issue.
</div>
<div class="modal-footer justify-content-center">
<button type="button" id="btn_modal_restart" class="btn btn-primary">Back to Orders</button>
</div>
</div>
</div>
</div>
<!-- Confirmation Modal -->
<div class="modal fade" id="mdl_confirmation" tabindex="-1" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content shadow-lg">
<div class="modal-header">
<h5 class="modal-title">Confirm</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body fw-bold" id="lbl_confirmation_body">
Placeholder text
</div>
<div class="modal-footer justify-content-center">
<button type="button" class="btn btn-primary me-3" id="btn_confirm_left">Cancel</button>
<button type="button" class="btn btn-secondary" id="btn_confirm_right">Confirm</button>
</div>
</div>
</div>
</div>
<!-- Notification Modal -->
<div class="modal fade" id="mdl_notification" tabindex="-1" aria-labelledby="lbl_notification_title"
aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content shadow-lg">
<div class="modal-header">
<h5 class="modal-title" id="lbl_notification_title">Info</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body fs-6 fw-bold" id="lbl_notification_body">
Please contact EMSystems to solve the issue.
</div>
<div class="modal-footer justify-content-center">
<button type="button" id="btn_modal_close" class="btn btn-primary">Close</button>
</div>
</div>
</div>
</div>
</div>
unit View.Main;
interface
uses
System.SysUtils, System.Classes, JS, Web,
WEBLib.Controls, WEBLib.Forms, WEBLib.ExtCtrls, WEBLib.StdCtrls,
App.Types, ConnectionModule, XData.Web.Client, WEBLib.Dialogs, Vcl.StdCtrls,
Vcl.Controls, Vcl.Graphics;
type
TFViewMain = class(TWebForm)
pnlMain: TWebPanel;
lblUsername: TWebLabel;
lblUserProfile: TWebLinkLabel;
lblHome: TWebLinkLabel;
lblLogout: TWebLinkLabel;
lblVersion: TWebLabel;
lblAppTitle: TWebLabel;
memoDebug: TWebMemo;
xdwcMain: TXDataWebClient;
procedure WebFormCreate(Sender: TObject);
procedure lblLogoutClick(Sender: TObject);
private
FChildForm: TWebForm;
FLogoutProc: TLogoutProc;
procedure ShowForm(aFormClass: TWebFormClass);
public
class procedure Display(logoutProc: TLogoutProc);
end;
var
FViewMain: TFViewMain;
implementation
uses
Auth.Service,
View.Test;
{$R *.dfm}
procedure TFViewMain.WebFormCreate(Sender: TObject);
var
userName: string;
begin
userName := JS.toString(AuthService.TokenPayload.Properties['user_name']);
lblUsername.Caption := userName;
lblVersion.Caption := 'v' + DMConnection.clientVersion;
ShowForm(TFTest);
end;
procedure TFViewMain.lblLogoutClick(Sender: TObject);
begin
if Assigned(FLogoutProc) then
FLogoutProc('');
end;
procedure TFViewMain.ShowForm(aFormClass: TWebFormClass);
begin
if Assigned(FChildForm) then
FChildForm.Free;
Application.CreateForm(aFormClass, pnlMain.ElementID, FChildForm);
end;
class procedure TFViewMain.Display(logoutProc: TLogoutProc);
begin
if Assigned(FViewMain) then
FViewMain.Free;
FViewMain := TFViewMain.CreateNew;
FViewMain.FLogoutProc := logoutProc;
end;
end.
object FTest: TFTest
Width = 640
Height = 480
CSSLibrary = cssBootstrap
ElementFont = efCSS
object lblTest: TWebLabel
Left = 280
Top = 204
Width = 52
Height = 15
Caption = 'Test Form'
ElementID = 'lbl_test'
ElementFont = efCSS
HeightStyle = ssAuto
HeightPercent = 100.000000000000000000
WidthPercent = 100.000000000000000000
end
object btnTestApi: TWebButton
Left = 266
Top = 240
Width = 96
Height = 25
Caption = 'Test Api'
ChildOrder = 1
ElementID = 'btn_test_api'
ElementFont = efCSS
HeightStyle = ssAuto
HeightPercent = 100.000000000000000000
WidthPercent = 100.000000000000000000
OnClick = btnTestApiClick
end
object memoTestDebug: TWebMemo
Left = 224
Top = 286
Width = 185
Height = 89
ElementClassName = 'form-control'
ElementID = 'memo_test_debug'
ElementFont = efCSS
HeightPercent = 100.000000000000000000
Lines.Strings = (
'memoTestDebug')
SelLength = 0
SelStart = 0
ShowHint = False
WidthPercent = 100.000000000000000000
OnChange = memoTestDebugChange
end
object xdwcTest: TXDataWebClient
Connection = DMConnection.ApiConnection
Left = 464
Top = 208
end
end
<div class="container py-4">
<div class="d-flex flex-wrap align-items-center justify-content-between gap-3 mb-4">
<div>
<div id="lbl_test" class="h2 fw-semibold mb-1">Test Form</div>
<div class="text-muted">Quick API + JWT/version diagnostics</div>
</div>
<button id="btn_test_api" class="btn btn-primary">Test API</button>
</div>
<div class="card border-0 shadow-sm">
<div class="card-header bg-body-tertiary d-flex align-items-center justify-content-between">
<div class="fw-semibold">Debug Output</div>
</div>
<div class="card-body" style="min-height: 70vh;">
<textarea id="memo_test_debug"
class="form-control font-monospace h-100"
style="min-height: 65vh;"
rows="28"
placeholder="Click Test API to populate diagnostics..."></textarea>
</div>
</div>
</div>
unit View.Test;
interface
uses
System.SysUtils, System.Classes, JS, Web,
WEBLib.Graphics, WEBLib.Controls, WEBLib.Forms, WEBLib.StdCtrls,
XData.Web.Client,
App.Types, ConnectionModule, Vcl.StdCtrls, Vcl.Controls;
type
TFTest = class(TWebForm)
lblTest: TWebLabel;
btnTestApi: TWebButton;
memoTestDebug: TWebMemo;
xdwcTest: TXDataWebClient;
[async] procedure btnTestApiClick(Sender: TObject);
procedure memoTestDebugChange(Sender: TObject);
private
procedure AddLine(const s: string);
procedure DumpClaims;
public
end;
var
FTest: TFTest;
implementation
uses
Auth.Service;
procedure TFTest.AddLine(const s: string);
begin
memoTestDebug.Lines.Add(s);
end;
procedure TFTest.DumpClaims;
var
token: string;
payload: TJSObject;
begin
token := AuthService.GetToken;
AddLine('token present: ' + BoolToStr(token <> '', True));
if token = '' then
Exit;
AddLine('token expired: ' + BoolToStr(AuthService.TokenExpired, True));
AddLine('token exp (local): ' + DateTimeToStr(AuthService.TokenExpirationDate));
payload := TJSObject(AuthService.TokenPayload);
if not Assigned(payload) then
Exit;
asm
const p = payload;
const keys = Object.keys(p);
for (let i = 0; i < keys.length; i++) {
const k = keys[i];
const v = p[k];
this.AddLine('claim ' + k + ': ' + String(v));
}
end;
end;
[async] procedure TFTest.btnTestApiClick(Sender: TObject);
var
response: TXDataClientResponse;
resultObj: TJSObject;
messageText: string;
requiredVersion: string;
begin
memoTestDebug.Visible := True;
memoTestDebug.Lines.Clear;
AddLine('--- request ---');
AddLine('api url: ' + DMConnection.ApiConnection.URL);
AddLine('auth url: ' + DMConnection.AuthConnection.URL);
AddLine('clientVersion const: ' + DMConnection.clientVersion);
AddLine('');
AddLine('--- token / claims ---');
DumpClaims;
messageText := 'hello from TFTest @ ' + DateTimeToStr(Now);
AddLine('');
AddLine('calling IApiService.TestApi ...');
try
response := await(xdwcTest.RawInvokeAsync('IApiService.TestApi', [messageText]));
except
on E: Exception do
begin
AddLine('');
AddLine('--- api exception ---');
AddLine(E.Message);
Exit;
end;
end;
AddLine('');
AddLine('--- api response ---');
if not Assigned(response.Result) then
begin
AddLine('response.Result is nil');
Exit;
end;
resultObj := TJSObject(response.Result);
AddLine('messageEcho: ' + JS.toString(resultObj['messageEcho']));
AddLine('serverTime: ' + JS.toString(resultObj['serverTime']));
AddLine('requiredWebClientVersion: ' + JS.toString(resultObj['requiredWebClientVersion']));
AddLine('note: ' + JS.toString(resultObj['note']));
requiredVersion := JS.toString(resultObj['requiredWebClientVersion']);
AddLine('');
AddLine('--- version compare (client-side) ---');
AddLine('clientVersion const: ' + DMConnection.clientVersion);
AddLine('requiredWebClientVersion: ' + requiredVersion);
AddLine('match: ' + BoolToStr(DMConnection.clientVersion = requiredVersion, True));
end;
procedure TFTest.memoTestDebugChange(Sender: TObject);
begin
end;
end.
{
"AuthUrl" : "http://localhost:2004/emsys/template/auth/",
"ApiUrl" : "http://localhost:2004/emsys/template/api/"
}
is-invalid .form-check-input {
border: 1px solid #dc3545 !important;
}
.is-invalid .form-check-label {
color: #dc3545 !important;
}
.btn-primary {
background-color: #286090 !important;
border-color: #286090 !important;
color: #fff !important;
}
.btn-primary:hover {
background-color: #204d74 !important;
border-color: #204d74 !important;
}
@keyframes slideInLeft {
from {
transform: translateX(-120%);
opacity: 0;
}
to {
transform: translateX(0);
opacity: 1;
}
}
.toast.slide-in {
animation: slideInLeft 0.4s ease-out forwards;
}
#spinner {
position: fixed !important;
z-index: 9999 !important;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.lds-roller {
display: inline-block;
position: relative;
width: 80px;
height: 80px;
}
.lds-roller div {
animation: lds-roller 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;
transform-origin: 40px 40px;
}
.lds-roller div:after {
content: " ";
display: block;
position: absolute;
width: 10px;
height: 10px;
border-radius: 50%;
background: #204d74;
margin: -5px 0 0 -5px;
}
.lds-roller div:nth-child(1) {
animation-delay: -0.036s;
}
.lds-roller div:nth-child(1):after {
top: 63px;
left: 63px;
}
.lds-roller div:nth-child(2) {
animation-delay: -0.072s;
}
.lds-roller div:nth-child(2):after {
top: 68px;
left: 56px;
}
.lds-roller div:nth-child(3) {
animation-delay: -0.108s;
}
.lds-roller div:nth-child(3):after {
top: 71px;
left: 48px;
}
.lds-roller div:nth-child(4) {
animation-delay: -0.144s;
}
.lds-roller div:nth-child(4):after {
top: 72px;
left: 40px;
}
.lds-roller div:nth-child(5) {
animation-delay: -0.18s;
}
.lds-roller div:nth-child(5):after {
top: 71px;
left: 32px;
}
.lds-roller div:nth-child(6) {
animation-delay: -0.216s;
}
.lds-roller div:nth-child(6):after {
top: 68px;
left: 24px;
}
.lds-roller div:nth-child(7) {
animation-delay: -0.252s;
}
.lds-roller div:nth-child(7):after {
top: 63px;
left: 17px;
}
.lds-roller div:nth-child(8) {
animation-delay: -0.288s;
}
.lds-roller div:nth-child(8):after {
top: 56px;
left: 12px;
}
@keyframes lds-roller {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta content="width=device-width, initial-scale=1" name="viewport"/>
<link href="data:;base64,=" rel="icon"/>
<title>EM Systems Template App</title>
<link href="https://cdnjs.cloudflare.com/ajax/libs/flag-icon-css/2.3.1/css/flag-icon.min.css" rel="stylesheet"/>
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"/>
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.0/css/all.min.css" rel="stylesheet"/>
<link href="css/app.css" rel="stylesheet"/>
<link href="css/spinner.css" rel="stylesheet"/>
<script crossorigin="anonymous" integrity="sha256-eKhayi8LEQwp4NKxN+CfCh+3qOVUtJn3QNZ0TciWLP4=" src="https://code.jquery.com/jquery-3.7.1.js"></script>
<link crossorigin="anonymous" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/js/bootstrap.bundle.min.js"></script>
<script src="$(ProjectName).js"></script>
</head>
<body>
<noscript>Your browser does not support JavaScript!</noscript>
<script>rtl.run();</script>
</body>
</html>
program webTemplateApp;
uses
Vcl.Forms,
XData.Web.Connection,
WEBLib.Dialogs,
Auth.Service in 'Auth.Service.pas',
App.Types in 'App.Types.pas',
ConnectionModule in 'ConnectionModule.pas' {DMConnection: TWebDataModule},
App.Config in 'App.Config.pas',
View.Main in 'View.Main.pas' {FViewMain: TWebForm} {*.html},
Utils in 'Utils.pas',
View.Login in 'View.Login.pas' {FViewLogin: TWebForm} {*.html},
View.Test in 'View.Test.pas' {FTest: TWebForm} {*.html};
{$R *.res}
procedure DisplayLoginView(AMessage: string = ''); forward;
procedure DisplayMainView;
procedure ConnectProc;
begin
if Assigned(FViewLogin) then
FViewLogin.Free;
TFViewMain.Display(@DisplayLoginView);
end;
begin
if not DMConnection.ApiConnection.Connected then
DMConnection.ApiConnection.Open(@ConnectProc)
else
ConnectProc;
end;
procedure DisplayLoginView(AMessage: string);
begin
AuthService.Logout;
DMConnection.ApiConnection.Connected := False;
if Assigned(FViewMain) then
FViewMain.Free;
TFViewLogin.Display(@DisplayMainView, AMessage);
end;
procedure UnauthorizedAccessProc(AMessage: string);
begin
DisplayLoginView(AMessage);
end;
procedure StartApplication;
var
ClientVer: string;
begin
ClientVer := TDMConnection.clientVersion;
DMConnection.InitApp(
procedure
begin
DMConnection.SetClientConfig(
procedure(Success: Boolean; ErrorMessage: string)
begin
if Success then
begin
if (not AuthService.Authenticated) or AuthService.TokenExpired then
DisplayLoginView
else
DisplayMainView;
end
else
begin
asm
var dlg = document.createElement("dialog");
dlg.classList.add("shadow", "rounded", "border", "p-4");
dlg.style.maxWidth = "500px";
dlg.style.width = "90%";
dlg.style.fontFamily = "system-ui, sans-serif";
dlg.innerHTML =
"<h5 class='fw-bold mb-3 text-danger'>kgOrders web app</h5>" +
"<p class='mb-3' style='white-space: pre-wrap;'>" + ErrorMessage + "</p>" +
"<div class='text-end'>" +
"<button id='refreshBtn' class='btn btn-primary'>Reload</button></div>";
document.body.appendChild(dlg);
dlg.showModal();
document.getElementById("refreshBtn").addEventListener("click", function () {
var base = location.origin + location.pathname;
location.replace(base + "?ver=" + ClientVer + "&r=" + Date.now() + location.hash);
});
end;
end;
end);
end,
@UnauthorizedAccessProc
);
end;
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TDMConnection, DMConnection);
StartApplication;
Application.Run;
end.
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProjectGuid>{DB6F5DBF-7E4B-45DA-AFFA-6C8DF15BA740}</ProjectGuid>
<ProjectVersion>20.3</ProjectVersion>
<FrameworkType>VCL</FrameworkType>
<MainSource>webTemplateApp.dpr</MainSource>
<Base>True</Base>
<Config Condition="'$(Config)'==''">Debug</Config>
<Platform Condition="'$(Platform)'==''">Win32</Platform>
<TargetedPlatforms>1</TargetedPlatforms>
<AppType>Application</AppType>
<ProjectName Condition="'$(ProjectName)'==''">webTemplateApp</ProjectName>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''">
<Base_Win32>true</Base_Win32>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Base)'=='true') or '$(Base_Win64)'!=''">
<Base_Win64>true</Base_Win64>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''">
<Cfg_1>true</Cfg_1>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win32)'!=''">
<Cfg_1_Win32>true</Cfg_1_Win32>
<CfgParent>Cfg_1</CfgParent>
<Cfg_1>true</Cfg_1>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''">
<Cfg_2>true</Cfg_2>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_2)'=='true') or '$(Cfg_2_Win32)'!=''">
<Cfg_2_Win32>true</Cfg_2_Win32>
<CfgParent>Cfg_2</CfgParent>
<Cfg_2>true</Cfg_2>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Base)'!=''">
<DCC_DcuOutput>.\$(Platform)\$(Config)</DCC_DcuOutput>
<DCC_ExeOutput>.\$(Platform)\$(Config)</DCC_ExeOutput>
<DCC_E>false</DCC_E>
<DCC_N>false</DCC_N>
<DCC_S>false</DCC_S>
<DCC_F>false</DCC_F>
<DCC_K>false</DCC_K>
<DCC_UsePackage>RESTComponents;emsclientfiredac;DataSnapFireDAC;FireDACIBDriver;xdata;emsclient;FireDACCommon;RESTBackendComponents;soapserver;CloudService;FireDACCommonDriver;inet;FireDAC;FireDACSqliteDriver;soaprtl;soapmidas;aurelius;$(DCC_UsePackage)</DCC_UsePackage>
<DCC_Namespace>System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace)</DCC_Namespace>
<Icon_MainIcon>$(BDS)\bin\delphi_PROJECTICON.ico</Icon_MainIcon>
<Icns_MainIcns>$(BDS)\bin\delphi_PROJECTICNS.icns</Icns_MainIcns>
<SanitizedProjectName>webTemplateApp</SanitizedProjectName>
<VerInfo_Locale>1046</VerInfo_Locale>
<TMSWebProject>2</TMSWebProject>
<VerInfo_Keys>CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.802;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;LastCompiledTime=2018/07/25 12:57:53</VerInfo_Keys>
<TMSWebHTMLFile>index.html</TMSWebHTMLFile>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Win32)'!=''">
<DCC_UsePackage>DBXSqliteDriver;DataSnapServerMidas;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;svnui;tethering;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;svn;Intraweb;DBXOracleDriver;inetdb;FmxTeeUI;emsedge;fmx;fmxdae;vclib;FireDACDBXDriver;dbexpress;IndyCore;vclx;dsnap;DataSnapCommon;DataSnapConnectors;VCLRESTComponents;vclie;TMSWEBCorePkgDXE11;bindengine;DBXMySQLDriver;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;DataSnapClient;bindcompdbx;IndyIPCommon;vcl;DBXSybaseASEDriver;IndyIPServer;IndySystem;FireDACDb2Driver;TMSWEBCorePkgLibDXE11;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;TeeDB;emshosting;FireDACPgDriver;ibmonitor;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;DbxCommonDriver;ibxpress;Tee;DataSnapServer;xmlrtl;DataSnapNativeClient;fmxobj;vclwinx;ibxbindings;rtl;FireDACDSDriver;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;TeeUI;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;inetdbxpress;FireDACMongoDBDriver;IndyProtocols;fmxase;$(DCC_UsePackage)</DCC_UsePackage>
<DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace>
<BT_BuildType>Debug</BT_BuildType>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<VerInfo_Keys>CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=0.9.5.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=0.9.5.0;Comments=</VerInfo_Keys>
<VerInfo_Locale>1033</VerInfo_Locale>
<Manifest_File>$(BDS)\bin\default_app.manifest</Manifest_File>
<VerInfo_MajorVer>0</VerInfo_MajorVer>
<VerInfo_MinorVer>9</VerInfo_MinorVer>
<VerInfo_Release>5</VerInfo_Release>
<AppDPIAwarenessMode>none</AppDPIAwarenessMode>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Win64)'!=''">
<DCC_UsePackage>DBXSqliteDriver;DataSnapServerMidas;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;tethering;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;Intraweb;DBXOracleDriver;inetdb;FmxTeeUI;emsedge;fmx;fmxdae;vclib;FireDACDBXDriver;dbexpress;IndyCore;vclx;dsnap;DataSnapCommon;DataSnapConnectors;VCLRESTComponents;vclie;bindengine;DBXMySQLDriver;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;DataSnapClient;bindcompdbx;IndyIPCommon;vcl;DBXSybaseASEDriver;IndyIPServer;IndySystem;FireDACDb2Driver;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;TeeDB;emshosting;FireDACPgDriver;ibmonitor;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;DbxCommonDriver;ibxpress;Tee;DataSnapServer;xmlrtl;DataSnapNativeClient;fmxobj;vclwinx;ibxbindings;rtl;FireDACDSDriver;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;TeeUI;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;inetdbxpress;FireDACMongoDBDriver;IndyProtocols;fmxase;$(DCC_UsePackage)</DCC_UsePackage>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1)'!=''">
<DCC_Define>DEBUG;$(DCC_Define)</DCC_Define>
<DCC_DebugDCUs>true</DCC_DebugDCUs>
<DCC_Optimize>false</DCC_Optimize>
<DCC_GenerateStackFrames>true</DCC_GenerateStackFrames>
<DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
<DCC_RemoteDebug>true</DCC_RemoteDebug>
<TMSWebDebugInfo>2</TMSWebDebugInfo>
<TMSWebDefines>DEBUG</TMSWebDefines>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1_Win32)'!=''">
<DCC_RemoteDebug>false</DCC_RemoteDebug>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<VerInfo_Locale>1033</VerInfo_Locale>
<VerInfo_Keys>CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=0.9.8.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=0.9.8.0;Comments=;LastCompiledTime=2018/08/27 15:18:29</VerInfo_Keys>
<AppDPIAwarenessMode>PerMonitor</AppDPIAwarenessMode>
<VerInfo_MajorVer>0</VerInfo_MajorVer>
<VerInfo_MinorVer>9</VerInfo_MinorVer>
<VerInfo_Release>8</VerInfo_Release>
<TMSWebBrowser>1</TMSWebBrowser>
<TMSUseJSDebugger>2</TMSUseJSDebugger>
<TMSWebSingleInstance>1</TMSWebSingleInstance>
<TMSWebOutputPath>..\kgOrdersServer\bin\static</TMSWebOutputPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2)'!=''">
<DCC_LocalDebugSymbols>false</DCC_LocalDebugSymbols>
<DCC_Define>RELEASE;$(DCC_Define)</DCC_Define>
<DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo>
<DCC_DebugInformation>0</DCC_DebugInformation>
<TMSWebOptimization>2</TMSWebOptimization>
<TMSWebDefines>RELEASE</TMSWebDefines>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2_Win32)'!=''">
<VerInfo_Keys>CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;LastCompiledTime=2018/08/22 16:25:56</VerInfo_Keys>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<VerInfo_Locale>1033</VerInfo_Locale>
<AppDPIAwarenessMode>PerMonitor</AppDPIAwarenessMode>
<TMSWebBrowser>1</TMSWebBrowser>
</PropertyGroup>
<ItemGroup>
<DelphiCompile Include="$(MainSource)">
<MainSource>MainSource</MainSource>
</DelphiCompile>
<DCCReference Include="Auth.Service.pas"/>
<DCCReference Include="App.Types.pas"/>
<DCCReference Include="ConnectionModule.pas">
<Form>DMConnection</Form>
<DesignClass>TWebDataModule</DesignClass>
</DCCReference>
<DCCReference Include="App.Config.pas"/>
<DCCReference Include="View.Main.pas">
<Form>FViewMain</Form>
<FormType>dfm</FormType>
<DesignClass>TWebForm</DesignClass>
</DCCReference>
<DCCReference Include="Utils.pas"/>
<DCCReference Include="View.Login.pas">
<Form>FViewLogin</Form>
<FormType>dfm</FormType>
<DesignClass>TWebForm</DesignClass>
</DCCReference>
<DCCReference Include="View.Test.pas">
<Form>FTest</Form>
<FormType>dfm</FormType>
<DesignClass>TWebForm</DesignClass>
</DCCReference>
<None Include="index.html"/>
<None Include="css\app.css"/>
<None Include="config\config.json"/>
<None Include="css\spinner.css"/>
<BuildConfiguration Include="Base">
<Key>Base</Key>
</BuildConfiguration>
<BuildConfiguration Include="Debug">
<Key>Cfg_1</Key>
<CfgParent>Base</CfgParent>
</BuildConfiguration>
<BuildConfiguration Include="Release">
<Key>Cfg_2</Key>
<CfgParent>Base</CfgParent>
</BuildConfiguration>
</ItemGroup>
<ProjectExtensions>
<Borland.Personality>Delphi.Personality.12</Borland.Personality>
<Borland.ProjectType>Application</Borland.ProjectType>
<BorlandProject>
<Delphi.Personality>
<Source>
<Source Name="MainSource">webTemplateApp.dpr</Source>
</Source>
<Excluded_Packages>
<Excluded_Packages Name="$(BDSBIN)\bcboffice2k290.bpl">Embarcadero C++Builder Office 2000 Servers Package</Excluded_Packages>
<Excluded_Packages Name="$(BDSBIN)\bcbofficexp290.bpl">Embarcadero C++Builder Office XP Servers Package</Excluded_Packages>
<Excluded_Packages Name="$(BDSBIN)\dcloffice2k290.bpl">Microsoft Office 2000 Sample Automation Server Wrapper Components</Excluded_Packages>
<Excluded_Packages Name="$(BDSBIN)\dclofficexp290.bpl">Microsoft Office XP Sample Automation Server Wrapper Components</Excluded_Packages>
</Excluded_Packages>
</Delphi.Personality>
<Deployment Version="5">
<DeployFile LocalName="Win32\Debug\webCharms.exe" Configuration="Debug" Class="ProjectOutput"/>
<DeployFile LocalName="Win32\Debug\webKGOrders.exe" Configuration="Debug" Class="ProjectOutput"/>
<DeployFile LocalName="Win32\Debug\webTemplateApp.exe" Configuration="Debug" Class="ProjectOutput">
<Platform Name="Win32">
<RemoteName>webTemplateApp.exe</RemoteName>
<Overwrite>true</Overwrite>
</Platform>
</DeployFile>
<DeployFile LocalName="Win32\Debug\webTemplateApp.exe" Configuration="Debug" Class="ProjectOutput">
<Platform Name="Win32">
<RemoteName>webTemplateApp.exe</RemoteName>
<Overwrite>true</Overwrite>
</Platform>
</DeployFile>
<DeployFile LocalName="Win32\Release\webTemplateApp.exe" Configuration="Release" Class="ProjectOutput">
<Platform Name="Win32">
<RemoteName>webTemplateApp.exe</RemoteName>
<Overwrite>true</Overwrite>
</Platform>
</DeployFile>
<DeployFile LocalName="Win32\Release\webTemplateApp.exe" Configuration="Release" Class="ProjectOutput">
<Platform Name="Win32">
<RemoteName>webTemplateApp.exe</RemoteName>
<Overwrite>true</Overwrite>
</Platform>
</DeployFile>
<DeployFile LocalName="config\config.json" Configuration="Debug" Class="ProjectFile"/>
<DeployFile LocalName="config\config.json" Configuration="Debug" Class="ProjectFile">
<Platform Name="Win32">
<RemoteDir>.\</RemoteDir>
<Overwrite>true</Overwrite>
</Platform>
</DeployFile>
<DeployFile LocalName="config\config.json" Configuration="Release" Class="ProjectFile">
<Platform Name="Win32">
<RemoteDir>.\</RemoteDir>
<Overwrite>true</Overwrite>
</Platform>
</DeployFile>
<DeployFile LocalName="css\app.css" Configuration="Debug" Class="ProjectFile"/>
<DeployFile LocalName="css\app.css" Configuration="Debug" Class="ProjectFile">
<Platform Name="Win32">
<RemoteDir>.\</RemoteDir>
<Overwrite>true</Overwrite>
</Platform>
</DeployFile>
<DeployFile LocalName="css\app.css" Configuration="Release" Class="ProjectFile">
<Platform Name="Win32">
<RemoteDir>.\</RemoteDir>
<Overwrite>true</Overwrite>
</Platform>
</DeployFile>
<DeployFile LocalName="css\spinner.css" Configuration="Debug" Class="ProjectFile">
<Platform Name="Win32">
<RemoteDir>.\</RemoteDir>
<Overwrite>true</Overwrite>
</Platform>
</DeployFile>
<DeployFile LocalName="css\spinner.css" Configuration="Release" Class="ProjectFile">
<Platform Name="Win32">
<RemoteDir>.\</RemoteDir>
<Overwrite>true</Overwrite>
</Platform>
</DeployFile>
<DeployFile LocalName="index.html" Configuration="Debug" Class="ProjectFile"/>
<DeployFile LocalName="index.html" Configuration="Debug" Class="ProjectFile">
<Platform Name="Win32">
<RemoteDir>.\</RemoteDir>
<Overwrite>true</Overwrite>
</Platform>
</DeployFile>
<DeployFile LocalName="index.html" Configuration="Release" Class="ProjectFile">
<Platform Name="Win32">
<RemoteDir>.\</RemoteDir>
<Overwrite>true</Overwrite>
</Platform>
</DeployFile>
<DeployFile LocalName="template\bootstrap\bootstrap.min.css" Configuration="Debug" Class="ProjectFile"/>
<DeployFile LocalName="template\bootstrap\bootstrap.min.js" Configuration="Debug" Class="ProjectFile"/>
<DeployFile LocalName="template\bootstrap\dataTables.bootstrap.css" Configuration="Debug" Class="ProjectFile"/>
<DeployFile LocalName="template\css\emsys.css" Configuration="Debug" Class="ProjectFile"/>
<DeployFile LocalName="template\css\metisMenu.min.css" Configuration="Debug" Class="ProjectFile"/>
<DeployFile LocalName="template\css\morris.css" Configuration="Debug" Class="ProjectFile"/>
<DeployFile LocalName="template\css\sb-admin-2.css" Configuration="Debug" Class="ProjectFile"/>
<DeployFile LocalName="template\font-awesome\font-awesome.min.css" Configuration="Debug" Class="ProjectFile"/>
<DeployFile LocalName="template\font-awesome\fonts\fontawesome-webfont.ttf" Configuration="Debug" Class="ProjectFile"/>
<DeployFile LocalName="template\font-awesome\fonts\fontawesome-webfont.woff2" Configuration="Debug" Class="ProjectFile"/>
<DeployFile LocalName="template\font-awesome\fonts\fontawesome-webfont.woff" Configuration="Debug" Class="ProjectFile"/>
<DeployFile LocalName="template\jquery\jquery.min.js" Configuration="Debug" Class="ProjectFile"/>
<DeployClass Name="AdditionalDebugSymbols">
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
<Platform Name="OSX32">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidFileProvider">
<Platform Name="Android">
<RemoteDir>res\xml</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\xml</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidLibnativeArmeabiFile">
<Platform Name="Android">
<RemoteDir>library\lib\armeabi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>library\lib\armeabi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidLibnativeArmeabiv7aFile">
<Platform Name="Android64">
<RemoteDir>library\lib\armeabi-v7a</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidLibnativeMipsFile">
<Platform Name="Android">
<RemoteDir>library\lib\mips</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>library\lib\mips</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidServiceOutput">
<Platform Name="Android">
<RemoteDir>library\lib\armeabi-v7a</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>library\lib\arm64-v8a</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidServiceOutput_Android32">
<Platform Name="Android64">
<RemoteDir>library\lib\armeabi-v7a</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidSplashImageDef">
<Platform Name="Android">
<RemoteDir>res\drawable</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidSplashImageDefV21">
<Platform Name="Android">
<RemoteDir>res\drawable-anydpi-v21</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-anydpi-v21</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidSplashStyles">
<Platform Name="Android">
<RemoteDir>res\values</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\values</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidSplashStylesV21">
<Platform Name="Android">
<RemoteDir>res\values-v21</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\values-v21</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidSplashStylesV31">
<Platform Name="Android">
<RemoteDir>res\values-v31</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\values-v31</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidSplashStylesV35">
<Platform Name="Android">
<RemoteDir>res\values-v35</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\values-v35</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_AdaptiveIcon">
<Platform Name="Android">
<RemoteDir>res\drawable-anydpi-v26</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-anydpi-v26</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_AdaptiveIconBackground">
<Platform Name="Android">
<RemoteDir>res\drawable</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_AdaptiveIconForeground">
<Platform Name="Android">
<RemoteDir>res\drawable</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_AdaptiveIconMonochrome">
<Platform Name="Android">
<RemoteDir>res\drawable</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_AdaptiveIconV33">
<Platform Name="Android">
<RemoteDir>res\drawable-anydpi-v33</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-anydpi-v33</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_Colors">
<Platform Name="Android">
<RemoteDir>res\values</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\values</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_ColorsDark">
<Platform Name="Android">
<RemoteDir>res\values-night-v21</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\values-night-v21</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_DefaultAppIcon">
<Platform Name="Android">
<RemoteDir>res\drawable</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_LauncherIcon144">
<Platform Name="Android">
<RemoteDir>res\drawable-xxhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-xxhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_LauncherIcon192">
<Platform Name="Android">
<RemoteDir>res\drawable-xxxhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-xxxhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_LauncherIcon36">
<Platform Name="Android">
<RemoteDir>res\drawable-ldpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-ldpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_LauncherIcon48">
<Platform Name="Android">
<RemoteDir>res\drawable-mdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-mdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_LauncherIcon72">
<Platform Name="Android">
<RemoteDir>res\drawable-hdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-hdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_LauncherIcon96">
<Platform Name="Android">
<RemoteDir>res\drawable-xhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-xhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_NotificationIcon24">
<Platform Name="Android">
<RemoteDir>res\drawable-mdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-mdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_NotificationIcon36">
<Platform Name="Android">
<RemoteDir>res\drawable-hdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-hdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_NotificationIcon48">
<Platform Name="Android">
<RemoteDir>res\drawable-xhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-xhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_NotificationIcon72">
<Platform Name="Android">
<RemoteDir>res\drawable-xxhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-xxhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_NotificationIcon96">
<Platform Name="Android">
<RemoteDir>res\drawable-xxxhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-xxxhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_SplashImage426">
<Platform Name="Android">
<RemoteDir>res\drawable-small</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-small</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_SplashImage470">
<Platform Name="Android">
<RemoteDir>res\drawable-normal</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-normal</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_SplashImage640">
<Platform Name="Android">
<RemoteDir>res\drawable-large</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-large</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_SplashImage960">
<Platform Name="Android">
<RemoteDir>res\drawable-xlarge</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-xlarge</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_Strings">
<Platform Name="Android">
<RemoteDir>res\values</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\values</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_VectorizedNotificationIcon">
<Platform Name="Android">
<RemoteDir>res\drawable-anydpi-v24</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-anydpi-v24</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_VectorizedSplash">
<Platform Name="Android">
<RemoteDir>res\drawable</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_VectorizedSplashDark">
<Platform Name="Android">
<RemoteDir>res\drawable-night-anydpi-v21</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-night-anydpi-v21</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_VectorizedSplashV31">
<Platform Name="Android">
<RemoteDir>res\drawable-anydpi-v31</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-anydpi-v31</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_VectorizedSplashV31Dark">
<Platform Name="Android">
<RemoteDir>res\drawable-night-anydpi-v31</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-night-anydpi-v31</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="DebugSymbols">
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
<Platform Name="OSX32">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
</Platform>
</DeployClass>
<DeployClass Name="DependencyFramework">
<Platform Name="OSX32">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
<Extensions>.framework</Extensions>
</Platform>
<Platform Name="OSX64">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
<Extensions>.framework</Extensions>
</Platform>
<Platform Name="OSXARM64">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
<Extensions>.framework</Extensions>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
</Platform>
</DeployClass>
<DeployClass Name="DependencyModule">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="iOSSimARM64">
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="OSX32">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="OSX64">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="OSXARM64">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
<Extensions>.dll;.bpl</Extensions>
</Platform>
</DeployClass>
<DeployClass Required="true" Name="DependencyPackage">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="iOSSimARM64">
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="OSX32">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="OSX64">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="OSXARM64">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
<Extensions>.bpl</Extensions>
</Platform>
</DeployClass>
<DeployClass Name="File">
<Platform Name="Android">
<Operation>0</Operation>
</Platform>
<Platform Name="Android64">
<Operation>0</Operation>
</Platform>
<Platform Name="iOSDevice32">
<Operation>0</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>0</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<Operation>0</Operation>
</Platform>
<Platform Name="OSX32">
<RemoteDir>Contents\Resources\StartUp\</RemoteDir>
<Operation>0</Operation>
</Platform>
<Platform Name="OSX64">
<RemoteDir>Contents\Resources\StartUp\</RemoteDir>
<Operation>0</Operation>
</Platform>
<Platform Name="OSXARM64">
<RemoteDir>Contents\Resources\StartUp\</RemoteDir>
<Operation>0</Operation>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectAndroidManifest">
<Platform Name="Android">
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectOSXDebug">
<Platform Name="OSX64">
<RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="OSXARM64">
<RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectOSXEntitlements">
<Platform Name="OSX32">
<RemoteDir>..\</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="OSX64">
<RemoteDir>..\</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="OSXARM64">
<RemoteDir>..\</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectOSXInfoPList">
<Platform Name="OSX32">
<RemoteDir>Contents</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="OSX64">
<RemoteDir>Contents</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="OSXARM64">
<RemoteDir>Contents</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectOSXResource">
<Platform Name="OSX32">
<RemoteDir>Contents\Resources</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="OSX64">
<RemoteDir>Contents\Resources</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="OSXARM64">
<RemoteDir>Contents\Resources</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Required="true" Name="ProjectOutput">
<Platform Name="Android">
<RemoteDir>library\lib\armeabi-v7a</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>library\lib\arm64-v8a</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<Operation>1</Operation>
</Platform>
<Platform Name="Linux64">
<Operation>1</Operation>
</Platform>
<Platform Name="OSX32">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="OSX64">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="OSXARM64">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectOutput_Android32">
<Platform Name="Android64">
<RemoteDir>library\lib\armeabi-v7a</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectUWPManifest">
<Platform Name="Win32">
<Operation>1</Operation>
</Platform>
<Platform Name="Win64">
<Operation>1</Operation>
</Platform>
<Platform Name="Win64x">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectiOSDeviceDebug">
<Platform Name="iOSDevice32">
<RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectiOSEntitlements">
<Platform Name="iOSDevice32">
<RemoteDir>..\</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<RemoteDir>..\</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectiOSInfoPList">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectiOSLaunchScreen">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen</RemoteDir>
<Operation>64</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen</RemoteDir>
<Operation>64</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectiOSResource">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="UWP_DelphiLogo150">
<Platform Name="Win32">
<RemoteDir>Assets</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Win64">
<RemoteDir>Assets</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="UWP_DelphiLogo44">
<Platform Name="Win32">
<RemoteDir>Assets</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Win64">
<RemoteDir>Assets</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iOS_AppStore1024">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_AppIcon152">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_AppIcon167">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_Launch2x">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_LaunchDark2x">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_Notification40">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_Setting58">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_SpotLight80">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_AppIcon120">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_AppIcon180">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Launch2x">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Launch3x">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_LaunchDark2x">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_LaunchDark3x">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Notification40">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Notification60">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Setting58">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Setting87">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Spotlight120">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Spotlight80">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<ProjectRoot Platform="Android" Name="$(PROJECTNAME)"/>
<ProjectRoot Platform="Android64" Name="$(PROJECTNAME)"/>
<ProjectRoot Platform="iOSDevice32" Name="$(PROJECTNAME).app"/>
<ProjectRoot Platform="iOSDevice64" Name="$(PROJECTNAME).app"/>
<ProjectRoot Platform="iOSSimARM64" Name="$(PROJECTNAME).app"/>
<ProjectRoot Platform="iOSSimulator" Name="$(PROJECTNAME).app"/>
<ProjectRoot Platform="Linux64" Name="$(PROJECTNAME)"/>
<ProjectRoot Platform="OSX32" Name="$(PROJECTNAME).app"/>
<ProjectRoot Platform="OSX64" Name="$(PROJECTNAME).app"/>
<ProjectRoot Platform="OSXARM64" Name="$(PROJECTNAME).app"/>
<ProjectRoot Platform="Win32" Name="$(PROJECTNAME)"/>
<ProjectRoot Platform="Win64" Name="$(PROJECTNAME)"/>
<ProjectRoot Platform="Win64x" Name="$(PROJECTNAME)"/>
</Deployment>
<Platforms>
<Platform value="Win32">True</Platform>
<Platform value="Win64">False</Platform>
</Platforms>
<ModelSupport>False</ModelSupport>
</BorlandProject>
<ProjectFileVersion>12</ProjectFileVersion>
</ProjectExtensions>
<Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')"/>
<Import Project="$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj" Condition="Exists('$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj')"/>
<Import Project="$(MSBuildProjectName).deployproj" Condition="Exists('$(MSBuildProjectName).deployproj')"/>
</Project>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment