
GET     /                                                     otoroshi.controllers.BackOfficeController.index
GET     /robot.txt                                            otoroshi.controllers.BackOfficeController.robotTxt
GET     /error                                                otoroshi.controllers.BackOfficeController.error(message: Option[String])
GET     /auth0error                                           otoroshi.controllers.AuthController.auth0error(error: Option[String], error_description: Option[String])
GET     /health                                               otoroshi.controllers.HealthController.health()
GET     /metrics                                              otoroshi.controllers.HealthController.processMetrics()
GET     /live                                                 otoroshi.controllers.HealthController.live()
GET     /ready                                                otoroshi.controllers.HealthController.ready()
GET     /startup                                              otoroshi.controllers.HealthController.startup()

# WebAuthn URLs
POST    /bo/webauthn/register/start                           otoroshi.controllers.U2FController.webAuthnRegistrationStart()
POST    /bo/webauthn/register/finish                          otoroshi.controllers.U2FController.webAuthnRegistrationFinish()
POST    /bo/webauthn/login/start                              otoroshi.controllers.U2FController.webAuthnLoginStart()
POST    /bo/webauthn/login/finish                             otoroshi.controllers.U2FController.webAuthnLoginFinish()
# GET     /bo/webauthn/admins                                 otoroshi.controllers.U2FController.webAuthnAdmins()
# DELETE  /bo/webauthn/admins/:username/:id                   otoroshi.controllers.U2FController.webAuthnDeleteAdmin(username, id)

# Simple Login URLs
GET     /bo/simple/login                                      otoroshi.controllers.U2FController.loginPage()
POST    /bo/simple/login                                      otoroshi.controllers.U2FController.simpleLogin()
# POST    /bo/simple/admins                                   otoroshi.controllers.U2FController.registerSimpleAdmin()
# GET     /bo/simple/admins                                   otoroshi.controllers.U2FController.simpleAdmins()
# DELETE  /bo/simple/admins/:username                         otoroshi.controllers.U2FController.deleteAdmin(username)

# BackOffice URLs
GET     /bo/cacert                                            otoroshi.controllers.BackOfficeController.caCert()
GET     /bo/dashboard                                         otoroshi.controllers.BackOfficeController.dashboard
GET     /bo/dashboard/*ui                                     otoroshi.controllers.BackOfficeController.dashboardRoutes(ui)
GET     /bo/api/lines/:lineId/:serviceId/docframe             otoroshi.controllers.BackOfficeController.documentationFrame(lineId, serviceId)
GET     /bo/api/lines/:lineId/:serviceId/docdesc              otoroshi.controllers.BackOfficeController.documentationFrameDescriptor(lineId, serviceId)
POST    /bo/api/search/services                               otoroshi.controllers.BackOfficeController.searchServicesApi()
GET     /bo/api/version                                       otoroshi.controllers.BackOfficeController.version()
GET     /bo/api/env                                           otoroshi.controllers.BackOfficeController.getEnv()
GET     /bo/api/apps                                          otoroshi.controllers.BackOfficeController.cleverApps()
# GET     /bo/api/sessions                                    otoroshi.controllers.BackOfficeController.sessions()
# DELETE  /bo/api/sessions/:id                                otoroshi.controllers.BackOfficeController.discardSession(id)
# DELETE  /bo/api/sessions                                    otoroshi.controllers.BackOfficeController.discardAllSessions()
# GET     /bo/api/papps/sessions                              otoroshi.controllers.BackOfficeController.privateAppsSessions()
# DELETE  /bo/api/papps/sessions/:id                          otoroshi.controllers.BackOfficeController.discardPrivateAppsSession(id)
# DELETE  /bo/api/papps/sessions                              otoroshi.controllers.BackOfficeController.discardAllPrivateAppsSessions()
POST    /bo/api/panic                                         otoroshi.controllers.BackOfficeController.panicMode()
GET     /bo/api/events/audit                                  otoroshi.controllers.BackOfficeController.auditEvents()
GET     /bo/api/events/alert                                  otoroshi.controllers.BackOfficeController.alertEvents()
GET     /bo/api/loggers/:name/level                           otoroshi.controllers.BackOfficeController.getLogLevel(name)
PUT     /bo/api/loggers/:name/level                           otoroshi.controllers.BackOfficeController.changeLogLevel(name, newLevel: Option[String])
GET     /bo/api/loggers                                       otoroshi.controllers.BackOfficeController.getAllLoggers()
GET     /bo/api/services/top10                                otoroshi.controllers.BackOfficeController.mostCalledServices()
GET     /bo/api/services/map                                  otoroshi.controllers.BackOfficeController.servicesMap()
DELETE  /bo/api/services/:id/circuitbreakers                  otoroshi.controllers.BackOfficeController.resetCircuitBreakers(id)

GET     /bo/api/bodies/:serviceId/:requestId                  otoroshi.controllers.BackOfficeController.fetchBodiesFor(serviceId, requestId)

GET     /bo/api/groups-and-services                           otoroshi.controllers.BackOfficeController.fetchGroupsAndServices()
GET     /bo/api/apikeys-for/:serviceId                        otoroshi.controllers.BackOfficeController.fetchApikeysForGroupAndService(serviceId)

POST    /bo/api/certificates/_data                            otoroshi.controllers.BackOfficeController.certificateData()
POST    /bo/api/certificates/_valid                           otoroshi.controllers.BackOfficeController.certificateIsValid()
POST    /bo/api/certificates/_selfSigned                      otoroshi.controllers.BackOfficeController.selfSignedCert()
POST    /bo/api/certificates/_selfSignedClient                otoroshi.controllers.BackOfficeController.selfSignedClientCert()
POST    /bo/api/certificates/_caSigned                        otoroshi.controllers.BackOfficeController.caSignedCert()
POST    /bo/api/certificates/_caSignedClient                  otoroshi.controllers.BackOfficeController.caSignedClientCert()
POST    /bo/api/certificates/_ca                              otoroshi.controllers.BackOfficeController.caCert()
POST    /bo/api/certificates/:id/_renew                       otoroshi.controllers.BackOfficeController.renew(id)
POST    /bo/api/certificates/_letsencrypt                     otoroshi.controllers.BackOfficeController.createLetsEncryptCertificate()
POST    /bo/api/certificates/_importP12                       otoroshi.controllers.BackOfficeController.importP12File()
POST    /bo/api/certificates/_createCertificate               otoroshi.controllers.BackOfficeController.createCertificate()
POST    /bo/api/certificates/_createCSR                       otoroshi.controllers.BackOfficeController.createCsr()

POST    /bo/api/auth/:id/_check                               otoroshi.controllers.BackOfficeController.checkExistingLdapConnection(id)
POST    /bo/api/auth/_check                                   otoroshi.controllers.BackOfficeController.checkLdapConnection()
POST    /bo/api/elastic/_check                                otoroshi.controllers.BackOfficeController.checkElasticsearchConnection()
POST    /bo/api/elastic/_apply_template                       otoroshi.controllers.BackOfficeController.applyElasticsearchTemplate()
POST    /bo/api/elastic/_template                             otoroshi.controllers.BackOfficeController.elasticTemplate()
GET     /bo/api/elastic/_version                              otoroshi.controllers.BackOfficeController.elasticVersion()

POST    /bo/api/oidc/_fetchConfig                             otoroshi.controllers.BackOfficeController.fetchOpenIdConfiguration()
POST    /bo/api/saml/_fetchConfig                             otoroshi.controllers.BackOfficeController.fetchSAMLConfiguration()

# Admin API proxy
GET     /bo/api/proxy/*path                                   otoroshi.controllers.BackOfficeController.proxyAdminApi(path)
POST    /bo/api/proxy/*path                                   otoroshi.controllers.BackOfficeController.proxyAdminApi(path)
PUT     /bo/api/proxy/*path                                   otoroshi.controllers.BackOfficeController.proxyAdminApi(path)
DELETE  /bo/api/proxy/*path                                   otoroshi.controllers.BackOfficeController.proxyAdminApi(path)
PATCH   /bo/api/proxy/*path                                   otoroshi.controllers.BackOfficeController.proxyAdminApi(path)
HEAD    /bo/api/proxy/*path                                   otoroshi.controllers.BackOfficeController.proxyAdminApi(path)
OPTIONS /bo/api/proxy/*path                                   otoroshi.controllers.BackOfficeController.proxyAdminApi(path)

# Private Apps URLs
GET     /privateapps/error                                    otoroshi.controllers.PrivateAppsController.error(message: Option[String])
GET     /privateapps/home                                     otoroshi.controllers.PrivateAppsController.home
GET     /privateapps/redirect                                 otoroshi.controllers.PrivateAppsController.redirect

DELETE  /privateapps/registration                             otoroshi.controllers.PrivateAppsController.selfRegistrationDelete()
POST    /privateapps/register/start                           otoroshi.controllers.PrivateAppsController.selfRegistrationStart()
POST    /privateapps/register/finish                          otoroshi.controllers.PrivateAppsController.selfRegistrationFinish()
GET     /privateapps/profile                                  otoroshi.controllers.PrivateAppsController.selfUpdateProfilePage()
POST    /privateapps/profile                                  otoroshi.controllers.PrivateAppsController.selfUpdateProfile()
POST    /api/privateapps/sessions/send/:id/:username          otoroshi.controllers.PrivateAppsController.sendSelfUpdateLink(id, username)
POST    /api/privateapps/sessions/:id/:username               otoroshi.controllers.PrivateAppsController.registerSession(id, username)

OPTIONS /privateapps/generic/login                            otoroshi.controllers.AuthController.confidentialAppLoginPageOptions()
GET     /privateapps/generic/login                            otoroshi.controllers.AuthController.confidentialAppLoginPage()
GET     /privateapps/generic/logout                           otoroshi.controllers.AuthController.confidentialAppLogout()
GET     /privateapps/generic/callback                         otoroshi.controllers.AuthController.confidentialAppCallback()
POST    /privateapps/generic/callback                         otoroshi.controllers.AuthController.confidentialAppCallback()


GET     /backoffice/auth0/login                               otoroshi.controllers.AuthController.backOfficeLogin()
GET     /backoffice/auth0/logout                              otoroshi.controllers.AuthController.backOfficeLogout()
GET     /backoffice/auth0/callback                            otoroshi.controllers.AuthController.backOfficeCallback(error: Option[String], error_description: Option[String])
POST    /backoffice/auth0/callback                            otoroshi.controllers.AuthController.backOfficeCallback(error: Option[String], error_description: Option[String])

# Admin API

## new models
GET     /api/new/apikey                                       otoroshi.controllers.adminapi.TemplatesController.initiateApiKey(groupId: Option[String])
GET     /api/new/service                                      otoroshi.controllers.adminapi.TemplatesController.initiateService()
GET     /api/new/tcp/service                                  otoroshi.controllers.adminapi.TemplatesController.initiateTcpService()
GET     /api/new/group                                        otoroshi.controllers.adminapi.TemplatesController.initiateServiceGroup()


# Create entity from template
POST    /api/tcp/services/_template                           otoroshi.controllers.adminapi.TemplatesController.createFromTemplate(entity = "tcp/services")
POST    /api/admins/simple/_template                          otoroshi.controllers.adminapi.TemplatesController.createFromTemplate(entity = "admins/simple")
POST    /api/admins/webauthn/_template                        otoroshi.controllers.adminapi.TemplatesController.createFromTemplate(entity = "admins/webauthn")
POST    /api/:entity/_template                                otoroshi.controllers.adminapi.TemplatesController.createFromTemplate(entity)

## ApiKeys
GET     /api/apikeys/_template                                otoroshi.controllers.adminapi.TemplatesController.initiateApiKey(groupId: Option[String])
POST    /api/apikeys/_bulk                                    otoroshi.controllers.adminapi.ApiKeysController.bulkCreateAction()
PUT     /api/apikeys/_bulk                                    otoroshi.controllers.adminapi.ApiKeysController.bulkUpdateAction()
PATCH   /api/apikeys/_bulk                                    otoroshi.controllers.adminapi.ApiKeysController.bulkPatchAction()
DELETE  /api/apikeys/_bulk                                    otoroshi.controllers.adminapi.ApiKeysController.bulkDeleteAction()
GET     /api/apikeys/:id/quotas                               otoroshi.controllers.adminapi.ApiKeysController.apiKeyQuotas(id)
DELETE  /api/apikeys/:id/quotas                               otoroshi.controllers.adminapi.ApiKeysController.resetApiKeyQuotas(id)
GET     /api/apikeys/:id                                      otoroshi.controllers.adminapi.ApiKeysController.findEntityByIdAction(id)
DELETE  /api/apikeys/:id                                      otoroshi.controllers.adminapi.ApiKeysController.deleteEntityAction(id)
PUT     /api/apikeys/:id                                      otoroshi.controllers.adminapi.ApiKeysController.updateEntityAction(id)
PATCH   /api/apikeys/:id                                      otoroshi.controllers.adminapi.ApiKeysController.patchEntityAction(id)
GET     /api/apikeys                                          otoroshi.controllers.adminapi.ApiKeysController.findAllEntitiesAction()
POST    /api/apikeys                                          otoroshi.controllers.adminapi.ApiKeysController.createAction()

GET     /api/services/:serviceId/apikeys/:clientId/quotas     otoroshi.controllers.adminapi.ApiKeysFromServiceController.apiKeyQuotas(serviceId, clientId)
DELETE  /api/services/:serviceId/apikeys/:clientId/quotas     otoroshi.controllers.adminapi.ApiKeysFromServiceController.resetApiKeyQuotas(serviceId, clientId)
#GET     /api/services/:serviceId/apikeys/:clientId/group      otoroshi.controllers.adminapi.ApiKeysFromServiceController.apiKeyGroup(serviceId, clientId)
#PUT     /api/services/:serviceId/apikeys/:clientId/group      otoroshi.controllers.adminapi.ApiKeysFromServiceController.updateApiKeyGroup(serviceId, clientId)
GET     /api/services/:serviceId/apikeys/:clientId            otoroshi.controllers.adminapi.ApiKeysFromServiceController.apiKey(serviceId, clientId)
PUT     /api/services/:serviceId/apikeys/:clientId            otoroshi.controllers.adminapi.ApiKeysFromServiceController.updateApiKey(serviceId, clientId)
PATCH   /api/services/:serviceId/apikeys/:clientId            otoroshi.controllers.adminapi.ApiKeysFromServiceController.patchApiKey(serviceId, clientId)
DELETE  /api/services/:serviceId/apikeys/:clientId            otoroshi.controllers.adminapi.ApiKeysFromServiceController.deleteApiKey(serviceId, clientId)
POST    /api/services/:serviceId/apikeys                      otoroshi.controllers.adminapi.ApiKeysFromServiceController.createApiKey(serviceId)
GET     /api/services/:serviceId/apikeys                      otoroshi.controllers.adminapi.ApiKeysFromServiceController.apiKeys(serviceId)

GET     /api/groups/:groupId/apikeys/:clientId/quotas         otoroshi.controllers.adminapi.ApiKeysFromGroupController.apiKeyFromGroupQuotas(groupId, clientId)
DELETE  /api/groups/:groupId/apikeys/:clientId/quotas         otoroshi.controllers.adminapi.ApiKeysFromGroupController.resetApiKeyFromGroupQuotas(groupId, clientId)
GET     /api/groups/:groupId/apikeys/:clientId                otoroshi.controllers.adminapi.ApiKeysFromGroupController.apiKeyFromGroup(groupId, clientId)
PUT     /api/groups/:groupId/apikeys/:clientId                otoroshi.controllers.adminapi.ApiKeysFromGroupController.updateApiKeyFromGroup(groupId, clientId)
PATCH   /api/groups/:groupId/apikeys/:clientId                otoroshi.controllers.adminapi.ApiKeysFromGroupController.patchApiKeyFromGroup(groupId, clientId)
DELETE  /api/groups/:groupId/apikeys/:clientId                otoroshi.controllers.adminapi.ApiKeysFromGroupController.deleteApiKeyFromGroup(groupId, clientId)
POST    /api/groups/:groupId/apikeys                          otoroshi.controllers.adminapi.ApiKeysFromGroupController.createApiKeyFromGroup(groupId)
GET     /api/groups/:groupId/apikeys                          otoroshi.controllers.adminapi.ApiKeysFromGroupController.apiKeysFromGroup(groupId)
GET     /api/groups/:groupId/status                           otoroshi.controllers.adminapi.AnalyticsController.groupStatus(groupId, from: Option[String], to: Option[String])

## Services
GET     /api/services/_template                               otoroshi.controllers.adminapi.TemplatesController.initiateService()
GET     /api/services/:serviceId/template                     otoroshi.controllers.adminapi.ServicesController.serviceTemplate(serviceId)
PUT     /api/services/:serviceId/template                     otoroshi.controllers.adminapi.ServicesController.updateServiceTemplate(serviceId)
POST    /api/services/:serviceId/template                     otoroshi.controllers.adminapi.ServicesController.createServiceTemplate(serviceId)
DELETE  /api/services/:serviceId/template                     otoroshi.controllers.adminapi.ServicesController.deleteServiceTemplate(serviceId)
GET     /api/services/:serviceId/targets                      otoroshi.controllers.adminapi.ServicesController.serviceTargets(serviceId)
POST    /api/services/:serviceId/targets                      otoroshi.controllers.adminapi.ServicesController.serviceAddTarget(serviceId)
DELETE  /api/services/:serviceId/targets                      otoroshi.controllers.adminapi.ServicesController.serviceDeleteTarget(serviceId)
PATCH   /api/services/:serviceId/targets                      otoroshi.controllers.adminapi.ServicesController.updateServiceTargets(serviceId)
GET     /api/services/:serviceId/live                         otoroshi.controllers.adminapi.StatsController.serviceLiveStats(serviceId, every: Option[Int])
GET     /api/services/:serviceId/stats                        otoroshi.controllers.adminapi.AnalyticsController.serviceStats(serviceId, from: Option[String], to: Option[String])
GET     /api/services/:serviceId/events                       otoroshi.controllers.adminapi.AnalyticsController.serviceEvents(serviceId, from: Option[String], to: Option[String])
GET     /api/services/:serviceId/status                       otoroshi.controllers.adminapi.AnalyticsController.serviceStatus(serviceId, from: Option[String], to: Option[String])
GET     /api/services/:serviceId/health                       otoroshi.controllers.adminapi.ServicesController.serviceHealth(serviceId)
GET     /api/services/:serviceId/response                     otoroshi.controllers.adminapi.AnalyticsController.serviceResponseTime(serviceId, from: Option[String], to: Option[String])
GET     /api/services/:serviceId/canary                       otoroshi.controllers.adminapi.CanaryController.serviceCanaryMembers(serviceId)
DELETE  /api/services/:serviceId/canary                       otoroshi.controllers.adminapi.CanaryController.resetServiceCanaryMembers(serviceId)
# GET     /api/services/:serviceId                              otoroshi.controllers.adminapi.ServicesController.service(serviceId)
# PUT     /api/services/:serviceId                              otoroshi.controllers.adminapi.ServicesController.updateService(serviceId)
# PATCH   /api/services/:serviceId                              otoroshi.controllers.adminapi.ServicesController.patchService(serviceId)
# DELETE  /api/services/:serviceId                              otoroshi.controllers.adminapi.ServicesController.deleteService(serviceId)
# GET     /api/services                                         otoroshi.controllers.adminapi.ServicesController.allServices()
# POST    /api/services                                         otoroshi.controllers.adminapi.ServicesController.createService()
POST    /api/services/_bulk                                   otoroshi.controllers.adminapi.ServicesController.bulkCreateAction()
PUT     /api/services/_bulk                                   otoroshi.controllers.adminapi.ServicesController.bulkUpdateAction()
PATCH   /api/services/_bulk                                   otoroshi.controllers.adminapi.ServicesController.bulkPatchAction()
DELETE  /api/services/_bulk                                   otoroshi.controllers.adminapi.ServicesController.bulkDeleteAction()
GET     /api/services/:id                                     otoroshi.controllers.adminapi.ServicesController.findEntityByIdAction(id)
DELETE  /api/services/:id                                     otoroshi.controllers.adminapi.ServicesController.deleteEntityAction(id)
PUT     /api/services/:id                                     otoroshi.controllers.adminapi.ServicesController.updateEntityAction(id)
PATCH   /api/services/:id                                     otoroshi.controllers.adminapi.ServicesController.patchEntityAction(id)
GET     /api/services                                         otoroshi.controllers.adminapi.ServicesController.findAllEntitiesAction()
POST    /api/services                                         otoroshi.controllers.adminapi.ServicesController.createAction()

## ServiceGroup
GET     /api/groups/_template                                 otoroshi.controllers.adminapi.TemplatesController.initiateServiceGroup()
# GET     /api/groups/:serviceGroupId/services                  otoroshi.controllers.adminapi.ServiceGroupController.serviceGroupServices(serviceGroupId)
# GET     /api/groups/:serviceGroupId                           otoroshi.controllers.adminapi.ServiceGroupController.serviceGroup(serviceGroupId)
# DELETE  /api/groups/:serviceGroupId                           otoroshi.controllers.adminapi.ServiceGroupController.deleteGroup(serviceGroupId)
# PUT     /api/groups/:serviceGroupId                           otoroshi.controllers.adminapi.ServiceGroupController.updateGroup(serviceGroupId)
# PATCH   /api/groups/:serviceGroupId                           otoroshi.controllers.adminapi.ServiceGroupController.patchGroup(serviceGroupId)
# GET     /api/groups                                           otoroshi.controllers.adminapi.ServiceGroupController.allServiceGroups()
# POST    /api/groups                                           otoroshi.controllers.adminapi.ServiceGroupController.createGroup()
POST    /api/groups/_bulk                                     otoroshi.controllers.adminapi.ServiceGroupController.bulkCreateAction()
PUT     /api/groups/_bulk                                     otoroshi.controllers.adminapi.ServiceGroupController.bulkUpdateAction()
PATCH   /api/groups/_bulk                                     otoroshi.controllers.adminapi.ServiceGroupController.bulkPatchAction()
DELETE  /api/groups/_bulk                                     otoroshi.controllers.adminapi.ServiceGroupController.bulkDeleteAction()
GET     /api/groups/:id/services                              otoroshi.controllers.adminapi.ServiceGroupController.serviceGroupServices(id)
GET     /api/groups/:id                                       otoroshi.controllers.adminapi.ServiceGroupController.findEntityByIdAction(id)
DELETE  /api/groups/:id                                       otoroshi.controllers.adminapi.ServiceGroupController.deleteEntityAction(id)
PUT     /api/groups/:id                                       otoroshi.controllers.adminapi.ServiceGroupController.updateEntityAction(id)
PATCH   /api/groups/:id                                       otoroshi.controllers.adminapi.ServiceGroupController.patchEntityAction(id)
GET     /api/groups                                           otoroshi.controllers.adminapi.ServiceGroupController.findAllEntitiesAction()
POST    /api/groups                                           otoroshi.controllers.adminapi.ServiceGroupController.createAction()

## Certificates
GET     /api/certificates/_template                           otoroshi.controllers.adminapi.TemplatesController.initiateCertificate()
POST    /api/certificates/:certId/_renew                      otoroshi.controllers.adminapi.CertificatesController.renewCert(certId)
# GET     /api/certificates/:certId                             otoroshi.controllers.adminapi.CertificatesController.oneCert(certId)
# DELETE  /api/certificates/:certId                             otoroshi.controllers.adminapi.CertificatesController.deleteCert(certId)
# PUT     /api/certificates/:certId                             otoroshi.controllers.adminapi.CertificatesController.updateCert(certId)
# PATCH   /api/certificates/:certId                             otoroshi.controllers.adminapi.CertificatesController.patchCert(certId)
# GET     /api/certificates                                     otoroshi.controllers.adminapi.CertificatesController.allCerts()
# POST    /api/certificates                                     otoroshi.controllers.adminapi.CertificatesController.createCert()
POST    /api/certificates/_bulk                               otoroshi.controllers.adminapi.CertificatesController.bulkCreateAction()
PUT     /api/certificates/_bulk                               otoroshi.controllers.adminapi.CertificatesController.bulkUpdateAction()
PATCH   /api/certificates/_bulk                               otoroshi.controllers.adminapi.CertificatesController.bulkPatchAction()
DELETE  /api/certificates/_bulk                               otoroshi.controllers.adminapi.CertificatesController.bulkDeleteAction()
GET     /api/certificates/:id                                 otoroshi.controllers.adminapi.CertificatesController.findEntityByIdAction(id)
DELETE  /api/certificates/:id                                 otoroshi.controllers.adminapi.CertificatesController.deleteEntityAction(id)
PUT     /api/certificates/:id                                 otoroshi.controllers.adminapi.CertificatesController.updateEntityAction(id)
PATCH   /api/certificates/:id                                 otoroshi.controllers.adminapi.CertificatesController.patchEntityAction(id)
GET     /api/certificates                                     otoroshi.controllers.adminapi.CertificatesController.findAllEntitiesAction()
POST    /api/certificates                                     otoroshi.controllers.adminapi.CertificatesController.createAction()

POST    /api/pki/certs/_letencrypt                            otoroshi.controllers.adminapi.PkiController.genLetsEncryptCert()
POST    /api/pki/certs/_p12                                   otoroshi.controllers.adminapi.PkiController.importCertFromP12()
POST    /api/pki/certs/_valid                                 otoroshi.controllers.adminapi.PkiController.certificateIsValid()
POST    /api/pki/certs/_data                                  otoroshi.controllers.adminapi.PkiController.certificateData()
POST    /api/pki/certs                                        otoroshi.controllers.adminapi.PkiController.genSelfSignedCert()
POST    /api/pki/csrs                                         otoroshi.controllers.adminapi.PkiController.genCsr()
POST    /api/pki/keys                                         otoroshi.controllers.adminapi.PkiController.genKeyPair()
POST    /api/pki/cas                                          otoroshi.controllers.adminapi.PkiController.genSelfSignedCA()
POST    /api/pki/cas/:ca/certs/_sign                          otoroshi.controllers.adminapi.PkiController.signCert(ca)
POST    /api/pki/cas/:ca/certs                                otoroshi.controllers.adminapi.PkiController.genCert(ca)
POST    /api/pki/cas/:ca/cas                                  otoroshi.controllers.adminapi.PkiController.genSubCA(ca)

GET     /api/lines/:line/services                             otoroshi.controllers.adminapi.ServicesController.servicesForALine(line)
GET     /api/lines                                            otoroshi.controllers.adminapi.ServicesController.allLines()

GET     /api/live/host                                        otoroshi.controllers.adminapi.StatsController.hostMetrics()
GET     /api/live/:id                                         otoroshi.controllers.adminapi.StatsController.serviceLiveStats(id, every: Option[Int])
GET     /api/live                                             otoroshi.controllers.adminapi.StatsController.globalLiveStats()

GET     /api/globalconfig/_template                           otoroshi.controllers.adminapi.TemplatesController.initiateGlobalConfig()
GET     /api/globalconfig                                     otoroshi.controllers.adminapi.GlobalConfigController.globalConfig()
PUT     /api/globalconfig                                     otoroshi.controllers.adminapi.GlobalConfigController.updateGlobalConfig()
PATCH   /api/globalconfig                                     otoroshi.controllers.adminapi.GlobalConfigController.patchGlobalConfig()

GET     /api/otoroshi.json                                    otoroshi.controllers.adminapi.ImportExportController.fullExport()
POST    /api/otoroshi.json                                    otoroshi.controllers.adminapi.ImportExportController.fullImport()
POST    /api/import                                           otoroshi.controllers.adminapi.ImportExportController.fullImportFromFile()

POST    /api/snowmonkey/_start                                otoroshi.controllers.adminapi.SnowMonkeyController.startSnowMonkey()
POST    /api/snowmonkey/_stop                                 otoroshi.controllers.adminapi.SnowMonkeyController.stopSnowMonkey()
DELETE  /api/snowmonkey/outages                               otoroshi.controllers.adminapi.SnowMonkeyController.resetSnowMonkey()
GET     /api/snowmonkey/outages                               otoroshi.controllers.adminapi.SnowMonkeyController.getSnowMonkeyOutages()
GET     /api/snowmonkey/config                                otoroshi.controllers.adminapi.SnowMonkeyController.getSnowMonkeyConfig()
PUT     /api/snowmonkey/config                                otoroshi.controllers.adminapi.SnowMonkeyController.updateSnowMonkey()
PATCH   /api/snowmonkey/config                                otoroshi.controllers.adminapi.SnowMonkeyController.patchSnowMonkey()

GET     /api/verifiers/_template                              otoroshi.controllers.adminapi.TemplatesController.initiateJwtVerifier()
# GET     /api/verifiers/:id                                    otoroshi.controllers.adminapi.JwtVerifierController.findGlobalJwtVerifiersById(id)
# DELETE  /api/verifiers/:id                                    otoroshi.controllers.adminapi.JwtVerifierController.deleteGlobalJwtVerifier(id)
# PUT     /api/verifiers/:id                                    otoroshi.controllers.adminapi.JwtVerifierController.updateGlobalJwtVerifier(id)
# PATCH   /api/verifiers/:id                                    otoroshi.controllers.adminapi.JwtVerifierController.patchGlobalJwtVerifier(id)
# GET     /api/verifiers                                        otoroshi.controllers.adminapi.JwtVerifierController.findAllGlobalJwtVerifiers()
# POST    /api/verifiers                                        otoroshi.controllers.adminapi.JwtVerifierController.createGlobalJwtVerifier()
POST    /api/verifiers/_bulk                                  otoroshi.controllers.adminapi.JwtVerifierController.bulkCreateAction()
PUT     /api/verifiers/_bulk                                  otoroshi.controllers.adminapi.JwtVerifierController.bulkUpdateAction()
PATCH   /api/verifiers/_bulk                                  otoroshi.controllers.adminapi.JwtVerifierController.bulkPatchAction()
DELETE  /api/verifiers/_bulk                                  otoroshi.controllers.adminapi.JwtVerifierController.bulkDeleteAction()
GET     /api/verifiers/:id                                    otoroshi.controllers.adminapi.JwtVerifierController.findEntityByIdAction(id)
DELETE  /api/verifiers/:id                                    otoroshi.controllers.adminapi.JwtVerifierController.deleteEntityAction(id)
PUT     /api/verifiers/:id                                    otoroshi.controllers.adminapi.JwtVerifierController.updateEntityAction(id)
PATCH   /api/verifiers/:id                                    otoroshi.controllers.adminapi.JwtVerifierController.patchEntityAction(id)
GET     /api/verifiers                                        otoroshi.controllers.adminapi.JwtVerifierController.findAllEntitiesAction()
POST    /api/verifiers                                        otoroshi.controllers.adminapi.JwtVerifierController.createAction()

# GET     /api/client-validators/:id                            otoroshi.controllers.adminapi.ClientValidatorsController.findClientValidatorById(id)
# DELETE  /api/client-validators/:id                            otoroshi.controllers.adminapi.ClientValidatorsController.deleteClientValidator(id)
# PUT     /api/client-validators/:id                            otoroshi.controllers.adminapi.ClientValidatorsController.updateClientValidator(id)
# PATCH   /api/client-validators/:id                            otoroshi.controllers.adminapi.ClientValidatorsController.patchClientValidator(id)
# GET     /api/client-validators                                otoroshi.controllers.adminapi.ClientValidatorsController.findAllClientValidators()
# POST    /api/client-validators                                otoroshi.controllers.adminapi.ClientValidatorsController.createClientValidator()
POST    /api/client-validators/_bulk                          otoroshi.controllers.adminapi.ClientValidatorsController.bulkCreateAction()
PUT     /api/client-validators/_bulk                          otoroshi.controllers.adminapi.ClientValidatorsController.bulkUpdateAction()
PATCH   /api/client-validators/_bulk                          otoroshi.controllers.adminapi.ClientValidatorsController.bulkPatchAction()
DELETE  /api/client-validators/_bulk                          otoroshi.controllers.adminapi.ClientValidatorsController.bulkDeleteAction()
GET     /api/client-validators/:id                            otoroshi.controllers.adminapi.ClientValidatorsController.findEntityByIdAction(id)
DELETE  /api/client-validators/:id                            otoroshi.controllers.adminapi.ClientValidatorsController.deleteEntityAction(id)
PUT     /api/client-validators/:id                            otoroshi.controllers.adminapi.ClientValidatorsController.updateEntityAction(id)
PATCH   /api/client-validators/:id                            otoroshi.controllers.adminapi.ClientValidatorsController.patchEntityAction(id)
GET     /api/client-validators                                otoroshi.controllers.adminapi.ClientValidatorsController.findAllEntitiesAction()
POST    /api/client-validators                                otoroshi.controllers.adminapi.ClientValidatorsController.createAction()

GET     /api/auths/_template                                  otoroshi.controllers.adminapi.TemplatesController.initiateAuthModule()
POST    /api/auths/:id/register/start                         otoroshi.controllers.adminapi.AuthModulesController.startRegistration(id)
POST    /api/auths/:id/register/finish                        otoroshi.controllers.adminapi.AuthModulesController.finishRegistration(id)
# GET     /api/auths/:id                                        otoroshi.controllers.adminapi.AuthModulesController.findGlobalAuthModuleById(id)
# DELETE  /api/auths/:id                                        otoroshi.controllers.adminapi.AuthModulesController.deleteGlobalAuthModule(id)
# PUT     /api/auths/:id                                        otoroshi.controllers.adminapi.AuthModulesController.updateGlobalAuthModule(id)
# PATCH   /api/auths/:id                                        otoroshi.controllers.adminapi.AuthModulesController.patchGlobalAuthModule(id)
# GET     /api/auths                                            otoroshi.controllers.adminapi.AuthModulesController.findAllGlobalAuthModules()
# POST    /api/auths                                            otoroshi.controllers.adminapi.AuthModulesController.createGlobalAuthModule()
POST    /api/auths/_bulk                                      otoroshi.controllers.adminapi.AuthModulesController.bulkCreateAction()
PUT     /api/auths/_bulk                                      otoroshi.controllers.adminapi.AuthModulesController.bulkUpdateAction()
PATCH   /api/auths/_bulk                                      otoroshi.controllers.adminapi.AuthModulesController.bulkPatchAction()
DELETE  /api/auths/_bulk                                      otoroshi.controllers.adminapi.AuthModulesController.bulkDeleteAction()
GET     /api/auths/:id                                        otoroshi.controllers.adminapi.AuthModulesController.findEntityByIdAction(id)
DELETE  /api/auths/:id                                        otoroshi.controllers.adminapi.AuthModulesController.deleteEntityAction(id)
PUT     /api/auths/:id                                        otoroshi.controllers.adminapi.AuthModulesController.updateEntityAction(id)
PATCH   /api/auths/:id                                        otoroshi.controllers.adminapi.AuthModulesController.patchEntityAction(id)
GET     /api/auths                                            otoroshi.controllers.adminapi.AuthModulesController.findAllEntitiesAction()
POST    /api/auths                                            otoroshi.controllers.adminapi.AuthModulesController.createAction()

GET     /api/cluster/sessions/:id                             otoroshi.controllers.adminapi.ClusterController.isSessionValid(id)
POST    /api/cluster/sessions                                 otoroshi.controllers.adminapi.ClusterController.createSession()
PUT     /api/cluster/quotas                                   otoroshi.controllers.adminapi.ClusterController.updateQuotas()
GET     /api/cluster/state                                    otoroshi.controllers.adminapi.ClusterController.internalState()
GET     /api/cluster/members                                  otoroshi.controllers.adminapi.ClusterController.getClusterMembers()
DELETE  /api/cluster/members                                  otoroshi.controllers.adminapi.ClusterController.clearClusterMembers()
GET     /api/cluster/live                                     otoroshi.controllers.adminapi.ClusterController.liveCluster()
GET     /api/cluster/login-tokens/:id                         otoroshi.controllers.adminapi.ClusterController.isLoginTokenValid(id)
POST    /api/cluster/login-tokens/:id                         otoroshi.controllers.adminapi.ClusterController.createLoginToken(id)
GET     /api/cluster/user-tokens/:id                          otoroshi.controllers.adminapi.ClusterController.getUserToken(id)
POST    /api/cluster/user-tokens                              otoroshi.controllers.adminapi.ClusterController.setUserToken()

GET     /api/scripts/_template                                otoroshi.controllers.adminapi.TemplatesController.initiateScript()
# GET     /api/scripts/:id                                      otoroshi.controllers.adminapi.ScriptApiController.findScriptById(id)
# PUT     /api/scripts/:id                                      otoroshi.controllers.adminapi.ScriptApiController.updateScript(id)
# PATCH   /api/scripts/:id                                      otoroshi.controllers.adminapi.ScriptApiController.patchScript(id)
# DELETE  /api/scripts/:id                                      otoroshi.controllers.adminapi.ScriptApiController.deleteScript(id)
# POST    /api/scripts                                          otoroshi.controllers.adminapi.ScriptApiController.createScript()
# GET     /api/scripts                                          otoroshi.controllers.adminapi.ScriptApiController.findAllScripts()
GET     /api/scripts/_list                                    otoroshi.controllers.adminapi.ScriptApiController.findAllScriptsList()
POST    /api/scripts/_compile                                 otoroshi.controllers.adminapi.ScriptApiController.compileScript()
POST    /api/scripts/_bulk                                    otoroshi.controllers.adminapi.ScriptApiController.bulkCreateAction()
PUT     /api/scripts/_bulk                                    otoroshi.controllers.adminapi.ScriptApiController.bulkUpdateAction()
PATCH   /api/scripts/_bulk                                    otoroshi.controllers.adminapi.ScriptApiController.bulkPatchAction()
DELETE  /api/scripts/_bulk                                    otoroshi.controllers.adminapi.ScriptApiController.bulkDeleteAction()
GET     /api/scripts/:id                                      otoroshi.controllers.adminapi.ScriptApiController.findEntityByIdAction(id)
DELETE  /api/scripts/:id                                      otoroshi.controllers.adminapi.ScriptApiController.deleteEntityAction(id)
PUT     /api/scripts/:id                                      otoroshi.controllers.adminapi.ScriptApiController.updateEntityAction(id)
PATCH   /api/scripts/:id                                      otoroshi.controllers.adminapi.ScriptApiController.patchEntityAction(id)
GET     /api/scripts                                          otoroshi.controllers.adminapi.ScriptApiController.findAllEntitiesAction()
POST    /api/scripts                                          otoroshi.controllers.adminapi.ScriptApiController.createAction()

GET     /api/tcp/_template                                    otoroshi.controllers.adminapi.TemplatesController.initiateTcpService()
# GET     /api/tcp/services/:id                                 otoroshi.controllers.adminapi.TcpServiceApiController.findTcpServiceById(id)
# PUT     /api/tcp/services/:id                                 otoroshi.controllers.adminapi.TcpServiceApiController.updateTcpService(id)
# PATCH   /api/tcp/services/:id                                 otoroshi.controllers.adminapi.TcpServiceApiController.patchTcpService(id)
# DELETE  /api/tcp/services/:id                                 otoroshi.controllers.adminapi.TcpServiceApiController.deleteTcpService(id)
# POST    /api/tcp/services                                     otoroshi.controllers.adminapi.TcpServiceApiController.createTcpService()
# GET     /api/tcp/services                                     otoroshi.controllers.adminapi.TcpServiceApiController.findAllTcpServices()
POST    /api/tcp/services/_bulk                                  otoroshi.controllers.adminapi.TcpServiceApiController.bulkCreateAction()
PUT     /api/tcp/services/_bulk                                  otoroshi.controllers.adminapi.TcpServiceApiController.bulkUpdateAction()
PATCH   /api/tcp/services/_bulk                                  otoroshi.controllers.adminapi.TcpServiceApiController.bulkPatchAction()
DELETE  /api/tcp/services/_bulk                                  otoroshi.controllers.adminapi.TcpServiceApiController.bulkDeleteAction()
GET     /api/tcp/services/:id                                    otoroshi.controllers.adminapi.TcpServiceApiController.findEntityByIdAction(id)
DELETE  /api/tcp/services/:id                                    otoroshi.controllers.adminapi.TcpServiceApiController.deleteEntityAction(id)
PUT     /api/tcp/services/:id                                    otoroshi.controllers.adminapi.TcpServiceApiController.updateEntityAction(id)
PATCH   /api/tcp/services/:id                                    otoroshi.controllers.adminapi.TcpServiceApiController.patchEntityAction(id)
GET     /api/tcp/services                                        otoroshi.controllers.adminapi.TcpServiceApiController.findAllEntitiesAction()
POST    /api/tcp/services                                        otoroshi.controllers.adminapi.TcpServiceApiController.createAction()

# tenant API
GET     /api/tenants/_template                                otoroshi.controllers.adminapi.TemplatesController.initiateTenant()
POST    /api/tenants/_bulk                                    otoroshi.controllers.adminapi.TenantsController.bulkCreateAction()
PUT     /api/tenants/_bulk                                    otoroshi.controllers.adminapi.TenantsController.bulkUpdateAction()
PATCH   /api/tenants/_bulk                                    otoroshi.controllers.adminapi.TenantsController.bulkPatchAction()
DELETE  /api/tenants/_bulk                                    otoroshi.controllers.adminapi.TenantsController.bulkDeleteAction()
GET     /api/tenants/:id                                      otoroshi.controllers.adminapi.TenantsController.findEntityByIdAction(id)
DELETE  /api/tenants/:id                                      otoroshi.controllers.adminapi.TenantsController.deleteEntityAction(id)
PUT     /api/tenants/:id                                      otoroshi.controllers.adminapi.TenantsController.updateEntityAction(id)
PATCH   /api/tenants/:id                                      otoroshi.controllers.adminapi.TenantsController.patchEntityAction(id)
GET     /api/tenants                                          otoroshi.controllers.adminapi.TenantsController.findAllEntitiesAction()
POST    /api/tenants                                          otoroshi.controllers.adminapi.TenantsController.createAction()

# teams API
GET     /api/teams/_template                                otoroshi.controllers.adminapi.TemplatesController.initiateTeam()
POST    /api/teams/_bulk                                    otoroshi.controllers.adminapi.TeamsController.bulkCreateAction()
PUT     /api/teams/_bulk                                    otoroshi.controllers.adminapi.TeamsController.bulkUpdateAction()
PATCH   /api/teams/_bulk                                    otoroshi.controllers.adminapi.TeamsController.bulkPatchAction()
DELETE  /api/teams/_bulk                                    otoroshi.controllers.adminapi.TeamsController.bulkDeleteAction()
GET     /api/teams/:id                                      otoroshi.controllers.adminapi.TeamsController.findEntityByIdAction(id)
DELETE  /api/teams/:id                                      otoroshi.controllers.adminapi.TeamsController.deleteEntityAction(id)
PUT     /api/teams/:id                                      otoroshi.controllers.adminapi.TeamsController.updateEntityAction(id)
PATCH   /api/teams/:id                                      otoroshi.controllers.adminapi.TeamsController.patchEntityAction(id)
GET     /api/teams                                          otoroshi.controllers.adminapi.TeamsController.findAllEntitiesAction()
POST    /api/teams                                          otoroshi.controllers.adminapi.TeamsController.createAction()

# data exporter config API
GET     /api/data-exporter-configs/_template                otoroshi.controllers.adminapi.TemplatesController.initiateDataExporterConfig()
POST    /api/data-exporter-configs/_bulk                    otoroshi.controllers.adminapi.DataExporterConfigController.bulkCreateAction()
PUT     /api/data-exporter-configs/_bulk                    otoroshi.controllers.adminapi.DataExporterConfigController.bulkUpdateAction()
PATCH   /api/data-exporter-configs/_bulk                    otoroshi.controllers.adminapi.DataExporterConfigController.bulkPatchAction()
DELETE  /api/data-exporter-configs/_bulk                    otoroshi.controllers.adminapi.DataExporterConfigController.bulkDeleteAction()
GET     /api/data-exporter-configs/:id                      otoroshi.controllers.adminapi.DataExporterConfigController.findEntityByIdAction(id)
DELETE  /api/data-exporter-configs/:id                      otoroshi.controllers.adminapi.DataExporterConfigController.deleteEntityAction(id)
PUT     /api/data-exporter-configs/:id                      otoroshi.controllers.adminapi.DataExporterConfigController.updateEntityAction(id)
PATCH   /api/data-exporter-configs/:id                      otoroshi.controllers.adminapi.DataExporterConfigController.patchEntityAction(id)
GET     /api/data-exporter-configs                          otoroshi.controllers.adminapi.DataExporterConfigController.findAllEntitiesAction()
POST    /api/data-exporter-configs                          otoroshi.controllers.adminapi.DataExporterConfigController.createAction()

GET     /api/stats/global                                     otoroshi.controllers.adminapi.AnalyticsController.globalStats(from: Option[String], to: Option[String])
GET     /api/status/global                                    otoroshi.controllers.adminapi.AnalyticsController.globalStatus(from: Option[String], to: Option[String])
GET     /api/stats                                            otoroshi.controllers.adminapi.AnalyticsController.filterableStats(from: Option[String], to: Option[String])
GET     /api/events                                           otoroshi.controllers.adminapi.AnalyticsController.filterableEvents(from: Option[String], to: Option[String])
GET     /api/events/_template                                 otoroshi.controllers.adminapi.TemplatesController.templateSpec(eventType: String)
POST    /api/status                                           otoroshi.controllers.adminapi.AnalyticsController.servicesStatus(from: Option[String], to: Option[String])

GET     /api/admin-sessions                                   otoroshi.controllers.adminapi.UsersController.sessions()
DELETE  /api/admin-sessions/:id                               otoroshi.controllers.adminapi.UsersController.discardSession(id)
DELETE  /api/admin-sessions                                   otoroshi.controllers.adminapi.UsersController.discardAllSessions()

GET     /api/apps-sessions                                    otoroshi.controllers.adminapi.UsersController.privateAppsSessions()
DELETE  /api/apps-sessions/:id                                otoroshi.controllers.adminapi.UsersController.discardPrivateAppsSession(id)
DELETE  /api/apps-sessions                                    otoroshi.controllers.adminapi.UsersController.discardAllPrivateAppsSessions()

GET     /api/audit/events                                     otoroshi.controllers.adminapi.EventsController.auditEvents()
# TODO: PAGINATE
GET     /api/alert/events                                     otoroshi.controllers.adminapi.EventsController.alertEvents()
# TODO: PAGINATE

GET     /api/admins/simple/_template                          otoroshi.controllers.adminapi.TemplatesController.initiateSimpleAdmin()
POST    /api/admins/simple                                    otoroshi.controllers.adminapi.UsersController.registerSimpleAdmin()
GET     /api/admins/simple                                    otoroshi.controllers.adminapi.UsersController.simpleAdmins()
PUT     /api/admins/simple/:username                          otoroshi.controllers.adminapi.UsersController.updateAdmin(username)
DELETE  /api/admins/simple/:username                          otoroshi.controllers.adminapi.UsersController.deleteAdmin(username)

GET     /api/admins/webauthn/_template                        otoroshi.controllers.adminapi.TemplatesController.initiateWebauthnAdmin()
GET     /api/admins/webauthn                                  otoroshi.controllers.adminapi.UsersController.webAuthnAdmins()
POST    /api/admins/webauthn                                  otoroshi.controllers.adminapi.UsersController.registerWebAuthnAdmin()
PUT     /api/admins/webauthn/:username                        otoroshi.controllers.adminapi.UsersController.updateWebAuthnAdmin(username)
DELETE  /api/admins/webauthn/:username/:id                    otoroshi.controllers.adminapi.UsersController.webAuthnDeleteAdmin(username, id)

# GET     /api/swagger.json                                     otoroshi.controllers.SwaggerController.swagger()
# GET     /api/swagger/ui                                       otoroshi.controllers.SwaggerController.swaggerUi()
GET     /api/openapi.json                                     otoroshi.controllers.SwaggerController.openapi()
GET     /api/openapi/ui                                       otoroshi.controllers.SwaggerController.openapiUi()

########################################################################################################################

GET     /assets/*file                                         controllers.Assets.versioned(path="/public", file: Asset)
GET     /__otoroshi_assets/*file                              controllers.Assets.versioned(path="/public", file: Asset)
GET     /docs/*file                                           controllers.Assets.at(path="/public/docs", file)
