├── .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 | [](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 |
2 |
12 |
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 |
2 |
3 |
4 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
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 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
Error Page!
9 |
10 |
11 |
{{ errorMessage }}
12 |
13 |
You are not authorized to access this page.
14 |
The page you requested does not exist.
15 |
16 |
17 |
18 |
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 |
2 |
5 |
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 |
2 |
3 |
4 |
5 | Blog
6 |
7 |
8 |
9 | Post
10 |
11 |
12 |
13 | Tag
14 |
15 |
16 |
17 | Product
18 |
19 |
20 |
21 |
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 |
2 |
3 |
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 |
2 |
3 |
4 | Showing {{ first }} - {{ second }} of {{ total }} items.
7 |
8 | Showing {{ (page - 1) * itemsPerPage === 0 ? 1 : (page - 1) * itemsPerPage + 1 }} -
9 | {{ page * itemsPerPage < total ? page * itemsPerPage : total }}
10 | of {{ total }} items.
11 |
12 |
13 |
14 |
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 |
2 |
3 |
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
--------------------------------------------------------------------------------