├── .gitignore ├── LICENSE ├── README.md ├── reactive-jhipster ├── .idea │ ├── .gitignore │ ├── misc.xml │ ├── modules.xml │ ├── reactive-jhipster.iml │ └── vcs.xml ├── LICENSE ├── README.md ├── blog │ ├── .devcontainer │ │ ├── Dockerfile │ │ └── devcontainer.json │ ├── .editorconfig │ ├── .gitattributes │ ├── .gitignore │ ├── .jhipster │ │ ├── Blog.json │ │ ├── Post.json │ │ └── Tag.json │ ├── .prettierignore │ ├── .prettierrc │ ├── .yo-rc.json │ ├── README.md │ ├── build.gradle │ ├── checkstyle.xml │ ├── gradle.properties │ ├── gradle │ │ ├── docker.gradle │ │ ├── profile_dev.gradle │ │ ├── profile_prod.gradle │ │ ├── sonar.gradle │ │ ├── war.gradle │ │ ├── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ │ └── zipkin.gradle │ ├── gradlew │ ├── gradlew.bat │ ├── package.json │ ├── settings.gradle │ ├── sonar-project.properties │ └── src │ │ ├── main │ │ ├── docker │ │ │ ├── app.yml │ │ │ ├── central-server-config │ │ │ │ ├── README.md │ │ │ │ ├── docker-config │ │ │ │ │ └── application.yml │ │ │ │ └── localhost-config │ │ │ │ │ └── application.yml │ │ │ ├── grafana │ │ │ │ └── provisioning │ │ │ │ │ ├── dashboards │ │ │ │ │ ├── JVM.json │ │ │ │ │ └── dashboard.yml │ │ │ │ │ └── datasources │ │ │ │ │ └── datasource.yml │ │ │ ├── jhipster-control-center.yml │ │ │ ├── jhipster-registry.yml │ │ │ ├── jib │ │ │ │ └── entrypoint.sh │ │ │ ├── keycloak.yml │ │ │ ├── monitoring.yml │ │ │ ├── neo4j.yml │ │ │ ├── prometheus │ │ │ │ └── prometheus.yml │ │ │ ├── realm-config │ │ │ │ └── jhipster-realm.json │ │ │ ├── services.yml │ │ │ ├── sonar.yml │ │ │ └── zipkin.yml │ │ ├── java │ │ │ └── com │ │ │ │ └── okta │ │ │ │ └── developer │ │ │ │ └── blog │ │ │ │ ├── BlogApp.java │ │ │ │ ├── GeneratedByJHipster.java │ │ │ │ ├── aop │ │ │ │ └── logging │ │ │ │ │ └── LoggingAspect.java │ │ │ │ ├── config │ │ │ │ ├── ApplicationProperties.java │ │ │ │ ├── AsyncConfiguration.java │ │ │ │ ├── CRLFLogConverter.java │ │ │ │ ├── Constants.java │ │ │ │ ├── DatabaseConfiguration.java │ │ │ │ ├── DateTimeFormatConfiguration.java │ │ │ │ ├── EurekaWorkaroundConfiguration.java │ │ │ │ ├── JacksonConfiguration.java │ │ │ │ ├── LocaleConfiguration.java │ │ │ │ ├── LoggingAspectConfiguration.java │ │ │ │ ├── LoggingConfiguration.java │ │ │ │ ├── ReactorConfiguration.java │ │ │ │ ├── SecurityConfiguration.java │ │ │ │ ├── WebConfigurer.java │ │ │ │ ├── neo4j │ │ │ │ │ ├── Neo4jMigrations.java │ │ │ │ │ └── package-info.java │ │ │ │ └── package-info.java │ │ │ │ ├── domain │ │ │ │ ├── AbstractAuditingEntity.java │ │ │ │ ├── Authority.java │ │ │ │ ├── Blog.java │ │ │ │ ├── Post.java │ │ │ │ ├── Tag.java │ │ │ │ ├── User.java │ │ │ │ └── package-info.java │ │ │ │ ├── repository │ │ │ │ ├── AuthorityRepository.java │ │ │ │ ├── BlogRepository.java │ │ │ │ ├── PostRepository.java │ │ │ │ ├── TagRepository.java │ │ │ │ ├── UserRepository.java │ │ │ │ └── package-info.java │ │ │ │ ├── security │ │ │ │ ├── AuthoritiesConstants.java │ │ │ │ ├── SecurityUtils.java │ │ │ │ ├── oauth2 │ │ │ │ │ ├── AudienceValidator.java │ │ │ │ │ ├── JwtGrantedAuthorityConverter.java │ │ │ │ │ └── OAuthIdpTokenResponseDTO.java │ │ │ │ └── package-info.java │ │ │ │ ├── service │ │ │ │ ├── UserService.java │ │ │ │ ├── dto │ │ │ │ │ ├── AdminUserDTO.java │ │ │ │ │ ├── UserDTO.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── mapper │ │ │ │ │ ├── UserMapper.java │ │ │ │ │ └── package-info.java │ │ │ │ └── package-info.java │ │ │ │ └── web │ │ │ │ └── rest │ │ │ │ ├── BlogResource.java │ │ │ │ ├── PostResource.java │ │ │ │ ├── PublicUserResource.java │ │ │ │ ├── TagResource.java │ │ │ │ ├── errors │ │ │ │ ├── BadRequestAlertException.java │ │ │ │ ├── ErrorConstants.java │ │ │ │ ├── ExceptionTranslator.java │ │ │ │ ├── FieldErrorVM.java │ │ │ │ └── package-info.java │ │ │ │ ├── package-info.java │ │ │ │ └── vm │ │ │ │ ├── ManagedUserVM.java │ │ │ │ └── package-info.java │ │ └── resources │ │ │ ├── banner.txt │ │ │ ├── config │ │ │ ├── application-dev.yml │ │ │ ├── application-prod.yml │ │ │ ├── application-tls.yml │ │ │ ├── application.yml │ │ │ ├── bootstrap-prod.yml │ │ │ ├── bootstrap.yml │ │ │ ├── neo4j │ │ │ │ └── migrations │ │ │ │ │ ├── user__admin.json │ │ │ │ │ └── user__user.json │ │ │ └── tls │ │ │ │ └── keystore.p12 │ │ │ ├── i18n │ │ │ ├── messages.properties │ │ │ └── messages_en.properties │ │ │ ├── logback-spring.xml │ │ │ ├── static │ │ │ └── index.html │ │ │ └── templates │ │ │ └── error.html │ │ └── test │ │ ├── java │ │ └── com │ │ │ └── okta │ │ │ └── developer │ │ │ └── blog │ │ │ ├── IntegrationTest.java │ │ │ ├── TechnicalStructureTest.java │ │ │ ├── config │ │ │ ├── AsyncSyncConfiguration.java │ │ │ ├── EmbeddedNeo4j.java │ │ │ ├── JHipsterBlockHoundIntegration.java │ │ │ ├── Neo4jTestContainer.java │ │ │ ├── SpringBootTestClassOrderer.java │ │ │ ├── TestContainersSpringContextCustomizerFactory.java │ │ │ └── TestSecurityConfiguration.java │ │ │ ├── domain │ │ │ ├── BlogTest.java │ │ │ ├── PostTest.java │ │ │ └── TagTest.java │ │ │ ├── security │ │ │ ├── SecurityUtilsUnitTest.java │ │ │ └── oauth2 │ │ │ │ └── AudienceValidatorTest.java │ │ │ ├── service │ │ │ ├── UserServiceIT.java │ │ │ └── mapper │ │ │ │ └── UserMapperTest.java │ │ │ └── web │ │ │ └── rest │ │ │ ├── BlogResourceIT.java │ │ │ ├── PostResourceIT.java │ │ │ ├── PublicUserResourceIT.java │ │ │ ├── TagResourceIT.java │ │ │ ├── TestUtil.java │ │ │ ├── UserResourceIT.java │ │ │ ├── WithUnauthenticatedMockUser.java │ │ │ └── errors │ │ │ ├── ExceptionTranslatorIT.java │ │ │ └── ExceptionTranslatorTestController.java │ │ └── resources │ │ ├── META-INF │ │ ├── services │ │ │ └── reactor.blockhound.integration.BlockHoundIntegration │ │ └── spring.factories │ │ ├── config │ │ ├── application.yml │ │ └── bootstrap.yml │ │ ├── junit-platform.properties │ │ └── logback.xml ├── demo.adoc ├── docker-compose │ ├── .yo-rc.json │ ├── README-DOCKER-COMPOSE.md │ ├── central-server-config │ │ └── application.yml │ ├── docker-compose.yml │ └── realm-config │ │ └── jhipster-realm.json ├── gateway │ ├── .devcontainer │ │ ├── Dockerfile │ │ └── devcontainer.json │ ├── .editorconfig │ ├── .eslintignore │ ├── .eslintrc.js │ ├── .gitattributes │ ├── .gitignore │ ├── .jhipster │ │ ├── Blog.json │ │ ├── Post.json │ │ ├── Product.json │ │ └── Tag.json │ ├── .postcssrc.js │ ├── .prettierignore │ ├── .prettierrc │ ├── .yo-rc.json │ ├── README.md │ ├── build.gradle │ ├── checkstyle.xml │ ├── cypress-audits.config.ts │ ├── cypress.config.ts │ ├── gradle.properties │ ├── gradle │ │ ├── docker.gradle │ │ ├── profile_dev.gradle │ │ ├── profile_prod.gradle │ │ ├── sonar.gradle │ │ ├── war.gradle │ │ ├── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ │ └── zipkin.gradle │ ├── gradlew │ ├── gradlew.bat │ ├── npmw │ ├── npmw.cmd │ ├── package.json │ ├── settings.gradle │ ├── sonar-project.properties │ ├── src │ │ ├── main │ │ │ ├── docker │ │ │ │ ├── app.yml │ │ │ │ ├── central-server-config │ │ │ │ │ ├── README.md │ │ │ │ │ ├── docker-config │ │ │ │ │ │ └── application.yml │ │ │ │ │ └── localhost-config │ │ │ │ │ │ └── application.yml │ │ │ │ ├── grafana │ │ │ │ │ └── provisioning │ │ │ │ │ │ ├── dashboards │ │ │ │ │ │ ├── JVM.json │ │ │ │ │ │ └── dashboard.yml │ │ │ │ │ │ └── datasources │ │ │ │ │ │ └── datasource.yml │ │ │ │ ├── jhipster-control-center.yml │ │ │ │ ├── jhipster-registry.yml │ │ │ │ ├── jib │ │ │ │ │ └── entrypoint.sh │ │ │ │ ├── keycloak.yml │ │ │ │ ├── monitoring.yml │ │ │ │ ├── postgresql.yml │ │ │ │ ├── prometheus │ │ │ │ │ └── prometheus.yml │ │ │ │ ├── realm-config │ │ │ │ │ └── jhipster-realm.json │ │ │ │ ├── services.yml │ │ │ │ ├── sonar.yml │ │ │ │ └── zipkin.yml │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── okta │ │ │ │ │ └── developer │ │ │ │ │ └── gateway │ │ │ │ │ ├── GatewayApp.java │ │ │ │ │ ├── GeneratedByJHipster.java │ │ │ │ │ ├── aop │ │ │ │ │ └── logging │ │ │ │ │ │ └── LoggingAspect.java │ │ │ │ │ ├── config │ │ │ │ │ ├── ApplicationProperties.java │ │ │ │ │ ├── AsyncConfiguration.java │ │ │ │ │ ├── CRLFLogConverter.java │ │ │ │ │ ├── Constants.java │ │ │ │ │ ├── DatabaseConfiguration.java │ │ │ │ │ ├── DateTimeFormatConfiguration.java │ │ │ │ │ ├── EurekaWorkaroundConfiguration.java │ │ │ │ │ ├── JacksonConfiguration.java │ │ │ │ │ ├── LiquibaseConfiguration.java │ │ │ │ │ ├── LocaleConfiguration.java │ │ │ │ │ ├── LoggingAspectConfiguration.java │ │ │ │ │ ├── LoggingConfiguration.java │ │ │ │ │ ├── ReactorConfiguration.java │ │ │ │ │ ├── SecurityConfiguration.java │ │ │ │ │ ├── WebConfigurer.java │ │ │ │ │ └── package-info.java │ │ │ │ │ ├── domain │ │ │ │ │ ├── AbstractAuditingEntity.java │ │ │ │ │ ├── Authority.java │ │ │ │ │ ├── User.java │ │ │ │ │ └── package-info.java │ │ │ │ │ ├── repository │ │ │ │ │ ├── AuthorityRepository.java │ │ │ │ │ ├── EntityManager.java │ │ │ │ │ ├── UserRepository.java │ │ │ │ │ ├── UserSqlHelper.java │ │ │ │ │ ├── package-info.java │ │ │ │ │ └── rowmapper │ │ │ │ │ │ ├── ColumnConverter.java │ │ │ │ │ │ └── UserRowMapper.java │ │ │ │ │ ├── security │ │ │ │ │ ├── AuthoritiesConstants.java │ │ │ │ │ ├── SecurityUtils.java │ │ │ │ │ ├── oauth2 │ │ │ │ │ │ ├── AudienceValidator.java │ │ │ │ │ │ ├── JwtGrantedAuthorityConverter.java │ │ │ │ │ │ └── OAuthIdpTokenResponseDTO.java │ │ │ │ │ └── package-info.java │ │ │ │ │ ├── service │ │ │ │ │ ├── UserService.java │ │ │ │ │ ├── dto │ │ │ │ │ │ ├── AdminUserDTO.java │ │ │ │ │ │ ├── UserDTO.java │ │ │ │ │ │ └── package-info.java │ │ │ │ │ ├── mapper │ │ │ │ │ │ ├── UserMapper.java │ │ │ │ │ │ └── package-info.java │ │ │ │ │ └── package-info.java │ │ │ │ │ └── web │ │ │ │ │ ├── filter │ │ │ │ │ ├── ModifyServersOpenApiFilter.java │ │ │ │ │ ├── OAuth2ReactiveRefreshTokensWebFilter.java │ │ │ │ │ └── SpaWebFilter.java │ │ │ │ │ └── rest │ │ │ │ │ ├── AccountResource.java │ │ │ │ │ ├── AuthInfoResource.java │ │ │ │ │ ├── GatewayResource.java │ │ │ │ │ ├── LogoutResource.java │ │ │ │ │ ├── PublicUserResource.java │ │ │ │ │ ├── errors │ │ │ │ │ ├── BadRequestAlertException.java │ │ │ │ │ ├── ErrorConstants.java │ │ │ │ │ ├── ExceptionTranslator.java │ │ │ │ │ ├── FieldErrorVM.java │ │ │ │ │ └── package-info.java │ │ │ │ │ ├── package-info.java │ │ │ │ │ └── vm │ │ │ │ │ ├── ManagedUserVM.java │ │ │ │ │ ├── RouteVM.java │ │ │ │ │ └── package-info.java │ │ │ ├── resources │ │ │ │ ├── .h2.server.properties │ │ │ │ ├── banner.txt │ │ │ │ ├── config │ │ │ │ │ ├── application-dev.yml │ │ │ │ │ ├── application-prod.yml │ │ │ │ │ ├── application-tls.yml │ │ │ │ │ ├── application.yml │ │ │ │ │ ├── bootstrap-prod.yml │ │ │ │ │ ├── bootstrap.yml │ │ │ │ │ ├── liquibase │ │ │ │ │ │ ├── changelog │ │ │ │ │ │ │ └── 00000000000000_initial_schema.xml │ │ │ │ │ │ ├── data │ │ │ │ │ │ │ └── authority.csv │ │ │ │ │ │ └── master.xml │ │ │ │ │ └── tls │ │ │ │ │ │ └── keystore.p12 │ │ │ │ ├── i18n │ │ │ │ │ ├── messages.properties │ │ │ │ │ └── messages_en.properties │ │ │ │ ├── logback-spring.xml │ │ │ │ └── templates │ │ │ │ │ └── error.html │ │ │ └── webapp │ │ │ │ ├── 404.html │ │ │ │ ├── WEB-INF │ │ │ │ └── web.xml │ │ │ │ ├── app │ │ │ │ ├── account │ │ │ │ │ ├── account.service.ts │ │ │ │ │ └── login.service.ts │ │ │ │ ├── admin │ │ │ │ │ ├── configuration │ │ │ │ │ │ ├── configuration.component.ts │ │ │ │ │ │ ├── configuration.service.ts │ │ │ │ │ │ └── configuration.vue │ │ │ │ │ ├── docs │ │ │ │ │ │ ├── docs.component.ts │ │ │ │ │ │ └── docs.vue │ │ │ │ │ ├── gateway │ │ │ │ │ │ ├── gateway.component.ts │ │ │ │ │ │ ├── gateway.service.ts │ │ │ │ │ │ └── gateway.vue │ │ │ │ │ ├── health │ │ │ │ │ │ ├── health-modal.component.ts │ │ │ │ │ │ ├── health-modal.vue │ │ │ │ │ │ ├── health.component.ts │ │ │ │ │ │ ├── health.service.ts │ │ │ │ │ │ └── health.vue │ │ │ │ │ ├── logs │ │ │ │ │ │ ├── logs.component.ts │ │ │ │ │ │ ├── logs.service.ts │ │ │ │ │ │ └── logs.vue │ │ │ │ │ └── metrics │ │ │ │ │ │ ├── metrics-modal.component.ts │ │ │ │ │ │ ├── metrics-modal.vue │ │ │ │ │ │ ├── metrics.component.ts │ │ │ │ │ │ ├── metrics.service.ts │ │ │ │ │ │ └── metrics.vue │ │ │ │ ├── app.component.ts │ │ │ │ ├── app.vue │ │ │ │ ├── constants.ts │ │ │ │ ├── core │ │ │ │ │ ├── error │ │ │ │ │ │ ├── error.component.ts │ │ │ │ │ │ └── error.vue │ │ │ │ │ ├── home │ │ │ │ │ │ ├── home.component.ts │ │ │ │ │ │ └── home.vue │ │ │ │ │ ├── jhi-footer │ │ │ │ │ │ ├── jhi-footer.component.ts │ │ │ │ │ │ └── jhi-footer.vue │ │ │ │ │ ├── jhi-navbar │ │ │ │ │ │ ├── jhi-navbar.component.ts │ │ │ │ │ │ └── jhi-navbar.vue │ │ │ │ │ └── ribbon │ │ │ │ │ │ ├── ribbon.component.ts │ │ │ │ │ │ └── ribbon.vue │ │ │ │ ├── declarations.d.ts │ │ │ │ ├── entities │ │ │ │ │ ├── blog │ │ │ │ │ │ ├── blog │ │ │ │ │ │ │ ├── blog-details.component.ts │ │ │ │ │ │ │ ├── blog-details.vue │ │ │ │ │ │ │ ├── blog-update.component.ts │ │ │ │ │ │ │ ├── blog-update.vue │ │ │ │ │ │ │ ├── blog.component.ts │ │ │ │ │ │ │ ├── blog.service.ts │ │ │ │ │ │ │ └── blog.vue │ │ │ │ │ │ ├── post │ │ │ │ │ │ │ ├── post-details.component.ts │ │ │ │ │ │ │ ├── post-details.vue │ │ │ │ │ │ │ ├── post-update.component.ts │ │ │ │ │ │ │ ├── post-update.vue │ │ │ │ │ │ │ ├── post.component.ts │ │ │ │ │ │ │ ├── post.service.ts │ │ │ │ │ │ │ └── post.vue │ │ │ │ │ │ └── tag │ │ │ │ │ │ │ ├── tag-details.component.ts │ │ │ │ │ │ │ ├── tag-details.vue │ │ │ │ │ │ │ ├── tag-update.component.ts │ │ │ │ │ │ │ ├── tag-update.vue │ │ │ │ │ │ │ ├── tag.component.ts │ │ │ │ │ │ │ ├── tag.service.ts │ │ │ │ │ │ │ └── tag.vue │ │ │ │ │ ├── entities-menu.component.ts │ │ │ │ │ ├── entities-menu.vue │ │ │ │ │ ├── entities.component.ts │ │ │ │ │ ├── entities.vue │ │ │ │ │ ├── store │ │ │ │ │ │ └── product │ │ │ │ │ │ │ ├── product-details.component.ts │ │ │ │ │ │ │ ├── product-details.vue │ │ │ │ │ │ │ ├── product-update.component.ts │ │ │ │ │ │ │ ├── product-update.vue │ │ │ │ │ │ │ ├── product.component.ts │ │ │ │ │ │ │ ├── product.service.ts │ │ │ │ │ │ │ └── product.vue │ │ │ │ │ └── user │ │ │ │ │ │ └── user.service.ts │ │ │ │ ├── locale │ │ │ │ │ └── translation.service.ts │ │ │ │ ├── main.ts │ │ │ │ ├── router │ │ │ │ │ ├── admin.ts │ │ │ │ │ ├── entities.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── pages.ts │ │ │ │ ├── shared │ │ │ │ │ ├── alert │ │ │ │ │ │ └── alert.service.ts │ │ │ │ │ ├── config │ │ │ │ │ │ ├── axios-interceptor.ts │ │ │ │ │ │ ├── config-bootstrap-vue.ts │ │ │ │ │ │ ├── config.ts │ │ │ │ │ │ ├── dayjs.ts │ │ │ │ │ │ ├── formatter.ts │ │ │ │ │ │ └── store │ │ │ │ │ │ │ ├── account-store.ts │ │ │ │ │ │ │ └── translation-store.ts │ │ │ │ │ ├── data │ │ │ │ │ │ └── data-utils.service.ts │ │ │ │ │ ├── date │ │ │ │ │ │ └── filters.ts │ │ │ │ │ ├── jhi-item-count.component.ts │ │ │ │ │ ├── jhi-item-count.vue │ │ │ │ │ ├── model │ │ │ │ │ │ ├── blog │ │ │ │ │ │ │ ├── blog.model.ts │ │ │ │ │ │ │ ├── post.model.ts │ │ │ │ │ │ │ └── tag.model.ts │ │ │ │ │ │ ├── store │ │ │ │ │ │ │ └── product.model.ts │ │ │ │ │ │ └── user.model.ts │ │ │ │ │ ├── security │ │ │ │ │ │ └── authority.ts │ │ │ │ │ └── sort │ │ │ │ │ │ ├── jhi-sort-indicator.component.ts │ │ │ │ │ │ ├── jhi-sort-indicator.vue │ │ │ │ │ │ └── sorts.ts │ │ │ │ └── shims-vue.d.ts │ │ │ │ ├── content │ │ │ │ ├── css │ │ │ │ │ └── loading.css │ │ │ │ ├── images │ │ │ │ │ ├── jhipster_family_member_0.svg │ │ │ │ │ ├── jhipster_family_member_0_head-192.png │ │ │ │ │ ├── jhipster_family_member_0_head-256.png │ │ │ │ │ ├── jhipster_family_member_0_head-384.png │ │ │ │ │ ├── jhipster_family_member_0_head-512.png │ │ │ │ │ ├── jhipster_family_member_1.svg │ │ │ │ │ ├── jhipster_family_member_1_head-192.png │ │ │ │ │ ├── jhipster_family_member_1_head-256.png │ │ │ │ │ ├── jhipster_family_member_1_head-384.png │ │ │ │ │ ├── jhipster_family_member_1_head-512.png │ │ │ │ │ ├── jhipster_family_member_2.svg │ │ │ │ │ ├── jhipster_family_member_2_head-192.png │ │ │ │ │ ├── jhipster_family_member_2_head-256.png │ │ │ │ │ ├── jhipster_family_member_2_head-384.png │ │ │ │ │ ├── jhipster_family_member_2_head-512.png │ │ │ │ │ ├── jhipster_family_member_3.svg │ │ │ │ │ ├── jhipster_family_member_3_head-192.png │ │ │ │ │ ├── jhipster_family_member_3_head-256.png │ │ │ │ │ ├── jhipster_family_member_3_head-384.png │ │ │ │ │ ├── jhipster_family_member_3_head-512.png │ │ │ │ │ └── logo-jhipster.png │ │ │ │ └── scss │ │ │ │ │ ├── _bootstrap-variables.scss │ │ │ │ │ ├── global.scss │ │ │ │ │ └── vendor.scss │ │ │ │ ├── favicon.ico │ │ │ │ ├── i18n │ │ │ │ └── en │ │ │ │ │ ├── activate.json │ │ │ │ │ ├── blogBlog.json │ │ │ │ │ ├── blogPost.json │ │ │ │ │ ├── blogTag.json │ │ │ │ │ ├── configuration.json │ │ │ │ │ ├── error.json │ │ │ │ │ ├── gateway.json │ │ │ │ │ ├── global.json │ │ │ │ │ ├── health.json │ │ │ │ │ ├── home.json │ │ │ │ │ ├── login.json │ │ │ │ │ ├── logs.json │ │ │ │ │ ├── metrics.json │ │ │ │ │ ├── password.json │ │ │ │ │ ├── register.json │ │ │ │ │ ├── reset.json │ │ │ │ │ ├── sessions.json │ │ │ │ │ ├── settings.json │ │ │ │ │ ├── storeProduct.json │ │ │ │ │ └── user-management.json │ │ │ │ ├── index.html │ │ │ │ ├── manifest.webapp │ │ │ │ ├── robots.txt │ │ │ │ └── swagger-ui │ │ │ │ ├── dist │ │ │ │ └── images │ │ │ │ │ └── throbber.gif │ │ │ │ └── index.html │ │ └── test │ │ │ ├── java │ │ │ └── com │ │ │ │ └── okta │ │ │ │ └── developer │ │ │ │ └── gateway │ │ │ │ ├── IntegrationTest.java │ │ │ │ ├── TechnicalStructureTest.java │ │ │ │ ├── config │ │ │ │ ├── AsyncSyncConfiguration.java │ │ │ │ ├── EmbeddedSQL.java │ │ │ │ ├── JHipsterBlockHoundIntegration.java │ │ │ │ ├── PostgreSqlTestContainer.java │ │ │ │ ├── SpringBootTestClassOrderer.java │ │ │ │ ├── SqlTestContainer.java │ │ │ │ ├── TestContainersSpringContextCustomizerFactory.java │ │ │ │ └── TestSecurityConfiguration.java │ │ │ │ ├── security │ │ │ │ ├── SecurityUtilsUnitTest.java │ │ │ │ └── oauth2 │ │ │ │ │ └── AudienceValidatorTest.java │ │ │ │ ├── service │ │ │ │ ├── UserServiceIT.java │ │ │ │ └── mapper │ │ │ │ │ └── UserMapperTest.java │ │ │ │ ├── test │ │ │ │ └── util │ │ │ │ │ └── OAuth2TestUtil.java │ │ │ │ └── web │ │ │ │ ├── filter │ │ │ │ └── ModifyServersOpenApiFilterTest.java │ │ │ │ └── rest │ │ │ │ ├── AccountResourceIT.java │ │ │ │ ├── LogoutResourceIT.java │ │ │ │ ├── PublicUserResourceIT.java │ │ │ │ ├── TestUtil.java │ │ │ │ ├── UserResourceIT.java │ │ │ │ ├── WithUnauthenticatedMockUser.java │ │ │ │ └── errors │ │ │ │ ├── ExceptionTranslatorIT.java │ │ │ │ └── ExceptionTranslatorTestController.java │ │ │ ├── javascript │ │ │ ├── cypress │ │ │ │ ├── .eslintrc.json │ │ │ │ ├── e2e │ │ │ │ │ ├── administration │ │ │ │ │ │ └── administration.cy.ts │ │ │ │ │ ├── entity │ │ │ │ │ │ ├── blog.cy.ts │ │ │ │ │ │ ├── post.cy.ts │ │ │ │ │ │ ├── product.cy.ts │ │ │ │ │ │ └── tag.cy.ts │ │ │ │ │ └── lighthouse.audits.ts │ │ │ │ ├── fixtures │ │ │ │ │ └── integration-test.png │ │ │ │ ├── plugins │ │ │ │ │ └── index.ts │ │ │ │ ├── support │ │ │ │ │ ├── commands.ts │ │ │ │ │ ├── entity.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── management.ts │ │ │ │ │ ├── navbar.ts │ │ │ │ │ └── oauth2.ts │ │ │ │ └── tsconfig.json │ │ │ ├── jest.conf.js │ │ │ └── spec │ │ │ │ └── app │ │ │ │ ├── account │ │ │ │ ├── account.service.spec.ts │ │ │ │ └── login.service.spec.ts │ │ │ │ ├── admin │ │ │ │ ├── configuration │ │ │ │ │ └── configuration.component.spec.ts │ │ │ │ ├── gateway │ │ │ │ │ └── gateway.component.spec.ts │ │ │ │ ├── health │ │ │ │ │ ├── health-modal.component.spec.ts │ │ │ │ │ ├── health.component.spec.ts │ │ │ │ │ └── health.service.spec.ts │ │ │ │ ├── logs │ │ │ │ │ └── logs.component.spec.ts │ │ │ │ └── metrics │ │ │ │ │ ├── metrics-modal.component.spec.ts │ │ │ │ │ └── metrics.component.spec.ts │ │ │ │ ├── core │ │ │ │ ├── error │ │ │ │ │ └── error.component.spec.ts │ │ │ │ ├── home │ │ │ │ │ └── home.component.spec.ts │ │ │ │ ├── jhi-navbar │ │ │ │ │ └── jhi-navbar.component.spec.ts │ │ │ │ └── ribbon │ │ │ │ │ └── ribbon.component.spec.ts │ │ │ │ ├── entities │ │ │ │ ├── blog │ │ │ │ │ ├── blog │ │ │ │ │ │ ├── blog-details.component.spec.ts │ │ │ │ │ │ ├── blog-update.component.spec.ts │ │ │ │ │ │ ├── blog.component.spec.ts │ │ │ │ │ │ └── blog.service.spec.ts │ │ │ │ │ ├── post │ │ │ │ │ │ ├── post-details.component.spec.ts │ │ │ │ │ │ ├── post-update.component.spec.ts │ │ │ │ │ │ ├── post.component.spec.ts │ │ │ │ │ │ └── post.service.spec.ts │ │ │ │ │ └── tag │ │ │ │ │ │ ├── tag-details.component.spec.ts │ │ │ │ │ │ ├── tag-update.component.spec.ts │ │ │ │ │ │ ├── tag.component.spec.ts │ │ │ │ │ │ └── tag.service.spec.ts │ │ │ │ └── store │ │ │ │ │ └── product │ │ │ │ │ ├── product-details.component.spec.ts │ │ │ │ │ ├── product-update.component.spec.ts │ │ │ │ │ ├── product.component.spec.ts │ │ │ │ │ └── product.service.spec.ts │ │ │ │ └── shared │ │ │ │ ├── alert │ │ │ │ └── alert.service.spec.ts │ │ │ │ ├── config │ │ │ │ ├── axios-interceptor.spec.ts │ │ │ │ └── formatter.spec.ts │ │ │ │ ├── data │ │ │ │ └── data-utils.service.spec.ts │ │ │ │ └── sort │ │ │ │ └── sorts.spec.ts │ │ │ └── resources │ │ │ ├── META-INF │ │ │ ├── services │ │ │ │ └── reactor.blockhound.integration.BlockHoundIntegration │ │ │ └── spring.factories │ │ │ ├── config │ │ │ ├── application-testdev.yml │ │ │ ├── application.yml │ │ │ └── bootstrap.yml │ │ │ ├── junit-platform.properties │ │ │ └── logback.xml │ ├── tsconfig.json │ ├── tsconfig.spec.json │ └── webpack │ │ ├── config.js │ │ ├── vue.utils.js │ │ ├── webpack.common.js │ │ ├── webpack.dev.js │ │ └── webpack.prod.js ├── reactive-mf.jdl ├── reactive-ms.jdl └── store │ ├── .devcontainer │ ├── Dockerfile │ └── devcontainer.json │ ├── .editorconfig │ ├── .gitattributes │ ├── .gitignore │ ├── .jhipster │ └── Product.json │ ├── .prettierignore │ ├── .prettierrc │ ├── .yo-rc.json │ ├── README.md │ ├── build.gradle │ ├── checkstyle.xml │ ├── gradle.properties │ ├── gradle │ ├── docker.gradle │ ├── profile_dev.gradle │ ├── profile_prod.gradle │ ├── sonar.gradle │ ├── war.gradle │ ├── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ └── zipkin.gradle │ ├── gradlew │ ├── gradlew.bat │ ├── package.json │ ├── settings.gradle │ ├── sonar-project.properties │ └── src │ ├── main │ ├── docker │ │ ├── app.yml │ │ ├── central-server-config │ │ │ ├── README.md │ │ │ ├── docker-config │ │ │ │ └── application.yml │ │ │ └── localhost-config │ │ │ │ └── application.yml │ │ ├── grafana │ │ │ └── provisioning │ │ │ │ ├── dashboards │ │ │ │ ├── JVM.json │ │ │ │ └── dashboard.yml │ │ │ │ └── datasources │ │ │ │ └── datasource.yml │ │ ├── jhipster-control-center.yml │ │ ├── jhipster-registry.yml │ │ ├── jib │ │ │ └── entrypoint.sh │ │ ├── keycloak.yml │ │ ├── mongodb-cluster.yml │ │ ├── mongodb.yml │ │ ├── mongodb │ │ │ ├── MongoDB.Dockerfile │ │ │ └── scripts │ │ │ │ └── init_replicaset.js │ │ ├── monitoring.yml │ │ ├── prometheus │ │ │ └── prometheus.yml │ │ ├── realm-config │ │ │ └── jhipster-realm.json │ │ ├── services.yml │ │ ├── sonar.yml │ │ └── zipkin.yml │ ├── java │ │ └── com │ │ │ └── okta │ │ │ └── developer │ │ │ └── store │ │ │ ├── GeneratedByJHipster.java │ │ │ ├── StoreApp.java │ │ │ ├── aop │ │ │ └── logging │ │ │ │ └── LoggingAspect.java │ │ │ ├── config │ │ │ ├── ApplicationProperties.java │ │ │ ├── AsyncConfiguration.java │ │ │ ├── CRLFLogConverter.java │ │ │ ├── Constants.java │ │ │ ├── DatabaseConfiguration.java │ │ │ ├── DateTimeFormatConfiguration.java │ │ │ ├── EurekaWorkaroundConfiguration.java │ │ │ ├── JacksonConfiguration.java │ │ │ ├── LocaleConfiguration.java │ │ │ ├── LoggingAspectConfiguration.java │ │ │ ├── LoggingConfiguration.java │ │ │ ├── ReactorConfiguration.java │ │ │ ├── SecurityConfiguration.java │ │ │ ├── WebConfigurer.java │ │ │ ├── dbmigrations │ │ │ │ ├── InitialSetupMigration.java │ │ │ │ └── package-info.java │ │ │ └── package-info.java │ │ │ ├── domain │ │ │ ├── AbstractAuditingEntity.java │ │ │ ├── Authority.java │ │ │ ├── Product.java │ │ │ ├── User.java │ │ │ └── package-info.java │ │ │ ├── repository │ │ │ ├── AuthorityRepository.java │ │ │ ├── ProductRepository.java │ │ │ ├── UserRepository.java │ │ │ └── package-info.java │ │ │ ├── security │ │ │ ├── AuthoritiesConstants.java │ │ │ ├── SecurityUtils.java │ │ │ ├── oauth2 │ │ │ │ ├── AudienceValidator.java │ │ │ │ ├── JwtGrantedAuthorityConverter.java │ │ │ │ └── OAuthIdpTokenResponseDTO.java │ │ │ └── package-info.java │ │ │ ├── service │ │ │ ├── UserService.java │ │ │ ├── dto │ │ │ │ ├── AdminUserDTO.java │ │ │ │ ├── UserDTO.java │ │ │ │ └── package-info.java │ │ │ ├── mapper │ │ │ │ ├── UserMapper.java │ │ │ │ └── package-info.java │ │ │ └── package-info.java │ │ │ └── web │ │ │ └── rest │ │ │ ├── ProductResource.java │ │ │ ├── PublicUserResource.java │ │ │ ├── errors │ │ │ ├── BadRequestAlertException.java │ │ │ ├── ErrorConstants.java │ │ │ ├── ExceptionTranslator.java │ │ │ ├── FieldErrorVM.java │ │ │ └── package-info.java │ │ │ ├── package-info.java │ │ │ └── vm │ │ │ ├── ManagedUserVM.java │ │ │ └── package-info.java │ └── resources │ │ ├── banner.txt │ │ ├── config │ │ ├── application-dev.yml │ │ ├── application-prod.yml │ │ ├── application-tls.yml │ │ ├── application.yml │ │ ├── bootstrap-prod.yml │ │ ├── bootstrap.yml │ │ └── tls │ │ │ └── keystore.p12 │ │ ├── i18n │ │ ├── messages.properties │ │ └── messages_en.properties │ │ ├── logback-spring.xml │ │ ├── static │ │ └── index.html │ │ └── templates │ │ └── error.html │ └── test │ ├── java │ └── com │ │ └── okta │ │ └── developer │ │ └── store │ │ ├── IntegrationTest.java │ │ ├── TechnicalStructureTest.java │ │ ├── config │ │ ├── AsyncSyncConfiguration.java │ │ ├── EmbeddedMongo.java │ │ ├── JHipsterBlockHoundIntegration.java │ │ ├── MongoDbTestContainer.java │ │ ├── SpringBootTestClassOrderer.java │ │ ├── TestContainersSpringContextCustomizerFactory.java │ │ └── TestSecurityConfiguration.java │ │ ├── domain │ │ └── ProductTest.java │ │ ├── security │ │ ├── SecurityUtilsUnitTest.java │ │ └── oauth2 │ │ │ └── AudienceValidatorTest.java │ │ ├── service │ │ ├── UserServiceIT.java │ │ └── mapper │ │ │ └── UserMapperTest.java │ │ └── web │ │ └── rest │ │ ├── ProductResourceIT.java │ │ ├── PublicUserResourceIT.java │ │ ├── TestUtil.java │ │ ├── UserResourceIT.java │ │ ├── WithUnauthenticatedMockUser.java │ │ └── errors │ │ ├── ExceptionTranslatorIT.java │ │ └── ExceptionTranslatorTestController.java │ └── resources │ ├── META-INF │ ├── services │ │ └── reactor.blockhound.integration.BlockHoundIntegration │ └── spring.factories │ ├── config │ ├── application.yml │ └── bootstrap.yml │ ├── junit-platform.properties │ └── logback.xml ├── spring-boot-gateway-mvc ├── .gitignore ├── LICENSE ├── README.md ├── api-gateway │ ├── .env.example │ ├── .gitignore │ ├── build.gradle │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── settings.gradle │ └── src │ │ ├── main │ │ ├── java │ │ │ └── com │ │ │ │ └── example │ │ │ │ └── apigateway │ │ │ │ ├── ApiGatewayApplication.java │ │ │ │ ├── config │ │ │ │ └── SecurityConfiguration.java │ │ │ │ └── web │ │ │ │ └── HomeController.java │ │ └── resources │ │ │ ├── application.properties │ │ │ └── application.yml │ │ └── test │ │ └── java │ │ └── com │ │ └── example │ │ └── apigateway │ │ └── ApiGatewayApplicationTests.java ├── car-service │ ├── .env.example │ ├── .gitignore │ ├── build.gradle │ ├── compose.yaml │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── settings.gradle │ └── src │ │ ├── main │ │ ├── java │ │ │ └── com │ │ │ │ └── example │ │ │ │ └── carservice │ │ │ │ ├── CarServiceApplication.java │ │ │ │ ├── data │ │ │ │ ├── Car.java │ │ │ │ └── CarRepository.java │ │ │ │ └── web │ │ │ │ └── HomeController.java │ │ └── resources │ │ │ └── application.properties │ │ └── test │ │ └── java │ │ └── com │ │ └── example │ │ └── carservice │ │ └── CarServiceApplicationTests.java ├── demo.adoc └── discovery-service │ ├── .gitignore │ ├── build.gradle │ ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── settings.gradle │ └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── example │ │ │ └── discoveryservice │ │ │ └── EurekaServiceApplication.java │ └── resources │ │ └── application.properties │ └── test │ └── java │ └── com │ └── example │ └── discoveryservice │ └── EurekaServiceApplicationTests.java ├── spring-boot-gateway-webflux ├── .gitignore ├── LICENSE ├── README.md ├── api-gateway │ ├── .env.example │ ├── .gitignore │ ├── build.gradle │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── settings.gradle │ └── src │ │ ├── main │ │ ├── java │ │ │ └── com │ │ │ │ └── example │ │ │ │ └── apigateway │ │ │ │ ├── ApiGatewayApplication.java │ │ │ │ ├── config │ │ │ │ ├── SecurityConfiguration.java │ │ │ │ └── WebClientConfiguration.java │ │ │ │ └── web │ │ │ │ ├── CoolCarController.java │ │ │ │ └── HomeController.java │ │ └── resources │ │ │ ├── application.properties │ │ │ └── application.yml │ │ └── test │ │ └── java │ │ └── com │ │ └── example │ │ └── apigateway │ │ └── ApiGatewayApplicationTests.java ├── car-service │ ├── .env.example │ ├── .gitignore │ ├── build.gradle │ ├── compose.yaml │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── settings.gradle │ └── src │ │ ├── main │ │ ├── java │ │ │ └── com │ │ │ │ └── example │ │ │ │ └── carservice │ │ │ │ ├── CarServiceApplication.java │ │ │ │ ├── data │ │ │ │ ├── Car.java │ │ │ │ └── CarRepository.java │ │ │ │ └── web │ │ │ │ ├── CarController.java │ │ │ │ └── HomeController.java │ │ └── resources │ │ │ └── application.properties │ │ └── test │ │ └── java │ │ └── com │ │ └── example │ │ └── carservice │ │ └── CarServiceApplicationTests.java ├── demo.adoc └── discovery-service │ ├── .gitignore │ ├── build.gradle │ ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── settings.gradle │ └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── example │ │ │ └── discoveryservice │ │ │ └── EurekaServiceApplication.java │ └── resources │ │ └── application.properties │ └── test │ └── java │ └── com │ └── example │ └── discoveryservice │ └── EurekaServiceApplicationTests.java └── static └── java-microservices.webp /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Auth0 Java Microservice Examples 2 | 3 | - [Reactive Java Microservices with Spring Boot and JHipster](reactive-jhipster#readme) 4 | - [Java Microservices with Spring Boot and Spring Cloud - Gateway WebFlux](spring-boot-gateway-webflux#readme) 5 | - [Java Microservices with Spring Boot and Spring Cloud - Gateway MVC](spring-boot-gateway-mvc#readme) 6 | 7 | You can watch a demo of the WebFlux example in the screencast below. 8 | 9 | [![Java Microservices with Spring Boot and Spring Cloud](static/java-microservices.webp)](https://youtu.be/m-lhymNdPBc) 10 | -------------------------------------------------------------------------------- /reactive-jhipster/.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Editor-based HTTP Client requests 5 | /httpRequests/ 6 | # Datasource local storage ignored files 7 | /dataSources/ 8 | /dataSources.local.xml 9 | -------------------------------------------------------------------------------- /reactive-jhipster/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | ApexVCS 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /reactive-jhipster/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /reactive-jhipster/.idea/reactive-jhipster.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /reactive-jhipster/.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig helps developers define and maintain consistent 2 | # coding styles between different editors and IDEs 3 | # editorconfig.org 4 | 5 | root = true 6 | 7 | [*] 8 | 9 | # We recommend you to keep these unchanged 10 | end_of_line = lf 11 | charset = utf-8 12 | trim_trailing_whitespace = true 13 | insert_final_newline = true 14 | 15 | # Change these settings to your own preference 16 | indent_style = space 17 | indent_size = 4 18 | 19 | [*.{ts,tsx,js,jsx,json,css,scss,yml,html,vue}] 20 | indent_size = 2 21 | 22 | [*.md] 23 | trim_trailing_whitespace = false 24 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/.jhipster/Blog.json: -------------------------------------------------------------------------------- 1 | { 2 | "applications": ["gateway", "blog"], 3 | "changelogDate": "20230228060241", 4 | "clientRootFolder": "blog", 5 | "databaseType": "neo4j", 6 | "dto": "no", 7 | "embedded": false, 8 | "entityTableName": "blog", 9 | "fields": [ 10 | { 11 | "fieldName": "name", 12 | "fieldType": "String", 13 | "fieldValidateRules": ["required", "minlength"], 14 | "fieldValidateRulesMinlength": "3" 15 | }, 16 | { 17 | "fieldName": "handle", 18 | "fieldType": "String", 19 | "fieldValidateRules": ["required", "minlength"], 20 | "fieldValidateRulesMinlength": "2" 21 | } 22 | ], 23 | "fluentMethods": true, 24 | "jpaMetamodelFiltering": false, 25 | "microserviceName": "blog", 26 | "name": "Blog", 27 | "pagination": "no", 28 | "readOnly": false, 29 | "relationships": [ 30 | { 31 | "otherEntityField": "login", 32 | "otherEntityName": "user", 33 | "relationshipName": "user", 34 | "relationshipType": "many-to-one" 35 | } 36 | ], 37 | "searchEngine": "no", 38 | "service": "no" 39 | } 40 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/.jhipster/Tag.json: -------------------------------------------------------------------------------- 1 | { 2 | "applications": ["gateway", "blog"], 3 | "changelogDate": "20230228060441", 4 | "clientRootFolder": "blog", 5 | "databaseType": "neo4j", 6 | "dto": "no", 7 | "embedded": false, 8 | "entityTableName": "tag", 9 | "fields": [ 10 | { 11 | "fieldName": "name", 12 | "fieldType": "String", 13 | "fieldValidateRules": ["required", "minlength"], 14 | "fieldValidateRulesMinlength": "2" 15 | } 16 | ], 17 | "fluentMethods": true, 18 | "jpaMetamodelFiltering": false, 19 | "microserviceName": "blog", 20 | "name": "Tag", 21 | "pagination": "infinite-scroll", 22 | "readOnly": false, 23 | "relationships": [ 24 | { 25 | "otherEntityName": "post", 26 | "otherEntityRelationshipName": "tag", 27 | "ownerSide": false, 28 | "relationshipName": "post", 29 | "relationshipType": "many-to-many" 30 | } 31 | ], 32 | "searchEngine": "no", 33 | "service": "no" 34 | } 35 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/.prettierignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | target 3 | build 4 | package-lock.json 5 | .git 6 | .mvn 7 | gradle 8 | .gradle 9 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/.prettierrc: -------------------------------------------------------------------------------- 1 | # Prettier configuration 2 | 3 | printWidth: 140 4 | singleQuote: true 5 | tabWidth: 2 6 | useTabs: false 7 | 8 | # js and ts rules: 9 | arrowParens: avoid 10 | 11 | # jsx and tsx rules: 12 | bracketSameLine: false 13 | 14 | # java rules: 15 | overrides: 16 | - files: "*.java" 17 | options: 18 | tabWidth: 4 19 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/checkstyle.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/gradle/docker.gradle: -------------------------------------------------------------------------------- 1 | jib { 2 | from { 3 | image = "eclipse-temurin:17-jre-focal" 4 | platforms { 5 | platform { 6 | architecture = "${findProperty('jibArchitecture') ?: 'amd64'}" 7 | os = "linux" 8 | } 9 | } 10 | } 11 | to { 12 | image = "blog:latest" 13 | } 14 | container { 15 | entrypoint = ["bash", "-c", "/entrypoint.sh"] 16 | ports = ["8081"] 17 | environment = [ 18 | SPRING_OUTPUT_ANSI_ENABLED: "ALWAYS", 19 | JHIPSTER_SLEEP: "0" 20 | ] 21 | creationTime = "USE_CURRENT_TIMESTAMP" 22 | user = 1000 23 | } 24 | extraDirectories { 25 | paths = file("src/main/docker/jib") 26 | permissions = ["/entrypoint.sh": "755"] 27 | } 28 | } 29 | 30 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/gradle/sonar.gradle: -------------------------------------------------------------------------------- 1 | jacoco { 2 | toolVersion = "0.8.8" 3 | } 4 | 5 | jacocoTestReport { 6 | executionData tasks.withType(Test) 7 | classDirectories.from = files(sourceSets.main.output.classesDirs) 8 | sourceDirectories.from = files(sourceSets.main.java.srcDirs) 9 | 10 | reports { 11 | xml.enabled = true 12 | } 13 | } 14 | 15 | file("sonar-project.properties").withReader { 16 | Properties sonarProperties = new Properties() 17 | sonarProperties.load(it) 18 | 19 | sonarProperties.each { key, value -> 20 | sonarqube { 21 | properties { 22 | property key, value 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/gradle/war.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: "war" 2 | 3 | bootWar { 4 | mainClass = "com.okta.developer.blog.BlogApp" 5 | includes = ["WEB-INF/**", "META-INF/**"] 6 | } 7 | 8 | war { 9 | enabled = true 10 | archiveExtension = "war.original" 11 | includes = ["WEB-INF/**", "META-INF/**"] 12 | 13 | } 14 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oktadev/auth0-java-microservices-examples/953224d0ebd0bd801a2c186c8dd2b464a48b3a6a/reactive-jhipster/blog/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /reactive-jhipster/blog/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/gradle/zipkin.gradle: -------------------------------------------------------------------------------- 1 | dependencies { 2 | implementation "io.micrometer:micrometer-tracing-bridge-brave" 3 | implementation "io.zipkin.reporter2:zipkin-reporter-brave" 4 | } 5 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/settings.gradle: -------------------------------------------------------------------------------- 1 | 2 | pluginManagement { 3 | repositories { 4 | mavenCentral() 5 | maven { url 'https://repo.spring.io/milestone' } 6 | gradlePluginPortal() 7 | // jhipster-needle-gradle-plugin-management-repositories - JHipster will add additional entries here 8 | } 9 | plugins { 10 | id 'org.springframework.boot' version "${springBootVersion}" 11 | id 'com.google.cloud.tools.jib' version "${jibPluginVersion}" 12 | id 'com.gorylenko.gradle-git-properties' version "${gitPropertiesPluginVersion}" 13 | id 'org.sonarqube' version "${sonarqubePluginVersion}" 14 | id "io.spring.nohttp" version "${noHttpCheckstyleVersion}" 15 | id 'com.github.andygoossens.gradle-modernizer-plugin' version "${modernizerPluginVersion}" 16 | // jhipster-needle-gradle-plugin-management-plugins - JHipster will add additional entries here 17 | } 18 | } 19 | 20 | rootProject.name = "blog" 21 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/main/docker/central-server-config/README.md: -------------------------------------------------------------------------------- 1 | # Central configuration sources details 2 | 3 | The JHipster-Registry will use the following directories as its configuration source : 4 | 5 | - localhost-config : when running the registry in docker with the jhipster-registry.yml docker-compose file 6 | - docker-config : when running the registry and the app both in docker with the app.yml docker-compose file 7 | 8 | For more info, refer to https://www.jhipster.tech/jhipster-registry/#spring-cloud-config 9 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/main/docker/central-server-config/docker-config/application.yml: -------------------------------------------------------------------------------- 1 | # Common configuration shared between all applications 2 | configserver: 3 | name: Docker JHipster Registry 4 | status: Connected to the JHipster Registry running in Docker 5 | 6 | jhipster: 7 | security: 8 | authentication: 9 | jwt: 10 | # secret key which should be base64 encoded and changed in production 11 | base64-secret: ZTgxNmE3NmNmY2IzNmQ3MWUyMGNjOTU0MDBhYmYwNGVjNTNjNDBmOTE0ZDNkYTNkNmIxZDNiOGQwNmNjNDY3NDI2ZDc5ZTQ0OTU1MmQ2NTY2ZjcwYjAxODQxMmNlYWFjMGU4OTA5YmY4MTUwNjFlNTU4MjcwZjY0MDFhMmE5NjY= 12 | 13 | eureka: 14 | client: 15 | service-url: 16 | defaultZone: http://admin:${jhipster.registry.password}@jhipster-registry:8761/eureka/ 17 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/main/docker/central-server-config/localhost-config/application.yml: -------------------------------------------------------------------------------- 1 | # Common configuration shared between all applications 2 | configserver: 3 | name: Docker JHipster Registry 4 | status: Connected to the JHipster Registry running in Docker 5 | 6 | jhipster: 7 | security: 8 | authentication: 9 | jwt: 10 | # secret key which should be base64 encoded and changed in production 11 | base64-secret: ZTgxNmE3NmNmY2IzNmQ3MWUyMGNjOTU0MDBhYmYwNGVjNTNjNDBmOTE0ZDNkYTNkNmIxZDNiOGQwNmNjNDY3NDI2ZDc5ZTQ0OTU1MmQ2NTY2ZjcwYjAxODQxMmNlYWFjMGU4OTA5YmY4MTUwNjFlNTU4MjcwZjY0MDFhMmE5NjY= 12 | 13 | eureka: 14 | client: 15 | service-url: 16 | defaultZone: http://admin:${jhipster.registry.password}@localhost:8761/eureka/ 17 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/main/docker/grafana/provisioning/dashboards/dashboard.yml: -------------------------------------------------------------------------------- 1 | apiVersion: 1 2 | 3 | providers: 4 | - name: 'Prometheus' 5 | orgId: 1 6 | folder: '' 7 | type: file 8 | disableDeletion: false 9 | editable: true 10 | options: 11 | path: /etc/grafana/provisioning/dashboards 12 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/main/docker/keycloak.yml: -------------------------------------------------------------------------------- 1 | # This configuration is intended for development purpose, it's **your** responsibility to harden it for production 2 | name: blog 3 | services: 4 | keycloak: 5 | image: quay.io/keycloak/keycloak:20.0.1 6 | command: ['start-dev --import-realm'] 7 | volumes: 8 | - ./realm-config:/opt/keycloak/data/import 9 | environment: 10 | - KC_DB=dev-file 11 | - KEYCLOAK_ADMIN=admin 12 | - KEYCLOAK_ADMIN_PASSWORD=admin 13 | - KC_FEATURES=scripts 14 | - KC_HTTP_PORT=9080 15 | - KC_HTTPS_PORT=9443 16 | # If you want to expose these ports outside your dev PC, 17 | # remove the "127.0.0.1:" prefix 18 | ports: 19 | - 127.0.0.1:9080:9080 20 | - 127.0.0.1:9443:9443 21 | healthcheck: 22 | test: ['CMD', 'curl', '-f', 'http://localhost:9080/realms/jhipster'] 23 | interval: 5s 24 | timeout: 5s 25 | retries: 20 26 | start_period: 10s 27 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/main/docker/neo4j.yml: -------------------------------------------------------------------------------- 1 | # This configuration is intended for development purpose, it's **your** responsibility to harden it for production 2 | name: blog 3 | services: 4 | neo4j: 5 | image: neo4j:5.5.0 6 | # volumes: 7 | # - ~/volumes/jhipster/blog/neo4j/:/data 8 | environment: 9 | - NEO4J_AUTH=none 10 | # If you want to expose these ports outside your dev PC, 11 | # remove the "127.0.0.1:" prefix 12 | ports: 13 | - '127.0.0.1:7474:7474' 14 | - '127.0.0.1:7687:7687' 15 | healthcheck: 16 | test: ['CMD', 'wget', 'http://localhost:7474/', '-O', '-'] 17 | interval: 5s 18 | timeout: 5s 19 | retries: 10 20 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/main/docker/services.yml: -------------------------------------------------------------------------------- 1 | # This configuration is intended for development purpose, it's **your** responsibility to harden it for production 2 | name: blog 3 | services: 4 | neo4j: 5 | extends: 6 | file: ./neo4j.yml 7 | service: neo4j 8 | keycloak: 9 | extends: 10 | file: ./keycloak.yml 11 | service: keycloak 12 | jhipster-registry: 13 | extends: 14 | file: ./jhipster-registry.yml 15 | service: jhipster-registry 16 | depends_on: 17 | keycloak: 18 | condition: service_healthy 19 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/main/docker/sonar.yml: -------------------------------------------------------------------------------- 1 | # This configuration is intended for development purpose, it's **your** responsibility to harden it for production 2 | name: blog 3 | services: 4 | sonar: 5 | container_name: sonarqube 6 | image: sonarqube:9.9.0-community 7 | # Forced authentication redirect for UI is turned off for out of the box experience while trying out SonarQube 8 | # For real use cases delete SONAR_FORCEAUTHENTICATION variable or set SONAR_FORCEAUTHENTICATION=true 9 | environment: 10 | - SONAR_FORCEAUTHENTICATION=false 11 | # If you want to expose these ports outside your dev PC, 12 | # remove the "127.0.0.1:" prefix 13 | ports: 14 | - 127.0.0.1:9001:9000 15 | - 127.0.0.1:9000:9000 16 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/main/docker/zipkin.yml: -------------------------------------------------------------------------------- 1 | # This configuration is intended for development purpose, it's **your** responsibility to harden it for production 2 | name: blog 3 | services: 4 | zipkin: 5 | image: openzipkin/zipkin:2.24 6 | ports: 7 | - 127.0.0.1:9411:9411 8 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/main/java/com/okta/developer/blog/GeneratedByJHipster.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.blog; 2 | 3 | import jakarta.annotation.Generated; 4 | import java.lang.annotation.ElementType; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | import java.lang.annotation.Target; 8 | 9 | @Generated(value = "JHipster", comments = "Generated by JHipster 7.9.3") 10 | @Retention(RetentionPolicy.SOURCE) 11 | @Target({ ElementType.TYPE }) 12 | public @interface GeneratedByJHipster { 13 | } 14 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/main/java/com/okta/developer/blog/config/ApplicationProperties.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.blog.config; 2 | 3 | import org.springframework.boot.context.properties.ConfigurationProperties; 4 | 5 | /** 6 | * Properties specific to Blog. 7 | *

8 | * Properties are configured in the {@code application.yml} file. 9 | * See {@link tech.jhipster.config.JHipsterProperties} for a good example. 10 | */ 11 | @ConfigurationProperties(prefix = "application", ignoreUnknownFields = false) 12 | public class ApplicationProperties { 13 | // jhipster-needle-application-properties-property 14 | // jhipster-needle-application-properties-property-getter 15 | // jhipster-needle-application-properties-property-class 16 | } 17 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/main/java/com/okta/developer/blog/config/Constants.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.blog.config; 2 | 3 | /** 4 | * Application constants. 5 | */ 6 | public final class Constants { 7 | 8 | // Regex for acceptable logins 9 | public static final String LOGIN_REGEX = "^(?>[a-zA-Z0-9!$&*+=?^_`{|}~.-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*)|(?>[_.@A-Za-z0-9-]+)$"; 10 | 11 | public static final String SYSTEM = "system"; 12 | public static final String DEFAULT_LANGUAGE = "en"; 13 | 14 | private Constants() {} 15 | } 16 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/main/java/com/okta/developer/blog/config/DateTimeFormatConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.blog.config; 2 | 3 | import org.springframework.context.annotation.Configuration; 4 | import org.springframework.format.FormatterRegistry; 5 | import org.springframework.format.datetime.standard.DateTimeFormatterRegistrar; 6 | import org.springframework.web.reactive.config.WebFluxConfigurer; 7 | 8 | /** 9 | * Configure the converters to use the ISO format for dates by default. 10 | */ 11 | @Configuration 12 | public class DateTimeFormatConfiguration implements WebFluxConfigurer { 13 | 14 | @Override 15 | public void addFormatters(FormatterRegistry registry) { 16 | DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar(); 17 | registrar.setUseIsoFormat(true); 18 | registrar.registerFormatters(registry); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/main/java/com/okta/developer/blog/config/JacksonConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.blog.config; 2 | 3 | import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; 4 | import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; 5 | import org.springframework.context.annotation.Bean; 6 | import org.springframework.context.annotation.Configuration; 7 | 8 | @Configuration 9 | public class JacksonConfiguration { 10 | 11 | /** 12 | * Support for Java date and time API. 13 | * @return the corresponding Jackson module. 14 | */ 15 | @Bean 16 | public JavaTimeModule javaTimeModule() { 17 | return new JavaTimeModule(); 18 | } 19 | 20 | @Bean 21 | public Jdk8Module jdk8TimeModule() { 22 | return new Jdk8Module(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/main/java/com/okta/developer/blog/config/LoggingAspectConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.blog.config; 2 | 3 | import com.okta.developer.blog.aop.logging.LoggingAspect; 4 | import org.springframework.context.annotation.*; 5 | import org.springframework.core.env.Environment; 6 | import tech.jhipster.config.JHipsterConstants; 7 | 8 | @Configuration 9 | @EnableAspectJAutoProxy 10 | public class LoggingAspectConfiguration { 11 | 12 | @Bean 13 | @Profile(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT) 14 | public LoggingAspect loggingAspect(Environment env) { 15 | return new LoggingAspect(env); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/main/java/com/okta/developer/blog/config/ReactorConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.blog.config; 2 | 3 | import org.springframework.context.annotation.Configuration; 4 | import org.springframework.context.annotation.Profile; 5 | import reactor.core.publisher.Hooks; 6 | import tech.jhipster.config.JHipsterConstants; 7 | 8 | @Configuration 9 | @Profile("!" + JHipsterConstants.SPRING_PROFILE_PRODUCTION) 10 | public class ReactorConfiguration { 11 | 12 | public ReactorConfiguration() { 13 | Hooks.onOperatorDebug(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/main/java/com/okta/developer/blog/config/neo4j/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Neo4j specific configuration and required migrations. 3 | */ 4 | package com.okta.developer.blog.config.neo4j; 5 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/main/java/com/okta/developer/blog/config/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Spring Framework configuration files. 3 | */ 4 | package com.okta.developer.blog.config; 5 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/main/java/com/okta/developer/blog/domain/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * JPA domain objects. 3 | */ 4 | package com.okta.developer.blog.domain; 5 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/main/java/com/okta/developer/blog/repository/AuthorityRepository.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.blog.repository; 2 | 3 | import com.okta.developer.blog.domain.Authority; 4 | import org.springframework.data.neo4j.repository.ReactiveNeo4jRepository; 5 | import reactor.core.publisher.Flux; 6 | 7 | /** 8 | * Spring Data Neo4j repository for the {@link Authority} entity. 9 | */ 10 | public interface AuthorityRepository extends ReactiveNeo4jRepository { 11 | Flux findAll(); 12 | } 13 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/main/java/com/okta/developer/blog/repository/BlogRepository.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.blog.repository; 2 | 3 | import com.okta.developer.blog.domain.Blog; 4 | import org.springframework.data.neo4j.repository.ReactiveNeo4jRepository; 5 | import org.springframework.data.neo4j.repository.query.Query; 6 | import org.springframework.stereotype.Repository; 7 | 8 | /** 9 | * Spring Data Neo4j reactive repository for the Blog entity. 10 | */ 11 | @SuppressWarnings("unused") 12 | @Repository 13 | public interface BlogRepository extends ReactiveNeo4jRepository {} 14 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/main/java/com/okta/developer/blog/repository/PostRepository.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.blog.repository; 2 | 3 | import com.okta.developer.blog.domain.Post; 4 | import org.springframework.data.domain.Pageable; 5 | import org.springframework.data.neo4j.repository.ReactiveNeo4jRepository; 6 | import org.springframework.data.neo4j.repository.query.Query; 7 | import org.springframework.stereotype.Repository; 8 | import reactor.core.publisher.Flux; 9 | 10 | /** 11 | * Spring Data Neo4j reactive repository for the Post entity. 12 | */ 13 | @SuppressWarnings("unused") 14 | @Repository 15 | public interface PostRepository extends ReactiveNeo4jRepository { 16 | Flux findAllBy(Pageable pageable); 17 | } 18 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/main/java/com/okta/developer/blog/repository/TagRepository.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.blog.repository; 2 | 3 | import com.okta.developer.blog.domain.Tag; 4 | import org.springframework.data.domain.Pageable; 5 | import org.springframework.data.neo4j.repository.ReactiveNeo4jRepository; 6 | import org.springframework.data.neo4j.repository.query.Query; 7 | import org.springframework.stereotype.Repository; 8 | import reactor.core.publisher.Flux; 9 | 10 | /** 11 | * Spring Data Neo4j reactive repository for the Tag entity. 12 | */ 13 | @SuppressWarnings("unused") 14 | @Repository 15 | public interface TagRepository extends ReactiveNeo4jRepository { 16 | Flux findAllBy(Pageable pageable); 17 | } 18 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/main/java/com/okta/developer/blog/repository/UserRepository.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.blog.repository; 2 | 3 | import com.okta.developer.blog.domain.User; 4 | import org.springframework.data.domain.*; 5 | import org.springframework.data.neo4j.repository.ReactiveNeo4jRepository; 6 | import org.springframework.stereotype.Repository; 7 | import reactor.core.publisher.Flux; 8 | import reactor.core.publisher.Mono; 9 | 10 | /** 11 | * Spring Data Neo4j repository for the {@link User} entity. 12 | */ 13 | @Repository 14 | public interface UserRepository extends ReactiveNeo4jRepository { 15 | Mono findOneByLogin(String login); 16 | 17 | Flux findAll(); 18 | 19 | Flux findAllByIdNotNull(Pageable pageable); 20 | 21 | Flux findAllByIdNotNullAndActivatedIsTrue(Pageable pageable); 22 | 23 | Mono count(); 24 | } 25 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/main/java/com/okta/developer/blog/repository/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Spring Data JPA repositories. 3 | */ 4 | package com.okta.developer.blog.repository; 5 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/main/java/com/okta/developer/blog/security/AuthoritiesConstants.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.blog.security; 2 | 3 | /** 4 | * Constants for Spring Security authorities. 5 | */ 6 | public final class AuthoritiesConstants { 7 | 8 | public static final String ADMIN = "ROLE_ADMIN"; 9 | 10 | public static final String USER = "ROLE_USER"; 11 | 12 | public static final String ANONYMOUS = "ROLE_ANONYMOUS"; 13 | 14 | private AuthoritiesConstants() {} 15 | } 16 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/main/java/com/okta/developer/blog/security/oauth2/JwtGrantedAuthorityConverter.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.blog.security.oauth2; 2 | 3 | import com.okta.developer.blog.security.SecurityUtils; 4 | import java.util.Collection; 5 | import org.springframework.core.convert.converter.Converter; 6 | import org.springframework.security.core.GrantedAuthority; 7 | import org.springframework.security.oauth2.jwt.Jwt; 8 | import org.springframework.stereotype.Component; 9 | 10 | @Component 11 | public class JwtGrantedAuthorityConverter implements Converter> { 12 | 13 | public JwtGrantedAuthorityConverter() { 14 | // Bean extracting authority. 15 | } 16 | 17 | @Override 18 | public Collection convert(Jwt jwt) { 19 | return SecurityUtils.extractAuthorityFromClaims(jwt.getClaims()); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/main/java/com/okta/developer/blog/security/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Spring Security configuration. 3 | */ 4 | package com.okta.developer.blog.security; 5 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/main/java/com/okta/developer/blog/service/dto/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Data Transfer Objects. 3 | */ 4 | package com.okta.developer.blog.service.dto; 5 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/main/java/com/okta/developer/blog/service/mapper/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * MapStruct mappers for mapping domain objects and Data Transfer Objects. 3 | */ 4 | package com.okta.developer.blog.service.mapper; 5 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/main/java/com/okta/developer/blog/service/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Service layer beans. 3 | */ 4 | package com.okta.developer.blog.service; 5 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/main/java/com/okta/developer/blog/web/rest/errors/ErrorConstants.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.blog.web.rest.errors; 2 | 3 | import java.net.URI; 4 | 5 | public final class ErrorConstants { 6 | 7 | public static final String ERR_CONCURRENCY_FAILURE = "error.concurrencyFailure"; 8 | public static final String ERR_VALIDATION = "error.validation"; 9 | public static final String PROBLEM_BASE_URL = "https://www.jhipster.tech/problem"; 10 | public static final URI DEFAULT_TYPE = URI.create(PROBLEM_BASE_URL + "/problem-with-message"); 11 | public static final URI CONSTRAINT_VIOLATION_TYPE = URI.create(PROBLEM_BASE_URL + "/constraint-violation"); 12 | 13 | private ErrorConstants() {} 14 | } 15 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/main/java/com/okta/developer/blog/web/rest/errors/FieldErrorVM.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.blog.web.rest.errors; 2 | 3 | import java.io.Serializable; 4 | 5 | public class FieldErrorVM implements Serializable { 6 | 7 | private static final long serialVersionUID = 1L; 8 | 9 | private final String objectName; 10 | 11 | private final String field; 12 | 13 | private final String message; 14 | 15 | public FieldErrorVM(String dto, String field, String message) { 16 | this.objectName = dto; 17 | this.field = field; 18 | this.message = message; 19 | } 20 | 21 | public String getObjectName() { 22 | return objectName; 23 | } 24 | 25 | public String getField() { 26 | return field; 27 | } 28 | 29 | public String getMessage() { 30 | return message; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/main/java/com/okta/developer/blog/web/rest/errors/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Specific errors used with Zalando's "problem-spring-web" library. 3 | * 4 | * More information on https://github.com/zalando/problem-spring-web 5 | */ 6 | package com.okta.developer.blog.web.rest.errors; 7 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/main/java/com/okta/developer/blog/web/rest/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Spring MVC REST controllers. 3 | */ 4 | package com.okta.developer.blog.web.rest; 5 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/main/java/com/okta/developer/blog/web/rest/vm/ManagedUserVM.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.blog.web.rest.vm; 2 | 3 | import com.okta.developer.blog.service.dto.AdminUserDTO; 4 | 5 | /** 6 | * View Model extending the AdminUserDTO, which is meant to be used in the user management UI. 7 | */ 8 | public class ManagedUserVM extends AdminUserDTO { 9 | 10 | public ManagedUserVM() { 11 | // Empty constructor needed for Jackson. 12 | } 13 | 14 | // prettier-ignore 15 | @Override 16 | public String toString() { 17 | return "ManagedUserVM{" + super.toString() + "} "; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/main/java/com/okta/developer/blog/web/rest/vm/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * View Models used by Spring MVC REST controllers. 3 | */ 4 | package com.okta.developer.blog.web.rest.vm; 5 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/main/resources/banner.txt: -------------------------------------------------------------------------------- 1 | 2 | ${AnsiColor.GREEN} ██╗${AnsiColor.RED} ██╗ ██╗ ████████╗ ███████╗ ██████╗ ████████╗ ████████╗ ███████╗ 3 | ${AnsiColor.GREEN} ██║${AnsiColor.RED} ██║ ██║ ╚══██╔══╝ ██╔═══██╗ ██╔════╝ ╚══██╔══╝ ██╔═════╝ ██╔═══██╗ 4 | ${AnsiColor.GREEN} ██║${AnsiColor.RED} ████████║ ██║ ███████╔╝ ╚█████╗ ██║ ██████╗ ███████╔╝ 5 | ${AnsiColor.GREEN}██╗ ██║${AnsiColor.RED} ██╔═══██║ ██║ ██╔════╝ ╚═══██╗ ██║ ██╔═══╝ ██╔══██║ 6 | ${AnsiColor.GREEN}╚██████╔╝${AnsiColor.RED} ██║ ██║ ████████╗ ██║ ██████╔╝ ██║ ████████╗ ██║ ╚██╗ 7 | ${AnsiColor.GREEN} ╚═════╝ ${AnsiColor.RED} ╚═╝ ╚═╝ ╚═══════╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══════╝ ╚═╝ ╚═╝ 8 | 9 | ${AnsiColor.BRIGHT_BLUE}:: JHipster 🤓 :: Running Spring Boot ${spring-boot.version} :: 10 | :: https://www.jhipster.tech ::${AnsiColor.DEFAULT} 11 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/main/resources/config/bootstrap-prod.yml: -------------------------------------------------------------------------------- 1 | # =================================================================== 2 | # Spring Cloud Config bootstrap configuration for the "prod" profile 3 | # =================================================================== 4 | 5 | spring: 6 | cloud: 7 | config: 8 | fail-fast: true 9 | retry: 10 | initial-interval: 1000 11 | max-interval: 2000 12 | max-attempts: 100 13 | uri: http://admin:${jhipster.registry.password}@localhost:8761/config 14 | # name of the config server's property source (file.yml) that we want to use 15 | name: blog 16 | profile: prod # profile(s) of the property source 17 | label: main # toggle to switch to a different version of the configuration as stored in git 18 | # it can be set to any label, branch or commit of the configuration source Git repository 19 | 20 | jhipster: 21 | registry: 22 | password: admin 23 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/main/resources/config/neo4j/migrations/user__admin.json: -------------------------------------------------------------------------------- 1 | { 2 | "login": "admin", 3 | 4 | "first_name": "Administrator", 5 | "last_name": "Administrator", 6 | "email": "admin@localhost", 7 | "activated": true, 8 | "lang_key": "en", 9 | "created_by": "system", 10 | "last_modified_by": "system", 11 | "authorities": ["ROLE_USER", "ROLE_ADMIN"], 12 | "_class": "com.okta.developer.blog.domain.User" 13 | } 14 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/main/resources/config/neo4j/migrations/user__user.json: -------------------------------------------------------------------------------- 1 | { 2 | "login": "user", 3 | 4 | "first_name": "User", 5 | "last_name": "User", 6 | "email": "user@localhost", 7 | "activated": true, 8 | "lang_key": "en", 9 | "created_by": "system", 10 | "last_modified_by": "system", 11 | "authorities": ["ROLE_USER"], 12 | "_class": "com.okta.developer.blog.domain.User" 13 | } 14 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/main/resources/config/tls/keystore.p12: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oktadev/auth0-java-microservices-examples/953224d0ebd0bd801a2c186c8dd2b464a48b3a6a/reactive-jhipster/blog/src/main/resources/config/tls/keystore.p12 -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/main/resources/i18n/messages.properties: -------------------------------------------------------------------------------- 1 | # Error page 2 | error.title=Your request cannot be processed 3 | error.subtitle=Sorry, an error has occurred. 4 | error.status=Status: 5 | error.message=Message: 6 | 7 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/main/resources/i18n/messages_en.properties: -------------------------------------------------------------------------------- 1 | # Error page 2 | error.title=Your request cannot be processed 3 | error.subtitle=Sorry, an error has occurred. 4 | error.status=Status: 5 | error.message=Message: 6 | 7 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/test/java/com/okta/developer/blog/config/AsyncSyncConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.blog.config; 2 | 3 | import java.util.concurrent.Executor; 4 | import org.springframework.context.annotation.Bean; 5 | import org.springframework.context.annotation.Configuration; 6 | import org.springframework.context.annotation.Primary; 7 | import org.springframework.core.task.SyncTaskExecutor; 8 | 9 | @Configuration 10 | public class AsyncSyncConfiguration { 11 | 12 | @Bean(name = "taskExecutor") 13 | public Executor taskExecutor() { 14 | return new SyncTaskExecutor(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/test/java/com/okta/developer/blog/config/EmbeddedNeo4j.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.blog.config; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Target(ElementType.TYPE) 9 | @Retention(RetentionPolicy.RUNTIME) 10 | public @interface EmbeddedNeo4j { 11 | } 12 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/test/java/com/okta/developer/blog/config/JHipsterBlockHoundIntegration.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.blog.config; 2 | 3 | import reactor.blockhound.BlockHound; 4 | import reactor.blockhound.integration.BlockHoundIntegration; 5 | 6 | public class JHipsterBlockHoundIntegration implements BlockHoundIntegration { 7 | 8 | @Override 9 | public void applyTo(BlockHound.Builder builder) { 10 | builder.allowBlockingCallsInside("org.springframework.validation.beanvalidation.SpringValidatorAdapter", "validate"); 11 | builder.allowBlockingCallsInside("com.okta.developer.blog.service.MailService", "sendEmailFromTemplate"); 12 | builder.allowBlockingCallsInside("com.okta.developer.blog.security.DomainUserDetailsService", "createSpringSecurityUser"); 13 | builder.allowBlockingCallsInside("org.springframework.data.neo4j.core.PropertyFilterSupport", "getInputProperties"); 14 | builder.allowBlockingCallsInside("org.springframework.web.reactive.result.method.InvocableHandlerMethod", "invoke"); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/test/java/com/okta/developer/blog/config/SpringBootTestClassOrderer.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.blog.config; 2 | 3 | import com.okta.developer.blog.IntegrationTest; 4 | import java.util.Comparator; 5 | import org.junit.jupiter.api.ClassDescriptor; 6 | import org.junit.jupiter.api.ClassOrderer; 7 | import org.junit.jupiter.api.ClassOrdererContext; 8 | 9 | public class SpringBootTestClassOrderer implements ClassOrderer { 10 | 11 | @Override 12 | public void orderClasses(ClassOrdererContext context) { 13 | context.getClassDescriptors().sort(Comparator.comparingInt(SpringBootTestClassOrderer::getOrder)); 14 | } 15 | 16 | private static int getOrder(ClassDescriptor classDescriptor) { 17 | if (classDescriptor.findAnnotation(IntegrationTest.class).isPresent()) { 18 | return 2; 19 | } 20 | return 1; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/test/java/com/okta/developer/blog/domain/BlogTest.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.blog.domain; 2 | 3 | import static org.assertj.core.api.Assertions.assertThat; 4 | 5 | import com.okta.developer.blog.web.rest.TestUtil; 6 | import org.junit.jupiter.api.Test; 7 | 8 | class BlogTest { 9 | 10 | @Test 11 | void equalsVerifier() throws Exception { 12 | TestUtil.equalsVerifier(Blog.class); 13 | Blog blog1 = new Blog(); 14 | blog1.setId("id1"); 15 | Blog blog2 = new Blog(); 16 | blog2.setId(blog1.getId()); 17 | assertThat(blog1).isEqualTo(blog2); 18 | blog2.setId("id2"); 19 | assertThat(blog1).isNotEqualTo(blog2); 20 | blog1.setId(null); 21 | assertThat(blog1).isNotEqualTo(blog2); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/test/java/com/okta/developer/blog/domain/PostTest.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.blog.domain; 2 | 3 | import static org.assertj.core.api.Assertions.assertThat; 4 | 5 | import com.okta.developer.blog.web.rest.TestUtil; 6 | import org.junit.jupiter.api.Test; 7 | 8 | class PostTest { 9 | 10 | @Test 11 | void equalsVerifier() throws Exception { 12 | TestUtil.equalsVerifier(Post.class); 13 | Post post1 = new Post(); 14 | post1.setId("id1"); 15 | Post post2 = new Post(); 16 | post2.setId(post1.getId()); 17 | assertThat(post1).isEqualTo(post2); 18 | post2.setId("id2"); 19 | assertThat(post1).isNotEqualTo(post2); 20 | post1.setId(null); 21 | assertThat(post1).isNotEqualTo(post2); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/test/java/com/okta/developer/blog/domain/TagTest.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.blog.domain; 2 | 3 | import static org.assertj.core.api.Assertions.assertThat; 4 | 5 | import com.okta.developer.blog.web.rest.TestUtil; 6 | import org.junit.jupiter.api.Test; 7 | 8 | class TagTest { 9 | 10 | @Test 11 | void equalsVerifier() throws Exception { 12 | TestUtil.equalsVerifier(Tag.class); 13 | Tag tag1 = new Tag(); 14 | tag1.setId("id1"); 15 | Tag tag2 = new Tag(); 16 | tag2.setId(tag1.getId()); 17 | assertThat(tag1).isEqualTo(tag2); 18 | tag2.setId("id2"); 19 | assertThat(tag1).isNotEqualTo(tag2); 20 | tag1.setId(null); 21 | assertThat(tag1).isNotEqualTo(tag2); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/test/resources/META-INF/services/reactor.blockhound.integration.BlockHoundIntegration: -------------------------------------------------------------------------------- 1 | com.okta.developer.blog.config.JHipsterBlockHoundIntegration 2 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/test/resources/META-INF/spring.factories: -------------------------------------------------------------------------------- 1 | org.springframework.test.context.ContextCustomizerFactory = com.okta.developer.blog.config.TestContainersSpringContextCustomizerFactory 2 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/test/resources/config/bootstrap.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | cloud: 3 | config: 4 | enabled: false 5 | -------------------------------------------------------------------------------- /reactive-jhipster/blog/src/test/resources/junit-platform.properties: -------------------------------------------------------------------------------- 1 | junit.jupiter.execution.timeout.default = 15 s 2 | junit.jupiter.execution.timeout.testable.method.default = 15 s 3 | junit.jupiter.execution.timeout.beforeall.method.default = 60 s 4 | junit.jupiter.testclass.order.default=com.okta.developer.blog.config.SpringBootTestClassOrderer 5 | -------------------------------------------------------------------------------- /reactive-jhipster/docker-compose/.yo-rc.json: -------------------------------------------------------------------------------- 1 | { 2 | "generator-jhipster": { 3 | "appsFolders": ["gateway", "blog", "store"], 4 | "clusteredDbApps": [], 5 | "deploymentType": "docker-compose", 6 | "directoryPath": "../", 7 | "dockerRepositoryName": "mraible", 8 | "gatewayType": "SpringCloudGateway", 9 | "jhipsterVersion": "7.9.3", 10 | "jwtSecretKey": "NjhjZWU2YTY2ODAxNGQ2M2QxNmY3YzkxMzNlMTY2NWM5MzkyZDExZmJjZWU5YzdhNzUyNmRlNTdmYzFiNmNjY2Q1OWJlMjQyNTJkMTkyOTRhYTVkZTk3M2QzYmNjODkyMmQ0Yg==", 11 | "monitoring": "no", 12 | "serviceDiscoveryType": "eureka" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /reactive-jhipster/docker-compose/README-DOCKER-COMPOSE.md: -------------------------------------------------------------------------------- 1 | # JHipster generated Docker-Compose configuration 2 | 3 | ## Usage 4 | 5 | Launch all your infrastructure by running: `docker compose up -d`. 6 | 7 | ## Configured Docker services 8 | 9 | ### Service registry and configuration server: 10 | 11 | - [JHipster Registry](http://localhost:8761) 12 | 13 | ### Applications and dependencies: 14 | 15 | - gateway (gateway application) 16 | - gateway's postgresql database 17 | - blog (microservice application) 18 | - blog's neo4j database 19 | - store (microservice application) 20 | - store's mongodb database 21 | 22 | ### Additional Services: 23 | 24 | - [Keycloak server](http://localhost:9080) 25 | -------------------------------------------------------------------------------- /reactive-jhipster/docker-compose/central-server-config/application.yml: -------------------------------------------------------------------------------- 1 | #common configuration shared between all applications 2 | configserver: 3 | name: Service Registry 4 | status: Connected to the JHipster Registry running in Docker 5 | 6 | jhipster: 7 | security: 8 | oauth2: 9 | audience: 10 | - https://dev-06bzs1cu.us.auth0.com/api/v2/ 11 | 12 | spring: 13 | security: 14 | oauth2: 15 | client: 16 | provider: 17 | oidc: 18 | issuer-uri: https://dev-06bzs1cu.us.auth0.com/ 19 | registration: 20 | oidc: 21 | client-id: 9PUjplMxqFdNH62A55k1NJpBpTKqvSLl 22 | client-secret: bAE7eONB320ORek88zc2JD9rqSZZdGK2L1Zvc4KXFG2NrHvSr-yxaqanVsXBOnVN 23 | 24 | eureka: 25 | client: 26 | service-url: 27 | defaultZone: http://admin:${jhipster.registry.password}@jhipster-registry:8761/eureka/ 28 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig helps developers define and maintain consistent 2 | # coding styles between different editors and IDEs 3 | # editorconfig.org 4 | 5 | root = true 6 | 7 | [*] 8 | 9 | # We recommend you to keep these unchanged 10 | end_of_line = lf 11 | charset = utf-8 12 | trim_trailing_whitespace = true 13 | insert_final_newline = true 14 | 15 | # Change these settings to your own preference 16 | indent_style = space 17 | indent_size = 4 18 | 19 | [*.{ts,tsx,js,jsx,json,css,scss,yml,html,vue}] 20 | indent_size = 2 21 | 22 | [*.md] 23 | trim_trailing_whitespace = false 24 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/.eslintignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | src/main/docker/ 3 | src/test/javascript/jest.conf.js 4 | webpack/ 5 | target/ 6 | build/ 7 | node/ 8 | postcss.config.js 9 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/.eslintrc.js: -------------------------------------------------------------------------------- 1 | require('@rushstack/eslint-patch/modern-module-resolution'); 2 | 3 | module.exports = { 4 | root: true, 5 | env: { 6 | node: true, 7 | }, 8 | extends: ['plugin:vue/essential', '@vue/eslint-config-typescript/recommended', '@vue/eslint-config-prettier'], 9 | parserOptions: { 10 | ecmaVersion: 2020, 11 | project: ['./tsconfig.json', './tsconfig.spec.json', './src/test/javascript/cypress/tsconfig.json'], 12 | }, 13 | rules: { 14 | 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', 15 | 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off', 16 | 'vue/multi-word-component-names': 'off', 17 | '@typescript-eslint/no-explicit-any': 'off', 18 | '@typescript-eslint/no-unused-vars': 'off', 19 | '@typescript-eslint/explicit-module-boundary-types': 'off', 20 | '@typescript-eslint/no-empty-function': 'off', 21 | '@typescript-eslint/ban-ts-comment': 'off', 22 | '@typescript-eslint/no-var-requires': 'off', 23 | }, 24 | ignorePatterns: ['build/'], 25 | }; 26 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/.jhipster/Blog.json: -------------------------------------------------------------------------------- 1 | { 2 | "applications": ["gateway", "blog"], 3 | "changelogDate": "20230228060241", 4 | "clientRootFolder": "blog", 5 | "databaseType": "sql", 6 | "dto": "no", 7 | "embedded": false, 8 | "entityTableName": "blog", 9 | "fields": [ 10 | { 11 | "fieldName": "name", 12 | "fieldType": "String", 13 | "fieldValidateRules": ["required", "minlength"], 14 | "fieldValidateRulesMinlength": "3" 15 | }, 16 | { 17 | "fieldName": "handle", 18 | "fieldType": "String", 19 | "fieldValidateRules": ["required", "minlength"], 20 | "fieldValidateRulesMinlength": "2" 21 | } 22 | ], 23 | "fluentMethods": true, 24 | "jpaMetamodelFiltering": false, 25 | "microserviceName": "blog", 26 | "name": "Blog", 27 | "pagination": "no", 28 | "readOnly": false, 29 | "relationships": [ 30 | { 31 | "otherEntityField": "login", 32 | "otherEntityName": "user", 33 | "relationshipName": "user", 34 | "relationshipType": "many-to-one" 35 | } 36 | ], 37 | "searchEngine": "no", 38 | "service": "no" 39 | } 40 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/.jhipster/Product.json: -------------------------------------------------------------------------------- 1 | { 2 | "applications": ["gateway", "store"], 3 | "changelogDate": "20230228060541", 4 | "clientRootFolder": "store", 5 | "databaseType": "sql", 6 | "dto": "no", 7 | "embedded": false, 8 | "entityTableName": "product", 9 | "fields": [ 10 | { 11 | "fieldName": "title", 12 | "fieldType": "String", 13 | "fieldValidateRules": ["required"] 14 | }, 15 | { 16 | "fieldName": "price", 17 | "fieldType": "BigDecimal", 18 | "fieldValidateRules": ["required", "min"], 19 | "fieldValidateRulesMin": "0" 20 | }, 21 | { 22 | "fieldName": "image", 23 | "fieldType": "byte[]", 24 | "fieldTypeBlobContent": "image" 25 | } 26 | ], 27 | "fluentMethods": true, 28 | "jpaMetamodelFiltering": false, 29 | "microserviceName": "store", 30 | "name": "Product", 31 | "pagination": "pagination", 32 | "readOnly": false, 33 | "relationships": [], 34 | "searchEngine": "no", 35 | "service": "no" 36 | } 37 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/.jhipster/Tag.json: -------------------------------------------------------------------------------- 1 | { 2 | "applications": ["gateway", "blog"], 3 | "changelogDate": "20230228060441", 4 | "clientRootFolder": "blog", 5 | "databaseType": "sql", 6 | "dto": "no", 7 | "embedded": false, 8 | "entityTableName": "tag", 9 | "fields": [ 10 | { 11 | "fieldName": "name", 12 | "fieldType": "String", 13 | "fieldValidateRules": ["required", "minlength"], 14 | "fieldValidateRulesMinlength": "2" 15 | } 16 | ], 17 | "fluentMethods": true, 18 | "jpaMetamodelFiltering": false, 19 | "microserviceName": "blog", 20 | "name": "Tag", 21 | "pagination": "infinite-scroll", 22 | "readOnly": false, 23 | "relationships": [ 24 | { 25 | "otherEntityName": "post", 26 | "otherEntityRelationshipName": "tag", 27 | "ownerSide": false, 28 | "relationshipName": "post", 29 | "relationshipType": "many-to-many" 30 | } 31 | ], 32 | "searchEngine": "no", 33 | "service": "no" 34 | } 35 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/.postcssrc.js: -------------------------------------------------------------------------------- 1 | // https://github.com/michael-ciniawsky/postcss-load-config 2 | 3 | module.exports = { 4 | plugins: { 5 | 'postcss-import': {}, 6 | 'postcss-url': {}, 7 | // to edit target browsers: use "browserslist" field in package.json 8 | autoprefixer: {}, 9 | }, 10 | }; 11 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/.prettierignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | target 3 | build 4 | package-lock.json 5 | .git 6 | .mvn 7 | gradle 8 | .gradle 9 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/.prettierrc: -------------------------------------------------------------------------------- 1 | # Prettier configuration 2 | 3 | printWidth: 140 4 | singleQuote: true 5 | tabWidth: 2 6 | useTabs: false 7 | 8 | # js and ts rules: 9 | arrowParens: avoid 10 | 11 | # jsx and tsx rules: 12 | bracketSameLine: false 13 | 14 | # java rules: 15 | overrides: 16 | - files: "*.java" 17 | options: 18 | tabWidth: 4 19 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/checkstyle.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/cypress-audits.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'cypress'; 2 | import { defaultConfig } from './cypress.config'; 3 | 4 | export default defineConfig({ 5 | ...defaultConfig, 6 | e2e: { 7 | ...defaultConfig.e2e, 8 | specPattern: 'src/test/javascript/cypress/e2e/**/*.audits.ts', 9 | }, 10 | }); 11 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/cypress.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'cypress'; 2 | 3 | export const defaultConfig = { 4 | video: false, 5 | fixturesFolder: 'src/test/javascript/cypress/fixtures', 6 | screenshotsFolder: 'build/cypress/screenshots', 7 | downloadsFolder: 'build/cypress/downloads', 8 | videosFolder: 'build/cypress/videos', 9 | chromeWebSecurity: true, 10 | viewportWidth: 1200, 11 | viewportHeight: 720, 12 | retries: 2, 13 | e2e: { 14 | // We've imported your old cypress plugins here. 15 | // You may want to clean this up later by importing these. 16 | async setupNodeEvents(on, config) { 17 | return (await import('./src/test/javascript/cypress/plugins/index')).default(on, config); 18 | }, 19 | baseUrl: 'http://localhost:8080/', 20 | specPattern: 'src/test/javascript/cypress/e2e/**/*.cy.ts', 21 | supportFile: 'src/test/javascript/cypress/support/index.ts', 22 | }, 23 | }; 24 | 25 | export default defineConfig(defaultConfig); 26 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/gradle/docker.gradle: -------------------------------------------------------------------------------- 1 | jib { 2 | from { 3 | image = "eclipse-temurin:17-jre-focal" 4 | platforms { 5 | platform { 6 | architecture = "${findProperty('jibArchitecture') ?: 'amd64'}" 7 | os = "linux" 8 | } 9 | } 10 | } 11 | to { 12 | image = "gateway:latest" 13 | } 14 | container { 15 | entrypoint = ["bash", "-c", "/entrypoint.sh"] 16 | ports = ["8080"] 17 | environment = [ 18 | SPRING_OUTPUT_ANSI_ENABLED: "ALWAYS", 19 | JHIPSTER_SLEEP: "0" 20 | ] 21 | creationTime = "USE_CURRENT_TIMESTAMP" 22 | user = 1000 23 | } 24 | extraDirectories { 25 | paths = file("src/main/docker/jib") 26 | permissions = ["/entrypoint.sh": "755"] 27 | } 28 | } 29 | 30 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/gradle/sonar.gradle: -------------------------------------------------------------------------------- 1 | jacoco { 2 | toolVersion = "0.8.8" 3 | } 4 | 5 | jacocoTestReport { 6 | executionData tasks.withType(Test) 7 | classDirectories.from = files(sourceSets.main.output.classesDirs) 8 | sourceDirectories.from = files(sourceSets.main.java.srcDirs) 9 | 10 | reports { 11 | xml.enabled = true 12 | } 13 | } 14 | 15 | file("sonar-project.properties").withReader { 16 | Properties sonarProperties = new Properties() 17 | sonarProperties.load(it) 18 | 19 | sonarProperties.each { key, value -> 20 | sonarqube { 21 | properties { 22 | property key, value 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/gradle/war.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: "war" 2 | 3 | bootWar { 4 | mainClass = "com.okta.developer.gateway.GatewayApp" 5 | includes = ["WEB-INF/**", "META-INF/**"] 6 | webXml = file("${project.rootDir}/src/main/webapp/WEB-INF/web.xml") 7 | } 8 | 9 | war { 10 | webAppDirName = "build/resources/main/static/" 11 | webXml = file("${project.rootDir}/src/main/webapp/WEB-INF/web.xml") 12 | enabled = true 13 | archiveExtension = "war.original" 14 | includes = ["WEB-INF/**", "META-INF/**"] 15 | 16 | } 17 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oktadev/auth0-java-microservices-examples/953224d0ebd0bd801a2c186c8dd2b464a48b3a6a/reactive-jhipster/gateway/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /reactive-jhipster/gateway/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/gradle/zipkin.gradle: -------------------------------------------------------------------------------- 1 | dependencies { 2 | implementation "io.micrometer:micrometer-tracing-bridge-brave" 3 | implementation "io.zipkin.reporter2:zipkin-reporter-brave" 4 | } 5 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/docker/central-server-config/README.md: -------------------------------------------------------------------------------- 1 | # Central configuration sources details 2 | 3 | The JHipster-Registry will use the following directories as its configuration source : 4 | 5 | - localhost-config : when running the registry in docker with the jhipster-registry.yml docker-compose file 6 | - docker-config : when running the registry and the app both in docker with the app.yml docker-compose file 7 | 8 | For more info, refer to https://www.jhipster.tech/jhipster-registry/#spring-cloud-config 9 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/docker/central-server-config/docker-config/application.yml: -------------------------------------------------------------------------------- 1 | # Common configuration shared between all applications 2 | configserver: 3 | name: Docker JHipster Registry 4 | status: Connected to the JHipster Registry running in Docker 5 | 6 | jhipster: 7 | security: 8 | authentication: 9 | jwt: 10 | # secret key which should be base64 encoded and changed in production 11 | base64-secret: YzkzNzRiMWVlNTFhZjA4YTY5YjliMmE4NzdlNzRhYWFiZTVjN2VlY2EyMDdhMTk3N2I4M2I3YTNmNjlkM2EyYWJlYTY2YzQyYWY4ZTA5NmQyNDI3NjFkZjNkN2NmMmIzNThhNTg5YzIzYTdmY2NhNzZkOTIxYzliMWQyODgxNzE= 12 | 13 | eureka: 14 | client: 15 | service-url: 16 | defaultZone: http://admin:${jhipster.registry.password}@jhipster-registry:8761/eureka/ 17 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/docker/central-server-config/localhost-config/application.yml: -------------------------------------------------------------------------------- 1 | # Common configuration shared between all applications 2 | configserver: 3 | name: Docker JHipster Registry 4 | status: Connected to the JHipster Registry running in Docker 5 | 6 | jhipster: 7 | security: 8 | oauth2: 9 | audience: https://dev-06bzs1cu.us.auth0.com/api/v2/ 10 | 11 | spring: 12 | security: 13 | oauth2: 14 | client: 15 | provider: 16 | oidc: 17 | issuer-uri: https://dev-06bzs1cu.us.auth0.com/ 18 | registration: 19 | oidc: 20 | client-id: YsdCPZvBvedEJhkaqRm9wwEr79bk0xg5 21 | client-secret: dJdNrvOQkOMI_Ug-pfWMoIf8_ZEYTNYw9R0EZ2wgvIVvPC55xoDq214njokW2ywP 22 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/docker/grafana/provisioning/dashboards/dashboard.yml: -------------------------------------------------------------------------------- 1 | apiVersion: 1 2 | 3 | providers: 4 | - name: 'Prometheus' 5 | orgId: 1 6 | folder: '' 7 | type: file 8 | disableDeletion: false 9 | editable: true 10 | options: 11 | path: /etc/grafana/provisioning/dashboards 12 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/docker/keycloak.yml: -------------------------------------------------------------------------------- 1 | # This configuration is intended for development purpose, it's **your** responsibility to harden it for production 2 | name: gateway 3 | services: 4 | keycloak: 5 | image: quay.io/keycloak/keycloak:20.0.1 6 | command: ['start-dev --import-realm'] 7 | volumes: 8 | - ./realm-config:/opt/keycloak/data/import 9 | environment: 10 | - KC_DB=dev-file 11 | - KEYCLOAK_ADMIN=admin 12 | - KEYCLOAK_ADMIN_PASSWORD=admin 13 | - KC_FEATURES=scripts 14 | - KC_HTTP_PORT=9080 15 | - KC_HTTPS_PORT=9443 16 | # If you want to expose these ports outside your dev PC, 17 | # remove the "127.0.0.1:" prefix 18 | ports: 19 | - 127.0.0.1:9080:9080 20 | - 127.0.0.1:9443:9443 21 | healthcheck: 22 | test: ['CMD', 'curl', '-f', 'http://localhost:9080/realms/jhipster'] 23 | interval: 5s 24 | timeout: 5s 25 | retries: 20 26 | start_period: 10s 27 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/docker/postgresql.yml: -------------------------------------------------------------------------------- 1 | # This configuration is intended for development purpose, it's **your** responsibility to harden it for production 2 | name: gateway 3 | services: 4 | postgresql: 5 | image: postgres:15.2 6 | # volumes: 7 | # - ~/volumes/jhipster/gateway/postgresql/:/var/lib/postgresql/data/ 8 | environment: 9 | - POSTGRES_USER=gateway 10 | - POSTGRES_PASSWORD= 11 | - POSTGRES_HOST_AUTH_METHOD=trust 12 | healthcheck: 13 | test: ['CMD-SHELL', 'pg_isready'] 14 | interval: 5s 15 | timeout: 5s 16 | retries: 10 17 | # If you want to expose these ports outside your dev PC, 18 | # remove the "127.0.0.1:" prefix 19 | ports: 20 | - 127.0.0.1:5432:5432 21 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/docker/services.yml: -------------------------------------------------------------------------------- 1 | # This configuration is intended for development purpose, it's **your** responsibility to harden it for production 2 | name: gateway 3 | services: 4 | postgresql: 5 | extends: 6 | file: ./postgresql.yml 7 | service: postgresql 8 | keycloak: 9 | extends: 10 | file: ./keycloak.yml 11 | service: keycloak 12 | jhipster-registry: 13 | extends: 14 | file: ./jhipster-registry.yml 15 | service: jhipster-registry 16 | depends_on: 17 | keycloak: 18 | condition: service_healthy 19 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/docker/sonar.yml: -------------------------------------------------------------------------------- 1 | # This configuration is intended for development purpose, it's **your** responsibility to harden it for production 2 | name: gateway 3 | services: 4 | sonar: 5 | container_name: sonarqube 6 | image: sonarqube:9.9.0-community 7 | # Forced authentication redirect for UI is turned off for out of the box experience while trying out SonarQube 8 | # For real use cases delete SONAR_FORCEAUTHENTICATION variable or set SONAR_FORCEAUTHENTICATION=true 9 | environment: 10 | - SONAR_FORCEAUTHENTICATION=false 11 | # If you want to expose these ports outside your dev PC, 12 | # remove the "127.0.0.1:" prefix 13 | ports: 14 | - 127.0.0.1:9001:9000 15 | - 127.0.0.1:9000:9000 16 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/docker/zipkin.yml: -------------------------------------------------------------------------------- 1 | # This configuration is intended for development purpose, it's **your** responsibility to harden it for production 2 | name: gateway 3 | services: 4 | zipkin: 5 | image: openzipkin/zipkin:2.24 6 | ports: 7 | - 127.0.0.1:9411:9411 8 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/java/com/okta/developer/gateway/GeneratedByJHipster.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.gateway; 2 | 3 | import jakarta.annotation.Generated; 4 | import java.lang.annotation.ElementType; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | import java.lang.annotation.Target; 8 | 9 | @Generated(value = "JHipster", comments = "Generated by JHipster 7.9.3") 10 | @Retention(RetentionPolicy.SOURCE) 11 | @Target({ ElementType.TYPE }) 12 | public @interface GeneratedByJHipster { 13 | } 14 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/java/com/okta/developer/gateway/config/ApplicationProperties.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.gateway.config; 2 | 3 | import org.springframework.boot.context.properties.ConfigurationProperties; 4 | 5 | /** 6 | * Properties specific to Gateway. 7 | *

8 | * Properties are configured in the {@code application.yml} file. 9 | * See {@link tech.jhipster.config.JHipsterProperties} for a good example. 10 | */ 11 | @ConfigurationProperties(prefix = "application", ignoreUnknownFields = false) 12 | public class ApplicationProperties { 13 | // jhipster-needle-application-properties-property 14 | // jhipster-needle-application-properties-property-getter 15 | // jhipster-needle-application-properties-property-class 16 | } 17 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/java/com/okta/developer/gateway/config/Constants.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.gateway.config; 2 | 3 | /** 4 | * Application constants. 5 | */ 6 | public final class Constants { 7 | 8 | // Regex for acceptable logins 9 | public static final String LOGIN_REGEX = "^(?>[a-zA-Z0-9!$&*+=?^_`{|}~.-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*)|(?>[_.@A-Za-z0-9-]+)$"; 10 | 11 | public static final String SYSTEM = "system"; 12 | public static final String DEFAULT_LANGUAGE = "en"; 13 | 14 | private Constants() {} 15 | } 16 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/java/com/okta/developer/gateway/config/DateTimeFormatConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.gateway.config; 2 | 3 | import org.springframework.context.annotation.Configuration; 4 | import org.springframework.format.FormatterRegistry; 5 | import org.springframework.format.datetime.standard.DateTimeFormatterRegistrar; 6 | import org.springframework.web.reactive.config.WebFluxConfigurer; 7 | 8 | /** 9 | * Configure the converters to use the ISO format for dates by default. 10 | */ 11 | @Configuration 12 | public class DateTimeFormatConfiguration implements WebFluxConfigurer { 13 | 14 | @Override 15 | public void addFormatters(FormatterRegistry registry) { 16 | DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar(); 17 | registrar.setUseIsoFormat(true); 18 | registrar.registerFormatters(registry); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/java/com/okta/developer/gateway/config/JacksonConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.gateway.config; 2 | 3 | import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; 4 | import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; 5 | import org.springframework.context.annotation.Bean; 6 | import org.springframework.context.annotation.Configuration; 7 | 8 | @Configuration 9 | public class JacksonConfiguration { 10 | 11 | /** 12 | * Support for Java date and time API. 13 | * @return the corresponding Jackson module. 14 | */ 15 | @Bean 16 | public JavaTimeModule javaTimeModule() { 17 | return new JavaTimeModule(); 18 | } 19 | 20 | @Bean 21 | public Jdk8Module jdk8TimeModule() { 22 | return new Jdk8Module(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/java/com/okta/developer/gateway/config/LoggingAspectConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.gateway.config; 2 | 3 | import com.okta.developer.gateway.aop.logging.LoggingAspect; 4 | import org.springframework.context.annotation.*; 5 | import org.springframework.core.env.Environment; 6 | import tech.jhipster.config.JHipsterConstants; 7 | 8 | @Configuration 9 | @EnableAspectJAutoProxy 10 | public class LoggingAspectConfiguration { 11 | 12 | @Bean 13 | @Profile(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT) 14 | public LoggingAspect loggingAspect(Environment env) { 15 | return new LoggingAspect(env); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/java/com/okta/developer/gateway/config/ReactorConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.gateway.config; 2 | 3 | import org.springframework.context.annotation.Configuration; 4 | import org.springframework.context.annotation.Profile; 5 | import reactor.core.publisher.Hooks; 6 | import tech.jhipster.config.JHipsterConstants; 7 | 8 | @Configuration 9 | @Profile("!" + JHipsterConstants.SPRING_PROFILE_PRODUCTION) 10 | public class ReactorConfiguration { 11 | 12 | public ReactorConfiguration() { 13 | Hooks.onOperatorDebug(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/java/com/okta/developer/gateway/config/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Spring Framework configuration files. 3 | */ 4 | package com.okta.developer.gateway.config; 5 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/java/com/okta/developer/gateway/domain/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * JPA domain objects. 3 | */ 4 | package com.okta.developer.gateway.domain; 5 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/java/com/okta/developer/gateway/repository/AuthorityRepository.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.gateway.repository; 2 | 3 | import com.okta.developer.gateway.domain.Authority; 4 | import org.springframework.data.r2dbc.repository.R2dbcRepository; 5 | 6 | /** 7 | * Spring Data R2DBC repository for the {@link Authority} entity. 8 | */ 9 | public interface AuthorityRepository extends R2dbcRepository {} 10 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/java/com/okta/developer/gateway/repository/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Spring Data JPA repositories. 3 | */ 4 | package com.okta.developer.gateway.repository; 5 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/java/com/okta/developer/gateway/security/AuthoritiesConstants.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.gateway.security; 2 | 3 | /** 4 | * Constants for Spring Security authorities. 5 | */ 6 | public final class AuthoritiesConstants { 7 | 8 | public static final String ADMIN = "ROLE_ADMIN"; 9 | 10 | public static final String USER = "ROLE_USER"; 11 | 12 | public static final String ANONYMOUS = "ROLE_ANONYMOUS"; 13 | 14 | private AuthoritiesConstants() {} 15 | } 16 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/java/com/okta/developer/gateway/security/oauth2/JwtGrantedAuthorityConverter.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.gateway.security.oauth2; 2 | 3 | import com.okta.developer.gateway.security.SecurityUtils; 4 | import java.util.Collection; 5 | import org.springframework.core.convert.converter.Converter; 6 | import org.springframework.security.core.GrantedAuthority; 7 | import org.springframework.security.oauth2.jwt.Jwt; 8 | import org.springframework.stereotype.Component; 9 | 10 | @Component 11 | public class JwtGrantedAuthorityConverter implements Converter> { 12 | 13 | public JwtGrantedAuthorityConverter() { 14 | // Bean extracting authority. 15 | } 16 | 17 | @Override 18 | public Collection convert(Jwt jwt) { 19 | return SecurityUtils.extractAuthorityFromClaims(jwt.getClaims()); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/java/com/okta/developer/gateway/security/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Spring Security configuration. 3 | */ 4 | package com.okta.developer.gateway.security; 5 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/java/com/okta/developer/gateway/service/dto/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Data Transfer Objects. 3 | */ 4 | package com.okta.developer.gateway.service.dto; 5 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/java/com/okta/developer/gateway/service/mapper/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * MapStruct mappers for mapping domain objects and Data Transfer Objects. 3 | */ 4 | package com.okta.developer.gateway.service.mapper; 5 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/java/com/okta/developer/gateway/service/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Service layer beans. 3 | */ 4 | package com.okta.developer.gateway.service; 5 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/java/com/okta/developer/gateway/web/rest/errors/ErrorConstants.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.gateway.web.rest.errors; 2 | 3 | import java.net.URI; 4 | 5 | public final class ErrorConstants { 6 | 7 | public static final String ERR_CONCURRENCY_FAILURE = "error.concurrencyFailure"; 8 | public static final String ERR_VALIDATION = "error.validation"; 9 | public static final String PROBLEM_BASE_URL = "https://www.jhipster.tech/problem"; 10 | public static final URI DEFAULT_TYPE = URI.create(PROBLEM_BASE_URL + "/problem-with-message"); 11 | public static final URI CONSTRAINT_VIOLATION_TYPE = URI.create(PROBLEM_BASE_URL + "/constraint-violation"); 12 | 13 | private ErrorConstants() {} 14 | } 15 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/java/com/okta/developer/gateway/web/rest/errors/FieldErrorVM.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.gateway.web.rest.errors; 2 | 3 | import java.io.Serializable; 4 | 5 | public class FieldErrorVM implements Serializable { 6 | 7 | private static final long serialVersionUID = 1L; 8 | 9 | private final String objectName; 10 | 11 | private final String field; 12 | 13 | private final String message; 14 | 15 | public FieldErrorVM(String dto, String field, String message) { 16 | this.objectName = dto; 17 | this.field = field; 18 | this.message = message; 19 | } 20 | 21 | public String getObjectName() { 22 | return objectName; 23 | } 24 | 25 | public String getField() { 26 | return field; 27 | } 28 | 29 | public String getMessage() { 30 | return message; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/java/com/okta/developer/gateway/web/rest/errors/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Specific errors used with Zalando's "problem-spring-web" library. 3 | * 4 | * More information on https://github.com/zalando/problem-spring-web 5 | */ 6 | package com.okta.developer.gateway.web.rest.errors; 7 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/java/com/okta/developer/gateway/web/rest/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Spring MVC REST controllers. 3 | */ 4 | package com.okta.developer.gateway.web.rest; 5 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/java/com/okta/developer/gateway/web/rest/vm/ManagedUserVM.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.gateway.web.rest.vm; 2 | 3 | import com.okta.developer.gateway.service.dto.AdminUserDTO; 4 | 5 | /** 6 | * View Model extending the AdminUserDTO, which is meant to be used in the user management UI. 7 | */ 8 | public class ManagedUserVM extends AdminUserDTO { 9 | 10 | public ManagedUserVM() { 11 | // Empty constructor needed for Jackson. 12 | } 13 | 14 | // prettier-ignore 15 | @Override 16 | public String toString() { 17 | return "ManagedUserVM{" + super.toString() + "} "; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/java/com/okta/developer/gateway/web/rest/vm/RouteVM.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.gateway.web.rest.vm; 2 | 3 | import java.util.List; 4 | import org.springframework.cloud.client.ServiceInstance; 5 | 6 | /** 7 | * View Model that stores a route managed by the Gateway. 8 | */ 9 | public class RouteVM { 10 | 11 | private String path; 12 | 13 | private String serviceId; 14 | 15 | private List serviceInstances; 16 | 17 | public String getPath() { 18 | return path; 19 | } 20 | 21 | public void setPath(String path) { 22 | this.path = path; 23 | } 24 | 25 | public String getServiceId() { 26 | return serviceId; 27 | } 28 | 29 | public void setServiceId(String serviceId) { 30 | this.serviceId = serviceId; 31 | } 32 | 33 | public List getServiceInstances() { 34 | return serviceInstances; 35 | } 36 | 37 | public void setServiceInstances(List serviceInstances) { 38 | this.serviceInstances = serviceInstances; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/java/com/okta/developer/gateway/web/rest/vm/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * View Models used by Spring MVC REST controllers. 3 | */ 4 | package com.okta.developer.gateway.web.rest.vm; 5 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/resources/.h2.server.properties: -------------------------------------------------------------------------------- 1 | #H2 Server Properties 2 | 0=JHipster H2 (Disk)|org.h2.Driver|jdbc\:h2\:file\:./build/h2db/db/gateway|gateway 3 | webAllowOthers=true 4 | webPort=8092 5 | webSSL=false 6 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/resources/banner.txt: -------------------------------------------------------------------------------- 1 | 2 | ${AnsiColor.GREEN} ██╗${AnsiColor.BLUE} ██╗ ██╗ ████████╗ ███████╗ ██████╗ ████████╗ ████████╗ ████${AnsiColor.GREEN}███╗ 3 | ${AnsiColor.GREEN} ██║ ██║ ${AnsiColor.BLUE} ██║ ╚══██╔══╝ ██╔═══██╗ ██╔════╝ ╚══██╔══╝ ██╔══${AnsiColor.GREEN}═══╝ ██╔═══██╗ 4 | ${AnsiColor.GREEN} ██║ ████████║${AnsiColor.BLUE} ██║ ███████╔╝ ╚█████╗ ██║ ${AnsiColor.GREEN} ██████╗ ███████╔╝ 5 | ${AnsiColor.GREEN}██╗ ██║ ██╔═══██║ ██║ ${AnsiColor.BLUE} ██╔════╝ ╚═══██╗ ${AnsiColor.GREEN}██║ ██╔═══╝ ██╔══██║ 6 | ${AnsiColor.GREEN}╚██████╔╝ ██║ ██║ ████████╗ ██║ ${AnsiColor.BLUE} ██████${AnsiColor.GREEN}╔╝ ██║ ████████╗ ██║ ╚██╗ 7 | ${AnsiColor.GREEN} ╚═════╝ ╚═╝ ╚═╝ ╚═══════╝ ╚═╝ ${AnsiColor.BLUE} ╚═${AnsiColor.GREEN}════╝ ╚═╝ ╚═══════╝ ╚═╝ ╚═╝ 8 | 9 | ${AnsiColor.BRIGHT_BLUE}:: JHipster 🤓 :: Running Spring Boot ${spring-boot.version} :: 10 | :: https://www.jhipster.tech ::${AnsiColor.DEFAULT} 11 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/resources/config/bootstrap-prod.yml: -------------------------------------------------------------------------------- 1 | # =================================================================== 2 | # Spring Cloud Config bootstrap configuration for the "prod" profile 3 | # =================================================================== 4 | 5 | spring: 6 | cloud: 7 | config: 8 | fail-fast: true 9 | retry: 10 | initial-interval: 1000 11 | max-interval: 2000 12 | max-attempts: 100 13 | uri: http://admin:${jhipster.registry.password}@localhost:8761/config 14 | # name of the config server's property source (file.yml) that we want to use 15 | name: gateway 16 | profile: prod # profile(s) of the property source 17 | label: main # toggle to switch to a different version of the configuration as stored in git 18 | # it can be set to any label, branch or commit of the configuration source Git repository 19 | 20 | jhipster: 21 | registry: 22 | password: admin 23 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/resources/config/liquibase/data/authority.csv: -------------------------------------------------------------------------------- 1 | name 2 | ROLE_ADMIN 3 | ROLE_USER 4 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/resources/config/tls/keystore.p12: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oktadev/auth0-java-microservices-examples/953224d0ebd0bd801a2c186c8dd2b464a48b3a6a/reactive-jhipster/gateway/src/main/resources/config/tls/keystore.p12 -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/resources/i18n/messages.properties: -------------------------------------------------------------------------------- 1 | # Error page 2 | error.title=Your request cannot be processed 3 | error.subtitle=Sorry, an error has occurred. 4 | error.status=Status: 5 | error.message=Message: 6 | 7 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/resources/i18n/messages_en.properties: -------------------------------------------------------------------------------- 1 | # Error page 2 | error.title=Your request cannot be processed 3 | error.subtitle=Sorry, an error has occurred. 4 | error.status=Status: 5 | error.message=Message: 6 | 7 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/WEB-INF/web.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | html 10 | text/html;charset=utf-8 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/app/account/login.service.ts: -------------------------------------------------------------------------------- 1 | import axios, { AxiosPromise } from 'axios'; 2 | 3 | export default class LoginService { 4 | public login(loc = window.location) { 5 | const port = loc.port ? ':' + loc.port : ''; 6 | let contextPath = location.pathname; 7 | if (contextPath.endsWith('accessdenied')) { 8 | contextPath = contextPath.substring(0, contextPath.indexOf('accessdenied')); 9 | } 10 | if (contextPath.endsWith('forbidden')) { 11 | contextPath = contextPath.substring(0, contextPath.indexOf('forbidden')); 12 | } 13 | if (!contextPath.endsWith('/')) { 14 | contextPath = contextPath + '/'; 15 | } 16 | // If you have configured multiple OIDC providers, then, you can update this URL to /login. 17 | // It will show a Spring Security generated login page with links to configured OIDC providers. 18 | loc.href = `//${loc.hostname}${port}${contextPath}oauth2/authorization/oidc`; 19 | } 20 | 21 | public logout(): AxiosPromise { 22 | return axios.post('api/logout'); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/app/admin/docs/docs.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Vue } from 'vue-property-decorator'; 2 | 3 | @Component 4 | export default class JhiDocs extends Vue {} 5 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/app/admin/docs/docs.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/app/admin/gateway/gateway.component.ts: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import { Component, Inject } from 'vue-property-decorator'; 3 | import GatewayService from './gateway.service'; 4 | 5 | @Component 6 | export default class JhiGatewayComponent extends Vue { 7 | public gatewayRoutes: any[] = []; 8 | public updatingRoutes = false; 9 | @Inject('gatewayService') private gatewayService: () => GatewayService; 10 | 11 | public mounted(): void { 12 | this.refresh(); 13 | } 14 | 15 | public refresh(): void { 16 | this.updatingRoutes = true; 17 | this.gatewayService() 18 | .findAll() 19 | .then(res => { 20 | this.gatewayRoutes = res.data; 21 | this.updatingRoutes = false; 22 | }); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/app/admin/gateway/gateway.service.ts: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | 3 | export default class GatewayService { 4 | public findAll(): Promise { 5 | return new Promise(resolve => { 6 | axios.get('api/gateway/routes/').then(res => { 7 | resolve(res); 8 | }); 9 | }); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/app/admin/logs/logs.service.ts: -------------------------------------------------------------------------------- 1 | import axios, { AxiosPromise } from 'axios'; 2 | import Vue from 'vue'; 3 | import Component from 'vue-class-component'; 4 | 5 | @Component 6 | export default class LogsService extends Vue { 7 | public changeLevel(name: string, configuredLevel: string): AxiosPromise { 8 | return axios.post(`management/loggers/${name}`, { configuredLevel }); 9 | } 10 | 11 | public findAll(): AxiosPromise { 12 | return axios.get('management/loggers'); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/app/admin/metrics/metrics.service.ts: -------------------------------------------------------------------------------- 1 | import axios, { AxiosPromise } from 'axios'; 2 | 3 | export default class MetricsService { 4 | public getMetrics(): AxiosPromise { 5 | return axios.get('management/jhimetrics'); 6 | } 7 | 8 | public retrieveThreadDump(): AxiosPromise { 9 | return axios.get('management/threaddump'); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import Component from 'vue-class-component'; 3 | import Ribbon from '@/core/ribbon/ribbon.vue'; 4 | import JhiFooter from '@/core/jhi-footer/jhi-footer.vue'; 5 | import JhiNavbar from '@/core/jhi-navbar/jhi-navbar.vue'; 6 | 7 | import '@/shared/config/dayjs'; 8 | 9 | @Component({ 10 | components: { 11 | ribbon: Ribbon, 12 | 'jhi-navbar': JhiNavbar, 13 | 14 | 'jhi-footer': JhiFooter, 15 | }, 16 | }) 17 | export default class App extends Vue {} 18 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/app/app.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/app/constants.ts: -------------------------------------------------------------------------------- 1 | // Errors 2 | export const PROBLEM_BASE_URL = 'https://www.jhipster.tech/problem'; 3 | export const EMAIL_ALREADY_USED_TYPE = `${PROBLEM_BASE_URL}/email-already-used`; 4 | export const LOGIN_ALREADY_USED_TYPE = `${PROBLEM_BASE_URL}/login-already-used`; 5 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/app/core/error/error.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/app/core/home/home.component.ts: -------------------------------------------------------------------------------- 1 | import Component from 'vue-class-component'; 2 | import { Inject, Vue } from 'vue-property-decorator'; 3 | import LoginService from '@/account/login.service'; 4 | 5 | @Component 6 | export default class Home extends Vue { 7 | @Inject('loginService') 8 | private loginService: () => LoginService; 9 | 10 | public openLogin(): void { 11 | this.loginService().login(); 12 | } 13 | 14 | public get authenticated(): boolean { 15 | return this.$store.getters.authenticated; 16 | } 17 | 18 | public get username(): string { 19 | return this.$store.getters.account?.login ?? ''; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/app/core/jhi-footer/jhi-footer.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Vue } from 'vue-property-decorator'; 2 | 3 | @Component 4 | export default class JhiFooter extends Vue {} 5 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/app/core/jhi-footer/jhi-footer.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/app/core/ribbon/ribbon.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Vue } from 'vue-property-decorator'; 2 | 3 | @Component 4 | export default class Ribbon extends Vue { 5 | public get ribbonEnv(): string { 6 | return this.$store.getters.ribbonOnProfiles; 7 | } 8 | 9 | public get ribbonEnabled(): boolean { 10 | return this.$store.getters.ribbonOnProfiles && this.$store.getters.activeProfiles.indexOf(this.$store.getters.ribbonOnProfiles) > -1; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/app/declarations.d.ts: -------------------------------------------------------------------------------- 1 | // These constants are injected via webpack environment variables. 2 | // You can add more variables in webpack.common.js or in profile specific webpack..js files. 3 | // If you change the values in the webpack config files, you need to re run webpack to update the application 4 | 5 | declare const SERVER_API_URL: string; 6 | declare const VERSION: string; 7 | declare const I18N_HASH: string; 8 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/app/entities/blog/blog/blog-details.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Vue, Inject } from 'vue-property-decorator'; 2 | 3 | import { IBlog } from '@/shared/model/blog/blog.model'; 4 | import BlogService from './blog.service'; 5 | import AlertService from '@/shared/alert/alert.service'; 6 | 7 | @Component 8 | export default class BlogDetails extends Vue { 9 | @Inject('blogService') private blogService: () => BlogService; 10 | @Inject('alertService') private alertService: () => AlertService; 11 | 12 | public blog: IBlog = {}; 13 | 14 | beforeRouteEnter(to, from, next) { 15 | next(vm => { 16 | if (to.params.blogId) { 17 | vm.retrieveBlog(to.params.blogId); 18 | } 19 | }); 20 | } 21 | 22 | public retrieveBlog(blogId) { 23 | this.blogService() 24 | .find(blogId) 25 | .then(res => { 26 | this.blog = res; 27 | }) 28 | .catch(error => { 29 | this.alertService().showHttpError(this, error.response); 30 | }); 31 | } 32 | 33 | public previousState() { 34 | this.$router.go(-1); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/app/entities/blog/tag/tag-details.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Vue, Inject } from 'vue-property-decorator'; 2 | 3 | import { ITag } from '@/shared/model/blog/tag.model'; 4 | import TagService from './tag.service'; 5 | import AlertService from '@/shared/alert/alert.service'; 6 | 7 | @Component 8 | export default class TagDetails extends Vue { 9 | @Inject('tagService') private tagService: () => TagService; 10 | @Inject('alertService') private alertService: () => AlertService; 11 | 12 | public tag: ITag = {}; 13 | 14 | beforeRouteEnter(to, from, next) { 15 | next(vm => { 16 | if (to.params.tagId) { 17 | vm.retrieveTag(to.params.tagId); 18 | } 19 | }); 20 | } 21 | 22 | public retrieveTag(tagId) { 23 | this.tagService() 24 | .find(tagId) 25 | .then(res => { 26 | this.tag = res; 27 | }) 28 | .catch(error => { 29 | this.alertService().showHttpError(this, error.response); 30 | }); 31 | } 32 | 33 | public previousState() { 34 | this.$router.go(-1); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/app/entities/entities-menu.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Inject, Vue } from 'vue-property-decorator'; 2 | 3 | @Component 4 | export default class EntitiesMenu extends Vue {} 5 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/app/entities/entities-menu.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/app/entities/entities.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Provide, Vue } from 'vue-property-decorator'; 2 | 3 | import UserService from '@/entities/user/user.service'; 4 | import BlogService from './blog/blog/blog.service'; 5 | import PostService from './blog/post/post.service'; 6 | import TagService from './blog/tag/tag.service'; 7 | import ProductService from './store/product/product.service'; 8 | // jhipster-needle-add-entity-service-to-entities-component-import - JHipster will import entities services here 9 | 10 | @Component 11 | export default class Entities extends Vue { 12 | @Provide('userService') private userService = () => new UserService(); 13 | @Provide('blogService') private blogService = () => new BlogService(); 14 | @Provide('postService') private postService = () => new PostService(); 15 | @Provide('tagService') private tagService = () => new TagService(); 16 | @Provide('productService') private productService = () => new ProductService(); 17 | // jhipster-needle-add-entity-service-to-entities-component - JHipster will import entities services here 18 | } 19 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/app/entities/entities.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/app/entities/user/user.service.ts: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | 3 | const baseApiUrl = 'api/users'; 4 | 5 | export default class UserService { 6 | public retrieve(): Promise { 7 | return new Promise((resolve, reject) => { 8 | axios 9 | .get(baseApiUrl) 10 | .then(res => { 11 | resolve(res); 12 | }) 13 | .catch(err => { 14 | reject(err); 15 | }); 16 | }); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/app/router/pages.ts: -------------------------------------------------------------------------------- 1 | import { Authority } from '@/shared/security/authority'; 2 | /* tslint:disable */ 3 | // prettier-ignore 4 | 5 | // jhipster-needle-add-entity-to-router-import - JHipster will import entities to the router here 6 | 7 | export default [ 8 | // jhipster-needle-add-entity-to-router - JHipster will add entities to the router here 9 | ] 10 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/app/shared/config/axios-interceptor.ts: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | 3 | const TIMEOUT = 1000000; 4 | const onRequestSuccess = config => { 5 | config.timeout = TIMEOUT; 6 | config.url = `${SERVER_API_URL}${config.url}`; 7 | return config; 8 | }; 9 | const setupAxiosInterceptors = (onUnauthenticated, onServerError) => { 10 | const onResponseError = err => { 11 | const status = err.status || err.response.status; 12 | if (status === 403 || status === 401) { 13 | return onUnauthenticated(err); 14 | } 15 | if (status >= 500) { 16 | return onServerError(err); 17 | } 18 | return Promise.reject(err); 19 | }; 20 | 21 | if (axios.interceptors) { 22 | axios.interceptors.request.use(onRequestSuccess); 23 | axios.interceptors.response.use(res => res, onResponseError); 24 | } 25 | }; 26 | 27 | export { onRequestSuccess, setupAxiosInterceptors }; 28 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/app/shared/config/dayjs.ts: -------------------------------------------------------------------------------- 1 | import dayjs from 'dayjs'; 2 | import customParseFormat from 'dayjs/plugin/customParseFormat'; 3 | import duration from 'dayjs/plugin/duration'; 4 | import relativeTime from 'dayjs/plugin/relativeTime'; 5 | 6 | // jhipster-needle-i18n-language-dayjs-imports - JHipster will import languages from dayjs here 7 | import 'dayjs/locale/en'; 8 | 9 | // DAYJS CONFIGURATION 10 | dayjs.extend(customParseFormat); 11 | dayjs.extend(duration); 12 | dayjs.extend(relativeTime); 13 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/app/shared/config/store/translation-store.ts: -------------------------------------------------------------------------------- 1 | import { Module } from 'vuex'; 2 | 3 | export const translationStore: Module = { 4 | state: { 5 | currentLanguage: localStorage.getItem('currentLanguage') || 'en', 6 | languages: { 7 | en: { name: 'English' }, 8 | // jhipster-needle-i18n-language-key-pipe - JHipster will add/remove languages in this object 9 | }, 10 | }, 11 | getters: { 12 | currentLanguage: state => state.currentLanguage, 13 | languages: state => state.languages, 14 | }, 15 | mutations: { 16 | currentLanguage(state, newLanguage) { 17 | state.currentLanguage = newLanguage; 18 | localStorage.setItem('currentLanguage', newLanguage); 19 | }, 20 | }, 21 | }; 22 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/app/shared/date/filters.ts: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import dayjs from 'dayjs'; 3 | 4 | export const DATE_FORMAT = 'YYYY-MM-DD'; 5 | export const DATE_TIME_FORMAT = 'YYYY-MM-DD HH:mm'; 6 | 7 | export const DATE_TIME_LONG_FORMAT = 'YYYY-MM-DDTHH:mm'; 8 | 9 | export function initFilters() { 10 | Vue.filter('formatDate', value => { 11 | if (value) { 12 | return dayjs(value).format(DATE_TIME_FORMAT); 13 | } 14 | return ''; 15 | }); 16 | Vue.filter('duration', value => { 17 | if (value) { 18 | const formatted = dayjs.duration(value).humanize(); 19 | if (formatted) { 20 | return formatted; 21 | } 22 | return value; 23 | } 24 | return ''; 25 | }); 26 | } 27 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/app/shared/jhi-item-count.component.ts: -------------------------------------------------------------------------------- 1 | import Component from 'vue-class-component'; 2 | import { Prop, Vue } from 'vue-property-decorator'; 3 | 4 | @Component 5 | export default class JhiItemCountComponent extends Vue { 6 | @Prop() 7 | page: number; 8 | @Prop() 9 | total: number; 10 | @Prop() 11 | itemsPerPage: number; 12 | i18nEnabled = true; 13 | 14 | get first() { 15 | return (this.page - 1) * this.itemsPerPage === 0 ? 1 : (this.page - 1) * this.itemsPerPage + 1; 16 | } 17 | 18 | get second() { 19 | return this.page * this.itemsPerPage < this.total ? this.page * this.itemsPerPage : this.total; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/app/shared/jhi-item-count.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/app/shared/model/blog/blog.model.ts: -------------------------------------------------------------------------------- 1 | import { IUser } from '@/shared/model/user.model'; 2 | 3 | export interface IBlog { 4 | id?: number; 5 | name?: string; 6 | handle?: string; 7 | user?: IUser | null; 8 | } 9 | 10 | export class Blog implements IBlog { 11 | constructor(public id?: number, public name?: string, public handle?: string, public user?: IUser | null) {} 12 | } 13 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/app/shared/model/blog/post.model.ts: -------------------------------------------------------------------------------- 1 | import { IBlog } from '@/shared/model/blog/blog.model'; 2 | import { ITag } from '@/shared/model/blog/tag.model'; 3 | 4 | export interface IPost { 5 | id?: number; 6 | title?: string; 7 | content?: string; 8 | date?: Date; 9 | blog?: IBlog | null; 10 | tags?: ITag[] | null; 11 | } 12 | 13 | export class Post implements IPost { 14 | constructor( 15 | public id?: number, 16 | public title?: string, 17 | public content?: string, 18 | public date?: Date, 19 | public blog?: IBlog | null, 20 | public tags?: ITag[] | null 21 | ) {} 22 | } 23 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/app/shared/model/blog/tag.model.ts: -------------------------------------------------------------------------------- 1 | import { IPost } from '@/shared/model/blog/post.model'; 2 | 3 | export interface ITag { 4 | id?: number; 5 | name?: string; 6 | posts?: IPost[] | null; 7 | } 8 | 9 | export class Tag implements ITag { 10 | constructor(public id?: number, public name?: string, public posts?: IPost[] | null) {} 11 | } 12 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/app/shared/model/store/product.model.ts: -------------------------------------------------------------------------------- 1 | export interface IProduct { 2 | id?: number; 3 | title?: string; 4 | price?: number; 5 | imageContentType?: string | null; 6 | image?: string | null; 7 | } 8 | 9 | export class Product implements IProduct { 10 | constructor( 11 | public id?: number, 12 | public title?: string, 13 | public price?: number, 14 | public imageContentType?: string | null, 15 | public image?: string | null 16 | ) {} 17 | } 18 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/app/shared/model/user.model.ts: -------------------------------------------------------------------------------- 1 | export interface IUser { 2 | id?: any; 3 | login?: string; 4 | firstName?: string; 5 | lastName?: string; 6 | email?: string; 7 | activated?: boolean; 8 | langKey?: string; 9 | authorities?: any[]; 10 | createdBy?: string; 11 | createdDate?: Date; 12 | lastModifiedBy?: string; 13 | lastModifiedDate?: Date; 14 | password?: string; 15 | } 16 | 17 | export class User implements IUser { 18 | constructor( 19 | public id?: any, 20 | public login?: string, 21 | public firstName?: string, 22 | public lastName?: string, 23 | public email?: string, 24 | public activated?: boolean, 25 | public langKey?: string, 26 | public authorities?: any[], 27 | public createdBy?: string, 28 | public createdDate?: Date, 29 | public lastModifiedBy?: string, 30 | public lastModifiedDate?: Date, 31 | public password?: string 32 | ) {} 33 | } 34 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/app/shared/security/authority.ts: -------------------------------------------------------------------------------- 1 | export enum Authority { 2 | ADMIN = 'ROLE_ADMIN', 3 | USER = 'ROLE_USER', 4 | } 5 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/app/shared/sort/jhi-sort-indicator.component.ts: -------------------------------------------------------------------------------- 1 | import Component from 'vue-class-component'; 2 | import { Prop, Vue } from 'vue-property-decorator'; 3 | 4 | @Component 5 | export default class JhiSortIndicatorComponent extends Vue { 6 | @Prop() 7 | currentOrder: string; 8 | @Prop() 9 | fieldName: string; 10 | @Prop() 11 | reverse: boolean; 12 | } 13 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/app/shared/sort/jhi-sort-indicator.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/app/shared/sort/sorts.ts: -------------------------------------------------------------------------------- 1 | export default function buildPaginationQueryOpts(paginationQuery) { 2 | if (paginationQuery) { 3 | let sorts = ''; 4 | for (const idx of Object.keys(paginationQuery.sort)) { 5 | if (sorts.length > 0) { 6 | sorts += '&'; 7 | } 8 | sorts += 'sort=' + paginationQuery.sort[idx]; 9 | } 10 | return `${sorts}&page=${paginationQuery.page}&size=${paginationQuery.size}`; 11 | } 12 | return ''; 13 | } 14 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/app/shims-vue.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.vue' { 2 | import Vue from 'vue'; 3 | export default Vue; 4 | } 5 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_0_head-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oktadev/auth0-java-microservices-examples/953224d0ebd0bd801a2c186c8dd2b464a48b3a6a/reactive-jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_0_head-192.png -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_0_head-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oktadev/auth0-java-microservices-examples/953224d0ebd0bd801a2c186c8dd2b464a48b3a6a/reactive-jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_0_head-256.png -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_0_head-384.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oktadev/auth0-java-microservices-examples/953224d0ebd0bd801a2c186c8dd2b464a48b3a6a/reactive-jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_0_head-384.png -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_0_head-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oktadev/auth0-java-microservices-examples/953224d0ebd0bd801a2c186c8dd2b464a48b3a6a/reactive-jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_0_head-512.png -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_1_head-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oktadev/auth0-java-microservices-examples/953224d0ebd0bd801a2c186c8dd2b464a48b3a6a/reactive-jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_1_head-192.png -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_1_head-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oktadev/auth0-java-microservices-examples/953224d0ebd0bd801a2c186c8dd2b464a48b3a6a/reactive-jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_1_head-256.png -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_1_head-384.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oktadev/auth0-java-microservices-examples/953224d0ebd0bd801a2c186c8dd2b464a48b3a6a/reactive-jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_1_head-384.png -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_1_head-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oktadev/auth0-java-microservices-examples/953224d0ebd0bd801a2c186c8dd2b464a48b3a6a/reactive-jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_1_head-512.png -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_2_head-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oktadev/auth0-java-microservices-examples/953224d0ebd0bd801a2c186c8dd2b464a48b3a6a/reactive-jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_2_head-192.png -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_2_head-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oktadev/auth0-java-microservices-examples/953224d0ebd0bd801a2c186c8dd2b464a48b3a6a/reactive-jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_2_head-256.png -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_2_head-384.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oktadev/auth0-java-microservices-examples/953224d0ebd0bd801a2c186c8dd2b464a48b3a6a/reactive-jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_2_head-384.png -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_2_head-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oktadev/auth0-java-microservices-examples/953224d0ebd0bd801a2c186c8dd2b464a48b3a6a/reactive-jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_2_head-512.png -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_3_head-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oktadev/auth0-java-microservices-examples/953224d0ebd0bd801a2c186c8dd2b464a48b3a6a/reactive-jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_3_head-192.png -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_3_head-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oktadev/auth0-java-microservices-examples/953224d0ebd0bd801a2c186c8dd2b464a48b3a6a/reactive-jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_3_head-256.png -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_3_head-384.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oktadev/auth0-java-microservices-examples/953224d0ebd0bd801a2c186c8dd2b464a48b3a6a/reactive-jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_3_head-384.png -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_3_head-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oktadev/auth0-java-microservices-examples/953224d0ebd0bd801a2c186c8dd2b464a48b3a6a/reactive-jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_3_head-512.png -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/content/images/logo-jhipster.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oktadev/auth0-java-microservices-examples/953224d0ebd0bd801a2c186c8dd2b464a48b3a6a/reactive-jhipster/gateway/src/main/webapp/content/images/logo-jhipster.png -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/content/scss/vendor.scss: -------------------------------------------------------------------------------- 1 | /* after changing this file run 'npm run webapp:build' */ 2 | 3 | /*************************** 4 | put Sass variables here: 5 | eg $input-color: red; 6 | ****************************/ 7 | // Override Boostrap variables 8 | @import 'bootstrap-variables'; 9 | // Import Bootstrap source files from node_modules 10 | @import 'bootstrap/scss/bootstrap'; 11 | @import 'bootstrap-vue/src/index.scss'; 12 | 13 | /* jhipster-needle-scss-add-vendor JHipster will add new css style */ 14 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oktadev/auth0-java-microservices-examples/953224d0ebd0bd801a2c186c8dd2b464a48b3a6a/reactive-jhipster/gateway/src/main/webapp/favicon.ico -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/i18n/en/activate.json: -------------------------------------------------------------------------------- 1 | { 2 | "activate": { 3 | "title": "Activation", 4 | "messages": { 5 | "success": "Your user account has been activated. Please ", 6 | "error": "Your user could not be activated. Please use the registration form to sign up." 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/i18n/en/blogBlog.json: -------------------------------------------------------------------------------- 1 | { 2 | "gatewayApp": { 3 | "blogBlog": { 4 | "home": { 5 | "title": "Blogs", 6 | "refreshListLabel": "Refresh list", 7 | "createLabel": "Create a new Blog", 8 | "createOrEditLabel": "Create or edit a Blog", 9 | "notFound": "No Blogs found" 10 | }, 11 | "delete": { 12 | "question": "Are you sure you want to delete Blog {{ id }}?" 13 | }, 14 | "detail": { 15 | "title": "Blog" 16 | }, 17 | "id": "ID", 18 | "name": "Name", 19 | "handle": "Handle", 20 | "user": "User" 21 | } 22 | }, 23 | "blogApp": { 24 | "blogBlog": { 25 | "created": "A new Blog is created with identifier {{ param }}", 26 | "updated": "A Blog is updated with identifier {{ param }}", 27 | "deleted": "A Blog is deleted with identifier {{ param }}" 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/i18n/en/blogPost.json: -------------------------------------------------------------------------------- 1 | { 2 | "gatewayApp": { 3 | "blogPost": { 4 | "home": { 5 | "title": "Posts", 6 | "refreshListLabel": "Refresh list", 7 | "createLabel": "Create a new Post", 8 | "createOrEditLabel": "Create or edit a Post", 9 | "notFound": "No Posts found" 10 | }, 11 | "delete": { 12 | "question": "Are you sure you want to delete Post {{ id }}?" 13 | }, 14 | "detail": { 15 | "title": "Post" 16 | }, 17 | "id": "ID", 18 | "title": "Title", 19 | "content": "Content", 20 | "date": "Date", 21 | "blog": "Blog", 22 | "tag": "Tag" 23 | } 24 | }, 25 | "blogApp": { 26 | "blogPost": { 27 | "created": "A new Post is created with identifier {{ param }}", 28 | "updated": "A Post is updated with identifier {{ param }}", 29 | "deleted": "A Post is deleted with identifier {{ param }}" 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/i18n/en/blogTag.json: -------------------------------------------------------------------------------- 1 | { 2 | "gatewayApp": { 3 | "blogTag": { 4 | "home": { 5 | "title": "Tags", 6 | "refreshListLabel": "Refresh list", 7 | "createLabel": "Create a new Tag", 8 | "createOrEditLabel": "Create or edit a Tag", 9 | "notFound": "No Tags found" 10 | }, 11 | "delete": { 12 | "question": "Are you sure you want to delete Tag {{ id }}?" 13 | }, 14 | "detail": { 15 | "title": "Tag" 16 | }, 17 | "id": "ID", 18 | "name": "Name", 19 | "post": "Post" 20 | } 21 | }, 22 | "blogApp": { 23 | "blogTag": { 24 | "created": "A new Tag is created with identifier {{ param }}", 25 | "updated": "A Tag is updated with identifier {{ param }}", 26 | "deleted": "A Tag is deleted with identifier {{ param }}" 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/i18n/en/configuration.json: -------------------------------------------------------------------------------- 1 | { 2 | "configuration": { 3 | "title": "Configuration", 4 | "filter": "Filter (by prefix)", 5 | "table": { 6 | "prefix": "Prefix", 7 | "properties": "Properties" 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/i18n/en/error.json: -------------------------------------------------------------------------------- 1 | { 2 | "error": { 3 | "title": "Error page!", 4 | "http": { 5 | "400": "Bad request.", 6 | "403": "You are not authorized to access this page.", 7 | "404": "The page does not exist.", 8 | "405": "The HTTP verb you used is not supported for this URL.", 9 | "500": "Internal server error." 10 | }, 11 | "concurrencyFailure": "Another user modified this data at the same time as you. Your changes were rejected.", 12 | "validation": "Validation error on the server." 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/i18n/en/gateway.json: -------------------------------------------------------------------------------- 1 | { 2 | "gateway": { 3 | "title": "Gateway", 4 | "routes": { 5 | "title": "Current routes", 6 | "url": "URL", 7 | "service": "Service", 8 | "servers": "Available servers", 9 | "error": "Warning: no server available!" 10 | }, 11 | "refresh": { 12 | "button": "Refresh" 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/i18n/en/health.json: -------------------------------------------------------------------------------- 1 | { 2 | "health": { 3 | "title": "Health Checks", 4 | "refresh.button": "Refresh", 5 | "stacktrace": "Stacktrace", 6 | "details": { 7 | "details": "Details", 8 | "properties": "Properties", 9 | "name": "Name", 10 | "value": "Value", 11 | "error": "Error" 12 | }, 13 | "indicator": { 14 | "discoveryComposite": "Discovery Composite", 15 | "refreshScope": "Microservice Refresh Scope", 16 | "clientConfigServer": "Microservice Config Server", 17 | "hystrix": "Hystrix", 18 | 19 | "reactiveDiscoveryClients": "Microservice Discovery Clients", 20 | "diskSpace": "Disk space", 21 | "mail": "Email", 22 | "livenessState": "Liveness state", 23 | "readinessState": "Readiness state", 24 | "ping": "Application", 25 | "r2dbc": "Database" 26 | }, 27 | "table": { 28 | "service": "Service name", 29 | "status": "Status" 30 | }, 31 | "status": { 32 | "UNKNOWN": "UNKNOWN", 33 | "UP": "UP", 34 | "DOWN": "DOWN" 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/i18n/en/home.json: -------------------------------------------------------------------------------- 1 | { 2 | "home": { 3 | "title": "Welcome, Java Hipster!", 4 | "subtitle": "This is your homepage", 5 | "logged": { 6 | "message": "You are logged in as user \"{{username}}\"." 7 | }, 8 | "question": "If you have any question on JHipster:", 9 | "link": { 10 | "homepage": "JHipster homepage", 11 | "stackoverflow": "JHipster on Stack Overflow", 12 | "bugtracker": "JHipster bug tracker", 13 | "chat": "JHipster public chat room", 14 | "follow": "follow @jhipster on Twitter" 15 | }, 16 | "like": "If you like JHipster, don't forget to give us a star on", 17 | "github": "GitHub" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/i18n/en/login.json: -------------------------------------------------------------------------------- 1 | { 2 | "login": { 3 | "title": "Sign in", 4 | "form": { 5 | "password": "Password", 6 | "password.placeholder": "Your password", 7 | "rememberme": "Remember me", 8 | "button": "Sign in" 9 | }, 10 | "messages": { 11 | "error": { 12 | "authentication": "Failed to sign in! Please check your credentials and try again." 13 | } 14 | }, 15 | "password": { 16 | "forgot": "Did you forget your password?" 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/i18n/en/logs.json: -------------------------------------------------------------------------------- 1 | { 2 | "logs": { 3 | "title": "Logs", 4 | "nbloggers": "There are {{ total }} loggers.", 5 | "filter": "Filter", 6 | "table": { 7 | "name": "Name", 8 | "level": "Level" 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/i18n/en/password.json: -------------------------------------------------------------------------------- 1 | { 2 | "password": { 3 | "title": "Password for [{{username}}]", 4 | "form": { 5 | "button": "Save" 6 | }, 7 | "messages": { 8 | "error": "An error has occurred! The password could not be changed.", 9 | "success": "Password changed!" 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/i18n/en/register.json: -------------------------------------------------------------------------------- 1 | { 2 | "register": { 3 | "title": "Registration", 4 | "form": { 5 | "button": "Register" 6 | }, 7 | "messages": { 8 | "validate": { 9 | "login": { 10 | "required": "Your username is required.", 11 | "minlength": "Your username is required to be at least 1 character.", 12 | "maxlength": "Your username cannot be longer than 50 characters.", 13 | "pattern": "Your username is invalid." 14 | } 15 | }, 16 | "success": "Registration saved! Please check your email for confirmation.", 17 | "error": { 18 | "fail": "Registration failed! Please try again later.", 19 | "userexists": "Login name already registered! Please choose another one.", 20 | "emailexists": "Email is already in use! Please choose another one." 21 | } 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/i18n/en/reset.json: -------------------------------------------------------------------------------- 1 | { 2 | "reset": { 3 | "request": { 4 | "title": "Reset your password", 5 | "form": { 6 | "button": "Reset password" 7 | }, 8 | "messages": { 9 | "info": "Enter the email address you used to register", 10 | "success": "Check your emails for details on how to reset your password." 11 | } 12 | }, 13 | "finish": { 14 | "title": "Reset password", 15 | "form": { 16 | "button": "Validate new password" 17 | }, 18 | "messages": { 19 | "info": "Choose a new password", 20 | "success": "Your password has been reset. Please ", 21 | "keymissing": "The reset key is missing.", 22 | "error": "Your password couldn't be reset. Remember a password request is only valid for 24 hours." 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/i18n/en/sessions.json: -------------------------------------------------------------------------------- 1 | { 2 | "sessions": { 3 | "title": "Active sessions for [{{username}}]", 4 | "table": { 5 | "ipaddress": "IP address", 6 | "useragent": "User Agent", 7 | "date": "Date", 8 | "button": "Invalidate" 9 | }, 10 | "messages": { 11 | "success": "Session invalidated!", 12 | "error": "An error has occurred! The session could not be invalidated." 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/i18n/en/storeProduct.json: -------------------------------------------------------------------------------- 1 | { 2 | "gatewayApp": { 3 | "storeProduct": { 4 | "home": { 5 | "title": "Products", 6 | "refreshListLabel": "Refresh list", 7 | "createLabel": "Create a new Product", 8 | "createOrEditLabel": "Create or edit a Product", 9 | "notFound": "No Products found" 10 | }, 11 | "delete": { 12 | "question": "Are you sure you want to delete Product {{ id }}?" 13 | }, 14 | "detail": { 15 | "title": "Product" 16 | }, 17 | "id": "ID", 18 | "title": "Title", 19 | "price": "Price", 20 | "image": "Image" 21 | } 22 | }, 23 | "storeApp": { 24 | "storeProduct": { 25 | "created": "A new Product is created with identifier {{ param }}", 26 | "updated": "A Product is updated with identifier {{ param }}", 27 | "deleted": "A Product is deleted with identifier {{ param }}" 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/i18n/en/user-management.json: -------------------------------------------------------------------------------- 1 | { 2 | "userManagement": { 3 | "home": { 4 | "title": "Users", 5 | "refreshListLabel": "Refresh list", 6 | "createLabel": "Create a new user", 7 | "createOrEditLabel": "Create or edit a user" 8 | }, 9 | "created": "A new user is created with identifier {{ param }}", 10 | "updated": "A user is updated with identifier {{ param }}", 11 | "deleted": "A user is deleted with identifier {{ param }}", 12 | "delete": { 13 | "question": "Are you sure you want to delete user {{ login }}?" 14 | }, 15 | "detail": { 16 | "title": "User" 17 | }, 18 | "login": "Login", 19 | "firstName": "First name", 20 | "lastName": "Last name", 21 | "email": "Email", 22 | "activated": "Activated", 23 | "deactivated": "Deactivated", 24 | "profiles": "Profiles", 25 | "langKey": "Language", 26 | "createdBy": "Created by", 27 | "createdDate": "Created date", 28 | "lastModifiedBy": "Modified by", 29 | "lastModifiedDate": "Modified date" 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/manifest.webapp: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Gateway", 3 | "short_name": "Gateway", 4 | "icons": [ 5 | { 6 | "src": "./content/images/jhipster_family_member_0_head-192.png", 7 | "sizes": "192x192", 8 | "type": "image/png" 9 | }, 10 | { 11 | "src": "./content/images/jhipster_family_member_0_head-256.png", 12 | "sizes": "256x256", 13 | "type": "image/png" 14 | }, 15 | { 16 | "src": "./content/images/jhipster_family_member_0_head-384.png", 17 | "sizes": "384x384", 18 | "type": "image/png" 19 | }, 20 | { 21 | "src": "./content/images/jhipster_family_member_0_head-512.png", 22 | "sizes": "512x512", 23 | "type": "image/png" 24 | } 25 | ], 26 | "theme_color": "#000000", 27 | "background_color": "#e0e0e0", 28 | "start_url": ".", 29 | "display": "standalone", 30 | "orientation": "portrait" 31 | } 32 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/robots.txt: -------------------------------------------------------------------------------- 1 | # robotstxt.org/ 2 | 3 | User-agent: * 4 | Disallow: /api/account 5 | Disallow: /api/logs/ 6 | Disallow: /api/users/ 7 | Disallow: /management/ 8 | Disallow: /v3/api-docs/ 9 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/main/webapp/swagger-ui/dist/images/throbber.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oktadev/auth0-java-microservices-examples/953224d0ebd0bd801a2c186c8dd2b464a48b3a6a/reactive-jhipster/gateway/src/main/webapp/swagger-ui/dist/images/throbber.gif -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/test/java/com/okta/developer/gateway/config/AsyncSyncConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.gateway.config; 2 | 3 | import java.util.concurrent.Executor; 4 | import org.springframework.context.annotation.Bean; 5 | import org.springframework.context.annotation.Configuration; 6 | import org.springframework.context.annotation.Primary; 7 | import org.springframework.core.task.SyncTaskExecutor; 8 | 9 | @Configuration 10 | public class AsyncSyncConfiguration { 11 | 12 | @Bean(name = "taskExecutor") 13 | public Executor taskExecutor() { 14 | return new SyncTaskExecutor(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/test/java/com/okta/developer/gateway/config/EmbeddedSQL.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.gateway.config; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Target(ElementType.TYPE) 9 | @Retention(RetentionPolicy.RUNTIME) 10 | public @interface EmbeddedSQL { 11 | } 12 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/test/java/com/okta/developer/gateway/config/JHipsterBlockHoundIntegration.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.gateway.config; 2 | 3 | import reactor.blockhound.BlockHound; 4 | import reactor.blockhound.integration.BlockHoundIntegration; 5 | 6 | public class JHipsterBlockHoundIntegration implements BlockHoundIntegration { 7 | 8 | @Override 9 | public void applyTo(BlockHound.Builder builder) { 10 | builder.allowBlockingCallsInside("org.springframework.validation.beanvalidation.SpringValidatorAdapter", "validate"); 11 | builder.allowBlockingCallsInside("com.okta.developer.gateway.service.MailService", "sendEmailFromTemplate"); 12 | builder.allowBlockingCallsInside("com.okta.developer.gateway.security.DomainUserDetailsService", "createSpringSecurityUser"); 13 | builder.allowBlockingCallsInside("org.springframework.web.reactive.result.method.InvocableHandlerMethod", "invoke"); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/test/java/com/okta/developer/gateway/config/SpringBootTestClassOrderer.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.gateway.config; 2 | 3 | import com.okta.developer.gateway.IntegrationTest; 4 | import java.util.Comparator; 5 | import org.junit.jupiter.api.ClassDescriptor; 6 | import org.junit.jupiter.api.ClassOrderer; 7 | import org.junit.jupiter.api.ClassOrdererContext; 8 | 9 | public class SpringBootTestClassOrderer implements ClassOrderer { 10 | 11 | @Override 12 | public void orderClasses(ClassOrdererContext context) { 13 | context.getClassDescriptors().sort(Comparator.comparingInt(SpringBootTestClassOrderer::getOrder)); 14 | } 15 | 16 | private static int getOrder(ClassDescriptor classDescriptor) { 17 | if (classDescriptor.findAnnotation(IntegrationTest.class).isPresent()) { 18 | return 2; 19 | } 20 | return 1; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/test/java/com/okta/developer/gateway/config/SqlTestContainer.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.gateway.config; 2 | 3 | import org.springframework.beans.factory.DisposableBean; 4 | import org.springframework.beans.factory.InitializingBean; 5 | import org.testcontainers.containers.JdbcDatabaseContainer; 6 | 7 | public interface SqlTestContainer extends InitializingBean, DisposableBean { 8 | JdbcDatabaseContainer getTestContainer(); 9 | } 10 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/test/javascript/cypress/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | "parser": "@typescript-eslint/parser", 4 | "plugins": ["cypress", "@typescript-eslint"], 5 | "env": { 6 | "cypress/globals": true 7 | }, 8 | "extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended", "plugin:cypress/recommended"], 9 | "rules": { 10 | "@typescript-eslint/no-namespace": ["error", { "allowDeclarations": true }] 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/test/javascript/cypress/e2e/lighthouse.audits.ts: -------------------------------------------------------------------------------- 1 | describe('Lighthouse Audits', () => { 2 | beforeEach(() => { 3 | cy.visit('/'); 4 | }); 5 | 6 | it('homepage', () => { 7 | const customThresholds = { 8 | performance: 80, 9 | accessibility: 90, 10 | seo: 90, 11 | 'best-practices': 90, 12 | // If you have enabled PWA you should set this threshold to 100 13 | pwa: 0, 14 | }; 15 | 16 | const desktopConfig = { 17 | extends: 'lighthouse:default', 18 | formFactor: 'desktop', 19 | // Change the CPU slowdown multiplier to emulate different kind of devices 20 | // See https://github.com/GoogleChrome/lighthouse/blob/master/docs/throttling.md#cpu-throttling for details 21 | throttling: { 22 | cpuSlowdownMultiplier: 1, 23 | }, 24 | screenEmulation: { disabled: true }, 25 | }; 26 | cy.lighthouse(customThresholds, desktopConfig); 27 | }); 28 | }); 29 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/test/javascript/cypress/fixtures/integration-test.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oktadev/auth0-java-microservices-examples/953224d0ebd0bd801a2c186c8dd2b464a48b3a6a/reactive-jhipster/gateway/src/test/javascript/cypress/fixtures/integration-test.png -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/test/javascript/cypress/support/index.ts: -------------------------------------------------------------------------------- 1 | // *********************************************************** 2 | // This support/index.js is processed and 3 | // loaded automatically before your test files. 4 | // 5 | // This is a great place to put global configuration and 6 | // behavior that modifies Cypress. 7 | // 8 | // You can change the location of this file or turn off 9 | // automatically serving support files with the 10 | // 'supportFile' configuration option. 11 | // 12 | // You can read more here: 13 | // https://on.cypress.io/configuration 14 | // *********************************************************** 15 | 16 | import './commands'; 17 | import './navbar'; 18 | import './entity'; 19 | import './management'; 20 | import './oauth2'; 21 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/test/javascript/cypress/support/management.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/no-namespace */ 2 | /* eslint-disable @typescript-eslint/no-use-before-define */ 3 | 4 | Cypress.Commands.add('getManagementInfo', () => { 5 | return cy 6 | .request({ 7 | method: 'GET', 8 | url: '/management/info', 9 | }) 10 | .then(response => response.body); 11 | }); 12 | 13 | declare global { 14 | namespace Cypress { 15 | interface Chainable { 16 | getManagementInfo(): Cypress.Chainable; 17 | } 18 | } 19 | } 20 | 21 | // Convert this to a module instead of script (allows import/export) 22 | export {}; 23 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/test/javascript/cypress/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../../tsconfig.json", 3 | "compilerOptions": { 4 | "baseUrl": "./", 5 | "outDir": "../../../../build/cypress/out-tsc", 6 | "target": "es2018", 7 | "types": ["cypress", "node"] 8 | }, 9 | "include": ["./../../../../cypress*.config.ts", "./**/*.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/test/javascript/spec/app/shared/config/formatter.spec.ts: -------------------------------------------------------------------------------- 1 | import JhiFormatter from '@/shared/config/formatter'; 2 | 3 | describe('Formatter i18n', () => { 4 | let formatter: JhiFormatter; 5 | 6 | beforeEach(() => { 7 | formatter = new JhiFormatter(); 8 | }); 9 | 10 | it('should interpolate properly given key', () => { 11 | const result = formatter.interpolate('{{key1}}', { key1: 'val1' }); 12 | 13 | expect(result[0]).toBe('val1'); 14 | }); 15 | 16 | it('should not interpolate message without values', () => { 17 | const result = formatter.interpolate('this is a text', undefined); 18 | 19 | expect(result[0]).toBe('this is a text'); 20 | }); 21 | }); 22 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/test/javascript/spec/app/shared/sort/sorts.spec.ts: -------------------------------------------------------------------------------- 1 | import buildPaginationQueryOpts from '@/shared/sort/sorts'; 2 | 3 | describe('Sort', () => { 4 | it('should return an empty string if there is no pagination', () => { 5 | const result = buildPaginationQueryOpts(undefined); 6 | 7 | expect(result).toBe(''); 8 | }); 9 | }); 10 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/test/resources/META-INF/services/reactor.blockhound.integration.BlockHoundIntegration: -------------------------------------------------------------------------------- 1 | com.okta.developer.gateway.config.JHipsterBlockHoundIntegration 2 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/test/resources/META-INF/spring.factories: -------------------------------------------------------------------------------- 1 | org.springframework.test.context.ContextCustomizerFactory = com.okta.developer.gateway.config.TestContainersSpringContextCustomizerFactory 2 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/test/resources/config/application-testdev.yml: -------------------------------------------------------------------------------- 1 | # =================================================================== 2 | # Spring Boot configuration. 3 | # 4 | # This configuration is used for unit/integration tests with testcontainers database containers. 5 | # 6 | # To activate this configuration launch integration tests with the 'testcontainers' profile 7 | # 8 | # More information on database containers: https://www.testcontainers.org/modules/databases/ 9 | # =================================================================== 10 | 11 | spring: 12 | r2dbc: 13 | url: r2dbc:h2:file:///./build/h2db/testdb/gateway;DB_CLOSE_DELAY=-1 14 | username: gateway 15 | password: 16 | liquibase: 17 | url: jdbc:h2:file:./build/h2db/testdb/gateway;DB_CLOSE_DELAY=-1 18 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/test/resources/config/bootstrap.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | cloud: 3 | config: 4 | enabled: false 5 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/src/test/resources/junit-platform.properties: -------------------------------------------------------------------------------- 1 | junit.jupiter.execution.timeout.default = 15 s 2 | junit.jupiter.execution.timeout.testable.method.default = 15 s 3 | junit.jupiter.execution.timeout.beforeall.method.default = 60 s 4 | junit.jupiter.testclass.order.default=com.okta.developer.gateway.config.SpringBootTestClassOrderer 5 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": "src/main/webapp/app", 4 | "outDir": "build/out-tsc/dist", 5 | "target": "es5", 6 | "esModuleInterop": true, 7 | "allowSyntheticDefaultImports": true, 8 | "module": "esnext", 9 | "moduleResolution": "node", 10 | "sourceMap": true, 11 | "emitDecoratorMetadata": true, 12 | "experimentalDecorators": true, 13 | "lib": ["es7", "dom"], 14 | "paths": { 15 | "@/*": ["*"] 16 | }, 17 | "types": ["node"], 18 | "importHelpers": false, 19 | "allowJs": true 20 | }, 21 | "include": ["src/main/webapp/app"], 22 | "exclude": ["node_modules"] 23 | } 24 | -------------------------------------------------------------------------------- /reactive-jhipster/gateway/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig", 3 | "compilerOptions": { 4 | "outDir": "build/out-tsc/spec", 5 | "types": ["jest", "node"] 6 | }, 7 | "include": ["src/main/webapp/app", "src/test/javascript/spec"] 8 | } 9 | -------------------------------------------------------------------------------- /reactive-jhipster/store/.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig helps developers define and maintain consistent 2 | # coding styles between different editors and IDEs 3 | # editorconfig.org 4 | 5 | root = true 6 | 7 | [*] 8 | 9 | # We recommend you to keep these unchanged 10 | end_of_line = lf 11 | charset = utf-8 12 | trim_trailing_whitespace = true 13 | insert_final_newline = true 14 | 15 | # Change these settings to your own preference 16 | indent_style = space 17 | indent_size = 4 18 | 19 | [*.{ts,tsx,js,jsx,json,css,scss,yml,html,vue}] 20 | indent_size = 2 21 | 22 | [*.md] 23 | trim_trailing_whitespace = false 24 | -------------------------------------------------------------------------------- /reactive-jhipster/store/.jhipster/Product.json: -------------------------------------------------------------------------------- 1 | { 2 | "applications": ["gateway", "store"], 3 | "changelogDate": "20230228060241", 4 | "clientRootFolder": "store", 5 | "databaseType": "mongodb", 6 | "dto": "no", 7 | "embedded": false, 8 | "entityTableName": "product", 9 | "fields": [ 10 | { 11 | "fieldName": "title", 12 | "fieldType": "String", 13 | "fieldValidateRules": ["required"] 14 | }, 15 | { 16 | "fieldName": "price", 17 | "fieldType": "BigDecimal", 18 | "fieldValidateRules": ["required", "min"], 19 | "fieldValidateRulesMin": "0" 20 | }, 21 | { 22 | "fieldName": "image", 23 | "fieldType": "byte[]", 24 | "fieldTypeBlobContent": "image" 25 | } 26 | ], 27 | "fluentMethods": true, 28 | "jpaMetamodelFiltering": false, 29 | "microserviceName": "store", 30 | "name": "Product", 31 | "pagination": "pagination", 32 | "readOnly": false, 33 | "relationships": [], 34 | "searchEngine": "no", 35 | "service": "no" 36 | } 37 | -------------------------------------------------------------------------------- /reactive-jhipster/store/.prettierignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | target 3 | build 4 | package-lock.json 5 | .git 6 | .mvn 7 | gradle 8 | .gradle 9 | -------------------------------------------------------------------------------- /reactive-jhipster/store/.prettierrc: -------------------------------------------------------------------------------- 1 | # Prettier configuration 2 | 3 | printWidth: 140 4 | singleQuote: true 5 | tabWidth: 2 6 | useTabs: false 7 | 8 | # js and ts rules: 9 | arrowParens: avoid 10 | 11 | # jsx and tsx rules: 12 | bracketSameLine: false 13 | 14 | # java rules: 15 | overrides: 16 | - files: "*.java" 17 | options: 18 | tabWidth: 4 19 | -------------------------------------------------------------------------------- /reactive-jhipster/store/checkstyle.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /reactive-jhipster/store/gradle/docker.gradle: -------------------------------------------------------------------------------- 1 | jib { 2 | from { 3 | image = "eclipse-temurin:17-jre-focal" 4 | platforms { 5 | platform { 6 | architecture = "${findProperty('jibArchitecture') ?: 'amd64'}" 7 | os = "linux" 8 | } 9 | } 10 | } 11 | to { 12 | image = "store:latest" 13 | } 14 | container { 15 | entrypoint = ["bash", "-c", "/entrypoint.sh"] 16 | ports = ["8082"] 17 | environment = [ 18 | SPRING_OUTPUT_ANSI_ENABLED: "ALWAYS", 19 | JHIPSTER_SLEEP: "0" 20 | ] 21 | creationTime = "USE_CURRENT_TIMESTAMP" 22 | user = 1000 23 | } 24 | extraDirectories { 25 | paths = file("src/main/docker/jib") 26 | permissions = ["/entrypoint.sh": "755"] 27 | } 28 | } 29 | 30 | -------------------------------------------------------------------------------- /reactive-jhipster/store/gradle/sonar.gradle: -------------------------------------------------------------------------------- 1 | jacoco { 2 | toolVersion = "0.8.8" 3 | } 4 | 5 | jacocoTestReport { 6 | executionData tasks.withType(Test) 7 | classDirectories.from = files(sourceSets.main.output.classesDirs) 8 | sourceDirectories.from = files(sourceSets.main.java.srcDirs) 9 | 10 | reports { 11 | xml.enabled = true 12 | } 13 | } 14 | 15 | file("sonar-project.properties").withReader { 16 | Properties sonarProperties = new Properties() 17 | sonarProperties.load(it) 18 | 19 | sonarProperties.each { key, value -> 20 | sonarqube { 21 | properties { 22 | property key, value 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /reactive-jhipster/store/gradle/war.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: "war" 2 | 3 | bootWar { 4 | mainClass = "com.okta.developer.store.StoreApp" 5 | includes = ["WEB-INF/**", "META-INF/**"] 6 | } 7 | 8 | war { 9 | enabled = true 10 | archiveExtension = "war.original" 11 | includes = ["WEB-INF/**", "META-INF/**"] 12 | 13 | } 14 | -------------------------------------------------------------------------------- /reactive-jhipster/store/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oktadev/auth0-java-microservices-examples/953224d0ebd0bd801a2c186c8dd2b464a48b3a6a/reactive-jhipster/store/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /reactive-jhipster/store/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /reactive-jhipster/store/gradle/zipkin.gradle: -------------------------------------------------------------------------------- 1 | dependencies { 2 | implementation "io.micrometer:micrometer-tracing-bridge-brave" 3 | implementation "io.zipkin.reporter2:zipkin-reporter-brave" 4 | } 5 | -------------------------------------------------------------------------------- /reactive-jhipster/store/settings.gradle: -------------------------------------------------------------------------------- 1 | 2 | pluginManagement { 3 | repositories { 4 | mavenCentral() 5 | maven { url 'https://repo.spring.io/milestone' } 6 | gradlePluginPortal() 7 | // jhipster-needle-gradle-plugin-management-repositories - JHipster will add additional entries here 8 | } 9 | plugins { 10 | id 'org.springframework.boot' version "${springBootVersion}" 11 | id 'com.google.cloud.tools.jib' version "${jibPluginVersion}" 12 | id 'com.gorylenko.gradle-git-properties' version "${gitPropertiesPluginVersion}" 13 | id 'org.sonarqube' version "${sonarqubePluginVersion}" 14 | id "io.spring.nohttp" version "${noHttpCheckstyleVersion}" 15 | id 'com.github.andygoossens.gradle-modernizer-plugin' version "${modernizerPluginVersion}" 16 | // jhipster-needle-gradle-plugin-management-plugins - JHipster will add additional entries here 17 | } 18 | } 19 | 20 | rootProject.name = "store" 21 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/main/docker/central-server-config/README.md: -------------------------------------------------------------------------------- 1 | # Central configuration sources details 2 | 3 | The JHipster-Registry will use the following directories as its configuration source : 4 | 5 | - localhost-config : when running the registry in docker with the jhipster-registry.yml docker-compose file 6 | - docker-config : when running the registry and the app both in docker with the app.yml docker-compose file 7 | 8 | For more info, refer to https://www.jhipster.tech/jhipster-registry/#spring-cloud-config 9 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/main/docker/central-server-config/docker-config/application.yml: -------------------------------------------------------------------------------- 1 | # Common configuration shared between all applications 2 | configserver: 3 | name: Docker JHipster Registry 4 | status: Connected to the JHipster Registry running in Docker 5 | 6 | jhipster: 7 | security: 8 | authentication: 9 | jwt: 10 | # secret key which should be base64 encoded and changed in production 11 | base64-secret: MDQyNDdlZDk3NzBkZWI1MTJkMjc3ZmQyZThlNGQxMWYyNTczZWVhMTRlZDhkMDIwNTM5MzNiMjViYmVlMWYyYjMzYzIyZmM4OTdjZjdmYzUyZWJkYWMxNWE3YWZlY2Q0YmFlMWVkNzRiYTc0YjNjZGRjMzFiZjJlNWRkM2U1ZGI= 12 | 13 | eureka: 14 | client: 15 | service-url: 16 | defaultZone: http://admin:${jhipster.registry.password}@jhipster-registry:8761/eureka/ 17 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/main/docker/central-server-config/localhost-config/application.yml: -------------------------------------------------------------------------------- 1 | # Common configuration shared between all applications 2 | configserver: 3 | name: Docker JHipster Registry 4 | status: Connected to the JHipster Registry running in Docker 5 | 6 | jhipster: 7 | security: 8 | authentication: 9 | jwt: 10 | # secret key which should be base64 encoded and changed in production 11 | base64-secret: MDQyNDdlZDk3NzBkZWI1MTJkMjc3ZmQyZThlNGQxMWYyNTczZWVhMTRlZDhkMDIwNTM5MzNiMjViYmVlMWYyYjMzYzIyZmM4OTdjZjdmYzUyZWJkYWMxNWE3YWZlY2Q0YmFlMWVkNzRiYTc0YjNjZGRjMzFiZjJlNWRkM2U1ZGI= 12 | 13 | eureka: 14 | client: 15 | service-url: 16 | defaultZone: http://admin:${jhipster.registry.password}@localhost:8761/eureka/ 17 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/main/docker/grafana/provisioning/dashboards/dashboard.yml: -------------------------------------------------------------------------------- 1 | apiVersion: 1 2 | 3 | providers: 4 | - name: 'Prometheus' 5 | orgId: 1 6 | folder: '' 7 | type: file 8 | disableDeletion: false 9 | editable: true 10 | options: 11 | path: /etc/grafana/provisioning/dashboards 12 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/main/docker/keycloak.yml: -------------------------------------------------------------------------------- 1 | # This configuration is intended for development purpose, it's **your** responsibility to harden it for production 2 | name: store 3 | services: 4 | keycloak: 5 | image: quay.io/keycloak/keycloak:20.0.1 6 | command: ['start-dev --import-realm'] 7 | volumes: 8 | - ./realm-config:/opt/keycloak/data/import 9 | environment: 10 | - KC_DB=dev-file 11 | - KEYCLOAK_ADMIN=admin 12 | - KEYCLOAK_ADMIN_PASSWORD=admin 13 | - KC_FEATURES=scripts 14 | - KC_HTTP_PORT=9080 15 | - KC_HTTPS_PORT=9443 16 | # If you want to expose these ports outside your dev PC, 17 | # remove the "127.0.0.1:" prefix 18 | ports: 19 | - 127.0.0.1:9080:9080 20 | - 127.0.0.1:9443:9443 21 | healthcheck: 22 | test: ['CMD', 'curl', '-f', 'http://localhost:9080/realms/jhipster'] 23 | interval: 5s 24 | timeout: 5s 25 | retries: 20 26 | start_period: 10s 27 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/main/docker/mongodb-cluster.yml: -------------------------------------------------------------------------------- 1 | # This configuration is intended for development purpose, it's **your** responsibility to harden it for production 2 | name: store 3 | services: 4 | mongodb: 5 | image: mongo:6.0.4 6 | # If you want to expose these ports outside your dev PC, 7 | # remove the "127.0.0.1:" prefix 8 | ports: 9 | - 127.0.0.1:27017:27017 10 | command: mongos --configdb csvr/store-mongodb-config --bind_ip 0.0.0.0 11 | mongodb-node: 12 | build: 13 | context: . 14 | dockerfile: mongodb/MongoDB.Dockerfile 15 | command: mongod --shardsvr --replSet rs1 16 | mongodb-config: 17 | image: mongo:6.0.4 18 | container_name: store-mongodb-config 19 | command: mongod --configsvr --dbpath /data/db --replSet csvr 20 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/main/docker/mongodb.yml: -------------------------------------------------------------------------------- 1 | # This configuration is intended for development purpose, it's **your** responsibility to harden it for production 2 | name: store 3 | services: 4 | mongodb: 5 | image: mongo:6.0.4 6 | # If you want to expose these ports outside your dev PC, 7 | # remove the "127.0.0.1:" prefix 8 | ports: 9 | - 127.0.0.1:27017:27017 10 | # volumes: 11 | # - ~/volumes/jhipster/store/mongodb/:/data/db/ 12 | healthcheck: 13 | test: ['CMD', 'echo', '''db.runCommand("ping").ok''', '|', 'mongo', 'localhost:27017/test', '--quiet'] 14 | interval: 5s 15 | timeout: 5s 16 | retries: 10 17 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/main/docker/mongodb/MongoDB.Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mongo:6.0.4 2 | ADD mongodb/scripts/init_replicaset.js init_replicaset.js 3 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/main/docker/mongodb/scripts/init_replicaset.js: -------------------------------------------------------------------------------- 1 | var status = rs.status(); 2 | if (status.errmsg === 'no replset config has been received') { 3 | rs.initiate(); 4 | } 5 | for (var i = 1; i <= param; i++) { 6 | if (i !== 1) rs.add(folder + '_store-mongodb-node_' + i + ':27018'); 7 | } 8 | var cfg = rs.conf(); 9 | cfg.members[0].host = folder + '_store-mongodb-node_1:27018'; 10 | rs.reconfig(cfg); 11 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/main/docker/services.yml: -------------------------------------------------------------------------------- 1 | # This configuration is intended for development purpose, it's **your** responsibility to harden it for production 2 | name: store 3 | services: 4 | mongodb: 5 | extends: 6 | file: ./mongodb.yml 7 | service: mongodb 8 | keycloak: 9 | extends: 10 | file: ./keycloak.yml 11 | service: keycloak 12 | jhipster-registry: 13 | extends: 14 | file: ./jhipster-registry.yml 15 | service: jhipster-registry 16 | depends_on: 17 | keycloak: 18 | condition: service_healthy 19 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/main/docker/sonar.yml: -------------------------------------------------------------------------------- 1 | # This configuration is intended for development purpose, it's **your** responsibility to harden it for production 2 | name: store 3 | services: 4 | sonar: 5 | container_name: sonarqube 6 | image: sonarqube:9.9.0-community 7 | # Forced authentication redirect for UI is turned off for out of the box experience while trying out SonarQube 8 | # For real use cases delete SONAR_FORCEAUTHENTICATION variable or set SONAR_FORCEAUTHENTICATION=true 9 | environment: 10 | - SONAR_FORCEAUTHENTICATION=false 11 | # If you want to expose these ports outside your dev PC, 12 | # remove the "127.0.0.1:" prefix 13 | ports: 14 | - 127.0.0.1:9001:9000 15 | - 127.0.0.1:9000:9000 16 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/main/docker/zipkin.yml: -------------------------------------------------------------------------------- 1 | # This configuration is intended for development purpose, it's **your** responsibility to harden it for production 2 | name: store 3 | services: 4 | zipkin: 5 | image: openzipkin/zipkin:2.24 6 | ports: 7 | - 127.0.0.1:9411:9411 8 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/main/java/com/okta/developer/store/GeneratedByJHipster.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.store; 2 | 3 | import jakarta.annotation.Generated; 4 | import java.lang.annotation.ElementType; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | import java.lang.annotation.Target; 8 | 9 | @Generated(value = "JHipster", comments = "Generated by JHipster 7.9.3") 10 | @Retention(RetentionPolicy.SOURCE) 11 | @Target({ ElementType.TYPE }) 12 | public @interface GeneratedByJHipster { 13 | } 14 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/main/java/com/okta/developer/store/config/ApplicationProperties.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.store.config; 2 | 3 | import org.springframework.boot.context.properties.ConfigurationProperties; 4 | 5 | /** 6 | * Properties specific to Store. 7 | *

8 | * Properties are configured in the {@code application.yml} file. 9 | * See {@link tech.jhipster.config.JHipsterProperties} for a good example. 10 | */ 11 | @ConfigurationProperties(prefix = "application", ignoreUnknownFields = false) 12 | public class ApplicationProperties { 13 | // jhipster-needle-application-properties-property 14 | // jhipster-needle-application-properties-property-getter 15 | // jhipster-needle-application-properties-property-class 16 | } 17 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/main/java/com/okta/developer/store/config/Constants.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.store.config; 2 | 3 | /** 4 | * Application constants. 5 | */ 6 | public final class Constants { 7 | 8 | // Regex for acceptable logins 9 | public static final String LOGIN_REGEX = "^(?>[a-zA-Z0-9!$&*+=?^_`{|}~.-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*)|(?>[_.@A-Za-z0-9-]+)$"; 10 | 11 | public static final String SYSTEM = "system"; 12 | public static final String DEFAULT_LANGUAGE = "en"; 13 | 14 | private Constants() {} 15 | } 16 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/main/java/com/okta/developer/store/config/DateTimeFormatConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.store.config; 2 | 3 | import org.springframework.context.annotation.Configuration; 4 | import org.springframework.format.FormatterRegistry; 5 | import org.springframework.format.datetime.standard.DateTimeFormatterRegistrar; 6 | import org.springframework.web.reactive.config.WebFluxConfigurer; 7 | 8 | /** 9 | * Configure the converters to use the ISO format for dates by default. 10 | */ 11 | @Configuration 12 | public class DateTimeFormatConfiguration implements WebFluxConfigurer { 13 | 14 | @Override 15 | public void addFormatters(FormatterRegistry registry) { 16 | DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar(); 17 | registrar.setUseIsoFormat(true); 18 | registrar.registerFormatters(registry); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/main/java/com/okta/developer/store/config/JacksonConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.store.config; 2 | 3 | import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; 4 | import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; 5 | import org.springframework.context.annotation.Bean; 6 | import org.springframework.context.annotation.Configuration; 7 | 8 | @Configuration 9 | public class JacksonConfiguration { 10 | 11 | /** 12 | * Support for Java date and time API. 13 | * @return the corresponding Jackson module. 14 | */ 15 | @Bean 16 | public JavaTimeModule javaTimeModule() { 17 | return new JavaTimeModule(); 18 | } 19 | 20 | @Bean 21 | public Jdk8Module jdk8TimeModule() { 22 | return new Jdk8Module(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/main/java/com/okta/developer/store/config/LoggingAspectConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.store.config; 2 | 3 | import com.okta.developer.store.aop.logging.LoggingAspect; 4 | import org.springframework.context.annotation.*; 5 | import org.springframework.core.env.Environment; 6 | import tech.jhipster.config.JHipsterConstants; 7 | 8 | @Configuration 9 | @EnableAspectJAutoProxy 10 | public class LoggingAspectConfiguration { 11 | 12 | @Bean 13 | @Profile(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT) 14 | public LoggingAspect loggingAspect(Environment env) { 15 | return new LoggingAspect(env); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/main/java/com/okta/developer/store/config/ReactorConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.store.config; 2 | 3 | import org.springframework.context.annotation.Configuration; 4 | import org.springframework.context.annotation.Profile; 5 | import reactor.core.publisher.Hooks; 6 | import tech.jhipster.config.JHipsterConstants; 7 | 8 | @Configuration 9 | @Profile("!" + JHipsterConstants.SPRING_PROFILE_PRODUCTION) 10 | public class ReactorConfiguration { 11 | 12 | public ReactorConfiguration() { 13 | Hooks.onOperatorDebug(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/main/java/com/okta/developer/store/config/dbmigrations/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * MongoDB database migrations using Mongock. 3 | */ 4 | package com.okta.developer.store.config.dbmigrations; 5 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/main/java/com/okta/developer/store/config/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Spring Framework configuration files. 3 | */ 4 | package com.okta.developer.store.config; 5 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/main/java/com/okta/developer/store/domain/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * JPA domain objects. 3 | */ 4 | package com.okta.developer.store.domain; 5 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/main/java/com/okta/developer/store/repository/AuthorityRepository.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.store.repository; 2 | 3 | import com.okta.developer.store.domain.Authority; 4 | import org.springframework.data.mongodb.repository.ReactiveMongoRepository; 5 | 6 | /** 7 | * Spring Data MongoDB repository for the {@link Authority} entity. 8 | */ 9 | public interface AuthorityRepository extends ReactiveMongoRepository {} 10 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/main/java/com/okta/developer/store/repository/ProductRepository.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.store.repository; 2 | 3 | import com.okta.developer.store.domain.Product; 4 | import org.springframework.data.domain.Pageable; 5 | import org.springframework.data.mongodb.repository.ReactiveMongoRepository; 6 | import org.springframework.stereotype.Repository; 7 | import reactor.core.publisher.Flux; 8 | 9 | /** 10 | * Spring Data MongoDB reactive repository for the Product entity. 11 | */ 12 | @SuppressWarnings("unused") 13 | @Repository 14 | public interface ProductRepository extends ReactiveMongoRepository { 15 | Flux findAllBy(Pageable pageable); 16 | } 17 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/main/java/com/okta/developer/store/repository/UserRepository.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.store.repository; 2 | 3 | import com.okta.developer.store.domain.User; 4 | import org.springframework.data.domain.*; 5 | import org.springframework.data.mongodb.repository.ReactiveMongoRepository; 6 | import org.springframework.stereotype.Repository; 7 | import reactor.core.publisher.Flux; 8 | import reactor.core.publisher.Mono; 9 | 10 | /** 11 | * Spring Data MongoDB repository for the {@link User} entity. 12 | */ 13 | @Repository 14 | public interface UserRepository extends ReactiveMongoRepository { 15 | Mono findOneByLogin(String login); 16 | 17 | Flux findAllByIdNotNull(Pageable pageable); 18 | 19 | Flux findAllByIdNotNullAndActivatedIsTrue(Pageable pageable); 20 | 21 | Mono count(); 22 | } 23 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/main/java/com/okta/developer/store/repository/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Spring Data JPA repositories. 3 | */ 4 | package com.okta.developer.store.repository; 5 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/main/java/com/okta/developer/store/security/AuthoritiesConstants.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.store.security; 2 | 3 | /** 4 | * Constants for Spring Security authorities. 5 | */ 6 | public final class AuthoritiesConstants { 7 | 8 | public static final String ADMIN = "ROLE_ADMIN"; 9 | 10 | public static final String USER = "ROLE_USER"; 11 | 12 | public static final String ANONYMOUS = "ROLE_ANONYMOUS"; 13 | 14 | private AuthoritiesConstants() {} 15 | } 16 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/main/java/com/okta/developer/store/security/oauth2/JwtGrantedAuthorityConverter.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.store.security.oauth2; 2 | 3 | import com.okta.developer.store.security.SecurityUtils; 4 | import java.util.Collection; 5 | import org.springframework.core.convert.converter.Converter; 6 | import org.springframework.security.core.GrantedAuthority; 7 | import org.springframework.security.oauth2.jwt.Jwt; 8 | import org.springframework.stereotype.Component; 9 | 10 | @Component 11 | public class JwtGrantedAuthorityConverter implements Converter> { 12 | 13 | public JwtGrantedAuthorityConverter() { 14 | // Bean extracting authority. 15 | } 16 | 17 | @Override 18 | public Collection convert(Jwt jwt) { 19 | return SecurityUtils.extractAuthorityFromClaims(jwt.getClaims()); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/main/java/com/okta/developer/store/security/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Spring Security configuration. 3 | */ 4 | package com.okta.developer.store.security; 5 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/main/java/com/okta/developer/store/service/dto/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Data Transfer Objects. 3 | */ 4 | package com.okta.developer.store.service.dto; 5 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/main/java/com/okta/developer/store/service/mapper/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * MapStruct mappers for mapping domain objects and Data Transfer Objects. 3 | */ 4 | package com.okta.developer.store.service.mapper; 5 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/main/java/com/okta/developer/store/service/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Service layer beans. 3 | */ 4 | package com.okta.developer.store.service; 5 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/main/java/com/okta/developer/store/web/rest/errors/ErrorConstants.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.store.web.rest.errors; 2 | 3 | import java.net.URI; 4 | 5 | public final class ErrorConstants { 6 | 7 | public static final String ERR_CONCURRENCY_FAILURE = "error.concurrencyFailure"; 8 | public static final String ERR_VALIDATION = "error.validation"; 9 | public static final String PROBLEM_BASE_URL = "https://www.jhipster.tech/problem"; 10 | public static final URI DEFAULT_TYPE = URI.create(PROBLEM_BASE_URL + "/problem-with-message"); 11 | public static final URI CONSTRAINT_VIOLATION_TYPE = URI.create(PROBLEM_BASE_URL + "/constraint-violation"); 12 | 13 | private ErrorConstants() {} 14 | } 15 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/main/java/com/okta/developer/store/web/rest/errors/FieldErrorVM.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.store.web.rest.errors; 2 | 3 | import java.io.Serializable; 4 | 5 | public class FieldErrorVM implements Serializable { 6 | 7 | private static final long serialVersionUID = 1L; 8 | 9 | private final String objectName; 10 | 11 | private final String field; 12 | 13 | private final String message; 14 | 15 | public FieldErrorVM(String dto, String field, String message) { 16 | this.objectName = dto; 17 | this.field = field; 18 | this.message = message; 19 | } 20 | 21 | public String getObjectName() { 22 | return objectName; 23 | } 24 | 25 | public String getField() { 26 | return field; 27 | } 28 | 29 | public String getMessage() { 30 | return message; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/main/java/com/okta/developer/store/web/rest/errors/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Specific errors used with Zalando's "problem-spring-web" library. 3 | * 4 | * More information on https://github.com/zalando/problem-spring-web 5 | */ 6 | package com.okta.developer.store.web.rest.errors; 7 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/main/java/com/okta/developer/store/web/rest/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Spring MVC REST controllers. 3 | */ 4 | package com.okta.developer.store.web.rest; 5 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/main/java/com/okta/developer/store/web/rest/vm/ManagedUserVM.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.store.web.rest.vm; 2 | 3 | import com.okta.developer.store.service.dto.AdminUserDTO; 4 | 5 | /** 6 | * View Model extending the AdminUserDTO, which is meant to be used in the user management UI. 7 | */ 8 | public class ManagedUserVM extends AdminUserDTO { 9 | 10 | public ManagedUserVM() { 11 | // Empty constructor needed for Jackson. 12 | } 13 | 14 | // prettier-ignore 15 | @Override 16 | public String toString() { 17 | return "ManagedUserVM{" + super.toString() + "} "; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/main/java/com/okta/developer/store/web/rest/vm/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * View Models used by Spring MVC REST controllers. 3 | */ 4 | package com.okta.developer.store.web.rest.vm; 5 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/main/resources/banner.txt: -------------------------------------------------------------------------------- 1 | 2 | ${AnsiColor.GREEN} ██╗${AnsiColor.RED} ██╗ ██╗ ████████╗ ███████╗ ██████╗ ████████╗ ████████╗ ███████╗ 3 | ${AnsiColor.GREEN} ██║${AnsiColor.RED} ██║ ██║ ╚══██╔══╝ ██╔═══██╗ ██╔════╝ ╚══██╔══╝ ██╔═════╝ ██╔═══██╗ 4 | ${AnsiColor.GREEN} ██║${AnsiColor.RED} ████████║ ██║ ███████╔╝ ╚█████╗ ██║ ██████╗ ███████╔╝ 5 | ${AnsiColor.GREEN}██╗ ██║${AnsiColor.RED} ██╔═══██║ ██║ ██╔════╝ ╚═══██╗ ██║ ██╔═══╝ ██╔══██║ 6 | ${AnsiColor.GREEN}╚██████╔╝${AnsiColor.RED} ██║ ██║ ████████╗ ██║ ██████╔╝ ██║ ████████╗ ██║ ╚██╗ 7 | ${AnsiColor.GREEN} ╚═════╝ ${AnsiColor.RED} ╚═╝ ╚═╝ ╚═══════╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══════╝ ╚═╝ ╚═╝ 8 | 9 | ${AnsiColor.BRIGHT_BLUE}:: JHipster 🤓 :: Running Spring Boot ${spring-boot.version} :: 10 | :: https://www.jhipster.tech ::${AnsiColor.DEFAULT} 11 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/main/resources/config/bootstrap-prod.yml: -------------------------------------------------------------------------------- 1 | # =================================================================== 2 | # Spring Cloud Config bootstrap configuration for the "prod" profile 3 | # =================================================================== 4 | 5 | spring: 6 | cloud: 7 | config: 8 | fail-fast: true 9 | retry: 10 | initial-interval: 1000 11 | max-interval: 2000 12 | max-attempts: 100 13 | uri: http://admin:${jhipster.registry.password}@localhost:8761/config 14 | # name of the config server's property source (file.yml) that we want to use 15 | name: store 16 | profile: prod # profile(s) of the property source 17 | label: main # toggle to switch to a different version of the configuration as stored in git 18 | # it can be set to any label, branch or commit of the configuration source Git repository 19 | 20 | jhipster: 21 | registry: 22 | password: admin 23 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/main/resources/config/tls/keystore.p12: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oktadev/auth0-java-microservices-examples/953224d0ebd0bd801a2c186c8dd2b464a48b3a6a/reactive-jhipster/store/src/main/resources/config/tls/keystore.p12 -------------------------------------------------------------------------------- /reactive-jhipster/store/src/main/resources/i18n/messages.properties: -------------------------------------------------------------------------------- 1 | # Error page 2 | error.title=Your request cannot be processed 3 | error.subtitle=Sorry, an error has occurred. 4 | error.status=Status: 5 | error.message=Message: 6 | 7 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/main/resources/i18n/messages_en.properties: -------------------------------------------------------------------------------- 1 | # Error page 2 | error.title=Your request cannot be processed 3 | error.subtitle=Sorry, an error has occurred. 4 | error.status=Status: 5 | error.message=Message: 6 | 7 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/test/java/com/okta/developer/store/config/AsyncSyncConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.store.config; 2 | 3 | import java.util.concurrent.Executor; 4 | import org.springframework.context.annotation.Bean; 5 | import org.springframework.context.annotation.Configuration; 6 | import org.springframework.context.annotation.Primary; 7 | import org.springframework.core.task.SyncTaskExecutor; 8 | 9 | @Configuration 10 | public class AsyncSyncConfiguration { 11 | 12 | @Bean(name = "taskExecutor") 13 | public Executor taskExecutor() { 14 | return new SyncTaskExecutor(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/test/java/com/okta/developer/store/config/EmbeddedMongo.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.store.config; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Target(ElementType.TYPE) 9 | @Retention(RetentionPolicy.RUNTIME) 10 | public @interface EmbeddedMongo { 11 | } 12 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/test/java/com/okta/developer/store/config/JHipsterBlockHoundIntegration.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.store.config; 2 | 3 | import reactor.blockhound.BlockHound; 4 | import reactor.blockhound.integration.BlockHoundIntegration; 5 | 6 | public class JHipsterBlockHoundIntegration implements BlockHoundIntegration { 7 | 8 | @Override 9 | public void applyTo(BlockHound.Builder builder) { 10 | builder.allowBlockingCallsInside("org.springframework.validation.beanvalidation.SpringValidatorAdapter", "validate"); 11 | builder.allowBlockingCallsInside("com.okta.developer.store.service.MailService", "sendEmailFromTemplate"); 12 | builder.allowBlockingCallsInside("com.okta.developer.store.security.DomainUserDetailsService", "createSpringSecurityUser"); 13 | builder.allowBlockingCallsInside("org.springframework.web.reactive.result.method.InvocableHandlerMethod", "invoke"); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/test/java/com/okta/developer/store/config/SpringBootTestClassOrderer.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.store.config; 2 | 3 | import com.okta.developer.store.IntegrationTest; 4 | import java.util.Comparator; 5 | import org.junit.jupiter.api.ClassDescriptor; 6 | import org.junit.jupiter.api.ClassOrderer; 7 | import org.junit.jupiter.api.ClassOrdererContext; 8 | 9 | public class SpringBootTestClassOrderer implements ClassOrderer { 10 | 11 | @Override 12 | public void orderClasses(ClassOrdererContext context) { 13 | context.getClassDescriptors().sort(Comparator.comparingInt(SpringBootTestClassOrderer::getOrder)); 14 | } 15 | 16 | private static int getOrder(ClassDescriptor classDescriptor) { 17 | if (classDescriptor.findAnnotation(IntegrationTest.class).isPresent()) { 18 | return 2; 19 | } 20 | return 1; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/test/java/com/okta/developer/store/domain/ProductTest.java: -------------------------------------------------------------------------------- 1 | package com.okta.developer.store.domain; 2 | 3 | import static org.assertj.core.api.Assertions.assertThat; 4 | 5 | import com.okta.developer.store.web.rest.TestUtil; 6 | import org.junit.jupiter.api.Test; 7 | 8 | class ProductTest { 9 | 10 | @Test 11 | void equalsVerifier() throws Exception { 12 | TestUtil.equalsVerifier(Product.class); 13 | Product product1 = new Product(); 14 | product1.setId("id1"); 15 | Product product2 = new Product(); 16 | product2.setId(product1.getId()); 17 | assertThat(product1).isEqualTo(product2); 18 | product2.setId("id2"); 19 | assertThat(product1).isNotEqualTo(product2); 20 | product1.setId(null); 21 | assertThat(product1).isNotEqualTo(product2); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/test/resources/META-INF/services/reactor.blockhound.integration.BlockHoundIntegration: -------------------------------------------------------------------------------- 1 | com.okta.developer.store.config.JHipsterBlockHoundIntegration 2 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/test/resources/META-INF/spring.factories: -------------------------------------------------------------------------------- 1 | org.springframework.test.context.ContextCustomizerFactory = com.okta.developer.store.config.TestContainersSpringContextCustomizerFactory 2 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/test/resources/config/bootstrap.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | cloud: 3 | config: 4 | enabled: false 5 | -------------------------------------------------------------------------------- /reactive-jhipster/store/src/test/resources/junit-platform.properties: -------------------------------------------------------------------------------- 1 | junit.jupiter.execution.timeout.default = 30 s 2 | junit.jupiter.execution.timeout.testable.method.default = 30 s 3 | junit.jupiter.execution.timeout.beforeall.method.default = 60 s 4 | junit.jupiter.testclass.order.default=com.okta.developer.store.config.SpringBootTestClassOrderer 5 | -------------------------------------------------------------------------------- /spring-boot-gateway-mvc/.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | *.env 3 | -------------------------------------------------------------------------------- /spring-boot-gateway-mvc/api-gateway/.env.example: -------------------------------------------------------------------------------- 1 | OKTA_OAUTH2_ISSUER=https:/// 2 | OKTA_OAUTH2_CLIENT_ID= 3 | OKTA_OAUTH2_CLIENT_SECRET= 4 | OKTA_OAUTH2_AUDIENCE=https:///api/v2/ 5 | -------------------------------------------------------------------------------- /spring-boot-gateway-mvc/api-gateway/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | .gradle 3 | build/ 4 | !gradle/wrapper/gradle-wrapper.jar 5 | !**/src/main/**/build/ 6 | !**/src/test/**/build/ 7 | 8 | ### STS ### 9 | .apt_generated 10 | .classpath 11 | .factorypath 12 | .project 13 | .settings 14 | .springBeans 15 | .sts4-cache 16 | bin/ 17 | !**/src/main/**/bin/ 18 | !**/src/test/**/bin/ 19 | 20 | ### IntelliJ IDEA ### 21 | .idea 22 | *.iws 23 | *.iml 24 | *.ipr 25 | out/ 26 | !**/src/main/**/out/ 27 | !**/src/test/**/out/ 28 | 29 | ### NetBeans ### 30 | /nbproject/private/ 31 | /nbbuild/ 32 | /dist/ 33 | /nbdist/ 34 | /.nb-gradle/ 35 | 36 | ### VS Code ### 37 | .vscode/ 38 | .env 39 | -------------------------------------------------------------------------------- /spring-boot-gateway-mvc/api-gateway/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oktadev/auth0-java-microservices-examples/953224d0ebd0bd801a2c186c8dd2b464a48b3a6a/spring-boot-gateway-mvc/api-gateway/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /spring-boot-gateway-mvc/api-gateway/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists 8 | -------------------------------------------------------------------------------- /spring-boot-gateway-mvc/api-gateway/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'api-gateway' 2 | -------------------------------------------------------------------------------- /spring-boot-gateway-mvc/api-gateway/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | spring.application.name=api-gateway 2 | spring.cloud.openfeign.oauth2.enabled=true 3 | spring.cloud.openfeign.oauth2.clientRegistrationId=okta 4 | #spring.cloud.openfeign.circuitbreaker.enabled=true 5 | 6 | okta.oauth2.issuer=${OKTA_OAUTH2_ISSUER} 7 | okta.oauth2.client-id=${OKTA_OAUTH2_CLIENT_ID} 8 | okta.oauth2.client-secret=${OKTA_OAUTH2_CLIENT_SECRET} 9 | okta.oauth2.audience=${OKTA_OAUTH2_AUDIENCE} 10 | -------------------------------------------------------------------------------- /spring-boot-gateway-mvc/api-gateway/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | cloud: 3 | gateway: 4 | discovery: 5 | locator: 6 | enabled: true 7 | -------------------------------------------------------------------------------- /spring-boot-gateway-mvc/api-gateway/src/test/java/com/example/apigateway/ApiGatewayApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.example.apigateway; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class ApiGatewayApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /spring-boot-gateway-mvc/car-service/.env.example: -------------------------------------------------------------------------------- 1 | OKTA_OAUTH2_ISSUER=https:/// 2 | OKTA_OAUTH2_AUDIENCE=https:///api/v2/ 3 | -------------------------------------------------------------------------------- /spring-boot-gateway-mvc/car-service/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | .gradle 3 | build/ 4 | !gradle/wrapper/gradle-wrapper.jar 5 | !**/src/main/**/build/ 6 | !**/src/test/**/build/ 7 | 8 | ### STS ### 9 | .apt_generated 10 | .classpath 11 | .factorypath 12 | .project 13 | .settings 14 | .springBeans 15 | .sts4-cache 16 | bin/ 17 | !**/src/main/**/bin/ 18 | !**/src/test/**/bin/ 19 | 20 | ### IntelliJ IDEA ### 21 | .idea 22 | *.iws 23 | *.iml 24 | *.ipr 25 | out/ 26 | !**/src/main/**/out/ 27 | !**/src/test/**/out/ 28 | 29 | ### NetBeans ### 30 | /nbproject/private/ 31 | /nbbuild/ 32 | /dist/ 33 | /nbdist/ 34 | /.nb-gradle/ 35 | 36 | ### VS Code ### 37 | .vscode/ 38 | .env 39 | -------------------------------------------------------------------------------- /spring-boot-gateway-mvc/car-service/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | postgres: 3 | image: 'postgres:latest' 4 | environment: 5 | - 'POSTGRES_DB=mydatabase' 6 | - 'POSTGRES_PASSWORD=secret' 7 | - 'POSTGRES_USER=myuser' 8 | ports: 9 | - '5432' 10 | -------------------------------------------------------------------------------- /spring-boot-gateway-mvc/car-service/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oktadev/auth0-java-microservices-examples/953224d0ebd0bd801a2c186c8dd2b464a48b3a6a/spring-boot-gateway-mvc/car-service/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /spring-boot-gateway-mvc/car-service/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists 8 | -------------------------------------------------------------------------------- /spring-boot-gateway-mvc/car-service/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'car-service' 2 | -------------------------------------------------------------------------------- /spring-boot-gateway-mvc/car-service/src/main/java/com/example/carservice/data/CarRepository.java: -------------------------------------------------------------------------------- 1 | package com.example.carservice.data; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | import org.springframework.data.rest.core.annotation.RepositoryRestResource; 5 | 6 | @RepositoryRestResource 7 | public interface CarRepository extends JpaRepository { 8 | } 9 | -------------------------------------------------------------------------------- /spring-boot-gateway-mvc/car-service/src/main/java/com/example/carservice/web/HomeController.java: -------------------------------------------------------------------------------- 1 | package com.example.carservice.web; 2 | 3 | import org.slf4j.Logger; 4 | import org.slf4j.LoggerFactory; 5 | import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken; 6 | import org.springframework.web.bind.annotation.GetMapping; 7 | import org.springframework.web.bind.annotation.RestController; 8 | 9 | import java.security.Principal; 10 | 11 | @RestController 12 | public class HomeController { 13 | 14 | private final static Logger log = LoggerFactory.getLogger(HomeController.class); 15 | 16 | @GetMapping("/home") 17 | public String howdy(Principal principal) { 18 | String username = principal.getName(); 19 | if (principal instanceof JwtAuthenticationToken token) { 20 | log.info("claims: " + token.getTokenAttributes()); 21 | } 22 | return "Hello, " + username; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /spring-boot-gateway-mvc/car-service/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | server.port=8090 2 | spring.application.name=car-service 3 | spring.jpa.hibernate.ddl-auto=update 4 | 5 | logging.level.org.springframework.security=TRACE 6 | 7 | okta.oauth2.issuer=${OKTA_OAUTH2_ISSUER} 8 | okta.oauth2.audience=${OKTA_OAUTH2_AUDIENCE} 9 | -------------------------------------------------------------------------------- /spring-boot-gateway-mvc/car-service/src/test/java/com/example/carservice/CarServiceApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.example.carservice; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class CarServiceApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /spring-boot-gateway-mvc/discovery-service/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | .gradle 3 | build/ 4 | !gradle/wrapper/gradle-wrapper.jar 5 | !**/src/main/**/build/ 6 | !**/src/test/**/build/ 7 | 8 | ### STS ### 9 | .apt_generated 10 | .classpath 11 | .factorypath 12 | .project 13 | .settings 14 | .springBeans 15 | .sts4-cache 16 | bin/ 17 | !**/src/main/**/bin/ 18 | !**/src/test/**/bin/ 19 | 20 | ### IntelliJ IDEA ### 21 | .idea 22 | *.iws 23 | *.iml 24 | *.ipr 25 | out/ 26 | !**/src/main/**/out/ 27 | !**/src/test/**/out/ 28 | 29 | ### NetBeans ### 30 | /nbproject/private/ 31 | /nbbuild/ 32 | /dist/ 33 | /nbdist/ 34 | /.nb-gradle/ 35 | 36 | ### VS Code ### 37 | .vscode/ 38 | -------------------------------------------------------------------------------- /spring-boot-gateway-mvc/discovery-service/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'java' 3 | id 'org.springframework.boot' version '3.2.0' 4 | id 'io.spring.dependency-management' version '1.1.4' 5 | } 6 | 7 | group = 'com.example' 8 | version = '0.0.1-SNAPSHOT' 9 | 10 | java { 11 | sourceCompatibility = '17' 12 | } 13 | 14 | repositories { 15 | mavenCentral() 16 | } 17 | 18 | ext { 19 | set('springCloudVersion', "2023.0.0") 20 | } 21 | 22 | dependencies { 23 | implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server' 24 | testImplementation 'org.springframework.boot:spring-boot-starter-test' 25 | } 26 | 27 | dependencyManagement { 28 | imports { 29 | mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" 30 | } 31 | } 32 | 33 | tasks.named('test') { 34 | useJUnitPlatform() 35 | } 36 | -------------------------------------------------------------------------------- /spring-boot-gateway-mvc/discovery-service/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oktadev/auth0-java-microservices-examples/953224d0ebd0bd801a2c186c8dd2b464a48b3a6a/spring-boot-gateway-mvc/discovery-service/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /spring-boot-gateway-mvc/discovery-service/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists 8 | -------------------------------------------------------------------------------- /spring-boot-gateway-mvc/discovery-service/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'discovery-service' 2 | -------------------------------------------------------------------------------- /spring-boot-gateway-mvc/discovery-service/src/main/java/com/example/discoveryservice/EurekaServiceApplication.java: -------------------------------------------------------------------------------- 1 | package com.example.discoveryservice; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; 6 | 7 | @EnableEurekaServer 8 | @SpringBootApplication 9 | public class EurekaServiceApplication { 10 | 11 | public static void main(String[] args) { 12 | SpringApplication.run(EurekaServiceApplication.class, args); 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /spring-boot-gateway-mvc/discovery-service/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | server.port=8761 2 | eureka.client.register-with-eureka=false 3 | eureka.client.fetch-registry=false 4 | -------------------------------------------------------------------------------- /spring-boot-gateway-mvc/discovery-service/src/test/java/com/example/discoveryservice/EurekaServiceApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.example.discoveryservice; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class EurekaServiceApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /spring-boot-gateway-webflux/.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | *.env 3 | -------------------------------------------------------------------------------- /spring-boot-gateway-webflux/api-gateway/.env.example: -------------------------------------------------------------------------------- 1 | OKTA_OAUTH2_ISSUER=https:/// 2 | OKTA_OAUTH2_CLIENT_ID= 3 | OKTA_OAUTH2_CLIENT_SECRET= 4 | OKTA_OAUTH2_AUDIENCE=https:///api/v2/ 5 | -------------------------------------------------------------------------------- /spring-boot-gateway-webflux/api-gateway/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | .gradle 3 | build/ 4 | !gradle/wrapper/gradle-wrapper.jar 5 | !**/src/main/**/build/ 6 | !**/src/test/**/build/ 7 | 8 | ### STS ### 9 | .apt_generated 10 | .classpath 11 | .factorypath 12 | .project 13 | .settings 14 | .springBeans 15 | .sts4-cache 16 | bin/ 17 | !**/src/main/**/bin/ 18 | !**/src/test/**/bin/ 19 | 20 | ### IntelliJ IDEA ### 21 | .idea 22 | *.iws 23 | *.iml 24 | *.ipr 25 | out/ 26 | !**/src/main/**/out/ 27 | !**/src/test/**/out/ 28 | 29 | ### NetBeans ### 30 | /nbproject/private/ 31 | /nbbuild/ 32 | /dist/ 33 | /nbdist/ 34 | /.nb-gradle/ 35 | 36 | ### VS Code ### 37 | .vscode/ 38 | .env 39 | -------------------------------------------------------------------------------- /spring-boot-gateway-webflux/api-gateway/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oktadev/auth0-java-microservices-examples/953224d0ebd0bd801a2c186c8dd2b464a48b3a6a/spring-boot-gateway-webflux/api-gateway/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /spring-boot-gateway-webflux/api-gateway/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists 8 | -------------------------------------------------------------------------------- /spring-boot-gateway-webflux/api-gateway/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'api-gateway' 2 | -------------------------------------------------------------------------------- /spring-boot-gateway-webflux/api-gateway/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | spring.application.name=api-gateway 2 | #logging.level.org.springframework=WARN 3 | #logging.level.com.netflix.discovery=WARN 4 | logging.level.org.springframework.web.reactive.function.client=DEBUG 5 | 6 | okta.oauth2.issuer=${OKTA_OAUTH2_ISSUER} 7 | okta.oauth2.client-id=${OKTA_OAUTH2_CLIENT_ID} 8 | okta.oauth2.client-secret=${OKTA_OAUTH2_CLIENT_SECRET} 9 | okta.oauth2.audience=${OKTA_OAUTH2_AUDIENCE} 10 | -------------------------------------------------------------------------------- /spring-boot-gateway-webflux/api-gateway/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | cloud: 3 | gateway: 4 | discovery: 5 | locator: 6 | enabled: true 7 | default-filters: 8 | - TokenRelay 9 | routes: 10 | - id: car-service 11 | uri: lb://car-service 12 | predicates: 13 | - Path=/home/** 14 | -------------------------------------------------------------------------------- /spring-boot-gateway-webflux/api-gateway/src/test/java/com/example/apigateway/ApiGatewayApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.example.apigateway; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class ApiGatewayApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /spring-boot-gateway-webflux/car-service/.env.example: -------------------------------------------------------------------------------- 1 | OKTA_OAUTH2_ISSUER=https:/// 2 | OKTA_OAUTH2_AUDIENCE=https:///api/v2/ 3 | -------------------------------------------------------------------------------- /spring-boot-gateway-webflux/car-service/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | .gradle 3 | build/ 4 | !gradle/wrapper/gradle-wrapper.jar 5 | !**/src/main/**/build/ 6 | !**/src/test/**/build/ 7 | 8 | ### STS ### 9 | .apt_generated 10 | .classpath 11 | .factorypath 12 | .project 13 | .settings 14 | .springBeans 15 | .sts4-cache 16 | bin/ 17 | !**/src/main/**/bin/ 18 | !**/src/test/**/bin/ 19 | 20 | ### IntelliJ IDEA ### 21 | .idea 22 | *.iws 23 | *.iml 24 | *.ipr 25 | out/ 26 | !**/src/main/**/out/ 27 | !**/src/test/**/out/ 28 | 29 | ### NetBeans ### 30 | /nbproject/private/ 31 | /nbbuild/ 32 | /dist/ 33 | /nbdist/ 34 | /.nb-gradle/ 35 | 36 | ### VS Code ### 37 | .vscode/ 38 | .env 39 | -------------------------------------------------------------------------------- /spring-boot-gateway-webflux/car-service/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | postgres: 3 | image: 'postgres:latest' 4 | environment: 5 | - 'POSTGRES_DB=mydatabase' 6 | - 'POSTGRES_PASSWORD=secret' 7 | - 'POSTGRES_USER=myuser' 8 | ports: 9 | - '5432' 10 | -------------------------------------------------------------------------------- /spring-boot-gateway-webflux/car-service/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oktadev/auth0-java-microservices-examples/953224d0ebd0bd801a2c186c8dd2b464a48b3a6a/spring-boot-gateway-webflux/car-service/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /spring-boot-gateway-webflux/car-service/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists 8 | -------------------------------------------------------------------------------- /spring-boot-gateway-webflux/car-service/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'car-service' 2 | -------------------------------------------------------------------------------- /spring-boot-gateway-webflux/car-service/src/main/java/com/example/carservice/data/CarRepository.java: -------------------------------------------------------------------------------- 1 | package com.example.carservice.data; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | 5 | public interface CarRepository extends JpaRepository { 6 | } 7 | -------------------------------------------------------------------------------- /spring-boot-gateway-webflux/car-service/src/main/java/com/example/carservice/web/CarController.java: -------------------------------------------------------------------------------- 1 | package com.example.carservice.web; 2 | 3 | import com.example.carservice.data.Car; 4 | import com.example.carservice.data.CarRepository; 5 | import org.springframework.web.bind.annotation.GetMapping; 6 | import org.springframework.web.bind.annotation.RestController; 7 | 8 | import java.util.List; 9 | 10 | @RestController 11 | class CarController { 12 | 13 | private final CarRepository repository; 14 | 15 | public CarController(CarRepository repository) { 16 | this.repository = repository; 17 | } 18 | 19 | @GetMapping("/cars") 20 | public List getCars() { 21 | return repository.findAll(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /spring-boot-gateway-webflux/car-service/src/main/java/com/example/carservice/web/HomeController.java: -------------------------------------------------------------------------------- 1 | package com.example.carservice.web; 2 | 3 | import org.slf4j.Logger; 4 | import org.slf4j.LoggerFactory; 5 | import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken; 6 | import org.springframework.web.bind.annotation.GetMapping; 7 | import org.springframework.web.bind.annotation.RestController; 8 | 9 | import java.security.Principal; 10 | 11 | @RestController 12 | public class HomeController { 13 | 14 | private final static Logger log = LoggerFactory.getLogger(HomeController.class); 15 | 16 | @GetMapping("/home") 17 | public String home(Principal principal) { 18 | var username = principal.getName(); 19 | if (principal instanceof JwtAuthenticationToken token) { 20 | log.info("claims: " + token.getTokenAttributes()); 21 | } 22 | return "Hello, " + username; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /spring-boot-gateway-webflux/car-service/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | server.port=8090 2 | spring.application.name=car-service 3 | spring.jpa.hibernate.ddl-auto=update 4 | 5 | logging.level.org.springframework.security=TRACE 6 | 7 | okta.oauth2.issuer=${OKTA_OAUTH2_ISSUER} 8 | okta.oauth2.audience=${OKTA_OAUTH2_AUDIENCE} 9 | -------------------------------------------------------------------------------- /spring-boot-gateway-webflux/car-service/src/test/java/com/example/carservice/CarServiceApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.example.carservice; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class CarServiceApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /spring-boot-gateway-webflux/discovery-service/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | .gradle 3 | build/ 4 | !gradle/wrapper/gradle-wrapper.jar 5 | !**/src/main/**/build/ 6 | !**/src/test/**/build/ 7 | 8 | ### STS ### 9 | .apt_generated 10 | .classpath 11 | .factorypath 12 | .project 13 | .settings 14 | .springBeans 15 | .sts4-cache 16 | bin/ 17 | !**/src/main/**/bin/ 18 | !**/src/test/**/bin/ 19 | 20 | ### IntelliJ IDEA ### 21 | .idea 22 | *.iws 23 | *.iml 24 | *.ipr 25 | out/ 26 | !**/src/main/**/out/ 27 | !**/src/test/**/out/ 28 | 29 | ### NetBeans ### 30 | /nbproject/private/ 31 | /nbbuild/ 32 | /dist/ 33 | /nbdist/ 34 | /.nb-gradle/ 35 | 36 | ### VS Code ### 37 | .vscode/ 38 | -------------------------------------------------------------------------------- /spring-boot-gateway-webflux/discovery-service/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'java' 3 | id 'org.springframework.boot' version '3.2.0' 4 | id 'io.spring.dependency-management' version '1.1.4' 5 | } 6 | 7 | group = 'com.example' 8 | version = '0.0.1-SNAPSHOT' 9 | 10 | java { 11 | sourceCompatibility = '17' 12 | } 13 | 14 | repositories { 15 | mavenCentral() 16 | } 17 | 18 | ext { 19 | set('springCloudVersion', "2023.0.0") 20 | } 21 | 22 | dependencies { 23 | implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server' 24 | testImplementation 'org.springframework.boot:spring-boot-starter-test' 25 | } 26 | 27 | dependencyManagement { 28 | imports { 29 | mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" 30 | } 31 | } 32 | 33 | tasks.named('test') { 34 | useJUnitPlatform() 35 | } 36 | -------------------------------------------------------------------------------- /spring-boot-gateway-webflux/discovery-service/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oktadev/auth0-java-microservices-examples/953224d0ebd0bd801a2c186c8dd2b464a48b3a6a/spring-boot-gateway-webflux/discovery-service/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /spring-boot-gateway-webflux/discovery-service/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists 8 | -------------------------------------------------------------------------------- /spring-boot-gateway-webflux/discovery-service/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'discovery-service' 2 | -------------------------------------------------------------------------------- /spring-boot-gateway-webflux/discovery-service/src/main/java/com/example/discoveryservice/EurekaServiceApplication.java: -------------------------------------------------------------------------------- 1 | package com.example.discoveryservice; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; 6 | 7 | @EnableEurekaServer 8 | @SpringBootApplication 9 | public class EurekaServiceApplication { 10 | 11 | public static void main(String[] args) { 12 | SpringApplication.run(EurekaServiceApplication.class, args); 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /spring-boot-gateway-webflux/discovery-service/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | server.port=8761 2 | eureka.client.register-with-eureka=false 3 | eureka.client.fetch-registry=false 4 | -------------------------------------------------------------------------------- /spring-boot-gateway-webflux/discovery-service/src/test/java/com/example/discoveryservice/EurekaServiceApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.example.discoveryservice; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class EurekaServiceApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /static/java-microservices.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oktadev/auth0-java-microservices-examples/953224d0ebd0bd801a2c186c8dd2b464a48b3a6a/static/java-microservices.webp --------------------------------------------------------------------------------