====== Ticketer Lite Development Details ======
Updated by Anna Dowling 12/10/2022
===== Overview =====
The purpose of the Ticketer Lite project is to bring the look and feel as well as the technology stack of the existing ticketer application up to date. The Ticketer is one of Errigals main, heavily used applications, yet the application display could be considered quite outdated. The applications front end technology stack is currently a mixture of grails gsp controllers and SmartGWT. These are both old technologies which are no longer favoured. As well as the age of them, they are also quite limiting when it comes to implementing more complex or detailed front end features.
Ticketer Lite application uses 5 services:
* ticketer-light for frontend
* user profile for authentication
* ticketer-light-gateway for middle-ware and backend data
* Ticketer for Business Logic backend
* idms-proxy for providing SnmpManager data
Repo:
* https://bitbucket.org/errigal/ticketer/branch/dev
* https://bitbucket.org/errigal/ticketer-light-gateway/branch/master
* https://bitbucket.org/errigal/ticketer-light/branch/master
* https://bitbucket.org/errigal/idms-proxy/branch/master
See also: [[development:applications:ticketer_light_gateway|Ticketer Light Gateway (Ticketer Light Gateway)]]
----
===== Architecture =====
== DIAGRAM 1 ==
{{ :development:applications:tl_architecture.png?600 |}}
== DIAGRAM 2 ==
{{ :development:applications:r_d-architecture_-_ticketer_lite.drawio.png?600 |}}
===== List of Tools & Technologies =====
* Java 11
* Spring Boot 2.4
* Spring R2DBC 2.4
* Spring WebFlux 2.4
* graphql-java 16.1
* Angular 11
* Apollo Client
* ngx-translate
===== Configuration =====
The ticketer-light is served via the load balancer in our server deployments. Its environment-specific variables are passed via the **/var/www/html/ticketer-light/config/config.json** file to the app at runtime.
Current Config Fields Are:
{
"deployment": {
"build": {
"identifier": "ticketer-light » ticketer-light-feature-branches » REL-4.4.0 REL-4.4.0.3",
"branch": "REL-4.4.0",
"number": "3",
"buildTime": "2022-10-06 09:35:42",
"deploymentTime": "2022-10-06 10:18:48"
}
},
"authConfig": {
"contextPath": "ticketer-light",
"userProfileUrl": "https://qanova.errigal.com/userprofile",
"redirectUri": "https://qanova.errigal.com/ticketer-light/callback",
"clientId": "0f59ca3a-353c-11eb-b954-0242ac110002",
"gatewayUri": "https://qanova.errigal.com/ticketer-light-gateway"
},
"googleAnalyticsConfig": {
"siteId": "UA-158352259-10"
},
"proxyConfig": {
"proxyApiUrl": "https://qanova.errigal.com/idms-proxy/api/v0"
},
"snmpConfig": {
"emsUrl": "https://qanova.errigal.com/SnmpManager/errigalEMS",
"snmpManagerUrl": "https://qanova.errigal.com/SnmpManager"
},
"ticketerConfig": {
"ticketerUrl": "https://qanova.errigal.com/Ticketer",
"analyticalReportUrl": "https://qanova.errigal.com/bubble-app",
"privateSalt": "BPVD05c3bvNYjntvfdhJLp2Xx4pH",
"demarcationEnabled": false,
"multiTenancy": false,
"kanbanEnabled": false,
"networkIdEnabled": true,
"siteIdEnabled": false,
"ticketerWorkbenchTimezone": "utc",
"ticketerWorkbenchTimezoneOffset": 0
},
"commonHeaderConfig": {
"headerUrl": "https://qanova.errigal.com/errigal-common-header/",
"config": "atc",
"version": "2.0",
"css": "style.css",
"suiteName": "IDMS - Demo Instance -",
"appName": "Ticketer Lite"
},
"casConfig": {
"casUrl": "https://qanova.errigal.com/cas",
"casCheck": false,
"casCheckInterval": 10000
},
"hotJarConfig": {
"hotJarEnabled": false,
"hotJarSiteId": 0,
"hotJarSnippetVersion": 6
}
}
=== Ansible Playbooks ===
ansible-playbook -i ../env-configuration/ENV/hosts.ini --diff --vault-id @prompt ticketer.yml --extra-vars "jenkins_build_name='ticketer-feature-branches/job/BRANCH' jenkins_job_build_num=NUM actions='upload,configure,deploy,stop,start'"
ansible-playbook -i ../env-configuration/ENV/hosts.ini --diff --vault-id @prompt idms-proxy.yml --extra-vars "jenkins_build_name='idms-proxy-feature-branches/job/BRANCH' appFileExtension='.jar' jenkins_job_build_num=NUM actions='upload,stop,deploy,configure,start'"
ansible-playbook -i ../env-configuration/nova/hosts.ini --diff --vault-id @prompt ticketer-light.yml --extra-vars "jenkins_build_name='ticketer-light-feature-branches/job/branchName' jenkins_job_build_num=buildNumber actions='upload,configure,deploy'"
ansible-playbook -i ../env-configuration/ENV/hosts.ini --diff --vault-id @prompt ticketer-light-gateway.yml --extra-vars "jenkins_build_name='ticketer-light-gateway-feature-branches/job/BRANCH' jenkins_job_build_num=NUM appFileExtension='.jar' actions='upload,stop,deploy,configure,start'"
=== Jenkins Build ===
https://jenkins.errigal.com:8443/job/ticketer-light/
===== Project Documents =====
For further information see requirements
documentation[[https://drive.google.com/drive/u/0/folders/1FbjMFdmZpCJ4jWcqFe4R21mnAr6wUhPy|here]]
===== OAuth2 and CAS Integration =====
Userprofile is acting as the authentication server for OAuth2, and also integrated with CAS to login to IDMS.
{{ :development:applications:tl_5.png?400 |}}
Implementation of an authentication service (AuthService) did the following:
* Issue a request to the Authentication server to retrieve an authentication token in JWT format.
* Issue a request to the CAS server to login to IDMS and generate CAS TGT and cookies
* Save token to browser session storage in the format:
* access_token
* token_expires_at
* CAS cookies
Implementation of an verifier service (AuthVerifierService) did the following:
* Generate auth token verifier hash
* Generate auth request parameters
Decode received result using jwt decoder.
Implementation of AuthGuard to detect:
* user authentication
* Token expiration and refresh
Implementation of a callback component in the angular front end once authenticated had been granted.
===== User Permission Control =====
User permissions for ticketer light are set up and managed via the User Profile Application using the existing Ticketer application permissions structure.
See also [[https://docs.google.com/document/d/1SY9ElGqaXUY4dFm-V4a1ZDGBrQCDLMTdSTHAFdTfgng/edit?usp=sharing|documentation]] for details.
=====Main Screens =====
==== View 1: Login(in Userprofile) ====
{{ :development:applications:tl_1.png?600 |}}
==== View 2: Ticket List, Search, History ====
{{ :development:applications:tl_2.png?600 |}}
==== View 3: Ticket Details ====
{{ :development:applications:tl_3.png?600 |}}
==== View 4: Ticket Details - Attachments Popup ====
{{ :development:applications:screenshot_2022-10-03_at_14.20.16.png?600 |}}
==== View 5: Ticket Details - Email Popup ====
{{ :development:applications:screenshot_2022-10-03_at_14.22.21.png?600 |}}
==== View 6: Ticket Details - Ticket History Popup ====
{{ :development:applications:screenshot_2022-10-03_at_14.23.44.png?600 |}}
==== View 7: Ticket Details - Ticket History Popup ====
{{ :development:applications:screenshot_2022-10-03_at_14.25.03.png?600 |}}
==== View 8: Ticket Details - Manage Owners Popup ====
{{ :development:applications:screenshot_2022-10-03_at_14.25.45.png?600 |}}
==== View 9: Ticket Details - Follow Up Popup ====
{{ :development:applications:screenshot_2022-10-03_at_14.26.33.png?600 |}}
==== View 10: Ticket Details - Ticket Group Popup ====
{{ :development:applications:screenshot_2022-10-03_at_14.29.17.png?600 |}}
==== View 11: Ticket Details - Contact Details Popup ====
{{ :development:applications:screenshot_2022-10-03_at_14.29.48.png?600 |}}
==== View 12: Ticket Details - Related Tickets Popup ====
{{ :development:applications:screenshot_2022-10-03_at_14.30.46.png?600 |}}
==== View 13: Ticket Forms ====
{{ :development:applications:tl_4.png?600 |}}
==== View 14: Create Ticket ====
{{ :development:applications:screenshot_2022-10-03_at_14.32.03.png?600 |}}
==== View 15: My Profile ====
{{ :development:applications:screenshot_2022-10-03_at_14.32.57.png?600 |}}
==== View 16: Alarm Details Pop up on ticket ====
{{ :development:applications:screenshot_2022-10-03_at_14.35.01.png?600 |}}
==== View 17: Device Details Pop up on ticket ====
{{ :development:applications:screenshot_2022-10-03_at_14.35.09.png?600 |}}
----
===== Google Analytics =====
User actions are tracked via Google Analytics.