├── .gitignore ├── CONTRIBUTING.md ├── LICENSE.txt ├── README.md ├── SECURITY.md ├── deploy ├── .gitignore ├── helm-chart │ ├── oke-setup │ │ ├── Chart.yaml │ │ ├── scripts │ │ │ ├── idcs-init.sh │ │ │ └── vault-write.sh │ │ ├── templates │ │ │ ├── ajdb │ │ │ │ ├── ajdb-admin-secret.yaml │ │ │ │ ├── ajdb-connection-secret.yaml │ │ │ │ ├── ajdb-wallet-zip-secret.yaml │ │ │ │ ├── secret-creator-rbac.yaml │ │ │ │ └── wallet-extractor-job.yaml │ │ │ ├── apm │ │ │ │ └── apm-secret.yaml │ │ │ ├── atp │ │ │ │ ├── atp-admin-secret.yaml │ │ │ │ ├── atp-connection-secret.yaml │ │ │ │ ├── atp-wallet-zip-secret.yaml │ │ │ │ ├── secret-creator-rbac.yaml │ │ │ │ └── wallet-extractor-job.yaml │ │ │ ├── idcs │ │ │ │ ├── apigw_config_map.yaml │ │ │ │ ├── config_job.yaml │ │ │ │ └── idcs_config_map.yaml │ │ │ ├── namespace.yaml │ │ │ ├── objectstorage │ │ │ │ └── object-storage-config-map.yaml │ │ │ └── stream │ │ │ │ └── stream-secret.yaml │ │ └── values.yaml │ └── uho │ │ ├── Chart.yaml │ │ ├── charts │ │ ├── appointment │ │ │ ├── Chart.yaml │ │ │ ├── config │ │ │ │ └── atp.init.sql │ │ │ ├── templates │ │ │ │ ├── _helpers.tpl │ │ │ │ ├── atp-appointment-secret.yaml │ │ │ │ ├── atp-init-configmap.yaml │ │ │ │ ├── deployment.yaml │ │ │ │ ├── job.yaml │ │ │ │ └── service.yaml │ │ │ └── values.yaml │ │ ├── encounter │ │ │ ├── Chart.yaml │ │ │ ├── config │ │ │ │ ├── ajdb.init.sql │ │ │ │ └── atp.init.sql │ │ │ ├── templates │ │ │ │ ├── _helpers.tpl │ │ │ │ ├── adb-encounter-secrets.yaml │ │ │ │ ├── atp-init-configmap.yaml │ │ │ │ ├── deployment.yaml │ │ │ │ ├── job.yaml │ │ │ │ └── service.yaml │ │ │ └── values.yaml │ │ ├── feedback │ │ │ ├── Chart.yaml │ │ │ ├── templates │ │ │ │ ├── _helpers.tpl │ │ │ │ ├── deployment.yaml │ │ │ │ └── service.yaml │ │ │ └── values.yaml │ │ ├── followup │ │ │ ├── Chart.yaml │ │ │ ├── templates │ │ │ │ ├── _helpers.tpl │ │ │ │ ├── deployment.yaml │ │ │ │ └── service.yaml │ │ │ └── values.yaml │ │ ├── frontend │ │ │ ├── Chart.yaml │ │ │ ├── config │ │ │ │ └── vault-read.sh │ │ │ ├── templates │ │ │ │ ├── _helpers.tpl │ │ │ │ ├── deployment.yaml │ │ │ │ ├── job.yaml │ │ │ │ ├── service.yaml │ │ │ │ └── vault-init-configmap.yaml │ │ │ └── values.yaml │ │ ├── patient │ │ │ ├── Chart.yaml │ │ │ ├── config │ │ │ │ └── atp.init.sql │ │ │ ├── templates │ │ │ │ ├── _helpers.tpl │ │ │ │ ├── atp-init-configmap.yaml │ │ │ │ ├── atp-patient-secret.yaml │ │ │ │ ├── deployment.yaml │ │ │ │ ├── job.yaml │ │ │ │ └── service.yaml │ │ │ └── values.yaml │ │ └── provider │ │ │ ├── Chart.yaml │ │ │ ├── config │ │ │ └── atp.init.sql │ │ │ ├── templates │ │ │ ├── _helpers.tpl │ │ │ ├── atp-init-configmap.yaml │ │ │ ├── atp-provider-secret.yaml │ │ │ ├── deployment.yaml │ │ │ ├── job.yaml │ │ │ └── service.yaml │ │ │ └── values.yaml │ │ ├── templates │ │ ├── config-map.yaml │ │ └── ingress-nginx │ │ │ ├── clusterrole.yaml │ │ │ ├── clusterrolebinding.yaml │ │ │ ├── config-map.yaml │ │ │ ├── controller-deployment.yaml │ │ │ ├── ingress-class │ │ │ ├── ingress.yaml │ │ │ ├── job.yaml │ │ │ ├── namespace.yaml │ │ │ ├── role-binding.yaml │ │ │ ├── role.yaml │ │ │ ├── service.yaml │ │ │ ├── serviceaccount.yaml │ │ │ └── validating-webhook-configuration │ │ └── values.yaml └── terraform │ ├── README.md │ ├── artifacts.tf │ ├── build-and-push-images.tf │ ├── helm-oke-setup.tf │ ├── iam.tf │ ├── k8tools.tf │ ├── locals.tf │ ├── main.tf │ ├── modules │ ├── ajdb │ │ ├── ajdb.tf │ │ ├── outputs.tf │ │ ├── providers.tf │ │ ├── utils.tf │ │ └── variables.tf │ ├── apigateway │ │ ├── api-gateway.tf │ │ ├── appointment-deployment.tf │ │ ├── encounter-deployment.tf │ │ ├── fetch_idcs_static_keys.sh │ │ ├── frontend-deployment.tf │ │ ├── outputs.tf │ │ ├── patient-deployment.tf │ │ ├── provider-deployment.tf │ │ ├── providers.tf │ │ └── variables.tf │ ├── apm │ │ ├── apm.tf │ │ ├── outputs.tf │ │ ├── providers.tf │ │ └── variables.tf │ ├── atp │ │ ├── atp.tf │ │ ├── iam.tf │ │ ├── outputs.tf │ │ ├── providers.tf │ │ ├── utils.tf │ │ └── variables.tf │ ├── cloudguard │ │ ├── cloud-guard.tf │ │ ├── providers.tf │ │ └── variables.tf │ ├── datasafe │ │ ├── data-safe.tf │ │ ├── providers.tf │ │ └── variables.tf │ ├── devops │ │ ├── appointment-pipeline-stages.tf │ │ ├── deployment │ │ │ ├── appointment.yaml │ │ │ ├── encounter.yaml │ │ │ ├── feedback.yaml │ │ │ ├── followup.yaml │ │ │ ├── frontend.yaml │ │ │ ├── patient.yaml │ │ │ └── provider.yaml │ │ ├── devops.tf │ │ ├── encounter-pipeline-stages.tf │ │ ├── feedback-pipeline-stages.tf │ │ ├── followup-pipeline-stages.tf │ │ ├── frontend-pipeline-stages.tf │ │ ├── notification-pipeline-stages.tf │ │ ├── outputs.tf │ │ ├── patient-pipeline-stages.tf │ │ ├── policies.tf │ │ ├── provider-pipeline-stages.tf │ │ ├── providers.tf │ │ ├── triggers.tf │ │ ├── utils.tf │ │ └── variables.tf │ ├── events │ │ ├── events.tf │ │ ├── providers.tf │ │ └── variables.tf │ ├── logging │ │ ├── apigw.tf │ │ ├── functions.tf │ │ ├── iam.tf │ │ ├── object-storage.tf │ │ ├── oke-app-logging.tf │ │ ├── outputs.tf │ │ ├── providers.tf │ │ ├── variables.tf │ │ ├── vcn.tf │ │ └── waf.tf │ ├── monitoring │ │ ├── monitoring.tf │ │ ├── outputs.tf │ │ ├── providers.tf │ │ └── variables.tf │ ├── notification │ │ ├── email.tf │ │ ├── iam.tf │ │ ├── network.tf │ │ ├── notification.tf │ │ ├── outputs.tf │ │ ├── providers.tf │ │ └── variables.tf │ ├── objectstorage │ │ ├── object-storage.tf │ │ ├── outputs.tf │ │ ├── providers.tf │ │ └── variables.tf │ ├── streaming │ │ ├── iam.tf │ │ ├── outputs.tf │ │ ├── providers.tf │ │ ├── streaming.tf │ │ └── variables.tf │ ├── vulnerability │ │ ├── iam.tf │ │ ├── providers.tf │ │ ├── variables.tf │ │ └── vulnerability.tf │ └── waf │ │ ├── outputs.tf │ │ ├── providers.tf │ │ ├── variables.tf │ │ └── web-application-firewall.tf │ ├── outputs.tf │ ├── providers.tf │ ├── randoms.tf │ ├── remove-k8s-state.sh │ ├── schema.yaml │ ├── scripts │ ├── build_and_push_images.sh │ ├── destroy_object_storage_objects.sh │ ├── destroy_resources.sh │ ├── generate_kubeconfig.template.sh │ ├── idcs_cleanup.sh │ ├── ingress_healthcheck.sh │ ├── install_helm.template.sh │ ├── install_kubectl.template.sh │ ├── kubeconfig_set_credentials.template.sh │ ├── oke_setup_values.tpl │ ├── token_helper.template.sh │ ├── uho_values.tpl │ └── uninstall_helm_releases.sh │ ├── specs │ ├── Appointment.yml │ ├── Encounter.yml │ ├── Patient.yml │ └── Provider.yml │ ├── uho-api-resource.tf │ ├── uho-oci-services.tf │ ├── uho-variables.tf │ └── utils.tf ├── docs ├── Images │ ├── activate-application.png │ ├── add-application-details.png │ ├── add-application-page.png │ ├── add-application-roles-page.png │ ├── add-application-roles.png │ ├── add-application.png │ ├── add-roles.png │ ├── advanced-options.png │ ├── application-step-1.png │ ├── application-step-2.png │ ├── application-step-3.png │ ├── application-step-4.png │ ├── application-step-5.png │ ├── application.png │ ├── auth_token.png │ ├── cloning-repository.png │ ├── code-repository.png │ ├── configure-oauth.png │ ├── configure-policy.png │ ├── create-external-connection.png │ ├── create-stack-2.png │ ├── create-stack-3.png │ ├── create-stack-4.png │ ├── create_devops_project.png │ ├── default-overview-page.png │ ├── deploy-stack.png │ ├── destroy-status.png │ ├── devops-deploy.png │ ├── devops-overview.png │ ├── devops-pro.png │ ├── domain-home-page.png │ ├── fed-add-application-page.png │ ├── fed-add-application.png │ ├── fed-idcs-home-page.png │ ├── federation-activation.png │ ├── federation-credentials.png │ ├── federation-deactivate.png │ ├── federation-home-page.png │ ├── federation-home.png │ ├── mirrored-repo.png │ ├── resource-manager-stacks.png │ ├── resources-jobs.png │ ├── rms-deploy-2.png │ ├── rms-deploy.png │ ├── roles-added.png │ ├── security-zone.png │ ├── smtp-credentials.png │ ├── stacks.png │ ├── url-deploy.png │ └── user-settings.png ├── deployment.md ├── devops-deployment.md └── prereq-config.md └── src ├── appointment ├── Dockerfile ├── README.md ├── build_spec.yaml ├── lombok.config ├── pom.xml ├── spotBugsIgnore.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── oracle │ │ │ └── refapp │ │ │ ├── Application.java │ │ │ ├── config │ │ │ ├── CustomQueryValueBinder.java │ │ │ └── CustomRequestBinderRegistry.java │ │ │ ├── constants │ │ │ ├── ErrorCodes.java │ │ │ └── Status.java │ │ │ ├── controller │ │ │ └── AppointmentController.java │ │ │ ├── domain │ │ │ ├── entity │ │ │ │ └── AppointmentEntity.java │ │ │ └── repository │ │ │ │ └── AppointmentRepository.java │ │ │ ├── exceptions │ │ │ ├── AppointmentUpdateFailedException.java │ │ │ ├── MultipleAppointmentNotAllowedException.java │ │ │ ├── NoSuchAppointmentFoundException.java │ │ │ ├── NoSuchPatientFoundException.java │ │ │ └── NoSuchProviderFoundException.java │ │ │ ├── helpers │ │ │ ├── CustomJwksSignature.java │ │ │ ├── CustomJwksSignatureConfiguration.java │ │ │ └── CustomRoleFinder.java │ │ │ ├── mappers │ │ │ └── AppointmentMapper.java │ │ │ ├── model │ │ │ ├── AppointmentMessage.java │ │ │ └── AppointmentSearchCriteria.java │ │ │ ├── search │ │ │ ├── AbstractAppointmentSearcher.java │ │ │ ├── AppointmentSearcher.java │ │ │ ├── AppointmentSearcherFactory.java │ │ │ ├── PatientAppointmentSearcher.java │ │ │ ├── ProviderAppointmentSearcher.java │ │ │ └── TimeRangeAppointmentSearcher.java │ │ │ ├── service │ │ │ ├── AppointmentMessageProducer.java │ │ │ ├── AppointmentService.java │ │ │ └── ServiceClient.java │ │ │ └── telemetry │ │ │ └── TelemetryClient.java │ └── resources │ │ ├── application-dev.yml │ │ ├── application-prod.yaml │ │ ├── application-test.yml │ │ ├── application.yml │ │ ├── db │ │ ├── changesets │ │ │ └── 0.1-init.xml │ │ └── migrations.xml │ │ └── logback.xml │ └── test │ └── java │ └── com │ └── oracle │ └── refapp │ ├── AppointmentTest.java │ ├── TestUtils.java │ ├── controller │ └── AppointmentControllerTest.java │ ├── helpers │ ├── CustomJwksSignatureTest.java │ └── CustomRoleFinderTest.java │ ├── mappers │ └── AppointmentMapperTest.java │ ├── search │ ├── AppointmentSearcherFactoryTest.java │ ├── PatientAppointmentSearcherTest.java │ ├── ProviderAppointmentSearcherTest.java │ └── TimeRangeAppointmentSearcherTest.java │ ├── service │ └── AppointmentServiceTest.java │ └── telemetry │ └── TelemetryClientTest.java ├── encounter ├── Dockerfile ├── README.md ├── build_spec.yaml ├── lombok.config ├── pom.xml ├── scripts │ ├── condition_codes.csv │ ├── encounter_codes.csv │ ├── generate_sql.py │ ├── observation_codes.csv │ └── reason_codes.csv ├── spotBugsIgnore.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── oracle │ │ │ └── refapp │ │ │ ├── Application.java │ │ │ ├── connections │ │ │ └── JSONConnection.java │ │ │ ├── constants │ │ │ ├── CodeType.java │ │ │ └── ErrorCodes.java │ │ │ ├── controller │ │ │ └── EncounterController.java │ │ │ ├── domain │ │ │ ├── entity │ │ │ │ ├── CodeEntity.java │ │ │ │ ├── ConditionEntity.java │ │ │ │ ├── EncounterEntity.java │ │ │ │ ├── EncounterEntityCollection.java │ │ │ │ ├── ObservationEntity.java │ │ │ │ ├── ParameterEntity.java │ │ │ │ ├── ParticipantEntity.java │ │ │ │ ├── PeriodEntity.java │ │ │ │ └── RecommendationEntity.java │ │ │ └── repository │ │ │ │ ├── CodeRepository.java │ │ │ │ └── EncounterRepository.java │ │ │ ├── exceptions │ │ │ ├── DatabaseConnectionException.java │ │ │ ├── EncounterCRUDFailedException.java │ │ │ └── EncounterServiceException.java │ │ │ ├── helpers │ │ │ ├── CustomJwksSignature.java │ │ │ ├── CustomJwksSignatureConfiguration.java │ │ │ ├── CustomRoleFinder.java │ │ │ └── ObjectStorageHelper.java │ │ │ ├── mapper │ │ │ └── EncounterMapper.java │ │ │ ├── model │ │ │ └── FilterSpecification.java │ │ │ ├── search │ │ │ ├── SearchCriteria.java │ │ │ └── SearchFilterBuilder.java │ │ │ └── service │ │ │ └── EncounterService.java │ └── resources │ │ ├── application-dev.yml │ │ ├── application-prod.yml │ │ ├── application-test.yml │ │ ├── application.yml │ │ ├── db │ │ ├── changesets │ │ │ ├── 0.1-init.xml │ │ │ ├── 0.2-data.xml │ │ │ ├── 0.3-json-encounter.xml │ │ │ └── sql │ │ │ │ ├── collection.sql │ │ │ │ └── data.sql │ │ └── migrations.xml │ │ └── logback.xml │ └── test │ └── java │ └── com │ └── oracle │ └── refapp │ ├── TestUtils.java │ ├── controller │ ├── EncounterControllerTest.java │ └── search │ │ └── SearchFilterBuilderTest.java │ ├── domain │ └── repository │ │ └── EncounterRepositoryTest.java │ ├── helpers │ ├── CustomJwksSignatureTest.java │ └── CustomRoleFinderTest.java │ └── service │ └── EncounterServiceTest.java ├── feedback ├── Dockerfile ├── Dockerfile.dev ├── README.md ├── build_spec.yaml ├── pom.xml ├── spotBugsIgnore.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── oracle │ │ │ └── refapp │ │ │ ├── Feedback.java │ │ │ ├── exceptions │ │ │ ├── EncounterContextException.java │ │ │ ├── NoSuchEncounterFoundException.java │ │ │ ├── NoSuchPatientFoundException.java │ │ │ ├── NoSuchProviderFoundException.java │ │ │ └── ProcessingException.java │ │ │ ├── model │ │ │ ├── EncounterCloudEvent.java │ │ │ └── FeedbackMessage.java │ │ │ ├── service │ │ │ ├── EncounterService.java │ │ │ ├── FeedbackService.java │ │ │ ├── IdcsService.java │ │ │ ├── PatientService.java │ │ │ ├── ProviderService.java │ │ │ └── TelemetryService.java │ │ │ └── telemetry │ │ │ ├── HelidonApmTracerProvider.java │ │ │ ├── HelidonMetricsExporter.java │ │ │ └── UnitConverter.java │ ├── lombok.config │ └── resources │ │ ├── META-INF │ │ ├── beans.xml │ │ ├── microprofile-config-dev.properties │ │ ├── microprofile-config-test.properties │ │ ├── microprofile-config.properties │ │ └── services │ │ │ └── io.helidon.tracing.opentracing.spi.OpenTracingProvider │ │ ├── email-body.mustache │ │ └── logback.xml │ └── test │ ├── java │ └── com │ │ └── oracle │ │ └── refapp │ │ ├── FeedbackServiceTest.java │ │ └── mock │ │ ├── MockConnector.java │ │ ├── MockEncounterService.java │ │ ├── MockIdcsService.java │ │ ├── MockPatientService.java │ │ ├── MockProviderService.java │ │ └── MockTelemetryService.java │ └── resources │ └── logback-test.xml ├── followup ├── Dockerfile ├── Dockerfile.dev ├── README.md ├── build_spec.yaml ├── pom.xml ├── spotBugsIgnore.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── oracle │ │ │ └── refapp │ │ │ ├── Followup.java │ │ │ ├── exceptions │ │ │ ├── EncounterContextException.java │ │ │ ├── NoSuchEncounterFoundException.java │ │ │ ├── NoSuchPatientFoundException.java │ │ │ ├── NoSuchProviderFoundException.java │ │ │ └── ProcessingException.java │ │ │ ├── model │ │ │ ├── EncounterCloudEvent.java │ │ │ └── FollowupMessage.java │ │ │ ├── service │ │ │ ├── EncounterService.java │ │ │ ├── FollowupService.java │ │ │ ├── IdcsService.java │ │ │ ├── PatientService.java │ │ │ ├── ProviderService.java │ │ │ └── TelemetryService.java │ │ │ └── telemetry │ │ │ ├── HelidonApmTracerProvider.java │ │ │ ├── HelidonMetricsExporter.java │ │ │ └── UnitConverter.java │ ├── lombok.config │ └── resources │ │ ├── META-INF │ │ ├── beans.xml │ │ ├── microprofile-config-dev.properties │ │ ├── microprofile-config-test.properties │ │ ├── microprofile-config.properties │ │ └── services │ │ │ └── io.helidon.tracing.opentracing.spi.OpenTracingProvider │ │ ├── email-body.mustache │ │ └── logback.xml │ └── test │ ├── java │ └── com │ │ └── oracle │ │ └── refapp │ │ ├── FollowupServiceTest.java │ │ └── mock │ │ ├── MockConnector.java │ │ ├── MockEncounterService.java │ │ ├── MockIdcsService.java │ │ ├── MockPatientService.java │ │ ├── MockProviderService.java │ │ └── MockTelemetryService.java │ └── resources │ └── logback-test.xml ├── frontend ├── Dockerfile ├── README.md ├── build_spec.yaml ├── lombok.config ├── pom.xml ├── spotBugsIgnore.xml ├── src │ ├── main │ │ ├── java │ │ │ └── com │ │ │ │ └── oracle │ │ │ │ └── refapp │ │ │ │ └── frontend │ │ │ │ ├── Application.java │ │ │ │ ├── apigw │ │ │ │ └── SecurityBypassFilter.java │ │ │ │ ├── auth │ │ │ │ ├── CustomIdTokenLoginHandler.java │ │ │ │ ├── CustomJwksSignature.java │ │ │ │ ├── CustomJwksSignatureConfiguration.java │ │ │ │ ├── CustomOpenIdTokenResponseValidator.java │ │ │ │ └── CustomRedirectConfigurationProperties.java │ │ │ │ ├── controllers │ │ │ │ ├── ApiController.java │ │ │ │ └── ClientForwardController.java │ │ │ │ ├── models │ │ │ │ └── Role.java │ │ │ │ ├── service │ │ │ │ └── ApiService.java │ │ │ │ └── telemetry │ │ │ │ └── TelemetryClient.java │ │ └── resources │ │ │ ├── application-dev.yml │ │ │ ├── application-test.yml │ │ │ ├── application.yml │ │ │ └── logback.xml │ └── test │ │ └── java │ │ └── com │ │ └── oracle │ │ └── refapp │ │ └── frontend │ │ ├── FrontendTest.java │ │ ├── controllers │ │ ├── ApiControllerTest.java │ │ └── ClientForwardControllerTest.java │ │ ├── model │ │ └── Provider.java │ │ ├── service │ │ └── ApiServiceTest.java │ │ └── telemetry │ │ └── TelemetryClientTest.java └── web │ ├── .gitignore │ ├── .prettierignore │ ├── README.md │ ├── lerna.json │ ├── oracle.license │ ├── package.json │ ├── packages │ ├── api │ │ ├── appointment-api-client │ │ │ ├── openapitools.json │ │ │ └── package.json │ │ ├── encounter-api-client │ │ │ ├── openapitools.json │ │ │ └── package.json │ │ ├── patient-api-client │ │ │ ├── openapitools.json │ │ │ └── package.json │ │ └── provider-api-client │ │ │ ├── openapitools.json │ │ │ └── package.json │ ├── configs │ │ ├── babel │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── jest │ │ │ ├── babel.config.js │ │ │ ├── jest-preset.js │ │ │ ├── package.json │ │ │ └── setupTests.ts │ │ └── tsconfig │ │ │ ├── package.json │ │ │ └── tsconfig.json │ └── uho-web │ │ ├── jest.config.ts │ │ ├── package.json │ │ ├── src │ │ ├── api │ │ │ ├── apiClients.ts │ │ │ ├── frontendApi.ts │ │ │ ├── index.ts │ │ │ ├── mockApiClients.ts │ │ │ └── mocks │ │ │ │ ├── appointmentApi.ts │ │ │ │ ├── encounterApi.ts │ │ │ │ ├── frontendApi.ts │ │ │ │ ├── patientApi.ts │ │ │ │ ├── providerApi.ts │ │ │ │ └── utils.ts │ │ ├── app │ │ │ ├── 404 │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── index.spec.tsx.snap │ │ │ │ ├── index.spec.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── styles.scss │ │ │ ├── __snapshots__ │ │ │ │ └── index.spec.tsx.snap │ │ │ ├── content │ │ │ │ ├── patient │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── index.spec.tsx.snap │ │ │ │ │ ├── appointments │ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ │ └── index.spec.tsx.snap │ │ │ │ │ │ ├── index.spec.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── encounters │ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ │ └── index.spec.tsx.snap │ │ │ │ │ │ ├── index.spec.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── index.spec.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── overview │ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ │ └── index.spec.tsx.snap │ │ │ │ │ │ ├── index.spec.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── patientFooter.tsx │ │ │ │ │ ├── providers │ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ │ └── index.spec.tsx.snap │ │ │ │ │ │ ├── details │ │ │ │ │ │ │ ├── foldouts │ │ │ │ │ │ │ │ ├── about.tsx │ │ │ │ │ │ │ │ ├── experience.tsx │ │ │ │ │ │ │ │ ├── feedback.tsx │ │ │ │ │ │ │ │ ├── organization.tsx │ │ │ │ │ │ │ │ └── profile.tsx │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── index.spec.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ └── styles.scss │ │ │ │ └── provider │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── index.spec.tsx.snap │ │ │ │ │ ├── appointments │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── index.spec.tsx.snap │ │ │ │ │ ├── index.spec.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.scss │ │ │ │ │ ├── encounters │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── index.spec.tsx.snap │ │ │ │ │ ├── index.spec.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.scss │ │ │ │ │ ├── index.spec.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── info-panel │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── index.spec.tsx.snap │ │ │ │ │ ├── index.spec.tsx │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── overview │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── index.spec.tsx.snap │ │ │ │ │ ├── index.spec.tsx │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── providerFooter.tsx │ │ │ │ │ └── styles.scss │ │ │ ├── index.spec.tsx │ │ │ ├── index.tsx │ │ │ └── landing │ │ │ │ ├── __snapshots__ │ │ │ │ └── index.spec.tsx.snap │ │ │ │ ├── card │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── index.spec.tsx.snap │ │ │ │ ├── index.spec.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── styles.scss │ │ │ │ ├── index.spec.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── styles.scss │ │ ├── components │ │ │ ├── appointments │ │ │ │ ├── appointment-details │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── index.spec.tsx.snap │ │ │ │ │ ├── index.spec.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.scss │ │ │ │ ├── appointment-list │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── index.spec.tsx.snap │ │ │ │ │ ├── index.spec.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── appointment-picker │ │ │ │ │ ├── date-picker │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.scss │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── slot-picker │ │ │ │ │ │ └── index.tsx │ │ │ │ └── appointment-schedule │ │ │ │ │ └── index.tsx │ │ │ ├── banner │ │ │ │ ├── index.tsx │ │ │ │ └── styles.scss │ │ │ ├── conditions │ │ │ │ ├── condition │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.scss │ │ │ │ └── index.tsx │ │ │ ├── dialogs │ │ │ │ └── confirmation │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── index.spec.tsx.snap │ │ │ │ │ ├── index.spec.tsx │ │ │ │ │ └── index.tsx │ │ │ ├── divider │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── index.spec.tsx.snap │ │ │ │ ├── index.spec.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── styles.scss │ │ │ ├── empty-screen │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── index.spec.tsx.snap │ │ │ │ ├── index.spec.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── styles.scss │ │ │ ├── encounters │ │ │ │ ├── codes │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── index.spec.tsx.snap │ │ │ │ │ ├── index.spec.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── create-encounter │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── index.spec.tsx.snap │ │ │ │ │ ├── index.spec.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── encounter-details │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── index.spec.tsx.snap │ │ │ │ │ ├── encounter │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.scss │ │ │ │ │ ├── index.spec.tsx │ │ │ │ │ └── index.tsx │ │ │ │ └── encounter-list │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── index.spec.tsx.snap │ │ │ │ │ ├── index.spec.tsx │ │ │ │ │ └── index.tsx │ │ │ ├── feedback │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── index.spec.tsx.snap │ │ │ │ ├── index.spec.tsx │ │ │ │ └── index.tsx │ │ │ ├── footer │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── index.spec.tsx.snap │ │ │ │ ├── index.spec.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── styles.scss │ │ │ ├── layouts │ │ │ │ ├── content-panel │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── index.spec.tsx.snap │ │ │ │ │ ├── index.spec.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.scss │ │ │ │ ├── dashboard │ │ │ │ │ ├── card │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── foldout │ │ │ │ │ ├── card │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.scss │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── profile │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.scss │ │ │ │ │ └── styles.scss │ │ │ │ ├── general-overview │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.scss │ │ │ │ └── smart-filter-search │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.scss │ │ │ ├── legend │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── index.spec.tsx.snap │ │ │ │ ├── index.spec.tsx │ │ │ │ └── index.tsx │ │ │ ├── loading-wrapper │ │ │ │ └── index.tsx │ │ │ ├── loading │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── index.spec.tsx.snap │ │ │ │ ├── index.spec.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── styles.scss │ │ │ ├── observations │ │ │ │ ├── index.tsx │ │ │ │ └── observation │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.scss │ │ │ ├── patient-list │ │ │ │ ├── card-layout │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.scss │ │ │ │ ├── dropdown │ │ │ │ │ └── index.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── list-layout │ │ │ │ │ └── index.tsx │ │ │ │ └── styles.scss │ │ │ ├── provider-list │ │ │ │ ├── card-layout │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.scss │ │ │ │ ├── dropdown │ │ │ │ │ └── index.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── list-layout │ │ │ │ │ └── index.tsx │ │ │ │ └── styles.scss │ │ │ ├── provider-profile │ │ │ │ └── index.tsx │ │ │ ├── rating │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── index.spec.tsx.snap │ │ │ │ ├── index.spec.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── mock.tsx │ │ │ ├── search │ │ │ │ ├── filter-belt │ │ │ │ │ ├── filter-chip │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── search-bar │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── search-chip │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.scss │ │ │ │ │ └── styles.scss │ │ │ ├── spinner │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── index.spec.tsx.snap │ │ │ │ ├── heart.tsx │ │ │ │ ├── index.spec.tsx │ │ │ │ └── styles.scss │ │ │ └── user-menu │ │ │ │ └── index.tsx │ │ ├── hooks │ │ │ ├── isApiSupported.ts │ │ │ ├── useApmRum │ │ │ │ ├── index.spec.ts │ │ │ │ └── index.ts │ │ │ ├── useDataProvider.ts │ │ │ ├── useFilters │ │ │ │ └── index.ts │ │ │ ├── useI18n.ts │ │ │ ├── useLocalStorage.ts │ │ │ ├── useMediaQuery.ts │ │ │ ├── useQueryParams.ts │ │ │ └── useTitle │ │ │ │ ├── index.spec.tsx │ │ │ │ └── index.ts │ │ ├── index-webpack.html │ │ ├── index.tsx │ │ ├── nls │ │ │ ├── en-US │ │ │ │ └── index.ts │ │ │ └── index.ts │ │ ├── styles │ │ │ ├── favicon.ico │ │ │ ├── images │ │ │ │ ├── background.png │ │ │ │ ├── banner.svg │ │ │ │ ├── left-pattern.png │ │ │ │ ├── right-pattern.png │ │ │ │ └── vertical-overview-texture-light.png │ │ │ └── themes │ │ │ │ └── light.scss │ │ └── utils │ │ │ ├── authProvider.tsx │ │ │ ├── backgroundHelper.ts │ │ │ ├── dateProvider.ts │ │ │ ├── delayDataProvider.ts │ │ │ ├── nameUtils.ts │ │ │ ├── uuid.spec.ts │ │ │ └── uuid.ts │ │ ├── test │ │ ├── jetHelper.tsx │ │ └── setup.ts │ │ ├── tsconfig.commonjs.json │ │ ├── tsconfig.json │ │ ├── typings │ │ └── index.ts │ │ └── webpack │ │ ├── webpack.config.base.ts │ │ ├── webpack.config.dev.ts │ │ └── webpack.config.prod.ts │ └── yarn.lock ├── notification ├── README.md ├── build_spec.yaml ├── pom.xml ├── spotBugsIgnore.xml └── src │ └── main │ ├── java │ └── com │ │ └── oracle │ │ └── refapp │ │ └── notification │ │ ├── DateUtils.java │ │ ├── EmailDeliveryService.java │ │ ├── Function.java │ │ └── OciSessionProvider.java │ ├── jte │ ├── appointment_patient.jte │ ├── appointment_provider.jte │ └── encounter.jte │ └── resources │ ├── application-oraclecloud.yml │ ├── bootstrap-oraclecloud.yml │ └── simplelogger.properties ├── patient ├── Dockerfile ├── README.md ├── build_spec.yaml ├── lombok.config ├── pom.xml ├── spotBugsIgnore.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── oracle │ │ │ └── refapp │ │ │ └── patient │ │ │ ├── Application.java │ │ │ ├── config │ │ │ ├── CustomQueryValueBinder.java │ │ │ └── CustomRequestBinderRegistry.java │ │ │ ├── constants │ │ │ └── ErrorCodes.java │ │ │ ├── controller │ │ │ └── PatientController.java │ │ │ ├── domain │ │ │ ├── entity │ │ │ │ └── PatientEntity.java │ │ │ └── repository │ │ │ │ └── PatientRepository.java │ │ │ ├── exceptions │ │ │ ├── NoSuchPatientFoundException.java │ │ │ ├── NoSuchProviderFoundException.java │ │ │ └── UniqueUserNameViolationException.java │ │ │ ├── helpers │ │ │ ├── CustomJwksSignature.java │ │ │ ├── CustomJwksSignatureConfiguration.java │ │ │ └── CustomRoleFinder.java │ │ │ ├── mapper │ │ │ └── PatientMapper.java │ │ │ └── service │ │ │ ├── PatientMessageProducer.java │ │ │ ├── PatientService.java │ │ │ └── ProviderServiceClient.java │ └── resources │ │ ├── application-dev.yml │ │ ├── application-prod.yml │ │ ├── application-test.yml │ │ ├── application.yml │ │ ├── db │ │ ├── changesets │ │ │ ├── 0.1-init.xml │ │ │ └── 0.2-data.xml │ │ └── migrations.xml │ │ └── logback.xml │ └── test │ └── java │ └── com │ └── oracle │ └── refapp │ └── patient │ ├── PatientTest.java │ ├── TestUtils.java │ ├── controller │ └── PatientControllerTest.java │ ├── helpers │ ├── CustomJwksSignatureTest.java │ └── CustomRoleFinderTest.java │ └── service │ ├── PatientMessageProducerTest.java │ └── PatientServiceTest.java └── provider ├── Dockerfile ├── README.md ├── build_spec.yaml ├── lombok.config ├── pom.xml ├── spotBugsIgnore.xml └── src ├── main ├── java │ └── com │ │ └── oracle │ │ └── refapp │ │ └── provider │ │ ├── Application.java │ │ ├── config │ │ ├── CustomQueryValueBinder.java │ │ └── CustomRequestBinderRegistry.java │ │ ├── constants │ │ └── ErrorCodes.java │ │ ├── consumer │ │ └── AppointmentsConsumer.java │ │ ├── controller │ │ └── ProviderController.java │ │ ├── domain │ │ ├── entity │ │ │ ├── FeedbackEntity.java │ │ │ ├── ProviderEntity.java │ │ │ ├── ScheduleEntity.java │ │ │ └── SlotEntity.java │ │ └── repository │ │ │ ├── FeedbackRepository.java │ │ │ ├── ProviderRepository.java │ │ │ ├── ScheduleRepository.java │ │ │ └── SlotRepository.java │ │ ├── exceptions │ │ ├── InvalidTimestampException.java │ │ ├── ProviderNotFoundException.java │ │ ├── ScheduleAlreadyExistsException.java │ │ ├── ScheduleNotFoundException.java │ │ └── UsernameAlreadyTakenException.java │ │ ├── helpers │ │ ├── CustomJwksSignature.java │ │ ├── CustomJwksSignatureConfiguration.java │ │ ├── CustomRoleFinder.java │ │ └── Helper.java │ │ ├── mappers │ │ └── ProviderMapper.java │ │ └── service │ │ ├── FeedbackService.java │ │ ├── ProviderService.java │ │ ├── ScheduleService.java │ │ └── SlotService.java └── resources │ ├── application-dev.yaml │ ├── application-prod.yaml │ ├── application-test.yml │ ├── application.yml │ ├── db │ ├── changesets │ │ ├── 0.1-init.xml │ │ ├── 0.2-data.xml │ │ ├── 0.3-fill-schedule.xml │ │ └── sql │ │ │ └── schedule.sql │ └── migrations.xml │ └── logback.xml └── test └── java └── com └── oracle └── refapp └── provider ├── ProviderTest.java ├── TestUtils.java ├── consumer └── AppointmentConsumerTest.java ├── controller └── ProviderControllerTest.java ├── helpers ├── CustomJwksSignatureTest.java ├── CustomRoleFinderTest.java └── HelperTest.java ├── mappers └── ProviderMapperTest.java └── service ├── FeedbackServiceTest.java ├── ProviderServiceTest.java ├── ScheduleServiceTest.java └── SlotServiceTest.java /deploy/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | *.tgz 3 | *.zip 4 | .idea/ 5 | 6 | ## Kubeconfig 7 | kubeconfig 8 | terraform/generated/ 9 | 10 | ### Terraform ### 11 | # Local .terraform directories 12 | **/.terraform/* 13 | **/.terrafor* 14 | .terraform.lock.hcl 15 | 16 | # .tfstate files 17 | *.tfstate 18 | *.tfstate.* 19 | 20 | # Ignore any .tfvars files that are generated automatically for each Terraform run. Most 21 | # .tfvars files are managed as part of configuration and so should be included in 22 | # version control. 23 | # 24 | *.tfvars 25 | 26 | # Ignore override files as they are usually used to override resources locally and so 27 | # are not checked in 28 | override.tf 29 | override.tf.json 30 | *_override.tf 31 | *_override.tf.json 32 | 33 | # Ignore local file containing idcs public key 34 | **/idcs_public_key 35 | 36 | # tf crash log 37 | crash.log 38 | -------------------------------------------------------------------------------- /deploy/helm-chart/oke-setup/Chart.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | appVersion: "1.0" 3 | description: UHO App microservices chart 4 | name: oke-setup 5 | version: 0.1.1 6 | -------------------------------------------------------------------------------- /deploy/helm-chart/oke-setup/templates/ajdb/ajdb-admin-secret.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Secret 3 | metadata: 4 | name: "ajdb-admin" 5 | namespace: uho 6 | type: Opaque 7 | data: 8 | ajdb-admin-password: {{ .Values.secrets.ajdb.admin.password | b64enc }} -------------------------------------------------------------------------------- /deploy/helm-chart/oke-setup/templates/ajdb/ajdb-connection-secret.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Secret 3 | metadata: 4 | name: "ajdb-connection" 5 | namespace: uho 6 | type: Opaque 7 | data: 8 | ajdb-wallet-password: {{ .Values.secrets.ajdb.connection.wallet_password | b64enc }} 9 | ajdb-service: {{ .Values.secrets.ajdb.connection.ajdb_service | b64enc }} -------------------------------------------------------------------------------- /deploy/helm-chart/oke-setup/templates/ajdb/ajdb-wallet-zip-secret.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Secret 3 | metadata: 4 | name: "ajdb-wallet-zip" 5 | namespace: uho 6 | type: Opaque 7 | data: 8 | wallet: {{ .Values.secrets.ajdb.wallet_zip.content | b64enc }} -------------------------------------------------------------------------------- /deploy/helm-chart/oke-setup/templates/ajdb/secret-creator-rbac.yaml: -------------------------------------------------------------------------------- 1 | # apiVersion: rbac.authorization.k8s.io/v1 2 | # kind: ClusterRole 3 | # metadata: 4 | # name: secret-creator 5 | # rules: 6 | # - apiGroups: 7 | # - '' 8 | # resources: 9 | # - secrets 10 | # verbs: 11 | # - create 12 | # - delete 13 | # --- 14 | # apiVersion: v1 15 | # kind: ServiceAccount 16 | # metadata: 17 | # name: secret-creator-sa 18 | # namespace: uho 19 | # --- 20 | # apiVersion: rbac.authorization.k8s.io/v1 21 | # kind: ClusterRoleBinding 22 | # metadata: 23 | # name: secret-creator-crb 24 | # roleRef: 25 | # apiGroup: rbac.authorization.k8s.io 26 | # kind: ClusterRole 27 | # name: secret-creator 28 | # subjects: 29 | # - kind: ServiceAccount 30 | # name: secret-creator-sa 31 | # namespace: uho -------------------------------------------------------------------------------- /deploy/helm-chart/oke-setup/templates/apm/apm-secret.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Secret 3 | metadata: 4 | name: "apm" 5 | namespace: uho 6 | type: Opaque 7 | data: 8 | data_upload_endpoint: {{ .Values.secrets.apm.data_upload_endpoint | b64enc }} 9 | data_upload_path: {{ .Values.secrets.apm.data_upload_path | b64enc }} 10 | data_private_key: {{ .Values.secrets.apm.data_private_key | b64enc }} -------------------------------------------------------------------------------- /deploy/helm-chart/oke-setup/templates/atp/atp-admin-secret.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Secret 3 | metadata: 4 | name: "atp-admin" 5 | namespace: uho 6 | type: Opaque 7 | data: 8 | atp-admin-password: {{ .Values.secrets.atp.admin.password | b64enc }} -------------------------------------------------------------------------------- /deploy/helm-chart/oke-setup/templates/atp/atp-connection-secret.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Secret 3 | metadata: 4 | name: "atp-connection" 5 | namespace: uho 6 | type: Opaque 7 | data: 8 | atp-wallet-password: {{ .Values.secrets.atp.connection.wallet_password | b64enc }} 9 | atp-service: {{ .Values.secrets.atp.connection.atp_service | b64enc }} -------------------------------------------------------------------------------- /deploy/helm-chart/oke-setup/templates/atp/atp-wallet-zip-secret.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Secret 3 | metadata: 4 | name: "atp-wallet-zip" 5 | namespace: uho 6 | type: Opaque 7 | data: 8 | wallet: {{ .Values.secrets.atp.wallet_zip.content | b64enc }} -------------------------------------------------------------------------------- /deploy/helm-chart/oke-setup/templates/atp/secret-creator-rbac.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: rbac.authorization.k8s.io/v1 2 | kind: ClusterRole 3 | metadata: 4 | name: secret-creator 5 | rules: 6 | - apiGroups: 7 | - '' 8 | resources: 9 | - secrets 10 | verbs: 11 | - create 12 | - delete 13 | --- 14 | apiVersion: v1 15 | kind: ServiceAccount 16 | metadata: 17 | name: secret-creator-sa 18 | namespace: uho 19 | --- 20 | apiVersion: rbac.authorization.k8s.io/v1 21 | kind: ClusterRoleBinding 22 | metadata: 23 | name: secret-creator-crb 24 | roleRef: 25 | apiGroup: rbac.authorization.k8s.io 26 | kind: ClusterRole 27 | name: secret-creator 28 | subjects: 29 | - kind: ServiceAccount 30 | name: secret-creator-sa 31 | namespace: uho -------------------------------------------------------------------------------- /deploy/helm-chart/oke-setup/templates/idcs/apigw_config_map.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ConfigMap 3 | metadata: 4 | name: "apigw" 5 | namespace: uho 6 | data: 7 | url: {{ .Values.apigw.url }} -------------------------------------------------------------------------------- /deploy/helm-chart/oke-setup/templates/idcs/idcs_config_map.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ConfigMap 3 | metadata: 4 | name: idcs 5 | namespace: uho 6 | data: 7 | url: {{ .Values.idcs.url }} 8 | {{ (.Files.Glob "scripts/idcs-init.sh").AsConfig | indent 2 }} 9 | {{ (.Files.Glob "scripts/vault-write.sh").AsConfig | indent 2 }} -------------------------------------------------------------------------------- /deploy/helm-chart/oke-setup/templates/namespace.yaml: -------------------------------------------------------------------------------- 1 | { 2 | "apiVersion": "v1", 3 | "kind": "Namespace", 4 | "metadata": { 5 | "name": "uho", 6 | "labels": { 7 | "name": "uho" 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /deploy/helm-chart/oke-setup/templates/objectstorage/object-storage-config-map.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ConfigMap 3 | metadata: 4 | name: "object-storage" 5 | namespace: uho 6 | data: 7 | namespace-name: {{ .Values.config_maps.object_storage.namespace }} 8 | bucket-name: {{ .Values.config_maps.object_storage.bucket_name }} 9 | region-id: {{ .Values.config_maps.object_storage.region_id }} 10 | -------------------------------------------------------------------------------- /deploy/helm-chart/uho/Chart.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | appVersion: "1.0" 3 | description: UHO App microservices chart 4 | name: uho 5 | version: 0.1.1 6 | -------------------------------------------------------------------------------- /deploy/helm-chart/uho/charts/appointment/Chart.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | name: appointment 3 | appVersion: 0.1.0 4 | version: 0.1.0 5 | description: Helm chart for deploying appointment service -------------------------------------------------------------------------------- /deploy/helm-chart/uho/charts/appointment/templates/atp-appointment-secret.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Secret 3 | metadata: 4 | name: "atp-appointment-secret" 5 | type: Opaque 6 | data: 7 | atp-appointment-username: {{ .Values.global.secrets.atp.appointment.username | b64enc }} 8 | atp-appointment-password: {{ .Values.global.secrets.atp.appointment.password | b64enc }} -------------------------------------------------------------------------------- /deploy/helm-chart/uho/charts/appointment/templates/atp-init-configmap.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ConfigMap 3 | metadata: 4 | name: "appointment-atp-init-configmap" 5 | data: {{- (.Files.Glob "config/*.sql").AsConfig | nindent 2 }} -------------------------------------------------------------------------------- /deploy/helm-chart/uho/charts/appointment/templates/service.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: {{ include "appointment.fullname" . }} 5 | labels: {{ include "appointment.labels" . | nindent 4 }} 6 | spec: 7 | selector: 8 | app.kubernetes.io/name: {{ include "appointment.name" . }} 9 | app.kubernetes.io/instance: {{ .Release.Name }} 10 | ports: 11 | - port: {{ .Values.service.port }} 12 | name: http 13 | targetPort: {{ .Values.pod.containerPort }} -------------------------------------------------------------------------------- /deploy/helm-chart/uho/charts/appointment/values.yaml: -------------------------------------------------------------------------------- 1 | replicaCount: 3 2 | name: uho-appointment 3 | 4 | image: 5 | pullPolicy: Always 6 | 7 | pod: 8 | containerPort: 8080 9 | 10 | service: 11 | port: 80 -------------------------------------------------------------------------------- /deploy/helm-chart/uho/charts/encounter/Chart.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | name: encounter 3 | appVersion: 0.1.0 4 | version: 0.1.0 5 | description: Helm chart for deploying encounter service -------------------------------------------------------------------------------- /deploy/helm-chart/uho/charts/encounter/config/ajdb.init.sql: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | 6 | create user &1 identified by "&2"; 7 | grant create session to &1; 8 | grant create table to &1; 9 | grant unlimited tablespace to &1; 10 | grant create view, create procedure, create sequence to &1; 11 | grant SODA_APP to &1; -------------------------------------------------------------------------------- /deploy/helm-chart/uho/charts/encounter/templates/adb-encounter-secrets.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Secret 3 | metadata: 4 | name: "atp-encounter-secret" 5 | type: Opaque 6 | data: 7 | atp-encounter-username: {{ .Values.global.secrets.atp.encounter.username | b64enc }} 8 | atp-encounter-password: {{ .Values.global.secrets.atp.encounter.password | b64enc }} 9 | 10 | --- 11 | 12 | apiVersion: v1 13 | kind: Secret 14 | metadata: 15 | name: "ajdb-encounter-secret" 16 | type: Opaque 17 | data: 18 | ajdb-encounter-username: {{ .Values.global.secrets.ajdb.encounter.username | b64enc }} 19 | ajdb-encounter-password: {{ .Values.global.secrets.ajdb.encounter.password | b64enc }} -------------------------------------------------------------------------------- /deploy/helm-chart/uho/charts/encounter/templates/atp-init-configmap.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ConfigMap 3 | metadata: 4 | name: "encounter-atp-init-configmap" 5 | data: {{- (.Files.Glob "config/*.sql").AsConfig | nindent 2 }} 6 | -------------------------------------------------------------------------------- /deploy/helm-chart/uho/charts/encounter/templates/service.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: {{ include "encounter.fullname" . }} 5 | labels: {{ include "encounter.labels" . | nindent 4 }} 6 | spec: 7 | selector: 8 | app.kubernetes.io/name: {{ include "encounter.name" . }} 9 | app.kubernetes.io/instance: {{ .Release.Name }} 10 | ports: 11 | - port: {{ .Values.service.port }} 12 | name: http 13 | targetPort: {{ .Values.pod.containerPort }} -------------------------------------------------------------------------------- /deploy/helm-chart/uho/charts/encounter/values.yaml: -------------------------------------------------------------------------------- 1 | replicaCount: 3 2 | name : uho-encounter 3 | 4 | image: 5 | pullPolicy: Always 6 | 7 | pod: 8 | containerPort: 8080 9 | 10 | service: 11 | port: 80 12 | -------------------------------------------------------------------------------- /deploy/helm-chart/uho/charts/feedback/Chart.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | name: feedback 3 | appVersion: 0.1.0 4 | version: 0.1.0 5 | description: Helm chart for deploying feedback service -------------------------------------------------------------------------------- /deploy/helm-chart/uho/charts/feedback/templates/service.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: {{ include "feedback.fullname" . }} 5 | labels: {{ include "feedback.labels" . | nindent 4 }} 6 | spec: 7 | selector: 8 | app.kubernetes.io/name: {{ include "feedback.name" . }} 9 | app.kubernetes.io/instance: {{ .Release.Name }} 10 | ports: 11 | - port: {{ .Values.service.port }} 12 | name: http 13 | targetPort: {{ .Values.pod.containerPort }} -------------------------------------------------------------------------------- /deploy/helm-chart/uho/charts/feedback/values.yaml: -------------------------------------------------------------------------------- 1 | replicaCount: 3 2 | name : uho-feedback 3 | 4 | image: 5 | pullPolicy: Always 6 | 7 | pod: 8 | containerPort: 8080 9 | 10 | service: 11 | port: 80 12 | -------------------------------------------------------------------------------- /deploy/helm-chart/uho/charts/followup/Chart.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | name: followup 3 | appVersion: 0.1.0 4 | version: 0.1.0 5 | description: Helm chart for deploying followup service -------------------------------------------------------------------------------- /deploy/helm-chart/uho/charts/followup/templates/service.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: {{ include "followup.fullname" . }} 5 | labels: {{ include "followup.labels" . | nindent 4 }} 6 | spec: 7 | selector: 8 | app.kubernetes.io/name: {{ include "followup.name" . }} 9 | app.kubernetes.io/instance: {{ .Release.Name }} 10 | ports: 11 | - port: {{ .Values.service.port }} 12 | name: http 13 | targetPort: {{ .Values.pod.containerPort }} -------------------------------------------------------------------------------- /deploy/helm-chart/uho/charts/followup/values.yaml: -------------------------------------------------------------------------------- 1 | replicaCount: 3 2 | name : uho-followup 3 | image: 4 | pullPolicy: Always 5 | 6 | pod: 7 | containerPort: 8080 8 | 9 | service: 10 | port: 80 11 | -------------------------------------------------------------------------------- /deploy/helm-chart/uho/charts/frontend/Chart.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | name: frontend 3 | appVersion: 0.1.0 4 | version: 0.1.0 5 | description: Helm chart for deploying frontend service 6 | -------------------------------------------------------------------------------- /deploy/helm-chart/uho/charts/frontend/templates/service.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: {{ include "frontend.fullname" . }} 5 | labels: {{ include "frontend.labels" . | nindent 4 }} 6 | spec: 7 | selector: 8 | app.kubernetes.io/name: {{ include "frontend.name" . }} 9 | app.kubernetes.io/instance: {{ .Release.Name }} 10 | ports: 11 | - port: {{ .Values.service.port }} 12 | name: http 13 | targetPort: {{ .Values.pod.containerPort }} -------------------------------------------------------------------------------- /deploy/helm-chart/uho/charts/frontend/templates/vault-init-configmap.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ConfigMap 3 | metadata: 4 | name: "frontend-vault-init-configmap" 5 | data: {{- (.Files.Glob "config/*.sh").AsConfig | nindent 2 }} -------------------------------------------------------------------------------- /deploy/helm-chart/uho/charts/frontend/values.yaml: -------------------------------------------------------------------------------- 1 | replicaCount: 3 2 | name : uho-frontend 3 | 4 | image: 5 | pullPolicy: Always 6 | 7 | pod: 8 | containerPort: 8080 9 | 10 | service: 11 | port: 80 12 | -------------------------------------------------------------------------------- /deploy/helm-chart/uho/charts/patient/Chart.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | name: patient 3 | appVersion: 0.1.0 4 | version: 0.1.0 5 | description: Helm chart for deploying patient service 6 | -------------------------------------------------------------------------------- /deploy/helm-chart/uho/charts/patient/templates/atp-init-configmap.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ConfigMap 3 | metadata: 4 | name: "patient-atp-init-configmap" 5 | data: {{- (.Files.Glob "config/*.sql").AsConfig | nindent 2 }} -------------------------------------------------------------------------------- /deploy/helm-chart/uho/charts/patient/templates/atp-patient-secret.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Secret 3 | metadata: 4 | name: "atp-patient-secret" 5 | type: Opaque 6 | data: 7 | atp-patient-username: {{ .Values.global.secrets.atp.patient.username | b64enc }} 8 | atp-patient-password: {{ .Values.global.secrets.atp.patient.password | b64enc }} -------------------------------------------------------------------------------- /deploy/helm-chart/uho/charts/patient/templates/service.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: {{ include "patient.fullname" . }} 5 | labels: {{ include "patient.labels" . | nindent 4 }} 6 | spec: 7 | selector: 8 | app.kubernetes.io/name: {{ include "patient.name" . }} 9 | app.kubernetes.io/instance: {{ .Release.Name }} 10 | ports: 11 | - port: {{ .Values.service.port }} 12 | name: http 13 | targetPort: {{ .Values.pod.containerPort }} -------------------------------------------------------------------------------- /deploy/helm-chart/uho/charts/patient/values.yaml: -------------------------------------------------------------------------------- 1 | replicaCount: 3 2 | name : uho-patient 3 | 4 | image: 5 | pullPolicy: Always 6 | 7 | pod: 8 | containerPort: 8080 9 | 10 | service: 11 | port: 80 12 | -------------------------------------------------------------------------------- /deploy/helm-chart/uho/charts/provider/Chart.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | name: provider 3 | appVersion: 0.1.0 4 | version: 0.1.0 5 | description: Helm chart for deploying provider service 6 | -------------------------------------------------------------------------------- /deploy/helm-chart/uho/charts/provider/templates/atp-init-configmap.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ConfigMap 3 | metadata: 4 | name: "provider-atp-init-configmap" 5 | data: {{- (.Files.Glob "config/*.sql").AsConfig | nindent 2 }} -------------------------------------------------------------------------------- /deploy/helm-chart/uho/charts/provider/templates/atp-provider-secret.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Secret 3 | metadata: 4 | name: "atp-provider-secret" 5 | type: Opaque 6 | data: 7 | atp-provider-username: {{ .Values.global.secrets.atp.provider.username | b64enc }} 8 | atp-provider-password: {{ .Values.global.secrets.atp.provider.password | b64enc }} -------------------------------------------------------------------------------- /deploy/helm-chart/uho/charts/provider/templates/service.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: {{ include "provider.fullname" . }} 5 | labels: {{ include "provider.labels" . | nindent 4 }} 6 | spec: 7 | selector: 8 | app.kubernetes.io/name: {{ include "provider.name" . }} 9 | app.kubernetes.io/instance: {{ .Release.Name }} 10 | ports: 11 | - port: {{ .Values.service.port }} 12 | name: http 13 | targetPort: {{ .Values.pod.containerPort }} -------------------------------------------------------------------------------- /deploy/helm-chart/uho/charts/provider/values.yaml: -------------------------------------------------------------------------------- 1 | replicaCount: 3 2 | name: uho-provider 3 | 4 | image: 5 | pullPolicy: Always 6 | 7 | pod: 8 | containerPort: 8080 9 | 10 | service: 11 | port: 80 12 | -------------------------------------------------------------------------------- /deploy/helm-chart/uho/templates/config-map.yaml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/deploy/helm-chart/uho/templates/config-map.yaml -------------------------------------------------------------------------------- /deploy/helm-chart/uho/templates/ingress-nginx/config-map.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | data: 3 | allow-snippet-annotations: "true" 4 | kind: ConfigMap 5 | metadata: 6 | labels: 7 | app.kubernetes.io/component: controller 8 | app.kubernetes.io/instance: ingress-nginx 9 | app.kubernetes.io/name: ingress-nginx 10 | app.kubernetes.io/part-of: ingress-nginx 11 | app.kubernetes.io/version: 1.1.3 12 | name: ingress-nginx-controller 13 | namespace: ingress-nginx 14 | -------------------------------------------------------------------------------- /deploy/helm-chart/uho/templates/ingress-nginx/ingress-class: -------------------------------------------------------------------------------- 1 | apiVersion: networking.k8s.io/v1 2 | kind: IngressClass 3 | metadata: 4 | labels: 5 | app.kubernetes.io/component: controller 6 | app.kubernetes.io/instance: ingress-nginx 7 | app.kubernetes.io/name: ingress-nginx 8 | app.kubernetes.io/part-of: ingress-nginx 9 | app.kubernetes.io/version: 1.1.3 10 | name: nginx 11 | spec: 12 | controller: k8s.io/ingress-nginx -------------------------------------------------------------------------------- /deploy/helm-chart/uho/templates/ingress-nginx/namespace.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Namespace 3 | metadata: 4 | labels: 5 | app.kubernetes.io/instance: ingress-nginx 6 | app.kubernetes.io/name: ingress-nginx 7 | name: ingress-nginx -------------------------------------------------------------------------------- /deploy/helm-chart/uho/templates/ingress-nginx/serviceaccount.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | automountServiceAccountToken: true 3 | kind: ServiceAccount 4 | metadata: 5 | labels: 6 | app.kubernetes.io/component: controller 7 | app.kubernetes.io/instance: ingress-nginx 8 | app.kubernetes.io/name: ingress-nginx 9 | app.kubernetes.io/part-of: ingress-nginx 10 | app.kubernetes.io/version: 1.1.3 11 | name: ingress-nginx 12 | namespace: ingress-nginx 13 | --- 14 | apiVersion: v1 15 | kind: ServiceAccount 16 | metadata: 17 | labels: 18 | app.kubernetes.io/component: admission-webhook 19 | app.kubernetes.io/instance: ingress-nginx 20 | app.kubernetes.io/name: ingress-nginx 21 | app.kubernetes.io/part-of: ingress-nginx 22 | app.kubernetes.io/version: 1.1.3 23 | name: ingress-nginx-admission 24 | namespace: ingress-nginx -------------------------------------------------------------------------------- /deploy/terraform/modules/ajdb/outputs.tf: -------------------------------------------------------------------------------- 1 | output "admin_password" { 2 | value = random_string.autonomous_json_database_admin_password.result 3 | } 4 | 5 | output "wallet_password" { 6 | value = random_string.autonomous_json_database_wallet_password.result 7 | } 8 | 9 | output "wallet_zip_content" { 10 | value = oci_database_autonomous_database_wallet.autonomous_json_database_wallet.content 11 | } 12 | 13 | output "db_name" { 14 | value = oci_database_autonomous_database.uho_autonomous_json_database.db_name 15 | } 16 | 17 | output "ajdb_nsg_id" { 18 | value = oci_core_network_security_group.ajdb_security_group.id 19 | } 20 | 21 | output "db_id" { 22 | value = oci_database_autonomous_database.uho_autonomous_json_database.id 23 | } 24 | 25 | output "ajdb_endpoint_subnet_id" { 26 | value = oci_core_subnet.ajdb_endpoint_subnet.id 27 | } -------------------------------------------------------------------------------- /deploy/terraform/modules/ajdb/providers.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_providers { 3 | oci = { 4 | source = "oracle/oci" 5 | configuration_aliases = [oci.home] 6 | } 7 | } 8 | required_version = ">= 1.0.0" 9 | } -------------------------------------------------------------------------------- /deploy/terraform/modules/ajdb/utils.tf: -------------------------------------------------------------------------------- 1 | 2 | resource "random_string" "autonomous_json_database_admin_password" { 3 | length = 16 4 | special = true 5 | min_upper = 3 6 | min_lower = 3 7 | min_numeric = 3 8 | min_special = 3 9 | override_special = "{}#^*<>[]%~" 10 | } 11 | 12 | resource "random_string" "autonomous_json_database_wallet_password" { 13 | length = 16 14 | special = true 15 | min_upper = 3 16 | min_lower = 3 17 | min_numeric = 3 18 | min_special = 3 19 | override_special = "{}#^*<>[]%~" 20 | } -------------------------------------------------------------------------------- /deploy/terraform/modules/ajdb/variables.tf: -------------------------------------------------------------------------------- 1 | variable "compartment_id" { 2 | type = string 3 | } 4 | 5 | variable "tenancy_id" { 6 | type = string 7 | } 8 | 9 | variable "label_prefix" { 10 | type = string 11 | } 12 | 13 | variable "app_name" { 14 | default = "UHO App" 15 | description = "Application name. Will be used as prefix to identify resources, such as OKE, VCN, ATP, and others" 16 | type = string 17 | } 18 | 19 | variable "vcn_id" { 20 | type = string 21 | } 22 | 23 | variable "ajdb_cidr_block" { 24 | type = string 25 | } 26 | 27 | variable "nat_route_id" { 28 | type = string 29 | } 30 | 31 | variable "ig_route_id" { 32 | type = string 33 | } 34 | 35 | variable "subnet_regional_cidr" { 36 | type = string 37 | } -------------------------------------------------------------------------------- /deploy/terraform/modules/apigateway/outputs.tf: -------------------------------------------------------------------------------- 1 | output "apigw_url" { 2 | value = "https://${oci_apigateway_gateway.api_gateway.hostname}" 3 | } 4 | 5 | output "deployment" { 6 | value = { 7 | frontend = oci_apigateway_deployment.home 8 | appointment = oci_apigateway_deployment.appointment 9 | encounter = oci_apigateway_deployment.encounter 10 | patient = oci_apigateway_deployment.patient 11 | provider = oci_apigateway_deployment.provider 12 | } 13 | } 14 | 15 | output "apigw_subnet_id" { 16 | value = oci_core_subnet.apigw_subnet.id 17 | } 18 | 19 | output "idcs_key_content" { 20 | value = data.oci_objectstorage_object.idcs_key_file.content 21 | } -------------------------------------------------------------------------------- /deploy/terraform/modules/apigateway/providers.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_providers { 3 | oci = { 4 | source = "oracle/oci" 5 | configuration_aliases = [oci.home] 6 | } 7 | } 8 | required_version = ">= 1.0.0" 9 | } -------------------------------------------------------------------------------- /deploy/terraform/modules/apigateway/variables.tf: -------------------------------------------------------------------------------- 1 | variable "compartment_id" { 2 | type = string 3 | } 4 | 5 | variable "tenancy_id" { 6 | type = string 7 | } 8 | 9 | variable "label_prefix" { 10 | type = string 11 | } 12 | 13 | variable "app_name" { 14 | type = string 15 | } 16 | 17 | variable "apigw_cidr" { 18 | type = string 19 | } 20 | 21 | variable "vcn_id" { 22 | type = string 23 | } 24 | 25 | variable "ingress_ip" { 26 | type = string 27 | } 28 | 29 | variable "idcs_url" { 30 | type = string 31 | } 32 | 33 | variable "idcs_admin_client_id" { 34 | type = string 35 | } 36 | 37 | variable "idcs_admin_client_secret" { 38 | type = string 39 | } 40 | 41 | variable "bucket_name" { 42 | type = string 43 | } 44 | 45 | variable "object_storage_namespace_name" { 46 | type = string 47 | } 48 | -------------------------------------------------------------------------------- /deploy/terraform/modules/apm/apm.tf: -------------------------------------------------------------------------------- 1 | resource "oci_apm_apm_domain" "uho_apm_domain" { 2 | 3 | compartment_id = var.compartment_id 4 | display_name = "${var.label_prefix}-${local.display_name}" 5 | 6 | description = local.description 7 | } 8 | 9 | data "oci_apm_data_keys" "uho_public_data_keys" { 10 | 11 | apm_domain_id = oci_apm_apm_domain.uho_apm_domain.id 12 | 13 | #Optional 14 | data_key_type = local.data_key_type_public 15 | } 16 | 17 | data "oci_apm_data_keys" "uho_private_data_keys" { 18 | 19 | apm_domain_id = oci_apm_apm_domain.uho_apm_domain.id 20 | 21 | #Optional 22 | data_key_type = local.data_key_type_private 23 | } 24 | 25 | locals { 26 | display_name = "UHO APM domain" 27 | description = "UHO APM domain" 28 | data_key_type_public = "PUBLIC" 29 | data_key_type_private = "PRIVATE" 30 | } -------------------------------------------------------------------------------- /deploy/terraform/modules/apm/outputs.tf: -------------------------------------------------------------------------------- 1 | output "data_upload_endpoint" { 2 | value = oci_apm_apm_domain.uho_apm_domain.data_upload_endpoint 3 | } 4 | 5 | output "public_data_key" { 6 | value = data.oci_apm_data_keys.uho_public_data_keys.data_keys.0.value 7 | } 8 | 9 | output "private_data_key" { 10 | value = data.oci_apm_data_keys.uho_private_data_keys.data_keys.0.value 11 | } -------------------------------------------------------------------------------- /deploy/terraform/modules/apm/providers.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_providers { 3 | oci = { 4 | source = "oracle/oci" 5 | configuration_aliases = [oci.home] 6 | } 7 | } 8 | required_version = ">= 1.0.0" 9 | } -------------------------------------------------------------------------------- /deploy/terraform/modules/apm/variables.tf: -------------------------------------------------------------------------------- 1 | variable "compartment_id" { 2 | type = string 3 | } 4 | 5 | variable "label_prefix" { 6 | type = string 7 | } -------------------------------------------------------------------------------- /deploy/terraform/modules/atp/iam.tf: -------------------------------------------------------------------------------- 1 | resource "oci_identity_policy" "atp_access_policy" { 2 | name = "${local.atp_policy_name}-${var.label_suffix}" 3 | description = "${var.app_name} compartment policy for managing autonomus transaction processing" 4 | compartment_id = var.compartment_id 5 | statements = local.allow_atp_mgmt_statements 6 | provider = oci.home 7 | } 8 | 9 | locals { 10 | atp_policy_name ="atp-access-policy" 11 | allow_atp_mgmt_statements = [ 12 | "Allow dynamic-group ${var.dynamic_group_name} to manage autonomous-database-family in compartment id ${var.compartment_id}" 13 | ] 14 | } -------------------------------------------------------------------------------- /deploy/terraform/modules/atp/outputs.tf: -------------------------------------------------------------------------------- 1 | output "admin_password" { 2 | value = random_string.autonomous_database_admin_password.result 3 | } 4 | 5 | output "wallet_password" { 6 | value = random_string.autonomous_database_wallet_password.result 7 | } 8 | 9 | output "wallet_zip_content" { 10 | value = oci_database_autonomous_database_wallet.autonomous_database_wallet.content 11 | } 12 | 13 | output "db_name" { 14 | value = oci_database_autonomous_database.uho_autonomous_database.db_name 15 | } 16 | 17 | output "db_id" { 18 | value = oci_database_autonomous_database.uho_autonomous_database.id 19 | } 20 | 21 | output "atp_nsg_id" { 22 | value = oci_core_network_security_group.adb_security_group.id 23 | } 24 | 25 | output "adb_endpoint_subnet_id" { 26 | value = oci_core_subnet.adb_endpoint_subnet.id 27 | } -------------------------------------------------------------------------------- /deploy/terraform/modules/atp/providers.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_providers { 3 | oci = { 4 | source = "oracle/oci" 5 | configuration_aliases = [oci.home] 6 | } 7 | } 8 | required_version = ">= 1.0.0" 9 | } -------------------------------------------------------------------------------- /deploy/terraform/modules/atp/utils.tf: -------------------------------------------------------------------------------- 1 | 2 | resource "random_string" "autonomous_database_admin_password" { 3 | length = 16 4 | special = true 5 | min_upper = 3 6 | min_lower = 3 7 | min_numeric = 3 8 | min_special = 3 9 | override_special = "{}#^*<>[]%~" 10 | } 11 | 12 | resource "random_string" "autonomous_database_wallet_password" { 13 | length = 16 14 | special = true 15 | min_upper = 3 16 | min_lower = 3 17 | min_numeric = 3 18 | min_special = 3 19 | override_special = "{}#^*<>[]%~" 20 | } -------------------------------------------------------------------------------- /deploy/terraform/modules/atp/variables.tf: -------------------------------------------------------------------------------- 1 | variable "compartment_id" { 2 | type = string 3 | } 4 | 5 | variable "tenancy_id" { 6 | type = string 7 | } 8 | 9 | variable "label_suffix" { 10 | type = string 11 | } 12 | 13 | variable "app_name" { 14 | default = "UHO App" 15 | description = "Application name. Will be used as prefix to identify resources, such as OKE, VCN, ATP, and others" 16 | type = string 17 | } 18 | 19 | variable "vcn_id" { 20 | type = string 21 | } 22 | 23 | variable "adb_cidr_block" { 24 | type = string 25 | } 26 | 27 | variable "nat_route_id" { 28 | type = string 29 | } 30 | 31 | variable "ig_route_id" { 32 | type = string 33 | } 34 | 35 | variable "subnet_regional_cidr" { 36 | type = string 37 | } 38 | 39 | variable "dynamic_group_name"{ 40 | type = string 41 | description = "Dynamic group for atp management policy" 42 | } -------------------------------------------------------------------------------- /deploy/terraform/modules/cloudguard/providers.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_providers { 3 | oci = { 4 | source = "oracle/oci" 5 | configuration_aliases = [oci.reporting_region, oci.home] 6 | } 7 | } 8 | required_version = ">= 1.0.0" 9 | } -------------------------------------------------------------------------------- /deploy/terraform/modules/cloudguard/variables.tf: -------------------------------------------------------------------------------- 1 | variable "compartment_id" { 2 | type = string 3 | } 4 | 5 | variable "tenancy_id" { 6 | type = string 7 | } 8 | 9 | variable "label_suffix" { 10 | type = string 11 | } 12 | 13 | variable "reporting_region" { 14 | type = string 15 | } -------------------------------------------------------------------------------- /deploy/terraform/modules/datasafe/providers.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_providers { 3 | oci = { 4 | source = "oracle/oci" 5 | configuration_aliases = [oci.home] 6 | } 7 | } 8 | required_version = ">= 1.0.0" 9 | } -------------------------------------------------------------------------------- /deploy/terraform/modules/datasafe/variables.tf: -------------------------------------------------------------------------------- 1 | variable "compartment_id" { 2 | type = string 3 | } 4 | 5 | variable "tenancy_id" { 6 | type = string 7 | } 8 | 9 | variable "label_suffix" { 10 | type = string 11 | } 12 | 13 | variable "atp_id" { 14 | type = string 15 | } 16 | 17 | variable "ajdb_id" { 18 | type = string 19 | } 20 | 21 | variable "atp_cidr" { 22 | type = string 23 | } 24 | 25 | variable "ajdb_cidr" { 26 | type = string 27 | } 28 | 29 | variable "vcn_id" { 30 | type = string 31 | } 32 | 33 | variable "private_endpoint_ip" { 34 | type = string 35 | } 36 | 37 | variable "data_safe_subnet_cidr" { 38 | type = string 39 | } 40 | 41 | 42 | variable "atp_nsg_id" { 43 | type = string 44 | } 45 | 46 | variable "ajdb_nsg_id" { 47 | type = string 48 | } -------------------------------------------------------------------------------- /deploy/terraform/modules/devops/deployment/appointment.yaml: -------------------------------------------------------------------------------- 1 | version: 1.0 2 | component: deployment 3 | runAs: ocarun 4 | env: 5 | variables: 6 | OCI_CLI_AUTH: "instance_principal" 7 | steps: 8 | - stepType: Command 9 | name: update appointment's deployment.yaml 10 | command: | 11 | oci ce cluster create-kubeconfig --cluster-id ${cluster-id} --file $HOME/.kube/config --region ${region} --token-version 2.0.0 --auth instance_principal --kube-endpoint PRIVATE_ENDPOINT 12 | kubectl set image deployment/uho-appointment appointment=${docker_repository}/${namespace}/${image}:${hash} -n uho 13 | timeoutInSeconds: 600 -------------------------------------------------------------------------------- /deploy/terraform/modules/devops/deployment/encounter.yaml: -------------------------------------------------------------------------------- 1 | version: 1.0 2 | component: deployment 3 | runAs: ocarun 4 | env: 5 | variables: 6 | OCI_CLI_AUTH: "instance_principal" 7 | steps: 8 | - stepType: Command 9 | name: update encounter's deployment.yaml 10 | command: | 11 | oci ce cluster create-kubeconfig --cluster-id ${cluster-id} --file $HOME/.kube/config --region ${region} --token-version 2.0.0 --auth instance_principal --kube-endpoint PRIVATE_ENDPOINT 12 | kubectl set image deployment/uho-encounter encounter=${docker_repository}/${namespace}/${image}:${hash} -n uho 13 | timeoutInSeconds: 600 -------------------------------------------------------------------------------- /deploy/terraform/modules/devops/deployment/feedback.yaml: -------------------------------------------------------------------------------- 1 | version: 1.0 2 | component: deployment 3 | runAs: ocarun 4 | env: 5 | variables: 6 | OCI_CLI_AUTH: "instance_principal" 7 | steps: 8 | - stepType: Command 9 | name: update feedback's deployment.yaml 10 | command: | 11 | oci ce cluster create-kubeconfig --cluster-id ${cluster-id} --file $HOME/.kube/config --region ${region} --token-version 2.0.0 --auth instance_principal --kube-endpoint PRIVATE_ENDPOINT 12 | kubectl set image deployment/uho-feedback feedback=${docker_repository}/${namespace}/${image}:${hash} -n uho 13 | timeoutInSeconds: 600 -------------------------------------------------------------------------------- /deploy/terraform/modules/devops/deployment/followup.yaml: -------------------------------------------------------------------------------- 1 | version: 1.0 2 | component: deployment 3 | runAs: ocarun 4 | env: 5 | variables: 6 | OCI_CLI_AUTH: "instance_principal" 7 | steps: 8 | - stepType: Command 9 | name: update followup's deployment.yaml 10 | command: | 11 | oci ce cluster create-kubeconfig --cluster-id ${cluster-id} --file $HOME/.kube/config --region ${region} --token-version 2.0.0 --auth instance_principal --kube-endpoint PRIVATE_ENDPOINT 12 | kubectl set image deployment/uho-followup followup=${docker_repository}/${namespace}/${image}:${hash} -n uho 13 | timeoutInSeconds: 600 -------------------------------------------------------------------------------- /deploy/terraform/modules/devops/deployment/frontend.yaml: -------------------------------------------------------------------------------- 1 | version: 1.0 2 | component: deployment 3 | runAs: ocarun 4 | env: 5 | variables: 6 | OCI_CLI_AUTH: "instance_principal" 7 | steps: 8 | - stepType: Command 9 | name: update frontend's deployment.yaml 10 | command: | 11 | oci ce cluster create-kubeconfig --cluster-id ${cluster-id} --file $HOME/.kube/config --region ${region} --token-version 2.0.0 --auth instance_principal --kube-endpoint PRIVATE_ENDPOINT 12 | kubectl set image deployment/uho-frontend frontend=${docker_repository}/${namespace}/${image}:${hash} -n uho 13 | timeoutInSeconds: 600 -------------------------------------------------------------------------------- /deploy/terraform/modules/devops/deployment/patient.yaml: -------------------------------------------------------------------------------- 1 | version: 1.0 2 | component: deployment 3 | runAs: ocarun 4 | env: 5 | variables: 6 | OCI_CLI_AUTH: "instance_principal" 7 | steps: 8 | - stepType: Command 9 | name: update patient's deployment.yaml 10 | command: | 11 | oci ce cluster create-kubeconfig --cluster-id ${cluster-id} --file $HOME/.kube/config --region ${region} --token-version 2.0.0 --auth instance_principal --kube-endpoint PRIVATE_ENDPOINT 12 | kubectl set image deployment/uho-patient patient=${docker_repository}/${namespace}/${image}:${hash} -n uho 13 | timeoutInSeconds: 600 -------------------------------------------------------------------------------- /deploy/terraform/modules/devops/deployment/provider.yaml: -------------------------------------------------------------------------------- 1 | version: 1.0 2 | component: deployment 3 | runAs: ocarun 4 | env: 5 | variables: 6 | OCI_CLI_AUTH: "instance_principal" 7 | steps: 8 | - stepType: Command 9 | name: update provider's deployment.yaml 10 | command: | 11 | oci ce cluster create-kubeconfig --cluster-id ${cluster-id} --file $HOME/.kube/config --region ${region} --token-version 2.0.0 --auth instance_principal --kube-endpoint PRIVATE_ENDPOINT 12 | kubectl set image deployment/uho-provider provider=${docker_repository}/${namespace}/${image}:${hash} -n uho 13 | timeoutInSeconds: 600 -------------------------------------------------------------------------------- /deploy/terraform/modules/devops/outputs.tf: -------------------------------------------------------------------------------- 1 | output "repositories" { 2 | value = [var.patient_container_repository_name, var.provider_container_repository_name, var.appointment_container_repository_name, var.frontend_container_repository_name] 3 | } 4 | -------------------------------------------------------------------------------- /deploy/terraform/modules/devops/providers.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_providers { 3 | oci = { 4 | source = "oracle/oci" 5 | configuration_aliases = [oci.home] 6 | } 7 | } 8 | required_version = ">= 1.0.0" 9 | } -------------------------------------------------------------------------------- /deploy/terraform/modules/devops/triggers.tf: -------------------------------------------------------------------------------- 1 | resource "oci_devops_trigger" "uho_master_push_trigger" { 2 | for_each = toset(local.projects) 3 | actions { 4 | build_pipeline_id = oci_devops_build_pipeline.uho_build_pipeline[each.value].id 5 | type = "TRIGGER_BUILD_PIPELINE" 6 | 7 | filter { 8 | trigger_source = local.uho_build_trigger_source 9 | events = ["PUSH"] 10 | include { 11 | head_ref = local.uho_repository_build_pipeline_branch 12 | file_filter { 13 | file_paths = ["src/${each.value}/**"] 14 | } 15 | } 16 | } 17 | } 18 | project_id = oci_devops_project.uho_project.id 19 | trigger_source = local.uho_build_trigger_source 20 | 21 | display_name = "uho-code-push-trigger-${each.value}" 22 | repository_id = var.create_external_connection ? oci_devops_repository.uho_github_repository[0].id : oci_devops_repository.uho_repository[0].id 23 | } 24 | -------------------------------------------------------------------------------- /deploy/terraform/modules/devops/utils.tf: -------------------------------------------------------------------------------- 1 | resource "random_string" "repository_id" { 2 | length = 8 3 | lower = true 4 | numeric = true 5 | special = false 6 | upper = false 7 | min_lower = 2 8 | min_numeric = 2 9 | } -------------------------------------------------------------------------------- /deploy/terraform/modules/events/events.tf: -------------------------------------------------------------------------------- 1 | resource "oci_events_rule" "encounter_object_event_to_streaming_rule" { 2 | compartment_id = var.compartment_id 3 | is_enabled = true 4 | display_name = "${local.rule_display_name}-${var.label_prefix}" 5 | description = local.rule_description 6 | 7 | condition = "{\"eventType\":\"com.oraclecloud.objectstorage.createobject\",\"data\":{\"additionalDetails\":{\"bucketName\":\"${var.bucket_name}\"}}}" 8 | 9 | actions { 10 | actions { 11 | action_type = "OSS" 12 | is_enabled = true 13 | stream_id = var.stream_id 14 | } 15 | } 16 | } 17 | 18 | locals { 19 | rule_display_name = "EncounterObjectEventStreamingRule" 20 | rule_description = "Rule to generate events on object create in bucket and send to streaming" 21 | } -------------------------------------------------------------------------------- /deploy/terraform/modules/events/providers.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_providers { 3 | oci = { 4 | source = "oracle/oci" 5 | configuration_aliases = [oci.home] 6 | } 7 | } 8 | required_version = ">= 1.0.0" 9 | } 10 | -------------------------------------------------------------------------------- /deploy/terraform/modules/events/variables.tf: -------------------------------------------------------------------------------- 1 | variable "compartment_id" { 2 | type = string 3 | } 4 | 5 | variable "stream_id" { 6 | type = string 7 | } 8 | 9 | variable "label_prefix" { 10 | type = string 11 | } 12 | 13 | variable "bucket_name" { 14 | type = string 15 | } -------------------------------------------------------------------------------- /deploy/terraform/modules/logging/iam.tf: -------------------------------------------------------------------------------- 1 | resource "oci_identity_policy" "oke_logging_policy" { 2 | name = "${local.oke_logging_policy_name}-${var.label_prefix}" 3 | description = "${var.app_name} compartment policy for application logging " 4 | compartment_id = var.compartment_id 5 | statements = local.allow_logging_statements 6 | provider = oci.home 7 | } 8 | 9 | locals { 10 | allow_logging_statements = [ 11 | "Allow dynamic-group ${var.dynamic_group_name} to use log-content in compartment id ${var.compartment_id}" 12 | ] 13 | } -------------------------------------------------------------------------------- /deploy/terraform/modules/logging/outputs.tf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/deploy/terraform/modules/logging/outputs.tf -------------------------------------------------------------------------------- /deploy/terraform/modules/logging/providers.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_providers { 3 | oci = { 4 | source = "oracle/oci" 5 | configuration_aliases = [oci.home] 6 | } 7 | } 8 | required_version = ">= 1.0.0" 9 | } -------------------------------------------------------------------------------- /deploy/terraform/modules/monitoring/outputs.tf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/deploy/terraform/modules/monitoring/outputs.tf -------------------------------------------------------------------------------- /deploy/terraform/modules/monitoring/providers.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_providers { 3 | oci = { 4 | source = "oracle/oci" 5 | configuration_aliases = [oci.home] 6 | } 7 | } 8 | required_version = ">= 1.0.0" 9 | } -------------------------------------------------------------------------------- /deploy/terraform/modules/monitoring/variables.tf: -------------------------------------------------------------------------------- 1 | variable "compartment_id" { 2 | type = string 3 | } 4 | 5 | variable "tenancy_id" { 6 | type = string 7 | } 8 | 9 | variable "label_prefix" { 10 | type = string 11 | } 12 | 13 | variable "alarm_notification_topic_name" { 14 | type = string 15 | default = "monitoring-alarms" 16 | } -------------------------------------------------------------------------------- /deploy/terraform/modules/notification/email.tf: -------------------------------------------------------------------------------- 1 | resource "oci_email_sender" "email_sender" { 2 | compartment_id = var.compartment_id 3 | email_address = local.sender_email_address 4 | } 5 | 6 | locals { 7 | sender_email_address = "help@uho.com" 8 | } -------------------------------------------------------------------------------- /deploy/terraform/modules/notification/outputs.tf: -------------------------------------------------------------------------------- 1 | output "email_delivery_function_id" { 2 | value = oci_functions_function.email_delivery_function.id 3 | } 4 | 5 | output "email_delivery_application_id" { 6 | value = oci_functions_application.email_delivery_application.id 7 | } 8 | 9 | output "functions_subnet_id" { 10 | value = oci_core_subnet.functions_subnet.id 11 | } 12 | -------------------------------------------------------------------------------- /deploy/terraform/modules/notification/providers.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_providers { 3 | oci = { 4 | source = "oracle/oci" 5 | configuration_aliases = [oci.home] 6 | } 7 | } 8 | required_version = ">= 1.0.0" 9 | } -------------------------------------------------------------------------------- /deploy/terraform/modules/objectstorage/outputs.tf: -------------------------------------------------------------------------------- 1 | output "object_storage_bucket_name" { 2 | value = oci_objectstorage_bucket.uho_object_storage.name 3 | } 4 | 5 | output "object_storage_namespace_name" { 6 | value = data.oci_objectstorage_namespace.objectstorage_namespace.namespace 7 | } -------------------------------------------------------------------------------- /deploy/terraform/modules/objectstorage/providers.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_providers { 3 | oci = { 4 | source = "oracle/oci" 5 | configuration_aliases = [oci.home] 6 | } 7 | } 8 | required_version = ">= 1.0.0" 9 | } -------------------------------------------------------------------------------- /deploy/terraform/modules/objectstorage/variables.tf: -------------------------------------------------------------------------------- 1 | variable "compartment_id" { 2 | type = string 3 | } 4 | 5 | variable "tenancy_id" { 6 | type = string 7 | } 8 | 9 | variable "label_prefix" { 10 | type = string 11 | } 12 | 13 | variable "object_storage_access_type" { 14 | default = "NoPublicAccess" 15 | type = string 16 | } 17 | 18 | variable "bucket_name" { 19 | default = "UHO-bucket" 20 | type = string 21 | } 22 | 23 | variable "kms_key_id" { 24 | type = string 25 | } 26 | 27 | variable "region" { 28 | type = string 29 | } -------------------------------------------------------------------------------- /deploy/terraform/modules/streaming/providers.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_providers { 3 | oci = { 4 | source = "oracle/oci" 5 | configuration_aliases = [oci.home] 6 | } 7 | } 8 | required_version = ">= 1.0.0" 9 | } -------------------------------------------------------------------------------- /deploy/terraform/modules/vulnerability/iam.tf: -------------------------------------------------------------------------------- 1 | resource "oci_identity_policy" "vss-policy" { 2 | provider = oci.home 3 | name = "vss-policies-${var.label_prefix}" 4 | description = "Policies for Vulnerability Scanning Service" 5 | compartment_id = var.compartment_id 6 | 7 | statements = [ 8 | "Allow service vulnerability-scanning-service to read repos in compartment id ${var.compartment_id}", 9 | "Allow service vulnerability-scanning-service to read compartments in compartment id ${var.compartment_id}" 10 | ] 11 | } -------------------------------------------------------------------------------- /deploy/terraform/modules/vulnerability/providers.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_providers { 3 | oci = { 4 | source = "oracle/oci" 5 | configuration_aliases = [oci.home] 6 | } 7 | } 8 | required_version = ">= 1.0.0" 9 | } -------------------------------------------------------------------------------- /deploy/terraform/modules/vulnerability/variables.tf: -------------------------------------------------------------------------------- 1 | variable "compartment_id" {} 2 | 3 | variable "tenancy_id" {} 4 | 5 | variable "region" {} 6 | 7 | variable "repositories" { 8 | default = [] 9 | } 10 | 11 | variable "label_prefix" { 12 | default = "" 13 | } -------------------------------------------------------------------------------- /deploy/terraform/modules/waf/outputs.tf: -------------------------------------------------------------------------------- 1 | output "waf_id" { 2 | value = oci_waf_web_app_firewall.web_app_firewall.id 3 | } -------------------------------------------------------------------------------- /deploy/terraform/modules/waf/providers.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_providers { 3 | oci = { 4 | source = "oracle/oci" 5 | configuration_aliases = [oci.home] 6 | } 7 | } 8 | required_version = ">= 1.0.0" 9 | } -------------------------------------------------------------------------------- /deploy/terraform/modules/waf/variables.tf: -------------------------------------------------------------------------------- 1 | variable "compartment_id" { 2 | type = string 3 | } 4 | 5 | variable "ingress_ip" { 6 | type = string 7 | } -------------------------------------------------------------------------------- /deploy/terraform/remove-k8s-state.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # 4 | # Copyright (c) 2023 Oracle and/or its affiliates. 5 | # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 6 | # 7 | 8 | # set -e 9 | 10 | terraform state rm "kubernetes_config_map.idcs" 11 | 12 | terraform state rm "kubernetes_secret.idcs[0]" 13 | 14 | terraform state rm "kubernetes_secret.atp-admin[0]" 15 | 16 | terraform state rm "kubernetes_secret.atp-connection[0]" 17 | 18 | terraform state rm "kubernetes_secret.atp_wallet_zip[0]" 19 | 20 | terraform state rm "kubernetes_service_account.secret_creator_sa[0]" 21 | 22 | terraform state rm "kubernetes_config_map.apigw" 23 | 24 | terraform state rm "helm_release.uho" 25 | 26 | terraform state rm "kubernetes_cluster_role_binding.secret_creator_crb[0]" 27 | 28 | terraform state rm "kubernetes_secret.uho-streampool-connection[0]" 29 | -------------------------------------------------------------------------------- /deploy/terraform/scripts/destroy_object_storage_objects.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # 4 | # Copyright (c) 2023 Oracle and/or its affiliates. 5 | # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 6 | # 7 | 8 | oci os object bulk-delete --bucket-name ${BUCKET_NAME} --force -------------------------------------------------------------------------------- /deploy/terraform/scripts/generate_kubeconfig.template.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # Copyright (c) 2023 Oracle and/or its affiliates. 4 | # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 5 | # 6 | 7 | if [ ! -f $HOME/.kube/config ]; then 8 | oci ce cluster create-kubeconfig --cluster-id ${cluster-id} --file $HOME/.kube/config --region ${region} --token-version 2.0.0 --auth instance_principal --kube-endpoint PRIVATE_ENDPOINT 9 | 10 | chmod go-r $HOME/.kube/config 11 | fi -------------------------------------------------------------------------------- /deploy/terraform/scripts/ingress_healthcheck.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # Copyright (c) 2023 Oracle and/or its affiliates. 4 | # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 5 | # 6 | 7 | set -e 8 | while true 9 | do 10 | IP=`kubectl get ingress nginx-ingress --namespace=uho -ojsonpath='{.status.loadBalancer.ingress[0].ip}'` 11 | if [[ $IP =~ ^[0-9] ]] 12 | then 13 | echo $IP > ingress_ip 14 | exit 0 15 | fi 16 | echo "looping until ingress-lb is created" 17 | sleep 5 18 | done 19 | exit 0 20 | -------------------------------------------------------------------------------- /deploy/terraform/scripts/install_helm.template.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # Copyright (c) 2023 Oracle and/or its affiliates. 4 | # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 5 | # 6 | 7 | if [ ! -f .helm_completed ]; then 8 | sudo yum install -y helm 9 | 10 | echo "source <(helm completion bash)" >> ~/.bashrc 11 | echo "alias h='helm'" >> ~/.bashrc 12 | echo "helm completed" 13 | touch .helm_completed 14 | fi -------------------------------------------------------------------------------- /deploy/terraform/scripts/kubeconfig_set_credentials.template.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # Copyright (c) 2023 Oracle and/or its affiliates. 4 | # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 5 | # 6 | 7 | kubectl config set-credentials "user-${cluster-id-11}" --exec-command="$HOME/bin/token_helper.sh" \ 8 | --exec-arg="ce" \ 9 | --exec-arg="cluster" \ 10 | --exec-arg="generate-token" \ 11 | --exec-arg="--cluster-id" \ 12 | --exec-arg="${cluster-id}" \ 13 | --exec-arg="--region" \ 14 | --exec-arg="${region}" -------------------------------------------------------------------------------- /deploy/terraform/scripts/token_helper.template.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # Copyright (c) 2023 Oracle and/or its affiliates. 4 | # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 5 | # 6 | 7 | CLUSTER=$5 8 | REGION=$7 9 | 10 | TOKEN_FILE=$HOME/.kube/TOKEN-$CLUSTER 11 | 12 | if ! test -f "$TOKEN_FILE" || test $(( `date +%s` - `stat -L -c %Y $TOKEN_FILE` )) -gt 240; then 13 | umask 022 14 | oci ce cluster generate-token --cluster-id "$CLUSTER" --region "$REGION" > $TOKEN_FILE 15 | fi 16 | 17 | cat $TOKEN_FILE 18 | -------------------------------------------------------------------------------- /deploy/terraform/scripts/uninstall_helm_releases.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # 4 | # Copyright (c) 2023 Oracle and/or its affiliates. 5 | # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 6 | # 7 | 8 | set -e 9 | 10 | echo "Inside operator" 11 | 12 | helm uninstall oke-setup 13 | echo "Sleeping for 60s after uninstalling oke-setup release.." 14 | sleep 60 15 | 16 | echo "Deleting ingress-nginx namespace" 17 | kubectl delete namespaces ingress-nginx -------------------------------------------------------------------------------- /deploy/terraform/uho-api-resource.tf: -------------------------------------------------------------------------------- 1 | resource "oci_apigateway_api" "patient_api" { 2 | 3 | compartment_id = var.compartment_ocid 4 | content = file("${path.module}/specs/Patient.yml") 5 | display_name = "Patient" 6 | } 7 | resource "oci_apigateway_api" "provider_api" { 8 | 9 | compartment_id = var.compartment_ocid 10 | content = file("${path.module}/specs/Provider.yml") 11 | display_name = "Provider" 12 | } 13 | resource "oci_apigateway_api" "appointment_api" { 14 | 15 | compartment_id = var.compartment_ocid 16 | content = file("${path.module}/specs/Appointment.yml") 17 | display_name = "Appointment" 18 | } 19 | resource "oci_apigateway_api" "encounter_api" { 20 | 21 | compartment_id = var.compartment_ocid 22 | content = file("${path.module}/specs/Encounter.yml") 23 | display_name = "Encounter" 24 | } -------------------------------------------------------------------------------- /docs/Images/activate-application.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/activate-application.png -------------------------------------------------------------------------------- /docs/Images/add-application-details.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/add-application-details.png -------------------------------------------------------------------------------- /docs/Images/add-application-page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/add-application-page.png -------------------------------------------------------------------------------- /docs/Images/add-application-roles-page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/add-application-roles-page.png -------------------------------------------------------------------------------- /docs/Images/add-application-roles.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/add-application-roles.png -------------------------------------------------------------------------------- /docs/Images/add-application.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/add-application.png -------------------------------------------------------------------------------- /docs/Images/add-roles.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/add-roles.png -------------------------------------------------------------------------------- /docs/Images/advanced-options.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/advanced-options.png -------------------------------------------------------------------------------- /docs/Images/application-step-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/application-step-1.png -------------------------------------------------------------------------------- /docs/Images/application-step-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/application-step-2.png -------------------------------------------------------------------------------- /docs/Images/application-step-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/application-step-3.png -------------------------------------------------------------------------------- /docs/Images/application-step-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/application-step-4.png -------------------------------------------------------------------------------- /docs/Images/application-step-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/application-step-5.png -------------------------------------------------------------------------------- /docs/Images/application.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/application.png -------------------------------------------------------------------------------- /docs/Images/auth_token.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/auth_token.png -------------------------------------------------------------------------------- /docs/Images/cloning-repository.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/cloning-repository.png -------------------------------------------------------------------------------- /docs/Images/code-repository.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/code-repository.png -------------------------------------------------------------------------------- /docs/Images/configure-oauth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/configure-oauth.png -------------------------------------------------------------------------------- /docs/Images/configure-policy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/configure-policy.png -------------------------------------------------------------------------------- /docs/Images/create-external-connection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/create-external-connection.png -------------------------------------------------------------------------------- /docs/Images/create-stack-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/create-stack-2.png -------------------------------------------------------------------------------- /docs/Images/create-stack-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/create-stack-3.png -------------------------------------------------------------------------------- /docs/Images/create-stack-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/create-stack-4.png -------------------------------------------------------------------------------- /docs/Images/create_devops_project.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/create_devops_project.png -------------------------------------------------------------------------------- /docs/Images/default-overview-page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/default-overview-page.png -------------------------------------------------------------------------------- /docs/Images/deploy-stack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/deploy-stack.png -------------------------------------------------------------------------------- /docs/Images/destroy-status.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/destroy-status.png -------------------------------------------------------------------------------- /docs/Images/devops-deploy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/devops-deploy.png -------------------------------------------------------------------------------- /docs/Images/devops-overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/devops-overview.png -------------------------------------------------------------------------------- /docs/Images/devops-pro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/devops-pro.png -------------------------------------------------------------------------------- /docs/Images/domain-home-page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/domain-home-page.png -------------------------------------------------------------------------------- /docs/Images/fed-add-application-page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/fed-add-application-page.png -------------------------------------------------------------------------------- /docs/Images/fed-add-application.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/fed-add-application.png -------------------------------------------------------------------------------- /docs/Images/fed-idcs-home-page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/fed-idcs-home-page.png -------------------------------------------------------------------------------- /docs/Images/federation-activation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/federation-activation.png -------------------------------------------------------------------------------- /docs/Images/federation-credentials.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/federation-credentials.png -------------------------------------------------------------------------------- /docs/Images/federation-deactivate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/federation-deactivate.png -------------------------------------------------------------------------------- /docs/Images/federation-home-page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/federation-home-page.png -------------------------------------------------------------------------------- /docs/Images/federation-home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/federation-home.png -------------------------------------------------------------------------------- /docs/Images/mirrored-repo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/mirrored-repo.png -------------------------------------------------------------------------------- /docs/Images/resource-manager-stacks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/resource-manager-stacks.png -------------------------------------------------------------------------------- /docs/Images/resources-jobs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/resources-jobs.png -------------------------------------------------------------------------------- /docs/Images/rms-deploy-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/rms-deploy-2.png -------------------------------------------------------------------------------- /docs/Images/rms-deploy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/rms-deploy.png -------------------------------------------------------------------------------- /docs/Images/roles-added.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/roles-added.png -------------------------------------------------------------------------------- /docs/Images/security-zone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/security-zone.png -------------------------------------------------------------------------------- /docs/Images/smtp-credentials.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/smtp-credentials.png -------------------------------------------------------------------------------- /docs/Images/stacks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/stacks.png -------------------------------------------------------------------------------- /docs/Images/url-deploy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/url-deploy.png -------------------------------------------------------------------------------- /docs/Images/user-settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oracle-samples/modern-app-dev/36c9661ee0e63009329fb5f3e07c28fa1c600667/docs/Images/user-settings.png -------------------------------------------------------------------------------- /src/appointment/README.md: -------------------------------------------------------------------------------- 1 | # Appointment Service 2 | 3 | ## Developer quick start 4 | 5 | Appointment is a Micronaut-based microservice that exposes APIs for managing appointment bookings in the Universal Healthcare Organization reference application. 6 | 7 | Start the application through Java: 8 | ```shell 9 | mvn clean install 10 | MICRONAUT_ENVIRONMENTS=dev java -jar target/appointment-1.0-SNAPSHOT.jar 11 | ``` 12 | 13 | Start the application in a Docker container by passing required variables that are defined in 14 | your application-env.yml file. 15 | 16 | ```shell 17 | DOCKER_BUILDKIT=1 docker build -t appointment:latest . 18 | docker run -p 8080:8080 --env MICRONAUT_ENVIRONMENTS= --mount type=bind,source=,target=/root/.oci appointment:latest 19 | ``` 20 | Access the application at http://localhost:8080 21 | 22 | 23 | **Note**: You can find the jacoco report in target/site/jacoco/index.html. -------------------------------------------------------------------------------- /src/appointment/lombok.config: -------------------------------------------------------------------------------- 1 | lombok.addLombokGeneratedAnnotation = true -------------------------------------------------------------------------------- /src/appointment/spotBugsIgnore.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/appointment/src/main/java/com/oracle/refapp/constants/ErrorCodes.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | package com.oracle.refapp.constants; 6 | 7 | import lombok.AccessLevel; 8 | import lombok.NoArgsConstructor; 9 | 10 | @NoArgsConstructor(access = AccessLevel.PRIVATE) 11 | public class ErrorCodes { 12 | 13 | public static final String ERROR_CODE_NOT_FOUND = "NotFound"; 14 | public static final String ERROR_CODE_BAD_REQUEST = "BadRequest"; 15 | public static final String INTERNAL_SERVER_ERROR = "InternalServerError"; 16 | } 17 | -------------------------------------------------------------------------------- /src/appointment/src/main/java/com/oracle/refapp/constants/Status.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | package com.oracle.refapp.constants; 6 | 7 | public enum Status { 8 | CONFIRMED, 9 | CANCELLED, 10 | } 11 | -------------------------------------------------------------------------------- /src/appointment/src/main/java/com/oracle/refapp/exceptions/AppointmentUpdateFailedException.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | package com.oracle.refapp.exceptions; 6 | 7 | public class AppointmentUpdateFailedException extends Exception { 8 | 9 | public AppointmentUpdateFailedException(String message) { 10 | super(message); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/appointment/src/main/java/com/oracle/refapp/exceptions/MultipleAppointmentNotAllowedException.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | package com.oracle.refapp.exceptions; 6 | 7 | public class MultipleAppointmentNotAllowedException extends Exception { 8 | 9 | public MultipleAppointmentNotAllowedException(String message) { 10 | super(message); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/appointment/src/main/java/com/oracle/refapp/exceptions/NoSuchAppointmentFoundException.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | package com.oracle.refapp.exceptions; 6 | 7 | public class NoSuchAppointmentFoundException extends Exception { 8 | 9 | public NoSuchAppointmentFoundException(Integer appointmentId) { 10 | super("No appointment with id=" + appointmentId + " exists."); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/appointment/src/main/java/com/oracle/refapp/exceptions/NoSuchPatientFoundException.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | package com.oracle.refapp.exceptions; 6 | 7 | public class NoSuchPatientFoundException extends Exception { 8 | 9 | public NoSuchPatientFoundException(String message) { 10 | super(message); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/appointment/src/main/java/com/oracle/refapp/exceptions/NoSuchProviderFoundException.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | package com.oracle.refapp.exceptions; 6 | 7 | public class NoSuchProviderFoundException extends Exception { 8 | 9 | public NoSuchProviderFoundException(String message) { 10 | super(message); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/appointment/src/main/java/com/oracle/refapp/helpers/CustomJwksSignatureConfiguration.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | package com.oracle.refapp.helpers; 6 | 7 | import com.nimbusds.jose.jwk.KeyType; 8 | import io.micronaut.context.annotation.ConfigurationProperties; 9 | import jakarta.inject.Singleton; 10 | import lombok.AllArgsConstructor; 11 | import lombok.Data; 12 | import lombok.NoArgsConstructor; 13 | 14 | @Data 15 | @NoArgsConstructor 16 | @AllArgsConstructor 17 | @Singleton 18 | @ConfigurationProperties("micronaut.security.token.jwt.signatures.static-jwks") 19 | public class CustomJwksSignatureConfiguration { 20 | 21 | private KeyType keyType; 22 | private String keys; 23 | } 24 | -------------------------------------------------------------------------------- /src/appointment/src/main/java/com/oracle/refapp/model/AppointmentSearchCriteria.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | package com.oracle.refapp.model; 6 | 7 | import io.micronaut.core.annotation.Introspected; 8 | import java.time.ZonedDateTime; 9 | import lombok.*; 10 | 11 | @Getter 12 | @Setter 13 | @ToString 14 | @NoArgsConstructor 15 | @AllArgsConstructor 16 | @Introspected 17 | public class AppointmentSearchCriteria { 18 | 19 | private ZonedDateTime startTime; 20 | private ZonedDateTime endTime; 21 | private Integer patientId; 22 | private Integer providerId; 23 | private Integer page; 24 | private Integer limit; 25 | } 26 | -------------------------------------------------------------------------------- /src/appointment/src/main/java/com/oracle/refapp/search/AppointmentSearcher.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | package com.oracle.refapp.search; 6 | 7 | import com.oracle.refapp.model.AppointmentCollection; 8 | import com.oracle.refapp.model.AppointmentSearchCriteria; 9 | 10 | public interface AppointmentSearcher { 11 | AppointmentCollection search(AppointmentSearchCriteria searchCriteria); 12 | } 13 | -------------------------------------------------------------------------------- /src/appointment/src/main/resources/application-test.yml: -------------------------------------------------------------------------------- 1 | micronaut: 2 | application: 3 | name: appointment 4 | security: 5 | enabled: false 6 | metrics: 7 | enabled: false 8 | export: 9 | oraclecloud: 10 | enabled: true 11 | namespace: uho_${micronaut.application.name} 12 | resourceGroup: mn_local 13 | compartmentId: dummy-compartment-id 14 | datasources: 15 | default: 16 | url: jdbc:h2:mem:devDb;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE 17 | driverClassName: org.h2.Driver 18 | username: sa 19 | password: '' 20 | 21 | streaming: 22 | id: "" 23 | endpoint: "" 24 | 25 | oci: 26 | config: 27 | profile: DEFAULT -------------------------------------------------------------------------------- /src/appointment/src/main/resources/db/migrations.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/appointment/src/main/resources/logback.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | 9 | 11 | 12 | %cyan(%d{HH:mm:ss.SSS}) %gray([%thread]) %highlight(%-5level) %magenta(%logger{36}) - %msg%n 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /src/appointment/src/test/java/com/oracle/refapp/AppointmentTest.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | package com.oracle.refapp; 6 | 7 | import io.micronaut.runtime.EmbeddedApplication; 8 | import io.micronaut.test.extensions.junit5.annotation.MicronautTest; 9 | import jakarta.inject.Inject; 10 | import org.junit.jupiter.api.Assertions; 11 | import org.junit.jupiter.api.Test; 12 | 13 | @MicronautTest 14 | class AppointmentTest { 15 | 16 | @Inject 17 | EmbeddedApplication application; 18 | 19 | @Test 20 | void testItWorks() { 21 | Assertions.assertTrue(application.isRunning()); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/encounter/README.md: -------------------------------------------------------------------------------- 1 | # Encounter Service 2 | 3 | Encounter is a Micronaut-based microservice that exposes APIs for managing consultations between the patient and provider in the Universal Healthcare Organization reference application. 4 | 5 | ## Developer quick start 6 | 7 | Start the application through Java: 8 | ```shell 9 | mvn clean install 10 | MICRONAUT_ENVIRONMENTS=dev java -jar target/encounter-1.0-SNAPSHOT.jar 11 | ``` 12 | 13 | Start the application in a Docker container by passing required variables that are defined in 14 | your application-env.yml file. 15 | 16 | ```shell 17 | DOCKER_BUILDKIT=1 docker build -t encounter:latest . 18 | docker run -p 8080:8080 --env MICRONAUT_ENVIRONMENTS= --mount type=bind,source=,target=/root/.oci encounter:latest 19 | ``` 20 | Access the application at http://localhost:8080 21 | 22 | 23 | **Note**: You can find the jacoco report in target/site/jacoco/index.html. -------------------------------------------------------------------------------- /src/encounter/lombok.config: -------------------------------------------------------------------------------- 1 | lombok.addLombokGeneratedAnnotation = true -------------------------------------------------------------------------------- /src/encounter/spotBugsIgnore.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /src/encounter/src/main/java/com/oracle/refapp/constants/CodeType.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | package com.oracle.refapp.constants; 6 | 7 | import io.micronaut.core.annotation.Introspected; 8 | 9 | @Introspected 10 | public enum CodeType { 11 | CONDITION, 12 | ENCOUNTER, 13 | OBSERVATION, 14 | REASON, 15 | } 16 | -------------------------------------------------------------------------------- /src/encounter/src/main/java/com/oracle/refapp/constants/ErrorCodes.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | package com.oracle.refapp.constants; 6 | 7 | import lombok.AccessLevel; 8 | import lombok.NoArgsConstructor; 9 | 10 | @NoArgsConstructor(access = AccessLevel.PRIVATE) 11 | public class ErrorCodes { 12 | 13 | public static final String ERROR_CODE_NOT_FOUND = "NotFound"; 14 | public static final String ERROR_CODE_INTERNAL_SERVER_ERROR = "InternalServerError"; 15 | } 16 | -------------------------------------------------------------------------------- /src/encounter/src/main/java/com/oracle/refapp/domain/entity/EncounterEntityCollection.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | package com.oracle.refapp.domain.entity; 6 | 7 | import io.micronaut.core.annotation.Introspected; 8 | import java.util.List; 9 | import lombok.AllArgsConstructor; 10 | import lombok.Data; 11 | import lombok.NoArgsConstructor; 12 | 13 | @Data 14 | @Introspected 15 | @NoArgsConstructor 16 | @AllArgsConstructor 17 | public class EncounterEntityCollection { 18 | 19 | private List encounterEntityList; 20 | private Integer nextPage; 21 | } 22 | -------------------------------------------------------------------------------- /src/encounter/src/main/java/com/oracle/refapp/domain/entity/ParameterEntity.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | package com.oracle.refapp.domain.entity; 6 | 7 | import io.micronaut.core.annotation.Introspected; 8 | import lombok.AllArgsConstructor; 9 | import lombok.Data; 10 | import lombok.NoArgsConstructor; 11 | 12 | @Data 13 | @AllArgsConstructor 14 | @NoArgsConstructor 15 | @Introspected 16 | public class ParameterEntity { 17 | 18 | private int value; 19 | private String unit; 20 | } 21 | -------------------------------------------------------------------------------- /src/encounter/src/main/java/com/oracle/refapp/domain/entity/ParticipantEntity.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | package com.oracle.refapp.domain.entity; 6 | 7 | import io.micronaut.core.annotation.Introspected; 8 | import lombok.AllArgsConstructor; 9 | import lombok.Data; 10 | import lombok.NoArgsConstructor; 11 | 12 | @Data 13 | @AllArgsConstructor 14 | @NoArgsConstructor 15 | @Introspected 16 | public class ParticipantEntity { 17 | 18 | private String type; 19 | private String name; 20 | } 21 | -------------------------------------------------------------------------------- /src/encounter/src/main/java/com/oracle/refapp/domain/entity/PeriodEntity.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | package com.oracle.refapp.domain.entity; 6 | 7 | import com.fasterxml.jackson.annotation.JsonProperty; 8 | import io.micronaut.core.annotation.Introspected; 9 | import lombok.AllArgsConstructor; 10 | import lombok.Data; 11 | import lombok.NoArgsConstructor; 12 | 13 | @Data 14 | @AllArgsConstructor 15 | @NoArgsConstructor 16 | @Introspected 17 | public class PeriodEntity { 18 | 19 | @JsonProperty("start_date") 20 | private String startDate; 21 | 22 | @JsonProperty("end_date") 23 | private String endDate; 24 | } 25 | -------------------------------------------------------------------------------- /src/encounter/src/main/java/com/oracle/refapp/domain/repository/CodeRepository.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | package com.oracle.refapp.domain.repository; 6 | 7 | import com.oracle.refapp.constants.CodeType; 8 | import com.oracle.refapp.domain.entity.CodeEntity; 9 | import io.micronaut.data.annotation.Repository; 10 | import io.micronaut.data.jdbc.annotation.JdbcRepository; 11 | import io.micronaut.data.model.Page; 12 | import io.micronaut.data.model.Pageable; 13 | import io.micronaut.data.model.query.builder.sql.Dialect; 14 | import io.micronaut.data.repository.CrudRepository; 15 | 16 | @JdbcRepository(dialect = Dialect.ORACLE) 17 | public interface CodeRepository extends CrudRepository { 18 | Page findByType(CodeType type, Pageable pageable); 19 | } 20 | -------------------------------------------------------------------------------- /src/encounter/src/main/java/com/oracle/refapp/exceptions/DatabaseConnectionException.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | package com.oracle.refapp.exceptions; 6 | 7 | public class DatabaseConnectionException extends Exception { 8 | 9 | public DatabaseConnectionException(String msg) { 10 | super(msg); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/encounter/src/main/java/com/oracle/refapp/exceptions/EncounterCRUDFailedException.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | package com.oracle.refapp.exceptions; 6 | 7 | public class EncounterCRUDFailedException extends Exception { 8 | 9 | public EncounterCRUDFailedException(String message) { 10 | super(message); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/encounter/src/main/java/com/oracle/refapp/exceptions/EncounterServiceException.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | package com.oracle.refapp.exceptions; 6 | 7 | public class EncounterServiceException extends Exception { 8 | 9 | public EncounterServiceException(String message) { 10 | super(message); 11 | } 12 | 13 | public EncounterServiceException(String message, Exception e) { 14 | super(message, e); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/encounter/src/main/java/com/oracle/refapp/helpers/CustomJwksSignatureConfiguration.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | package com.oracle.refapp.helpers; 6 | 7 | import com.nimbusds.jose.jwk.KeyType; 8 | import io.micronaut.context.annotation.ConfigurationProperties; 9 | import jakarta.inject.Singleton; 10 | import lombok.AllArgsConstructor; 11 | import lombok.Data; 12 | import lombok.NoArgsConstructor; 13 | 14 | @Data 15 | @NoArgsConstructor 16 | @AllArgsConstructor 17 | @Singleton 18 | @ConfigurationProperties("micronaut.security.token.jwt.signatures.static-jwks") 19 | public class CustomJwksSignatureConfiguration { 20 | 21 | private KeyType keyType; 22 | private String keys; 23 | } 24 | -------------------------------------------------------------------------------- /src/encounter/src/main/java/com/oracle/refapp/model/FilterSpecification.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | package com.oracle.refapp.model; 6 | 7 | import lombok.Data; 8 | 9 | @Data 10 | public class FilterSpecification { 11 | 12 | private String key; 13 | private T value; 14 | 15 | public FilterSpecification(String key, T val) { 16 | this.key = key; 17 | this.value = val; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/encounter/src/main/java/com/oracle/refapp/search/SearchCriteria.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | package com.oracle.refapp.search; 6 | 7 | import io.micronaut.core.annotation.Introspected; 8 | import lombok.AllArgsConstructor; 9 | import lombok.Data; 10 | import lombok.NoArgsConstructor; 11 | 12 | @Data 13 | @NoArgsConstructor 14 | @AllArgsConstructor 15 | @Introspected 16 | public class SearchCriteria { 17 | 18 | private Integer patientId; 19 | private Integer providerId; 20 | private Integer appointmentId; 21 | private Integer limit; 22 | private Integer page; 23 | } 24 | -------------------------------------------------------------------------------- /src/encounter/src/main/resources/application-test.yml: -------------------------------------------------------------------------------- 1 | micronaut: 2 | application: 3 | name: encounter 4 | security: 5 | enabled: false 6 | object-storage: 7 | oracle-cloud: 8 | default: 9 | namespace: '' 10 | bucket: '' 11 | metrics: 12 | enabled: false 13 | datasources: 14 | default: 15 | url: jdbc:h2:mem:devDb;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE 16 | driverClassName: org.h2.Driver 17 | username: sa 18 | password: '' 19 | 20 | -------------------------------------------------------------------------------- /src/encounter/src/main/resources/db/changesets/0.3-json-encounter.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 10 | 11 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/encounter/src/main/resources/db/changesets/sql/collection.sql: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | DECLARE 6 | collection SODA_COLLECTION_T; 7 | BEGIN 8 | collection := DBMS_SODA.open_collection('ENCOUNTERS'); 9 | IF collection IS NULL THEN 10 | collection := DBMS_SODA.create_collection('ENCOUNTERS'); 11 | END IF; 12 | END; 13 | / 14 | -------------------------------------------------------------------------------- /src/encounter/src/main/resources/db/migrations.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/encounter/src/main/resources/logback.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | 9 | 11 | 12 | 13 | %cyan(%d{HH:mm:ss.SSS}) %gray([%thread]) %highlight(%-5level) %magenta(%logger{36}) - %msg%n 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/feedback/spotBugsIgnore.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /src/feedback/src/main/java/com/oracle/refapp/Feedback.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | package com.oracle.refapp; 6 | 7 | import io.helidon.microprofile.server.Server; 8 | import java.io.IOException; 9 | import org.slf4j.bridge.SLF4JBridgeHandler; 10 | 11 | public class Feedback { 12 | 13 | public static void main(final String[] args) throws IOException { 14 | setupLogging(); 15 | startServer(); 16 | } 17 | 18 | // use slf4j for JUL as well 19 | private static void setupLogging() { 20 | SLF4JBridgeHandler.removeHandlersForRootLogger(); 21 | SLF4JBridgeHandler.install(); 22 | } 23 | 24 | private static Server startServer() { 25 | return Server.create().start(); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/feedback/src/main/java/com/oracle/refapp/exceptions/EncounterContextException.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | package com.oracle.refapp.exceptions; 6 | 7 | import lombok.Getter; 8 | import lombok.Setter; 9 | 10 | @Getter 11 | @Setter 12 | public class EncounterContextException extends RuntimeException { 13 | 14 | private String encounterId; 15 | 16 | public EncounterContextException(String message) { 17 | super(message); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/feedback/src/main/java/com/oracle/refapp/exceptions/NoSuchEncounterFoundException.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | package com.oracle.refapp.exceptions; 6 | 7 | public class NoSuchEncounterFoundException extends EncounterContextException { 8 | 9 | public NoSuchEncounterFoundException(String message) { 10 | super(message); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/feedback/src/main/java/com/oracle/refapp/exceptions/NoSuchPatientFoundException.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | package com.oracle.refapp.exceptions; 6 | 7 | public class NoSuchPatientFoundException extends EncounterContextException { 8 | 9 | public NoSuchPatientFoundException(String message) { 10 | super(message); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/feedback/src/main/java/com/oracle/refapp/exceptions/NoSuchProviderFoundException.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | package com.oracle.refapp.exceptions; 6 | 7 | public class NoSuchProviderFoundException extends EncounterContextException { 8 | 9 | public NoSuchProviderFoundException(String message) { 10 | super(message); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/feedback/src/main/java/com/oracle/refapp/exceptions/ProcessingException.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | package com.oracle.refapp.exceptions; 6 | 7 | public class ProcessingException extends RuntimeException { 8 | 9 | public ProcessingException(String message, Throwable cause) { 10 | super(message, cause); 11 | } 12 | 13 | public ProcessingException(String message) { 14 | super(message); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/feedback/src/main/java/com/oracle/refapp/model/EncounterCloudEvent.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | package com.oracle.refapp.model; 6 | 7 | import com.fasterxml.jackson.annotation.JsonProperty; 8 | import lombok.Getter; 9 | import lombok.NoArgsConstructor; 10 | import lombok.Setter; 11 | 12 | @Getter 13 | @Setter 14 | @NoArgsConstructor 15 | public class EncounterCloudEvent { 16 | 17 | @JsonProperty("data") 18 | private Data data; 19 | 20 | @Getter 21 | @Setter 22 | public static class Data { 23 | 24 | @JsonProperty("resourceName") 25 | private String resourceName; 26 | 27 | public String getEncounterId() { 28 | return this.getResourceName().split("_")[0]; 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/feedback/src/main/lombok.config: -------------------------------------------------------------------------------- 1 | config.stopBubbling=true 2 | lombok.anyconstructor.addconstructorproperties=false 3 | lombok.addLombokGeneratedAnnotation=true 4 | lombok.addSuppressWarnings=false -------------------------------------------------------------------------------- /src/feedback/src/main/resources/META-INF/beans.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 13 | 14 | -------------------------------------------------------------------------------- /src/feedback/src/main/resources/META-INF/microprofile-config-test.properties: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright (c) 2023 Oracle and/or its affiliates. 3 | # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | # 5 | 6 | # OCI Related properties 7 | oci.config.instance-principal.enabled=false 8 | oci.monitoring.enabled=false 9 | oci.monitoring.resourceGroup=helidon_dev 10 | 11 | # APM Tracing Related Properties 12 | tracing.enabled=false 13 | 14 | # Connector config properties are common to all channels 15 | mp.messaging.incoming.from-stream.connector=mock-connector 16 | mp.messaging.outgoing.to-stream.connector=mock-connector -------------------------------------------------------------------------------- /src/feedback/src/main/resources/META-INF/services/io.helidon.tracing.opentracing.spi.OpenTracingProvider: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright (c) 2023 Oracle and/or its affiliates. 3 | # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | # 5 | 6 | com.oracle.refapp.telemetry.HelidonApmTracerProvider -------------------------------------------------------------------------------- /src/feedback/src/main/resources/email-body.mustache: -------------------------------------------------------------------------------- 1 | Hi {{patient.name}}, 2 |

UHO would like to request your feedback for, {{provider.firstName}} {{provider.lastName}}, based on your recent appointment. 3 |

Thanks,
UHO. 4 |



5 |

Note: This is a system generated Email. Please do not reply to this Email.

-------------------------------------------------------------------------------- /src/feedback/src/main/resources/logback.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 9 | 10 | 11 | %cyan(%d{HH:mm:ss.SSS}) %gray([%thread]) %highlight(%-5level) %magenta(%logger{36}) - %msg %X{name}%n 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/feedback/src/test/java/com/oracle/refapp/mock/MockIdcsService.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | package com.oracle.refapp.mock; 6 | 7 | import com.oracle.refapp.service.IdcsService; 8 | import jakarta.annotation.Priority; 9 | import jakarta.enterprise.context.ApplicationScoped; 10 | import jakarta.enterprise.inject.Alternative; 11 | 12 | @Alternative 13 | @Priority(1) 14 | @ApplicationScoped 15 | public class MockIdcsService extends IdcsService { 16 | 17 | public MockIdcsService() { 18 | super(null, null, null, null); 19 | } 20 | 21 | @Override 22 | public String getAuthToken() { 23 | return "mock-token"; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/feedback/src/test/resources/logback-test.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 9 | 10 | 11 | %cyan(%d{HH:mm:ss.SSS}) %gray([%thread]) %highlight(%-5level) %magenta(%logger{36}) - %msg %X{name}%n 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/followup/spotBugsIgnore.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /src/followup/src/main/java/com/oracle/refapp/Followup.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | package com.oracle.refapp; 6 | 7 | import io.helidon.microprofile.server.Server; 8 | import java.io.IOException; 9 | import org.slf4j.bridge.SLF4JBridgeHandler; 10 | 11 | public class Followup { 12 | 13 | public static void main(final String[] args) throws IOException { 14 | setupLogging(); 15 | startServer(); 16 | } 17 | 18 | // use slf4j for JUL as well 19 | private static void setupLogging() { 20 | SLF4JBridgeHandler.removeHandlersForRootLogger(); 21 | SLF4JBridgeHandler.install(); 22 | } 23 | 24 | private static Server startServer() { 25 | return Server.create().start(); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/followup/src/main/java/com/oracle/refapp/exceptions/EncounterContextException.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | package com.oracle.refapp.exceptions; 6 | 7 | import lombok.Getter; 8 | import lombok.Setter; 9 | 10 | @Getter 11 | @Setter 12 | public class EncounterContextException extends RuntimeException { 13 | 14 | private String encounterId; 15 | 16 | public EncounterContextException(String message) { 17 | super(message); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/followup/src/main/java/com/oracle/refapp/exceptions/NoSuchEncounterFoundException.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | package com.oracle.refapp.exceptions; 6 | 7 | public class NoSuchEncounterFoundException extends EncounterContextException { 8 | 9 | public NoSuchEncounterFoundException(String message) { 10 | super(message); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/followup/src/main/java/com/oracle/refapp/exceptions/NoSuchPatientFoundException.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | package com.oracle.refapp.exceptions; 6 | 7 | public class NoSuchPatientFoundException extends EncounterContextException { 8 | 9 | public NoSuchPatientFoundException(String message) { 10 | super(message); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/followup/src/main/java/com/oracle/refapp/exceptions/NoSuchProviderFoundException.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | package com.oracle.refapp.exceptions; 6 | 7 | public class NoSuchProviderFoundException extends EncounterContextException { 8 | 9 | public NoSuchProviderFoundException(String message) { 10 | super(message); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/followup/src/main/java/com/oracle/refapp/exceptions/ProcessingException.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | package com.oracle.refapp.exceptions; 6 | 7 | public class ProcessingException extends RuntimeException { 8 | 9 | public ProcessingException(String message, Throwable cause) { 10 | super(message, cause); 11 | } 12 | 13 | public ProcessingException(String message) { 14 | super(message); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/followup/src/main/java/com/oracle/refapp/model/EncounterCloudEvent.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | package com.oracle.refapp.model; 6 | 7 | import com.fasterxml.jackson.annotation.JsonProperty; 8 | import lombok.Getter; 9 | import lombok.NoArgsConstructor; 10 | import lombok.Setter; 11 | 12 | @Getter 13 | @Setter 14 | @NoArgsConstructor 15 | public class EncounterCloudEvent { 16 | 17 | @JsonProperty("data") 18 | private Data data; 19 | 20 | @Getter 21 | @Setter 22 | public static class Data { 23 | 24 | @JsonProperty("resourceName") 25 | private String resourceName; 26 | 27 | public String getEncounterId() { 28 | return this.getResourceName().split("_")[0]; 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/followup/src/main/lombok.config: -------------------------------------------------------------------------------- 1 | config.stopBubbling=true 2 | lombok.anyconstructor.addconstructorproperties=false 3 | lombok.addLombokGeneratedAnnotation=true 4 | lombok.addSuppressWarnings=false -------------------------------------------------------------------------------- /src/followup/src/main/resources/META-INF/beans.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 13 | 14 | -------------------------------------------------------------------------------- /src/followup/src/main/resources/META-INF/microprofile-config-test.properties: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright (c) 2023 Oracle and/or its affiliates. 3 | # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | # 5 | 6 | # OCI Related properties 7 | oci.config.instance-principal.enabled=false 8 | oci.monitoring.enabled=false 9 | oci.monitoring.resourceGroup=helidon_dev 10 | 11 | # APM Tracing Related Properties 12 | tracing.enabled=false 13 | 14 | # Connector config properties are common to all channels 15 | mp.messaging.incoming.from-stream.connector=mock-connector 16 | mp.messaging.outgoing.to-stream.connector=mock-connector -------------------------------------------------------------------------------- /src/followup/src/main/resources/META-INF/services/io.helidon.tracing.opentracing.spi.OpenTracingProvider: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright (c) 2023 Oracle and/or its affiliates. 3 | # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | # 5 | 6 | com.oracle.refapp.telemetry.HelidonApmTracerProvider -------------------------------------------------------------------------------- /src/followup/src/main/resources/email-body.mustache: -------------------------------------------------------------------------------- 1 | Hi {{patient.name}}, 2 |

Doctor : {{provider.firstName}} {{provider.lastName}} has requested you to schedule a followup appointment. 3 |

Thanks,
UHO. 4 |



5 |

Note: This is a system generated Email. Please do not reply to this Email.

-------------------------------------------------------------------------------- /src/followup/src/main/resources/logback.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 9 | 10 | 11 | %cyan(%d{HH:mm:ss.SSS}) %gray([%thread]) %highlight(%-5level) %magenta(%logger{36}) - %msg %X{name}%n 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/followup/src/test/java/com/oracle/refapp/mock/MockIdcsService.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | package com.oracle.refapp.mock; 6 | 7 | import com.oracle.refapp.service.IdcsService; 8 | import jakarta.annotation.Priority; 9 | import jakarta.enterprise.context.ApplicationScoped; 10 | import jakarta.enterprise.inject.Alternative; 11 | 12 | @Alternative 13 | @Priority(1) 14 | @ApplicationScoped 15 | public class MockIdcsService extends IdcsService { 16 | 17 | public MockIdcsService() { 18 | super(null, null, null, null); 19 | } 20 | 21 | @Override 22 | public String getAuthToken() { 23 | return "mock-token"; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/followup/src/test/resources/logback-test.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 9 | 10 | 11 | %cyan(%d{HH:mm:ss.SSS}) %gray([%thread]) %highlight(%-5level) %magenta(%logger{36}) - %msg %X{name}%n 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/frontend/lombok.config: -------------------------------------------------------------------------------- 1 | lombok.addLombokGeneratedAnnotation = true -------------------------------------------------------------------------------- /src/frontend/spotBugsIgnore.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/frontend/src/main/java/com/oracle/refapp/frontend/auth/CustomJwksSignatureConfiguration.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | package com.oracle.refapp.frontend.auth; 6 | 7 | import com.nimbusds.jose.jwk.KeyType; 8 | import io.micronaut.context.annotation.ConfigurationProperties; 9 | import jakarta.inject.Singleton; 10 | import lombok.AllArgsConstructor; 11 | import lombok.Data; 12 | import lombok.NoArgsConstructor; 13 | 14 | @Data 15 | @NoArgsConstructor 16 | @AllArgsConstructor 17 | @Singleton 18 | @ConfigurationProperties("micronaut.security.token.jwt.signatures.static-jwks") 19 | public class CustomJwksSignatureConfiguration { 20 | 21 | private KeyType keyType; 22 | private String keys; 23 | } 24 | -------------------------------------------------------------------------------- /src/frontend/src/main/java/com/oracle/refapp/frontend/models/Role.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | package com.oracle.refapp.frontend.models; 6 | 7 | public enum Role { 8 | PATIENT, 9 | PROVIDER, 10 | } 11 | -------------------------------------------------------------------------------- /src/frontend/src/main/resources/logback.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | 9 | 11 | 12 | %cyan(%d{HH:mm:ss.SSS}) %gray([%thread]) %highlight(%-5level) %magenta(%logger{36}) - %msg%n 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /src/frontend/src/test/java/com/oracle/refapp/frontend/FrontendTest.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | package com.oracle.refapp.frontend; 6 | 7 | import io.micronaut.runtime.EmbeddedApplication; 8 | import io.micronaut.test.extensions.junit5.annotation.MicronautTest; 9 | import jakarta.inject.Inject; 10 | import org.junit.jupiter.api.Assertions; 11 | import org.junit.jupiter.api.Test; 12 | 13 | @MicronautTest 14 | class FrontendTest { 15 | 16 | @Inject 17 | EmbeddedApplication application; 18 | 19 | @Test 20 | void testItWorks() { 21 | Assertions.assertTrue(application.isRunning()); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/frontend/src/test/java/com/oracle/refapp/frontend/model/Provider.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | package com.oracle.refapp.frontend.model; 6 | 7 | import io.micronaut.core.annotation.Introspected; 8 | import io.micronaut.serde.annotation.Serdeable; 9 | import lombok.Data; 10 | import lombok.NoArgsConstructor; 11 | 12 | @Data 13 | @NoArgsConstructor 14 | @Introspected 15 | @Serdeable 16 | public class Provider { 17 | 18 | private Integer id; 19 | private String name; 20 | private String phone; 21 | private String email; 22 | private String gender; 23 | private Integer zip; 24 | private String city; 25 | private String country; 26 | private String speciality; 27 | } 28 | -------------------------------------------------------------------------------- /src/frontend/web/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | coverage/ 6 | 7 | # Compiled binary addons (http://nodejs.org/api/addons.html) 8 | build/Release 9 | build/ 10 | codegen/ 11 | .cache-loader/ 12 | 13 | # Dependency directories 14 | node_modules 15 | jspm_packages 16 | 17 | # Optional npm cache directory 18 | .npm 19 | 20 | # VS Code files 21 | .vscode/ 22 | 23 | # Packaging 24 | dist/ 25 | 26 | # environment variables for the local development machine 27 | DONOTCHECKIN.env -------------------------------------------------------------------------------- /src/frontend/web/.prettierignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | build 3 | dist 4 | .linaria-cache -------------------------------------------------------------------------------- /src/frontend/web/lerna.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "node_modules/lerna/schemas/lerna-schema.json", 3 | "useWorkspaces": true, 4 | "version": "0.0.0", 5 | "npmClient": "yarn" 6 | } 7 | -------------------------------------------------------------------------------- /src/frontend/web/oracle.license: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ -------------------------------------------------------------------------------- /src/frontend/web/packages/api/appointment-api-client/openapitools.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "./node_modules/@openapitools/openapi-generator-cli/config.schema.json", 3 | "spaces": 2, 4 | "generator-cli": { 5 | "version": "5.3.1", 6 | "storageDir": "./build/openapi-generator" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/frontend/web/packages/api/appointment-api-client/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@uho/appointment-api-client", 3 | "version": "0.0.0", 4 | "private": true, 5 | "main": "./dist/api-client", 6 | "scripts": { 7 | "build": "openapi-generator-cli generate -i ../../../../target/specs/Appointment.yml -g typescript-fetch -o ./dist/api-client --additional-properties=typescriptThreePlus=true,withInterfaces=true,useSingleRequestParameter=true" 8 | }, 9 | "workspaces": { 10 | "nohoist": [ 11 | "**" 12 | ] 13 | }, 14 | "devDependencies": { 15 | "@openapitools/openapi-generator-cli": "2.4.24" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/frontend/web/packages/api/encounter-api-client/openapitools.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "./node_modules/@openapitools/openapi-generator-cli/config.schema.json", 3 | "spaces": 2, 4 | "generator-cli": { 5 | "version": "5.3.1", 6 | "storageDir": "./build/openapi-generator" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/frontend/web/packages/api/encounter-api-client/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@uho/encounter-api-client", 3 | "version": "0.0.0", 4 | "private": true, 5 | "main": "./dist/api-client", 6 | "scripts": { 7 | "build": "openapi-generator-cli generate -i ../../../../target/specs/Encounter.yml -g typescript-fetch -o ./dist/api-client --additional-properties=typescriptThreePlus=true,withInterfaces=true,useSingleRequestParameter=true" 8 | }, 9 | "workspaces": { 10 | "nohoist": [ 11 | "**" 12 | ] 13 | }, 14 | "devDependencies": { 15 | "@openapitools/openapi-generator-cli": "2.4.24" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/frontend/web/packages/api/patient-api-client/openapitools.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "./node_modules/@openapitools/openapi-generator-cli/config.schema.json", 3 | "spaces": 2, 4 | "generator-cli": { 5 | "version": "5.3.1", 6 | "storageDir": "./build/openapi-generator" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/frontend/web/packages/api/patient-api-client/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@uho/patient-api-client", 3 | "version": "0.0.0", 4 | "private": true, 5 | "main": "./dist/api-client", 6 | "scripts": { 7 | "build": "openapi-generator-cli generate -i ../../../../target/specs/Patient.yml -g typescript-fetch -o ./dist/api-client --additional-properties=typescriptThreePlus=true,withInterfaces=true,useSingleRequestParameter=true" 8 | }, 9 | "workspaces": { 10 | "nohoist": [ 11 | "**" 12 | ] 13 | }, 14 | "devDependencies": { 15 | "@openapitools/openapi-generator-cli": "2.4.24" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/frontend/web/packages/api/provider-api-client/openapitools.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "./node_modules/@openapitools/openapi-generator-cli/config.schema.json", 3 | "spaces": 2, 4 | "generator-cli": { 5 | "version": "5.3.1", 6 | "storageDir": "./build/openapi-generator" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/frontend/web/packages/api/provider-api-client/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@uho/provider-api-client", 3 | "version": "0.0.0", 4 | "private": true, 5 | "main": "./dist/api-client", 6 | "scripts": { 7 | "build": "openapi-generator-cli generate -i ../../../../target/specs/Provider.yml -g typescript-fetch -o ./dist/api-client --additional-properties=typescriptThreePlus=true,withInterfaces=true,useSingleRequestParameter=true" 8 | }, 9 | "workspaces": { 10 | "nohoist": [ 11 | "**" 12 | ] 13 | }, 14 | "devDependencies": { 15 | "@openapitools/openapi-generator-cli": "2.4.24" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/frontend/web/packages/configs/babel/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | module.exports = { 6 | presets: [ 7 | '@babel/preset-env', 8 | [ 9 | '@babel/preset-typescript', 10 | { 11 | jsxPragma: 'h' 12 | } 13 | ] 14 | ], 15 | plugins: [ 16 | 'babel-plugin-transform-amd-to-commonjs', 17 | [ 18 | '@babel/plugin-transform-react-jsx', 19 | { 20 | runtime: 'automatic', 21 | importSource: 'preact' 22 | } 23 | ] 24 | ] 25 | }; 26 | -------------------------------------------------------------------------------- /src/frontend/web/packages/configs/babel/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@uho/babel-config", 3 | "version": "0.0.0", 4 | "license": "UPL-1.0", 5 | "scripts": {}, 6 | "dependencies": { 7 | "@babel/preset-env": "7.21.4", 8 | "@babel/preset-react": "7.18.6", 9 | "@babel/preset-typescript": "7.21.4", 10 | "babel-plugin-transform-amd-to-commonjs": "1.6.0" 11 | }, 12 | "main": "index.js" 13 | } 14 | -------------------------------------------------------------------------------- /src/frontend/web/packages/configs/jest/babel.config.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | /* eslint-disable @typescript-eslint/no-var-requires */ 6 | const { default: babelJest } = require('babel-jest'); 7 | 8 | module.exports = babelJest.createTransformer({ 9 | extends: '@uho/babel-config' 10 | }); 11 | -------------------------------------------------------------------------------- /src/frontend/web/packages/configs/jest/jest-preset.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | /* eslint-disable @typescript-eslint/no-var-requires */ 6 | const path = require('path'); 7 | const jestPreset = { ...require('@oracle/oraclejet-jest-preset') }; 8 | jestPreset.setupFilesAfterEnv = [path.resolve(__dirname, 'setupTests.ts')]; 9 | jestPreset.transform['^.+\\.(mjs|js|jsx|ts|tsx)$'] = path.resolve(__dirname, 'babel.config.js'); 10 | jestPreset.moduleNameMapper['oj-c/(.*)'] = '@oracle/oraclejet-core-pack/oj-c/$1'; 11 | 12 | const ignoredPatterns = ['@oracle/oraclejet', '@oracle/oraclejet-core-pack']; 13 | jestPreset.transformIgnorePatterns = [ 14 | `/node_modules/(?!(${ignoredPatterns.join('|')})/)`, 15 | '^.+\\.(css|sass|scss|less)$' 16 | ]; 17 | 18 | module.exports = { 19 | ...jestPreset 20 | }; 21 | -------------------------------------------------------------------------------- /src/frontend/web/packages/configs/jest/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@uho/jest-preset", 3 | "version": "0.0.0", 4 | "license": "UPL-1.0", 5 | "private": "true", 6 | "dependencies": { 7 | "@oracle/oraclejet-jest-preset": "14.1.0", 8 | "@uho/babel-config": "*", 9 | "@testing-library/jest-dom": "5.16.5", 10 | "@testing-library/preact": "3.2.3", 11 | "@testing-library/user-event": "14.4.3", 12 | "@types/jest": "27.5.1", 13 | "babel-jest": "27.5.1", 14 | "jest": "27.5.1", 15 | "ts-jest": "27.1.5" 16 | }, 17 | "peerDependencies": { 18 | "preact": "10.11.3", 19 | "@oracle/oraclejet": "14.1.0", 20 | "@oracle/oraclejet-core-pack": "14.1.0" 21 | }, 22 | "workspaces": { 23 | "nohoist": [ 24 | "**" 25 | ] 26 | }, 27 | "main": "jest-preset.js", 28 | "files": [ 29 | "jest-preset.js", 30 | "babel.config.js", 31 | "setupTests.ts" 32 | ] 33 | } 34 | -------------------------------------------------------------------------------- /src/frontend/web/packages/configs/jest/setupTests.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | import '@testing-library/jest-dom'; 6 | -------------------------------------------------------------------------------- /src/frontend/web/packages/configs/tsconfig/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@uho/ts-config", 3 | "version": "0.0.0", 4 | "license": "UPL-1.0", 5 | "devDependencies": { 6 | "@oracle/oraclejet": "14.1.0", 7 | "@oracle/oraclejet-preact": "14.1.0", 8 | "@oracle/oraclejet-core-pack": "14.1.0" 9 | }, 10 | "dependencies": { 11 | "typescript": "5.0.4" 12 | }, 13 | "main": "tsconfig.json", 14 | "files": [ 15 | "tsconfig.json", 16 | "global.d.ts" 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /src/frontend/web/packages/uho-web/jest.config.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | import { compilerOptions } from './tsconfig.json'; 6 | import { pathsToModuleNameMapper } from 'ts-jest'; 7 | 8 | const paths: Partial = { ...compilerOptions.paths }; 9 | delete paths['oj-c/*']; 10 | delete paths['ojs/*']; 11 | delete paths['react-dom']; 12 | delete paths['react']; 13 | 14 | const jestConfig = { 15 | roots: [''], 16 | preset: '@uho/jest-preset', 17 | setupFilesAfterEnv: ['/test/setup.ts'], 18 | moduleNameMapper: { 19 | './apiClients': '/src/api/mockApiClients', 20 | ...pathsToModuleNameMapper(paths)! 21 | }, 22 | modulePaths: [compilerOptions.baseUrl] 23 | }; 24 | 25 | export default jestConfig; 26 | -------------------------------------------------------------------------------- /src/frontend/web/packages/uho-web/src/api/apiClients.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | export { AppointmentApi } from '@uho/appointment-api-client'; 6 | export { EncounterApi } from '@uho/encounter-api-client'; 7 | export { FrontendApi } from './frontendApi'; 8 | export { PatientApi } from '@uho/patient-api-client/dist/api-client'; 9 | export { ProviderApi } from '@uho/provider-api-client/dist/api-client'; 10 | -------------------------------------------------------------------------------- /src/frontend/web/packages/uho-web/src/api/mockApiClients.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | import { MockAppointmentApi as AppointmentApi } from './mocks/appointmentApi'; 6 | import { MockEncounterApi as EncounterApi } from './mocks/encounterApi'; 7 | import { MockFrontendApi as FrontendApi } from './mocks/frontendApi'; 8 | import { MockPatientApi as PatientApi } from './mocks/patientApi'; 9 | import { MockProviderApi as ProviderApi } from './mocks/providerApi'; 10 | 11 | export { AppointmentApi, EncounterApi, FrontendApi, PatientApi, ProviderApi }; 12 | -------------------------------------------------------------------------------- /src/frontend/web/packages/uho-web/src/api/mocks/utils.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | 6 | type Options = { 7 | delay?: number; 8 | error?: Error; 9 | }; 10 | const defaultDelay = 0; 11 | 12 | export function mock(data: T, options?: Options): Promise { 13 | return new Promise((resolve, reject) => { 14 | setTimeout(() => { 15 | options?.error ? reject(options.error) : resolve(data); 16 | }, options?.delay || defaultDelay); 17 | }); 18 | } 19 | export function reject(options?: Options): Promise { 20 | return new Promise((_, reject) => { 21 | setTimeout(() => { 22 | reject(options?.error); 23 | }, options?.delay || defaultDelay); 24 | }); 25 | } 26 | 27 | export function mockDate() { 28 | return new Date(1654733487565); 29 | } 30 | -------------------------------------------------------------------------------- /src/frontend/web/packages/uho-web/src/app/404/index.spec.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | import { NotFound } from '.'; 6 | import { h } from 'preact'; 7 | import { snapshot } from '../../../test/jetHelper'; 8 | 9 | jest.mock('react-router-dom', () => ({ 10 | useNavigate: jest.fn() 11 | })); 12 | 13 | snapshot('404', ); 14 | -------------------------------------------------------------------------------- /src/frontend/web/packages/uho-web/src/app/404/styles.scss: -------------------------------------------------------------------------------- 1 | .not-found-wrapper { 2 | display: table; 3 | width: 100%; 4 | height: 100vh; 5 | text-align: center; 6 | background: var(--page-background-neutral-30); 7 | 8 | .animation { 9 | font-size: 80px; 10 | display: inline-block; 11 | padding-right: 25px; 12 | animation: animation 0.6s alternate infinite; 13 | 14 | @keyframes animation { 15 | from { 16 | box-shadow: inset -8px 0 black; 17 | } 18 | to { 19 | box-shadow: inset -8px 0 transparent; 20 | } 21 | } 22 | } 23 | 24 | .content { 25 | display: table-cell; 26 | vertical-align: middle; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/frontend/web/packages/uho-web/src/app/content/patient/appointments/__snapshots__/index.spec.tsx.snap: -------------------------------------------------------------------------------- 1 | // Jest Snapshot v1, https://goo.gl/fbAQLP 2 | 3 | exports[`Snapshot tests for Patient Snapshot: Component - Patient 1`] = ` 4 | 5 |
8 |
11 | 12 | `; 13 | -------------------------------------------------------------------------------- /src/frontend/web/packages/uho-web/src/app/content/patient/providers/details/foldouts/organization.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | import { Provider } from '@uho/provider-api-client/dist/api-client'; 6 | import { h } from 'preact'; 7 | import { useI18n } from 'hooks/useI18n'; 8 | import { Foldout } from 'components/layouts/foldout/card'; 9 | 10 | type Props = Readonly<{ 11 | loading: boolean; 12 | provider?: Provider; 13 | }>; 14 | 15 | export function Organization({ loading, provider }: Props) { 16 | const i18n = useI18n().patient.provider.organization; 17 | return Hello; 18 | } 19 | -------------------------------------------------------------------------------- /src/frontend/web/packages/uho-web/src/app/content/patient/styles.scss: -------------------------------------------------------------------------------- 1 | .patient-background { 2 | background: var(--page-background-neutral-30); 3 | background-image: var(--background-image-left), var(--background-image-right); 4 | background-position: left bottom, right bottom; 5 | background-repeat: no-repeat; 6 | 7 | .patient-landing { 8 | height: 100vh; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/frontend/web/packages/uho-web/src/app/content/provider/appointments/styles.scss: -------------------------------------------------------------------------------- 1 | .appointments-panel { 2 | height: 100%; 3 | } 4 | -------------------------------------------------------------------------------- /src/frontend/web/packages/uho-web/src/app/content/provider/encounters/styles.scss: -------------------------------------------------------------------------------- 1 | .encounters-panel { 2 | height: 100%; 3 | } 4 | -------------------------------------------------------------------------------- /src/frontend/web/packages/uho-web/src/app/content/provider/info-panel/index.spec.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | import { InfoPanel } from '.'; 6 | import { h } from 'preact'; 7 | import { snapshot } from '../../../../../test/jetHelper'; 8 | import { MemoryRouter } from 'react-router-dom'; 9 | import { AuthContext } from '../../../../utils/authProvider'; 10 | import { User } from 'api/frontendApi'; 11 | 12 | const user: User = { 13 | role: 'PROVIDER', 14 | username: 'jsmith' 15 | }; 16 | 17 | snapshot( 18 | 'Provider: InfoPanel', 19 | Promise.resolve(user), signout: () => console.log('signout') }}> 20 | 21 | 22 | 23 | 24 | ); 25 | -------------------------------------------------------------------------------- /src/frontend/web/packages/uho-web/src/app/content/provider/info-panel/index.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | import { h } from 'preact'; 6 | import { Provider } from '@uho/provider-api-client/dist/api-client'; 7 | import { ProviderProfile } from 'components/provider-profile'; 8 | 9 | type Props = Readonly<{ 10 | provider?: Provider; 11 | }>; 12 | 13 | export function InfoPanel({ provider }: Props) { 14 | return ( 15 |
16 |
17 | 18 |
19 |
20 | ); 21 | } 22 | -------------------------------------------------------------------------------- /src/frontend/web/packages/uho-web/src/app/content/provider/styles.scss: -------------------------------------------------------------------------------- 1 | .provider-background { 2 | background: var(--background-image-left) left bottom / auto no-repeat, 3 | var(--background-image-right) right bottom / auto no-repeat, 4 | linear-gradient(to bottom, var(--header-background-neutral-30), var(--header-background-neutral-30)) top / auto 5 | 236px no-repeat, 6 | linear-gradient(to top, var(--page-background-neutral-30), var(--page-background-neutral-30)) top / auto no-repeat; 7 | 8 | .provider-landing { 9 | height: 100vh; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/frontend/web/packages/uho-web/src/app/index.spec.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | import { App } from '.'; 6 | import { h } from 'preact'; 7 | import { snapshot } from '../../test/jetHelper'; 8 | import { MemoryRouter } from 'react-router-dom'; 9 | 10 | snapshot( 11 | 'App', 12 | 13 | 14 | 15 | ); 16 | -------------------------------------------------------------------------------- /src/frontend/web/packages/uho-web/src/app/landing/card/index.spec.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | import { RenderCard } from '.'; 6 | import { h } from 'preact'; 7 | import { snapshot } from '../../../../test/jetHelper'; 8 | 9 | snapshot( 10 | 'RenderCard', 11 | 12 | ); 13 | -------------------------------------------------------------------------------- /src/frontend/web/packages/uho-web/src/app/landing/card/styles.scss: -------------------------------------------------------------------------------- 1 | .action-card { 2 | background-color: var(--surface-neutral-10); 3 | 4 | .card-title { 5 | text-align: center; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/frontend/web/packages/uho-web/src/app/landing/index.spec.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | import { Landing } from '.'; 6 | import { h } from 'preact'; 7 | import { AuthProvider } from '../../utils/authProvider'; 8 | import { snapshot } from '../../../test/jetHelper'; 9 | 10 | jest.mock('react-router', () => ({ 11 | useHistory: () => ({ 12 | push: jest.fn() 13 | }) 14 | })); 15 | 16 | snapshot( 17 | 'Landing', 18 | 19 | 20 | 21 | ); 22 | -------------------------------------------------------------------------------- /src/frontend/web/packages/uho-web/src/app/landing/styles.scss: -------------------------------------------------------------------------------- 1 | .landing-page { 2 | background: var(--background-main); 3 | background-size: auto; 4 | width: 100%; 5 | height: 100vh; 6 | } 7 | -------------------------------------------------------------------------------- /src/frontend/web/packages/uho-web/src/components/appointments/appointment-details/index.spec.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | import { AppointmentDetails } from '.'; 6 | import { h } from 'preact'; 7 | import { queryClient, snapshot } from '../../../../test/jetHelper'; 8 | import { QueryClientProvider } from '@tanstack/react-query'; 9 | 10 | snapshot( 11 | 'AppointmentDetails', 12 | 13 | 14 | 15 | ); 16 | -------------------------------------------------------------------------------- /src/frontend/web/packages/uho-web/src/components/appointments/appointment-details/styles.scss: -------------------------------------------------------------------------------- 1 | .appointment-container { 2 | height: 100%; 3 | 4 | .appointment-body { 5 | white-space: pre-wrap; 6 | height: calc(100% - 70px); 7 | overflow-y: hidden; 8 | } 9 | 10 | .encounter-list { 11 | height: 100%; 12 | overflow-y: auto; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/frontend/web/packages/uho-web/src/components/appointments/appointment-list/index.spec.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | import { AppointmentList } from '.'; 6 | import { h } from 'preact'; 7 | import { queryClient, snapshot } from '../../../../test/jetHelper'; 8 | import { QueryClientProvider } from '@tanstack/react-query'; 9 | 10 | snapshot( 11 | 'AppointmentList', 12 | 13 | 14 | 15 | ); 16 | -------------------------------------------------------------------------------- /src/frontend/web/packages/uho-web/src/components/appointments/appointment-picker/date-picker/styles.scss: -------------------------------------------------------------------------------- 1 | .date-picker { 2 | .booked { 3 | /* background-color: red; */ 4 | } 5 | .available { 6 | a.oj-enabled { 7 | font-weight: 650; 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/frontend/web/packages/uho-web/src/components/banner/index.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2023 Oracle and/or its affiliates. 3 | * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracl.com/licenses/upl/ 4 | */ 5 | import { h } from 'preact'; 6 | import './styles.scss'; 7 | 8 | export function Banner() { 9 | return