generator-jhipster 8.0.0-rc.1 → 8.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +71 -58
- package/dist/cli/environment-builder.mjs +14 -7
- package/dist/cli/jhipster-command.mjs +7 -3
- package/dist/cli/program.mjs +2 -2
- package/dist/generators/angular/cleanup.mjs +7 -0
- package/dist/generators/angular/files-angular.mjs +3 -4
- package/dist/generators/angular/generator.mjs +10 -22
- package/dist/generators/angular/needle-api/needle-client-angular.mjs +2 -8
- package/dist/generators/angular/resources/package.json +25 -24
- package/dist/generators/angular/support/translate-angular.mjs +2 -2
- package/dist/generators/angular/templates/README.md.jhi.client.angular.ejs +1 -1
- package/dist/generators/angular/templates/angular.json.ejs +3 -7
- package/dist/generators/angular/templates/package.json.ejs +4 -8
- package/dist/generators/angular/templates/src/main/webapp/app/account/activate/activate.component.html.ejs +6 -4
- package/dist/generators/angular/templates/src/main/webapp/app/account/password/password-strength-bar/password-strength-bar.component.ts.ejs +1 -1
- package/dist/generators/angular/templates/src/main/webapp/app/account/password/password.component.html.ejs +39 -33
- package/dist/generators/angular/templates/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.html.ejs +44 -36
- package/dist/generators/angular/templates/src/main/webapp/app/account/password-reset/init/password-reset-init.component.html.ejs +24 -23
- package/dist/generators/angular/templates/src/main/webapp/app/account/register/register.component.html.ejs +74 -62
- package/dist/generators/angular/templates/src/main/webapp/app/account/sessions/sessions.component.html.ejs +12 -4
- package/dist/generators/angular/templates/src/main/webapp/app/account/settings/settings.component.html.ejs +54 -48
- package/dist/generators/angular/templates/src/main/webapp/app/admin/admin.routes.ts.ejs +74 -0
- package/dist/generators/angular/templates/src/main/webapp/app/admin/configuration/configuration.component.html.ejs +15 -5
- package/dist/generators/angular/templates/src/main/webapp/app/admin/docs/docs.component.ts.ejs +1 -1
- package/dist/generators/angular/templates/src/main/webapp/app/admin/gateway/gateway.component.html.ejs +20 -7
- package/dist/generators/angular/templates/src/main/webapp/app/admin/health/health.component.html.ejs +10 -7
- package/dist/generators/angular/templates/src/main/webapp/app/admin/health/modal/health-modal.component.html.ejs +9 -3
- package/dist/generators/angular/templates/src/main/webapp/app/admin/logs/logs.component.html.ejs +12 -4
- package/dist/generators/angular/templates/src/main/webapp/app/admin/metrics/blocks/jvm-memory/jvm-memory.component.html.ejs +13 -7
- package/dist/generators/angular/templates/src/main/webapp/app/admin/metrics/blocks/metrics-cache/metrics-cache.component.html.ejs +6 -2
- package/dist/generators/angular/templates/src/main/webapp/app/admin/metrics/blocks/metrics-datasource/metrics-datasource.component.html.ejs +3 -1
- package/dist/generators/angular/templates/src/main/webapp/app/admin/metrics/blocks/metrics-endpoints-requests/metrics-endpoints-requests.component.html.ejs +13 -9
- package/dist/generators/angular/templates/src/main/webapp/app/admin/metrics/blocks/metrics-garbagecollector/metrics-garbagecollector.component.html.ejs +13 -5
- package/dist/generators/angular/templates/src/main/webapp/app/admin/metrics/blocks/metrics-modal-threads/metrics-modal-threads.component.html.ejs +21 -7
- package/dist/generators/angular/templates/src/main/webapp/app/admin/metrics/blocks/metrics-request/metrics-request.component.html.ejs +6 -2
- package/dist/generators/angular/templates/src/main/webapp/app/admin/metrics/blocks/metrics-system/metrics-system.component.html.ejs +3 -1
- package/dist/generators/angular/templates/src/main/webapp/app/admin/metrics/metrics.component.html.ejs +16 -7
- package/dist/generators/angular/templates/src/main/webapp/app/admin/tracker/tracker.component.html.ejs +3 -1
- package/dist/generators/angular/templates/src/main/webapp/app/admin/user-management/delete/user-management-delete-dialog.component.html.ejs +3 -1
- package/dist/generators/angular/templates/src/main/webapp/app/admin/user-management/detail/user-management-detail.component.html.ejs +11 -4
- package/dist/generators/angular/templates/src/main/webapp/app/admin/user-management/list/user-management.component.html.ejs +20 -11
- package/dist/generators/angular/templates/src/main/webapp/app/admin/user-management/update/user-management-update.component.html.ejs +48 -34
- package/dist/generators/angular/templates/src/main/webapp/app/app.component.ts.ejs +73 -0
- package/dist/generators/angular/templates/src/main/webapp/app/app.config.ts.ejs +67 -0
- package/dist/generators/angular/templates/src/main/webapp/app/app.routes.ts.ejs +85 -0
- package/dist/generators/angular/templates/src/main/webapp/app/core/microfrontend/index.ts.ejs +5 -4
- package/dist/generators/angular/templates/src/main/webapp/app/core/util/alert.service.spec.ts.ejs +1 -1
- package/dist/generators/angular/templates/src/main/webapp/app/core/util/data-util.service.ts.ejs +2 -2
- package/dist/generators/angular/templates/src/main/webapp/app/core/util/event-manager.service.spec.ts.ejs +12 -12
- package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_.model.ts.ejs +4 -4
- package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/delete/_entityFile_-delete-dialog.component.html.ejs +3 -1
- package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/detail/_entityFile_-detail.component.html.ejs +26 -14
- package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/list/_entityFile_.component.html.ejs +44 -35
- package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/list/_entityFile_.component.ts.ejs +1 -1
- package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/service/_entityFile_.service.ts.ejs +1 -1
- package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/update/_entityFile_-form.service.spec.ts.ejs +2 -2
- package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/update/_entityFile_-form.service.ts.ejs +5 -12
- package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/update/_entityFile_-update.component.html.ejs +55 -21
- package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/update/_entityFile_-update.component.spec.ts.ejs +2 -2
- package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/update/_entityFile_-update.component.ts.ejs +10 -10
- package/dist/generators/angular/templates/src/main/webapp/app/entities/entity.routes.ts.ejs +25 -0
- package/dist/generators/angular/templates/src/main/webapp/app/home/home.component.html.ejs +21 -17
- package/dist/generators/angular/templates/src/main/webapp/app/home/home.component.ts.ejs +1 -1
- package/dist/generators/angular/templates/src/main/webapp/app/layouts/error/error.component.html.ejs +3 -3
- package/dist/generators/angular/templates/src/main/webapp/app/layouts/main/main.component.spec.ts.ejs +5 -2
- package/dist/generators/angular/templates/src/main/webapp/app/layouts/main/main.component.ts.ejs +5 -1
- package/dist/generators/angular/templates/src/main/webapp/app/layouts/navbar/navbar.component.html.ejs +97 -78
- package/dist/generators/angular/templates/src/main/webapp/app/layouts/navbar/navbar.component.scss.ejs +1 -1
- package/dist/generators/angular/templates/src/main/webapp/app/layouts/navbar/navbar.component.ts.ejs +1 -1
- package/dist/generators/angular/templates/src/main/webapp/app/layouts/profiles/page-ribbon.component.scss.ejs +1 -1
- package/dist/generators/angular/templates/src/main/webapp/app/layouts/profiles/page-ribbon.component.ts.ejs +6 -4
- package/dist/generators/angular/templates/src/main/webapp/app/login/login.component.html.ejs +3 -3
- package/dist/generators/angular/templates/src/main/webapp/app/shared/alert/alert-error.component.html.ejs +6 -2
- package/dist/generators/angular/templates/src/main/webapp/app/shared/alert/alert.component.html.ejs +6 -2
- package/dist/generators/angular/templates/src/main/webapp/app/shared/filter/filter.component.html.ejs +11 -7
- package/dist/generators/angular/templates/src/main/webapp/app/shared/filter/filter.model.spec.ts.ejs +1 -1
- package/dist/generators/angular/templates/src/main/webapp/app/shared/sort/sort-by.directive.spec.ts.ejs +3 -3
- package/dist/generators/angular/templates/src/main/webapp/bootstrap.ts.ejs +5 -5
- package/dist/generators/angular/templates/src/main/webapp/content/scss/global.scss.ejs +1 -1
- package/dist/generators/angular/templates/webpack/webpack.microfrontend.js.ejs +48 -126
- package/dist/generators/app/README.md +108 -0
- package/dist/generators/app/USAGE +3 -0
- package/dist/generators/app/command.mjs +3 -3
- package/dist/generators/app/generator.mjs +11 -0
- package/dist/generators/app/support/config.mjs +3 -3
- package/dist/generators/base/command.mjs +0 -11
- package/dist/generators/base/generator.mjs +0 -3
- package/dist/generators/base/support/config.mjs +6 -6
- package/dist/generators/base/support/jhipster7-context.mjs +3 -3
- package/dist/generators/base-application/generator.mjs +7 -8
- package/dist/generators/base-application/support/entities.mjs +2 -2
- package/dist/generators/base-application/support/enum.mjs +1 -1
- package/dist/generators/base-application/support/index.mjs +1 -0
- package/dist/generators/base-application/support/prepare-entity.mjs +14 -11
- package/dist/generators/base-application/support/prepare-field.mjs +11 -7
- package/dist/generators/base-application/support/prepare-relationship.mjs +16 -14
- package/dist/generators/base-application/support/update-application-entities-transform.mjs +52 -0
- package/dist/generators/base-core/generator.mjs +17 -4
- package/dist/generators/base-entity-changes/generator.mjs +1 -1
- package/dist/generators/base-workspaces/internal/docker-prompts.mjs +13 -12
- package/dist/generators/bootstrap/command.mjs +6 -0
- package/dist/generators/bootstrap/generator.mjs +84 -45
- package/dist/generators/bootstrap/support/auto-crlf-transform.mjs +34 -21
- package/dist/generators/bootstrap/support/eslint-transform.mjs +2 -5
- package/dist/generators/bootstrap/support/java-unused-imports-transform.mjs +2 -2
- package/dist/generators/bootstrap/support/multi-step-transform/index.mjs +17 -28
- package/dist/generators/bootstrap/support/multi-step-transform/template-file-fs.mjs +12 -6
- package/dist/generators/bootstrap/support/multi-step-transform/template-file.mjs +1 -0
- package/dist/generators/bootstrap/support/prettier-support.mjs +2 -2
- package/dist/generators/bootstrap-application/generator.mjs +10 -21
- package/dist/generators/bootstrap-application-base/command.mjs +30 -0
- package/dist/generators/bootstrap-application-base/generator.mjs +36 -11
- package/dist/generators/bootstrap-application-base/index.mjs +1 -0
- package/dist/generators/bootstrap-application-base/support/export-jdl-transform.mjs +61 -0
- package/dist/generators/bootstrap-application-base/support/import-jdl-transform.mjs +64 -0
- package/dist/generators/bootstrap-application-base/support/index.mjs +2 -0
- package/dist/generators/bootstrap-application-server/generator.mjs +2 -2
- package/dist/generators/client/command.mjs +2 -0
- package/dist/generators/client/resources/package.json +4 -4
- package/dist/generators/client/support/entity-definition.mjs +3 -3
- package/dist/generators/client/templates/README.md.jhi.client.ejs +2 -2
- package/dist/generators/client/templates/src/main/webapp/content/css/loading.css.ejs +1 -1
- package/dist/generators/client/templates/src/main/webapp/index.html.ejs +2 -2
- package/dist/generators/client/templates/webpack/webpack.microfrontend.js.jhi.ejs +14 -1
- package/dist/generators/common/command.mjs +2 -0
- package/dist/generators/common/files.mjs +1 -1
- package/dist/generators/common/generator.mjs +29 -7
- package/dist/generators/common/resources/package.json +4 -4
- package/dist/generators/common/templates/.lintstagedrc.cjs.ejs +21 -0
- package/dist/generators/common/templates/.prettierrc.ejs +1 -1
- package/dist/generators/common/templates/README.md.jhi.ejs +2 -0
- package/dist/generators/common/templates/sonar-project.properties.ejs +1 -1
- package/dist/generators/cypress/templates/src/test/javascript/cypress/e2e/account/settings-page.cy.ts.ejs +3 -0
- package/dist/generators/cypress/templates/src/test/javascript/cypress/e2e/entity/_entity_.cy.ts.ejs +0 -1
- package/dist/generators/docker/generator.mjs +1 -1
- package/dist/generators/docker/templates/docker/cassandra.yml.ejs +2 -2
- package/dist/generators/docker/templates/docker/keycloak.yml.ejs +1 -1
- package/dist/generators/docker/templates/docker/realm-config/jhipster-realm.json.ejs +4 -1
- package/dist/generators/docker-compose/generator.mjs +4 -11
- package/dist/generators/docker-compose/templates/docker-compose.yml.ejs +1 -1
- package/dist/generators/docker-compose/templates/realm-config/jhipster-realm.json.ejs +4 -1
- package/dist/generators/entity/prompts.mjs +123 -306
- package/dist/generators/export-jdl/generator.mjs +1 -1
- package/dist/generators/feign-client/cleanup.mjs +12 -0
- package/dist/generators/feign-client/files.mjs +35 -0
- package/dist/generators/feign-client/generator.mjs +65 -0
- package/dist/generators/feign-client/index.mjs +19 -0
- package/dist/generators/feign-client/templates/src/main/java/_package_/client/AuthorizationHeaderUtil.java.ejs +174 -0
- package/dist/generators/feign-client/templates/src/main/java/_package_/client/AuthorizedFeignClient.java.ejs +72 -0
- package/dist/generators/feign-client/templates/src/main/java/_package_/client/OAuth2InterceptedFeignConfiguration.java.ejs +35 -0
- package/dist/generators/feign-client/templates/src/main/java/_package_/client/OAuthIdpTokenResponseDTO.java.ejs +161 -0
- package/dist/generators/feign-client/templates/src/main/java/_package_/client/TokenRelayRequestInterceptor.java.ejs +42 -0
- package/dist/generators/feign-client/templates/src/main/java/_package_/client/UserFeignClientInterceptor_jwt.java.ejs +36 -0
- package/dist/generators/feign-client/templates/src/main/java/_package_/config/FeignConfiguration.java.ejs +45 -0
- package/dist/generators/feign-client/templates/src/test/java/_package_/client/AuthorizationHeaderUtilTest.java.ejs +263 -0
- package/dist/generators/generate-blueprint/command.mjs +1 -1
- package/dist/generators/generate-blueprint/resources/package.json +1 -1
- package/dist/generators/generate-blueprint/templates/vitest.config.ts.ejs +1 -1
- package/dist/generators/generator-constants.mjs +11 -7
- package/dist/generators/generator-list.mjs +1 -0
- package/dist/generators/git/generator.mjs +3 -5
- package/dist/generators/gradle/constants.mjs +1 -1
- package/dist/generators/heroku/generator.mjs +318 -595
- package/dist/generators/heroku/templates/Procfile.ejs +1 -1
- package/dist/generators/heroku/templates/application-heroku.yml.ejs +0 -12
- package/dist/generators/info/generator.mjs +6 -4
- package/dist/generators/init/generator.mjs +2 -2
- package/dist/generators/java/command.mjs +6 -0
- package/dist/generators/java/entity-files.mjs +5 -1
- package/dist/generators/java/generator.mjs +15 -15
- package/dist/generators/java/support/package-info-transform.mjs +20 -6
- package/dist/generators/java/templates/src/main/java/_package_/_entityPackage_/domain/_persistClass_.java.jhi.ejs +24 -28
- package/dist/generators/java/templates/src/main/java/_package_/_entityPackage_/domain/_persistClass_.java.jhi.jackson_identity_info.ejs +30 -0
- package/dist/generators/java/templates/src/main/java/_package_/_entityPackage_/domain/enumeration/_enumName_.java.ejs +3 -3
- package/dist/generators/java/templates/src/test/java/_package_/_entityPackage_/domain/_persistClass_Test.java.ejs +86 -8
- package/dist/generators/java/templates/src/test/java/_package_/_entityPackage_/domain/_persistClass_TestSamples.java.ejs +85 -0
- package/dist/generators/jdl/generator.mjs +32 -28
- package/dist/generators/kubernetes/templates/ingress.yml.ejs +0 -1
- package/dist/generators/kubernetes/templates/keycloak/keycloak-configmap.yml.ejs +4 -1
- package/dist/generators/kubernetes/templates/keycloak/keycloak.yml.ejs +1 -1
- package/dist/generators/languages/command.mjs +5 -0
- package/dist/generators/languages/generator.mjs +44 -28
- package/dist/generators/languages/prompts.mjs +3 -1
- package/dist/generators/languages/support/translate.mjs +1 -1
- package/dist/generators/languages/templates/entity/i18n/entity_pt-br.json.ejs +1 -1
- package/dist/generators/languages/translation-data.mjs +8 -13
- package/dist/generators/liquibase/README.md +19 -0
- package/dist/generators/liquibase/generator.mjs +7 -3
- package/dist/generators/project-name/generator.mjs +14 -19
- package/dist/generators/project-name/support/name-resolver.mjs +35 -6
- package/dist/generators/react/generator.mjs +18 -10
- package/dist/generators/react/resources/package.json +30 -29
- package/dist/generators/react/templates/package.json.ejs +4 -5
- package/dist/generators/react/templates/src/main/webapp/app/config/icon-loader.ts.ejs +35 -33
- package/dist/generators/react/templates/src/main/webapp/app/config/notification-middleware.spec.ts.ejs +4 -4
- package/dist/generators/react/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_-detail.tsx.ejs +1 -2
- package/dist/generators/react/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_-update.tsx.ejs +19 -15
- package/dist/generators/react/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_.reducer.ts.ejs +1 -1
- package/dist/generators/react/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_.tsx.ejs +3 -8
- package/dist/generators/react/templates/src/main/webapp/app/entities/_entityFolder_/_entityModel_.model.ts.ejs +1 -1
- package/dist/generators/react/templates/src/main/webapp/app/modules/home/home.tsx.ejs +1 -1
- package/dist/generators/react/templates/src/main/webapp/app/routes.tsx.ejs +9 -2
- package/dist/generators/react/templates/src/main/webapp/app/shared/layout/header/header-components.tsx.ejs +1 -1
- package/dist/generators/react/templates/src/main/webapp/app/shared/layout/header/header.scss.ejs +6 -5
- package/dist/generators/react/templates/src/main/webapp/app/shared/layout/menus/entities.tsx.ejs +10 -1
- package/dist/generators/react/templates/src/main/webapp/app/shared/reducers/reducer.utils.ts.ejs +1 -1
- package/dist/generators/react/templates/src/main/webapp/app/shared/util/date-utils.ts.ejs +1 -1
- package/dist/generators/react/templates/tsconfig.test.json.ejs +1 -1
- package/dist/generators/react/templates/webpack/webpack.microfrontend.js.jhi.react.ejs +13 -58
- package/dist/generators/server/cleanup.mjs +5 -0
- package/dist/generators/server/command.mjs +13 -2
- package/dist/generators/server/entity-files.mjs +3 -3
- package/dist/generators/server/files.mjs +2 -38
- package/dist/generators/server/generator.mjs +48 -23
- package/dist/generators/server/jdl/application-definition.mjs +5 -2
- package/dist/generators/server/options/feign-client.mjs +24 -0
- package/dist/generators/server/options/index.mjs +1 -0
- package/dist/generators/server/resources/Dockerfile +19 -19
- package/dist/generators/server/resources/gradle/libs.versions.toml +4 -4
- package/dist/generators/server/resources/pom.xml +18 -18
- package/dist/generators/server/support/config.mjs +5 -4
- package/dist/generators/server/support/prepare-entity.mjs +9 -6
- package/dist/generators/server/support/prepare-field.mjs +20 -0
- package/dist/generators/server/support/relationship.mjs +2 -1
- package/dist/generators/server/support/templates/field-values.mjs +5 -2
- package/dist/generators/server/templates/README.md.jhi.spring-boot.ejs +0 -1
- package/dist/generators/server/templates/build.gradle.ejs +1 -2
- package/dist/generators/server/templates/gradle/profile_dev.gradle.ejs +3 -21
- package/dist/generators/server/templates/gradle/profile_prod.gradle.ejs +5 -15
- package/dist/generators/server/templates/package.json.ejs +0 -5
- package/dist/generators/server/templates/pom.xml.ejs +2 -12
- package/dist/generators/server/templates/src/main/java/_package_/_entityPackage_/_partials_entity_/get_all_template.ejs +8 -8
- package/dist/generators/server/templates/src/main/java/_package_/_entityPackage_/_partials_entity_/search_template.ejs +4 -4
- package/dist/generators/server/templates/src/main/java/_package_/_entityPackage_/repository/_entityClass_Repository.java.ejs +1 -1
- package/dist/generators/server/templates/src/main/java/_package_/_entityPackage_/service/dto/_dtoClass_.java.ejs +2 -2
- package/dist/generators/server/templates/src/main/java/_package_/_entityPackage_/service/mapper/_entityClass_Mapper.java.ejs +2 -2
- package/dist/generators/server/templates/src/main/java/_package_/_entityPackage_/web/rest/_entityClass_Resource.java.ejs +14 -14
- package/dist/generators/server/templates/src/main/java/_package_/config/JacksonConfiguration.java.ejs +2 -1
- package/dist/generators/server/templates/src/main/java/_package_/config/SecurityConfiguration_imperative.java.ejs +21 -3
- package/dist/generators/server/templates/src/main/java/_package_/config/SecurityConfiguration_reactive.java.ejs +6 -1
- package/dist/generators/server/templates/src/main/java/_package_/security/oauth2/CustomClaimConverter.java.ejs +1 -5
- package/dist/generators/server/templates/src/main/java/_package_/service/MailService.java.ejs +48 -6
- package/dist/generators/server/templates/src/main/java/_package_/web/rest/AccountResource.java.ejs +1 -1
- package/dist/generators/server/templates/src/main/java/_package_/web/rest/LogoutResource_imperative.java.ejs +4 -13
- package/dist/generators/server/templates/src/main/java/_package_/web/rest/LogoutResource_reactive.java.ejs +5 -11
- package/dist/generators/server/templates/src/main/java/_package_/web/rest/PublicUserResource.java.ejs +6 -7
- package/dist/generators/server/templates/src/main/java/_package_/web/rest/UserResource.java.ejs +6 -8
- package/dist/generators/server/templates/src/main/java/_package_/web/rest/errors/ExceptionTranslator.java.ejs +4 -7
- package/dist/generators/server/templates/src/main/resources/config/application.yml.ejs +8 -7
- package/dist/generators/server/templates/src/test/java/_package_/TechnicalStructureTest.java.ejs +1 -1
- package/dist/generators/server/templates/src/test/java/_package_/_entityPackage_/web/rest/_entityClass_ResourceIT.java.ejs +11 -11
- package/dist/generators/server/templates/src/test/java/_package_/web/rest/AccountResourceIT.java.ejs +4 -4
- package/dist/generators/server/templates/src/test/java/_package_/web/rest/errors/ExceptionTranslatorTestController.java.ejs +2 -2
- package/dist/generators/spring-cache/internal/dependencies.mjs +1 -1
- package/dist/generators/spring-cache/templates/gradle/cache.gradle.ejs +1 -1
- package/dist/generators/spring-cache/templates/src/main/java/_package_/config/CacheFactoryConfiguration.java.ejs +1 -1
- package/dist/generators/spring-cloud-stream/templates/src/main/java/_package_/web/rest/KafkaResource_imperative.java.ejs +1 -1
- package/dist/generators/spring-cloud-stream/templates/src/main/java/_package_/web/rest/KafkaResource_reactive.java.ejs +1 -1
- package/dist/generators/spring-cloud-stream/templates/src/test/java/_package_/web/rest/KafkaResourceIT_reactive.java.ejs +3 -0
- package/dist/generators/spring-data-elasticsearch/templates/src/main/java/_package_/_entityPackage_/domain/_persistClass_.java.jhi.elastic_search.ejs +1 -1
- package/dist/generators/spring-data-elasticsearch/templates/src/main/java/_package_/_entityPackage_/repository/search/_entityClass_SearchRepository.java.ejs +1 -3
- package/dist/generators/spring-data-elasticsearch/templates/src/main/java/_package_/repository/search/UserSearchRepository.java.ejs +4 -4
- package/dist/generators/spring-data-neo4j/generator.mjs +43 -1
- package/dist/generators/spring-data-neo4j/templates/src/main/java/_package_/_entityPackage_/domain/_persistClass_.java.jhi.spring_data_neo4j.ejs +3 -37
- package/dist/generators/spring-data-relational/README.md +7 -0
- package/dist/generators/spring-data-relational/generator.mjs +2 -1
- package/dist/generators/spring-data-relational/internal/dependencies.mjs +29 -8
- package/dist/generators/spring-data-relational/support/database-data.mjs +4 -0
- package/dist/generators/spring-data-relational/templates/src/main/java/_package_/repository/EntityManager_reactive.java.ejs +49 -8
- package/dist/generators/spring-data-relational/templates/src/test/java/_package_/config/SqlTestContainersSpringContextCustomizerFactory.java.ejs +1 -1
- package/dist/generators/upgrade/generator.mjs +3 -3
- package/dist/generators/vue/generator.mjs +25 -16
- package/dist/generators/vue/resources/package.json +29 -28
- package/dist/generators/vue/templates/package.json.ejs +4 -5
- package/dist/generators/vue/templates/src/main/webapp/app/core/jhi-navbar/jhi-navbar.component.ts.ejs +10 -3
- package/dist/generators/vue/templates/src/main/webapp/app/core/jhi-navbar/jhi-navbar.vue.ejs +3 -4
- package/dist/generators/vue/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_-details.vue.ejs +1 -2
- package/dist/generators/vue/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_-update.component.spec.ts.ejs +1 -1
- package/dist/generators/vue/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_-update.component.ts.ejs +3 -3
- package/dist/generators/vue/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_-update.vue.ejs +2 -15
- package/dist/generators/vue/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_.service.ts.ejs +1 -1
- package/dist/generators/vue/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_.vue.ejs +14 -7
- package/dist/generators/vue/templates/src/main/webapp/app/router/index.ts.ejs +8 -1
- package/dist/generators/vue/templates/webpack/webpack.microfrontend.js.jhi.vue.ejs +19 -34
- package/dist/jdl/converters/jdl-to-json/jdl-to-json-basic-entity-converter.js +1 -0
- package/dist/jdl/converters/jdl-to-json/jdl-to-json-option-converter.js +2 -2
- package/dist/jdl/converters/jdl-to-json/jdl-to-json-relationship-converter.js +1 -1
- package/dist/jdl/converters/jdl-to-json/jdl-without-application-to-json-converter.js +1 -1
- package/dist/jdl/converters/json-to-jdl-converter.js +1 -1
- package/dist/jdl/converters/json-to-jdl-entity-converter.js +1 -0
- package/dist/jdl/converters/parsed-jdl-to-jdl-object/application-converter.js +1 -17
- package/dist/jdl/converters/parsed-jdl-to-jdl-object/entity-converter.js +5 -0
- package/dist/jdl/converters/parsed-jdl-to-jdl-object/parsed-jdl-to-jdl-object-converter.js +0 -27
- package/dist/jdl/exporters/applications/jhipster-application-formatter.js +17 -1
- package/dist/jdl/exporters/config.js +11 -0
- package/dist/jdl/exporters/export-utils.js +2 -13
- package/dist/jdl/exporters/jhipster-entity-exporter.js +3 -2
- package/dist/jdl/index.js +1 -0
- package/dist/jdl/jdl-importer.js +6 -2
- package/dist/jdl/jhipster/default-application-options.js +1 -1
- package/dist/jdl/jhipster/field-types.js +1 -1
- package/dist/jdl/jhipster/json-entity.js +6 -0
- package/dist/jdl/models/jdl-application-configuration-factory.js +34 -2
- package/dist/jdl/models/jdl-application-configuration.js +6 -3
- package/dist/jdl/models/jdl-application-factory.js +2 -2
- package/dist/jdl/models/jdl-application.js +12 -3
- package/dist/jdl/models/jdl-entity.js +16 -1
- package/dist/jdl/models/jdl-field.js +13 -0
- package/dist/jdl/models/jdl-object.js +3 -3
- package/dist/jdl/models/jdl-relationship.js +23 -5
- package/dist/jdl/parsing/jdl-ast-builder-visitor.js +63 -7
- package/dist/jdl/parsing/jdl-parser.js +52 -6
- package/dist/jdl/parsing/lexer/application-tokens.js +2 -2
- package/dist/jdl/validators/entity-validator.js +4 -2
- package/dist/jdl/validators/enum-validator.js +4 -2
- package/dist/jdl/validators/jdl-with-application-validator.js +18 -8
- package/dist/jdl/validators/jdl-without-application-validator.js +30 -29
- package/dist/jdl/validators/validator.js +1 -1
- package/dist/testing/helpers.mjs +10 -3
- package/dist/types/cli/environment-builder.d.mts +2 -0
- package/dist/types/generators/angular/needle-api/needle-client-angular.d.mts +0 -1
- package/dist/types/generators/base/api.d.mts +12 -0
- package/dist/types/generators/base/support/config.d.mts +3 -3
- package/dist/types/generators/base/support/needles.d.mts +1 -1
- package/dist/types/generators/base-application/generator.d.mts +2 -2
- package/dist/types/generators/base-application/support/index.d.mts +1 -0
- package/dist/types/generators/base-application/support/prepare-entity.d.mts +6 -1
- package/dist/types/generators/base-application/support/update-application-entities-transform.d.mts +4 -0
- package/dist/types/generators/base-application/types/relationship.d.mts +4 -0
- package/dist/types/generators/base-core/generator.d.mts +7 -1
- package/dist/types/generators/bootstrap/support/auto-crlf-transform.d.mts +3 -2
- package/dist/types/generators/bootstrap/support/multi-step-transform/index.d.mts +3 -20
- package/dist/types/generators/bootstrap/support/multi-step-transform/template-file-fs.d.mts +15 -9
- package/dist/types/generators/bootstrap/support/multi-step-transform/template-file.d.mts +1 -0
- package/dist/types/generators/bootstrap-application-base/support/export-jdl-transform.d.mts +8 -0
- package/dist/types/generators/bootstrap-application-base/support/import-jdl-transform.d.mts +6 -0
- package/dist/types/generators/bootstrap-application-base/support/index.d.mts +2 -0
- package/dist/types/generators/client/support/entity-definition.d.mts +2 -2
- package/dist/types/generators/feign-client/types-export.d.ts +1 -0
- package/dist/types/generators/generator-constants.d.mts +52 -48
- package/dist/types/generators/generator-list.d.mts +1 -0
- package/dist/types/generators/java/support/package-info-transform.d.mts +1 -4
- package/dist/types/generators/project-name/support/name-resolver.d.mts +9 -1
- package/dist/types/generators/server/options/feign-client.d.mts +21 -0
- package/dist/types/generators/server/options/index.d.mts +1 -0
- package/dist/types/generators/server/support/templates/field-values.d.mts +1 -1
- package/dist/types/jdl/converters/json-to-jdl-converter.d.ts +1 -0
- package/dist/types/jdl/converters/parsed-jdl-to-jdl-object/option-converter.d.ts +1 -1
- package/dist/types/jdl/exporters/config.d.ts +1 -0
- package/dist/types/jdl/index.d.ts +1 -0
- package/dist/types/jdl/jdl-importer.d.ts +1 -0
- package/dist/types/jdl/jhipster/json-entity.d.ts +2 -0
- package/dist/types/jdl/models/jdl-application-configuration-factory.d.ts +1 -0
- package/dist/types/jdl/models/jdl-application-configuration-option.d.ts +2 -2
- package/dist/types/jdl/models/jdl-application-configuration.d.ts +8 -6
- package/dist/types/jdl/models/jdl-application-factory.d.ts +1 -1
- package/dist/types/jdl/models/jdl-application.d.ts +8 -4
- package/dist/types/jdl/models/jdl-entity.d.ts +1 -0
- package/dist/types/jdl/models/jdl-object.d.ts +1 -1
- package/dist/types/jdl/models/jdl-relationship.d.ts +0 -18
- package/dist/types/jdl/models/list-jdl-application-configuration-option.d.ts +1 -1
- package/dist/types/jdl/parsing/jdl-ast-builder-visitor.d.ts +10 -0
- package/dist/types/jdl/parsing/jdl-parser.d.ts +3 -0
- package/dist/types/jdl/parsing/lexer/application-tokens.d.ts +1 -0
- package/dist/types/jdl/types/types.d.mts +2 -2
- package/dist/types/jdl/validators/entity-validator.d.ts +2 -2
- package/dist/types/jdl/validators/enum-validator.d.ts +2 -2
- package/dist/types/jdl/validators/validator.d.ts +4 -1
- package/package.json +41 -41
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2013-2023 the original author or authors from the JHipster project.
|
|
3
|
+
*
|
|
4
|
+
* This file is part of the JHipster project, see https://www.jhipster.tech/
|
|
5
|
+
* for more information.
|
|
6
|
+
*
|
|
7
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
* you may not use this file except in compliance with the License.
|
|
9
|
+
* You may obtain a copy of the License at
|
|
10
|
+
*
|
|
11
|
+
* https://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
*
|
|
13
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
* See the License for the specific language governing permissions and
|
|
17
|
+
* limitations under the License.
|
|
18
|
+
*/
|
|
19
|
+
import BaseApplicationGenerator from '../base-application/index.mjs';
|
|
20
|
+
import { GENERATOR_BOOTSTRAP_APPLICATION, GENERATOR_FEIGN_CLIENT } from '../generator-list.mjs';
|
|
21
|
+
import { feignFiles } from './files.mjs';
|
|
22
|
+
import cleanupTask from './cleanup.mjs';
|
|
23
|
+
export default class FeignClientGenerator extends BaseApplicationGenerator {
|
|
24
|
+
async beforeQueue() {
|
|
25
|
+
if (!this.fromBlueprint) {
|
|
26
|
+
await this.composeWithBlueprints(GENERATOR_FEIGN_CLIENT);
|
|
27
|
+
}
|
|
28
|
+
if (!this.delegateToBlueprint) {
|
|
29
|
+
await this.dependsOnJHipster(GENERATOR_BOOTSTRAP_APPLICATION);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
get writing() {
|
|
33
|
+
return this.asWritingTaskGroup({
|
|
34
|
+
cleanupTask,
|
|
35
|
+
async writeTask({ application }) {
|
|
36
|
+
await this.writeFiles({
|
|
37
|
+
sections: feignFiles,
|
|
38
|
+
context: application,
|
|
39
|
+
});
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
get [BaseApplicationGenerator.WRITING]() {
|
|
44
|
+
return this.delegateTasksToBlueprint(() => this.writing);
|
|
45
|
+
}
|
|
46
|
+
get postWriting() {
|
|
47
|
+
return this.asPostWritingTaskGroup({
|
|
48
|
+
addDependencies({ application, source }) {
|
|
49
|
+
const openFeignArtifact = { groupId: 'org.springframework.cloud', artifactId: 'spring-cloud-starter-openfeign' };
|
|
50
|
+
if (application.buildToolMaven) {
|
|
51
|
+
source.addMavenDependency?.(openFeignArtifact);
|
|
52
|
+
}
|
|
53
|
+
if (application.buildToolGradle) {
|
|
54
|
+
source.addGradleDependency?.({
|
|
55
|
+
...openFeignArtifact,
|
|
56
|
+
scope: 'implementation',
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
get [BaseApplicationGenerator.POST_WRITING]() {
|
|
63
|
+
return this.asPostWritingTaskGroup(this.delegateTasksToBlueprint(() => this.postWriting));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2013-2023 the original author or authors from the JHipster project.
|
|
3
|
+
*
|
|
4
|
+
* This file is part of the JHipster project, see https://www.jhipster.tech/
|
|
5
|
+
* for more information.
|
|
6
|
+
*
|
|
7
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
* you may not use this file except in compliance with the License.
|
|
9
|
+
* You may obtain a copy of the License at
|
|
10
|
+
*
|
|
11
|
+
* https://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
*
|
|
13
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
* See the License for the specific language governing permissions and
|
|
17
|
+
* limitations under the License.
|
|
18
|
+
*/
|
|
19
|
+
export { default } from './generator.mjs';
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
<%#
|
|
2
|
+
Copyright 2013-2023 the original author or authors from the JHipster project.
|
|
3
|
+
|
|
4
|
+
This file is part of the JHipster project, see https://www.jhipster.tech/
|
|
5
|
+
for more information.
|
|
6
|
+
|
|
7
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
you may not use this file except in compliance with the License.
|
|
9
|
+
You may obtain a copy of the License at
|
|
10
|
+
|
|
11
|
+
https://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
|
|
13
|
+
Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
See the License for the specific language governing permissions and
|
|
17
|
+
limitations under the License.
|
|
18
|
+
-%>
|
|
19
|
+
package <%= packageName %>.client;
|
|
20
|
+
|
|
21
|
+
import java.net.URI;
|
|
22
|
+
import java.time.Duration;
|
|
23
|
+
import java.time.Instant;
|
|
24
|
+
import java.util.HashMap;
|
|
25
|
+
import java.util.Map;
|
|
26
|
+
import java.util.Optional;
|
|
27
|
+
|
|
28
|
+
import org.slf4j.Logger;
|
|
29
|
+
import org.slf4j.LoggerFactory;
|
|
30
|
+
import org.springframework.boot.web.client.RestTemplateBuilder;
|
|
31
|
+
import org.springframework.http.MediaType;
|
|
32
|
+
import org.springframework.http.RequestEntity;
|
|
33
|
+
import org.springframework.http.ResponseEntity;
|
|
34
|
+
import org.springframework.http.converter.FormHttpMessageConverter;
|
|
35
|
+
import org.springframework.security.core.Authentication;
|
|
36
|
+
import org.springframework.security.core.context.SecurityContextHolder;
|
|
37
|
+
import org.springframework.security.oauth2.client.OAuth2AuthorizedClient;
|
|
38
|
+
import org.springframework.security.oauth2.client.OAuth2AuthorizedClientService;
|
|
39
|
+
import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken;
|
|
40
|
+
import org.springframework.security.oauth2.client.http.OAuth2ErrorResponseErrorHandler;
|
|
41
|
+
import org.springframework.security.oauth2.core.*;
|
|
42
|
+
import org.springframework.security.oauth2.core.endpoint.OAuth2AccessTokenResponse;
|
|
43
|
+
import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames;
|
|
44
|
+
import org.springframework.security.oauth2.core.http.converter.OAuth2AccessTokenResponseHttpMessageConverter;
|
|
45
|
+
import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken;
|
|
46
|
+
import org.springframework.stereotype.Component;
|
|
47
|
+
import org.springframework.util.LinkedMultiValueMap;
|
|
48
|
+
import org.springframework.util.MultiValueMap;
|
|
49
|
+
import org.springframework.web.client.RestTemplate;
|
|
50
|
+
|
|
51
|
+
import java.util.regex.Pattern;
|
|
52
|
+
import java.util.stream.Collectors;
|
|
53
|
+
|
|
54
|
+
@Component
|
|
55
|
+
public class AuthorizationHeaderUtil {
|
|
56
|
+
|
|
57
|
+
private final OAuth2AuthorizedClientService clientService;
|
|
58
|
+
private final RestTemplateBuilder restTemplateBuilder;
|
|
59
|
+
private final Logger log = LoggerFactory.getLogger(AuthorizationHeaderUtil.class);
|
|
60
|
+
|
|
61
|
+
public AuthorizationHeaderUtil(OAuth2AuthorizedClientService clientService, RestTemplateBuilder restTemplateBuilder) {
|
|
62
|
+
this.clientService = clientService;
|
|
63
|
+
this.restTemplateBuilder = restTemplateBuilder;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
public Optional<String> getAuthorizationHeader() {
|
|
67
|
+
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
|
|
68
|
+
if (authentication instanceof OAuth2AuthenticationToken) {
|
|
69
|
+
OAuth2AuthenticationToken oauthToken = (OAuth2AuthenticationToken) authentication;
|
|
70
|
+
String name = oauthToken.getName();
|
|
71
|
+
String registrationId = oauthToken.getAuthorizedClientRegistrationId();
|
|
72
|
+
OAuth2AuthorizedClient client = clientService.loadAuthorizedClient(
|
|
73
|
+
registrationId,
|
|
74
|
+
name);
|
|
75
|
+
|
|
76
|
+
if (null == client) {
|
|
77
|
+
throw new OAuth2AuthorizationException(new OAuth2Error("access_denied", "The token is expired", null));
|
|
78
|
+
}
|
|
79
|
+
OAuth2AccessToken accessToken = client.getAccessToken();
|
|
80
|
+
|
|
81
|
+
if (accessToken != null) {
|
|
82
|
+
String tokenType = accessToken.getTokenType().getValue();
|
|
83
|
+
String accessTokenValue = accessToken.getTokenValue();
|
|
84
|
+
if (isExpired(accessToken)) {
|
|
85
|
+
log.info("AccessToken expired, refreshing automatically");
|
|
86
|
+
accessTokenValue = refreshToken(client, oauthToken);
|
|
87
|
+
if (null == accessTokenValue) {
|
|
88
|
+
SecurityContextHolder.getContext().setAuthentication(null);
|
|
89
|
+
throw new OAuth2AuthorizationException(new OAuth2Error("access_denied", "The token is expired", null));
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
String authorizationHeaderValue = String.format("%s %s", tokenType, accessTokenValue);
|
|
93
|
+
return Optional.of(authorizationHeaderValue);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
} else if (authentication instanceof JwtAuthenticationToken) {
|
|
97
|
+
JwtAuthenticationToken accessToken = (JwtAuthenticationToken) authentication;
|
|
98
|
+
String tokenValue = accessToken.getToken().getTokenValue();
|
|
99
|
+
String authorizationHeaderValue = String.format("%s %s", OAuth2AccessToken.TokenType.BEARER.getValue(), tokenValue);
|
|
100
|
+
return Optional.of(authorizationHeaderValue);
|
|
101
|
+
}
|
|
102
|
+
return Optional.empty();
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
private String refreshToken(OAuth2AuthorizedClient client, OAuth2AuthenticationToken oauthToken) {
|
|
106
|
+
OAuth2AccessTokenResponse atr = refreshTokenClient(client);
|
|
107
|
+
if (atr == null || atr.getAccessToken() == null) {
|
|
108
|
+
log.info("Failed to refresh token for user");
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
OAuth2RefreshToken refreshToken = atr.getRefreshToken() != null ? atr.getRefreshToken(): client.getRefreshToken();
|
|
113
|
+
OAuth2AuthorizedClient updatedClient = new OAuth2AuthorizedClient(
|
|
114
|
+
client.getClientRegistration(),
|
|
115
|
+
client.getPrincipalName(),
|
|
116
|
+
atr.getAccessToken(),
|
|
117
|
+
refreshToken
|
|
118
|
+
);
|
|
119
|
+
|
|
120
|
+
clientService.saveAuthorizedClient(updatedClient, oauthToken);
|
|
121
|
+
return atr.getAccessToken().getTokenValue();
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
private OAuth2AccessTokenResponse refreshTokenClient(OAuth2AuthorizedClient currentClient) {
|
|
125
|
+
|
|
126
|
+
MultiValueMap<String, String> formParameters = new LinkedMultiValueMap<>();
|
|
127
|
+
formParameters.add(OAuth2ParameterNames.GRANT_TYPE, AuthorizationGrantType.REFRESH_TOKEN.getValue());
|
|
128
|
+
formParameters.add(OAuth2ParameterNames.REFRESH_TOKEN, currentClient.getRefreshToken().getTokenValue());
|
|
129
|
+
formParameters.add(OAuth2ParameterNames.CLIENT_ID, currentClient.getClientRegistration().getClientId());
|
|
130
|
+
RequestEntity requestEntity = RequestEntity
|
|
131
|
+
.post(URI.create(currentClient.getClientRegistration().getProviderDetails().getTokenUri()))
|
|
132
|
+
.contentType(MediaType.APPLICATION_FORM_URLENCODED)
|
|
133
|
+
.body(formParameters);
|
|
134
|
+
try {
|
|
135
|
+
RestTemplate r = restTemplate(currentClient.getClientRegistration().getClientId(), currentClient.getClientRegistration().getClientSecret());
|
|
136
|
+
ResponseEntity<OAuthIdpTokenResponseDTO> responseEntity = r.exchange(requestEntity, OAuthIdpTokenResponseDTO.class);
|
|
137
|
+
return toOAuth2AccessTokenResponse(responseEntity.getBody());
|
|
138
|
+
} catch (OAuth2AuthorizationException e) {
|
|
139
|
+
log.error("Unable to refresh token", e);
|
|
140
|
+
throw new OAuth2AuthenticationException(e.getError(), e);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
private OAuth2AccessTokenResponse toOAuth2AccessTokenResponse(OAuthIdpTokenResponseDTO oAuthIdpResponse) {
|
|
145
|
+
Map<String, Object> additionalParameters = new HashMap<>();
|
|
146
|
+
additionalParameters.put("id_token", oAuthIdpResponse.getIdToken());
|
|
147
|
+
additionalParameters.put("not-before-policy", oAuthIdpResponse.getNotBefore());
|
|
148
|
+
additionalParameters.put("refresh_expires_in", oAuthIdpResponse.getRefreshExpiresIn());
|
|
149
|
+
additionalParameters.put("session_state", oAuthIdpResponse.getSessionState());
|
|
150
|
+
return OAuth2AccessTokenResponse.withToken(oAuthIdpResponse.getAccessToken())
|
|
151
|
+
.expiresIn(oAuthIdpResponse.getExpiresIn())
|
|
152
|
+
.refreshToken(oAuthIdpResponse.getRefreshToken())
|
|
153
|
+
.scopes(Pattern.compile("\\s").splitAsStream(oAuthIdpResponse.getScope()).collect(Collectors.toSet()))
|
|
154
|
+
.tokenType(OAuth2AccessToken.TokenType.BEARER)
|
|
155
|
+
.additionalParameters(additionalParameters)
|
|
156
|
+
.build();
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
private RestTemplate restTemplate(String clientId, String clientSecret) {
|
|
160
|
+
return restTemplateBuilder
|
|
161
|
+
.additionalMessageConverters(
|
|
162
|
+
new FormHttpMessageConverter(),
|
|
163
|
+
new OAuth2AccessTokenResponseHttpMessageConverter())
|
|
164
|
+
.errorHandler(new OAuth2ErrorResponseErrorHandler())
|
|
165
|
+
.basicAuthentication(clientId, clientSecret)
|
|
166
|
+
.build();
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
private boolean isExpired(OAuth2AccessToken accessToken) {
|
|
170
|
+
Instant now = Instant.now();
|
|
171
|
+
Instant expiresAt = accessToken.getExpiresAt();
|
|
172
|
+
return now.isAfter(expiresAt.minus(Duration.ofMinutes(1L)));
|
|
173
|
+
}
|
|
174
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
<%#
|
|
2
|
+
Copyright 2013-2023 the original author or authors from the JHipster project.
|
|
3
|
+
|
|
4
|
+
This file is part of the JHipster project, see https://www.jhipster.tech/
|
|
5
|
+
for more information.
|
|
6
|
+
|
|
7
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
you may not use this file except in compliance with the License.
|
|
9
|
+
You may obtain a copy of the License at
|
|
10
|
+
|
|
11
|
+
https://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
|
|
13
|
+
Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
See the License for the specific language governing permissions and
|
|
17
|
+
limitations under the License.
|
|
18
|
+
-%>
|
|
19
|
+
package <%= packageName %>.client;
|
|
20
|
+
|
|
21
|
+
import org.springframework.cloud.openfeign.FeignClient;
|
|
22
|
+
import org.springframework.core.annotation.AliasFor;
|
|
23
|
+
|
|
24
|
+
import java.lang.annotation.*;
|
|
25
|
+
|
|
26
|
+
@Retention(RetentionPolicy.RUNTIME)
|
|
27
|
+
@Target(ElementType.TYPE)
|
|
28
|
+
@Documented
|
|
29
|
+
@FeignClient
|
|
30
|
+
public @interface AuthorizedFeignClient {
|
|
31
|
+
|
|
32
|
+
@AliasFor(annotation = FeignClient.class, attribute = "name")
|
|
33
|
+
String name() default "";
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* A custom {@code @Configuration} for the feign client.
|
|
37
|
+
*
|
|
38
|
+
* Can contain override {@code @Bean} definition for the pieces that
|
|
39
|
+
* make up the client, for instance {@link feign.codec.Decoder},
|
|
40
|
+
* {@link feign.codec.Encoder}, {@link feign.Contract}.
|
|
41
|
+
*
|
|
42
|
+
* @return the custom {@code @Configuration} for the feign client.
|
|
43
|
+
* @see org.springframework.cloud.openfeign.FeignClientsConfiguration for the defaults.
|
|
44
|
+
*/
|
|
45
|
+
@AliasFor(annotation = FeignClient.class, attribute = "configuration")
|
|
46
|
+
Class<?>[] configuration() default OAuth2InterceptedFeignConfiguration.class;
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* An absolute URL or resolvable hostname (the protocol is optional).
|
|
50
|
+
* @return the URL.
|
|
51
|
+
*/
|
|
52
|
+
String url() default "";
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Whether 404s should be decoded instead of throwing FeignExceptions.
|
|
56
|
+
* @return true if 404s will be decoded; false otherwise.
|
|
57
|
+
*/
|
|
58
|
+
boolean decode404() default false;
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Fallback class for the specified Feign client interface. The fallback class must
|
|
62
|
+
* implement the interface annotated by this annotation and be a valid Spring bean.
|
|
63
|
+
* @return the fallback class for the specified Feign client interface.
|
|
64
|
+
*/
|
|
65
|
+
Class<?> fallback() default void.class;
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Path prefix to be used by all method-level mappings.
|
|
69
|
+
* @return the path prefix to be used by all method-level mappings.
|
|
70
|
+
*/
|
|
71
|
+
String path() default "";
|
|
72
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
<%#
|
|
2
|
+
Copyright 2013-2023 the original author or authors from the JHipster project.
|
|
3
|
+
|
|
4
|
+
This file is part of the JHipster project, see https://www.jhipster.tech/
|
|
5
|
+
for more information.
|
|
6
|
+
|
|
7
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
you may not use this file except in compliance with the License.
|
|
9
|
+
You may obtain a copy of the License at
|
|
10
|
+
|
|
11
|
+
https://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
|
|
13
|
+
Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
See the License for the specific language governing permissions and
|
|
17
|
+
limitations under the License.
|
|
18
|
+
-%>
|
|
19
|
+
package <%= packageName %>.client;
|
|
20
|
+
|
|
21
|
+
<%_ if (authenticationTypeOauth2) { _%>
|
|
22
|
+
import org.springframework.context.annotation.Bean;
|
|
23
|
+
|
|
24
|
+
import feign.RequestInterceptor;
|
|
25
|
+
|
|
26
|
+
import <%= packageName %>.client.AuthorizationHeaderUtil;
|
|
27
|
+
|
|
28
|
+
public class OAuth2InterceptedFeignConfiguration {
|
|
29
|
+
|
|
30
|
+
@Bean(name = "oauth2RequestInterceptor")
|
|
31
|
+
public RequestInterceptor getOAuth2RequestInterceptor(AuthorizationHeaderUtil authorizationHeaderUtil) {
|
|
32
|
+
return new TokenRelayRequestInterceptor(authorizationHeaderUtil);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
<%_ } _%>
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
<%#
|
|
2
|
+
Copyright 2013-2023 the original author or authors from the JHipster project.
|
|
3
|
+
|
|
4
|
+
This file is part of the JHipster project, see https://www.jhipster.tech/
|
|
5
|
+
for more information.
|
|
6
|
+
|
|
7
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
you may not use this file except in compliance with the License.
|
|
9
|
+
You may obtain a copy of the License at
|
|
10
|
+
|
|
11
|
+
https://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
|
|
13
|
+
Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
See the License for the specific language governing permissions and
|
|
17
|
+
limitations under the License.
|
|
18
|
+
-%>
|
|
19
|
+
package <%= packageName %>.client;
|
|
20
|
+
|
|
21
|
+
import com.fasterxml.jackson.annotation.JsonProperty;
|
|
22
|
+
|
|
23
|
+
import java.io.Serializable;
|
|
24
|
+
import java.util.UUID;
|
|
25
|
+
|
|
26
|
+
public class OAuthIdpTokenResponseDTO implements Serializable {
|
|
27
|
+
|
|
28
|
+
@JsonProperty("token_type")
|
|
29
|
+
private String tokenType;
|
|
30
|
+
|
|
31
|
+
private String scope;
|
|
32
|
+
|
|
33
|
+
@JsonProperty("expires_in")
|
|
34
|
+
private Long expiresIn;
|
|
35
|
+
|
|
36
|
+
@JsonProperty("ext_expires_in")
|
|
37
|
+
private Long extExpiresIn;
|
|
38
|
+
|
|
39
|
+
@JsonProperty("expires_on")
|
|
40
|
+
private Long expiresOn;
|
|
41
|
+
|
|
42
|
+
@JsonProperty("not-before-policy")
|
|
43
|
+
private Long notBefore;
|
|
44
|
+
|
|
45
|
+
private UUID resource;
|
|
46
|
+
|
|
47
|
+
@JsonProperty("access_token")
|
|
48
|
+
private String accessToken;
|
|
49
|
+
|
|
50
|
+
@JsonProperty("refresh_token")
|
|
51
|
+
private String refreshToken;
|
|
52
|
+
|
|
53
|
+
@JsonProperty("id_token")
|
|
54
|
+
private String idToken;
|
|
55
|
+
|
|
56
|
+
@JsonProperty("session_state")
|
|
57
|
+
private String sessionState;
|
|
58
|
+
|
|
59
|
+
@JsonProperty("refresh_expires_in")
|
|
60
|
+
private String refreshExpiresIn;
|
|
61
|
+
|
|
62
|
+
public OAuthIdpTokenResponseDTO() {
|
|
63
|
+
// Empty constructor for serialization.
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
public String getRefreshExpiresIn() {
|
|
67
|
+
return refreshExpiresIn;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
public void setRefreshExpiresIn(String refreshExpiresIn) {
|
|
71
|
+
this.refreshExpiresIn = refreshExpiresIn;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
public String getSessionState() {
|
|
75
|
+
return sessionState;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
public void setSessionState(String sessionState) {
|
|
79
|
+
this.sessionState = sessionState;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
public String getTokenType() {
|
|
83
|
+
return tokenType;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
public void setTokenType(String tokenType) {
|
|
87
|
+
this.tokenType = tokenType;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
public String getScope() {
|
|
91
|
+
return scope;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
public void setScope(String scope) {
|
|
95
|
+
this.scope = scope;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
public Long getExpiresIn() {
|
|
99
|
+
return expiresIn;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
public void setExpiresIn(Long expiresIn) {
|
|
103
|
+
this.expiresIn = expiresIn;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
public Long getExtExpiresIn() {
|
|
107
|
+
return extExpiresIn;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
public void setExtExpiresIn(Long extExpiresIn) {
|
|
111
|
+
this.extExpiresIn = extExpiresIn;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
public Long getExpiresOn() {
|
|
115
|
+
return expiresOn;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
public void setExpiresOn(Long expiresOn) {
|
|
119
|
+
this.expiresOn = expiresOn;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
public Long getNotBefore() {
|
|
123
|
+
return notBefore;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
public void setNotBefore(Long notBefore) {
|
|
127
|
+
this.notBefore = notBefore;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
public UUID getResource() {
|
|
131
|
+
return resource;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
public void setResource(UUID resource) {
|
|
135
|
+
this.resource = resource;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
public String getAccessToken() {
|
|
139
|
+
return accessToken;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
public void setAccessToken(String accessToken) {
|
|
143
|
+
this.accessToken = accessToken;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
public String getRefreshToken() {
|
|
147
|
+
return refreshToken;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
public void setRefreshToken(String refreshToken) {
|
|
151
|
+
this.refreshToken = refreshToken;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
public String getIdToken() {
|
|
155
|
+
return idToken;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
public void setIdToken(String idToken) {
|
|
159
|
+
this.idToken = idToken;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
<%#
|
|
2
|
+
Copyright 2013-2023 the original author or authors from the JHipster project.
|
|
3
|
+
|
|
4
|
+
This file is part of the JHipster project, see https://www.jhipster.tech/
|
|
5
|
+
for more information.
|
|
6
|
+
|
|
7
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
you may not use this file except in compliance with the License.
|
|
9
|
+
You may obtain a copy of the License at
|
|
10
|
+
|
|
11
|
+
https://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
|
|
13
|
+
Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
See the License for the specific language governing permissions and
|
|
17
|
+
limitations under the License.
|
|
18
|
+
-%>
|
|
19
|
+
package <%= packageName %>.client;
|
|
20
|
+
|
|
21
|
+
import feign.RequestInterceptor;
|
|
22
|
+
import feign.RequestTemplate;
|
|
23
|
+
|
|
24
|
+
import java.util.Optional;
|
|
25
|
+
|
|
26
|
+
public class TokenRelayRequestInterceptor implements RequestInterceptor {
|
|
27
|
+
|
|
28
|
+
public static final String AUTHORIZATION = "Authorization";
|
|
29
|
+
|
|
30
|
+
private final AuthorizationHeaderUtil authorizationHeaderUtil;
|
|
31
|
+
|
|
32
|
+
public TokenRelayRequestInterceptor(AuthorizationHeaderUtil authorizationHeaderUtil) {
|
|
33
|
+
super();
|
|
34
|
+
this.authorizationHeaderUtil = authorizationHeaderUtil;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
@Override
|
|
38
|
+
public void apply(RequestTemplate template) {
|
|
39
|
+
Optional<String> authorizationHeader = authorizationHeaderUtil.getAuthorizationHeader();
|
|
40
|
+
authorizationHeader.ifPresent(s -> template.header(AUTHORIZATION, s));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
<%#
|
|
2
|
+
Copyright 2013-2023 the original author or authors from the JHipster project.
|
|
3
|
+
|
|
4
|
+
This file is part of the JHipster project, see https://www.jhipster.tech/
|
|
5
|
+
for more information.
|
|
6
|
+
|
|
7
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
you may not use this file except in compliance with the License.
|
|
9
|
+
You may obtain a copy of the License at
|
|
10
|
+
|
|
11
|
+
https://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
|
|
13
|
+
Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
See the License for the specific language governing permissions and
|
|
17
|
+
limitations under the License.
|
|
18
|
+
-%>
|
|
19
|
+
package <%= packageName %>.client;
|
|
20
|
+
|
|
21
|
+
import <%= packageName %>.security.SecurityUtils;
|
|
22
|
+
import feign.RequestInterceptor;
|
|
23
|
+
import feign.RequestTemplate;
|
|
24
|
+
import org.springframework.stereotype.Component;
|
|
25
|
+
|
|
26
|
+
@Component
|
|
27
|
+
public class UserFeignClientInterceptor implements RequestInterceptor {
|
|
28
|
+
private static final String AUTHORIZATION_HEADER = "Authorization";
|
|
29
|
+
private static final String BEARER = "Bearer";
|
|
30
|
+
|
|
31
|
+
@Override
|
|
32
|
+
public void apply(RequestTemplate template) {
|
|
33
|
+
SecurityUtils.getCurrentUserJWT()
|
|
34
|
+
.ifPresent(s -> template.header(AUTHORIZATION_HEADER,String.format("%s %s", BEARER, s)));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
<%#
|
|
2
|
+
Copyright 2013-2023 the original author or authors from the JHipster project.
|
|
3
|
+
|
|
4
|
+
This file is part of the JHipster project, see https://www.jhipster.tech/
|
|
5
|
+
for more information.
|
|
6
|
+
|
|
7
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
you may not use this file except in compliance with the License.
|
|
9
|
+
You may obtain a copy of the License at
|
|
10
|
+
|
|
11
|
+
https://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
|
|
13
|
+
Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
See the License for the specific language governing permissions and
|
|
17
|
+
limitations under the License.
|
|
18
|
+
-%>
|
|
19
|
+
package <%= packageName %>.config;
|
|
20
|
+
|
|
21
|
+
import org.springframework.cloud.openfeign.EnableFeignClients;
|
|
22
|
+
import org.springframework.cloud.openfeign.FeignClientsConfiguration;
|
|
23
|
+
import org.springframework.context.annotation.Bean;
|
|
24
|
+
import org.springframework.context.annotation.Configuration;
|
|
25
|
+
import org.springframework.context.annotation.Import;
|
|
26
|
+
<%_ if (reactive) { _%>
|
|
27
|
+
import reactivefeign.spring.config.EnableReactiveFeignClients;
|
|
28
|
+
<%_ } _%>
|
|
29
|
+
@Configuration
|
|
30
|
+
@EnableFeignClients(basePackages = "<%= packageName %>")
|
|
31
|
+
<%_ if (reactive) { _%>
|
|
32
|
+
@EnableReactiveFeignClients(basePackages = "<%= packageName %>")
|
|
33
|
+
<%_ } _%>
|
|
34
|
+
@Import(FeignClientsConfiguration.class)
|
|
35
|
+
public class FeignConfiguration {
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Set the Feign specific log level to log client REST requests.
|
|
39
|
+
*/
|
|
40
|
+
@Bean
|
|
41
|
+
feign.Logger.Level feignLoggerLevel() {
|
|
42
|
+
return feign.Logger.Level.BASIC;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
}
|