generator-jhipster 8.0.0 → 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.
Files changed (258) hide show
  1. package/README.md +61 -57
  2. package/dist/cli/environment-builder.mjs +11 -4
  3. package/dist/cli/program.mjs +1 -1
  4. package/dist/generators/angular/cleanup.mjs +7 -0
  5. package/dist/generators/angular/files-angular.mjs +3 -4
  6. package/dist/generators/angular/generator.mjs +2 -15
  7. package/dist/generators/angular/needle-api/needle-client-angular.mjs +2 -8
  8. package/dist/generators/angular/resources/package.json +23 -23
  9. package/dist/generators/angular/support/translate-angular.mjs +2 -2
  10. package/dist/generators/angular/templates/README.md.jhi.client.angular.ejs +1 -1
  11. package/dist/generators/angular/templates/angular.json.ejs +3 -7
  12. package/dist/generators/angular/templates/src/main/webapp/app/account/activate/activate.component.html.ejs +6 -4
  13. package/dist/generators/angular/templates/src/main/webapp/app/account/password/password-strength-bar/password-strength-bar.component.ts.ejs +1 -1
  14. package/dist/generators/angular/templates/src/main/webapp/app/account/password/password.component.html.ejs +39 -33
  15. package/dist/generators/angular/templates/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.html.ejs +44 -36
  16. package/dist/generators/angular/templates/src/main/webapp/app/account/password-reset/init/password-reset-init.component.html.ejs +24 -23
  17. package/dist/generators/angular/templates/src/main/webapp/app/account/register/register.component.html.ejs +74 -62
  18. package/dist/generators/angular/templates/src/main/webapp/app/account/sessions/sessions.component.html.ejs +12 -4
  19. package/dist/generators/angular/templates/src/main/webapp/app/account/settings/settings.component.html.ejs +54 -48
  20. package/dist/generators/angular/templates/src/main/webapp/app/admin/admin.routes.ts.ejs +74 -0
  21. package/dist/generators/angular/templates/src/main/webapp/app/admin/configuration/configuration.component.html.ejs +15 -5
  22. package/dist/generators/angular/templates/src/main/webapp/app/admin/docs/docs.component.ts.ejs +1 -1
  23. package/dist/generators/angular/templates/src/main/webapp/app/admin/gateway/gateway.component.html.ejs +20 -7
  24. package/dist/generators/angular/templates/src/main/webapp/app/admin/health/health.component.html.ejs +10 -7
  25. package/dist/generators/angular/templates/src/main/webapp/app/admin/health/modal/health-modal.component.html.ejs +9 -3
  26. package/dist/generators/angular/templates/src/main/webapp/app/admin/logs/logs.component.html.ejs +12 -4
  27. package/dist/generators/angular/templates/src/main/webapp/app/admin/metrics/blocks/jvm-memory/jvm-memory.component.html.ejs +13 -7
  28. package/dist/generators/angular/templates/src/main/webapp/app/admin/metrics/blocks/metrics-cache/metrics-cache.component.html.ejs +6 -2
  29. package/dist/generators/angular/templates/src/main/webapp/app/admin/metrics/blocks/metrics-datasource/metrics-datasource.component.html.ejs +3 -1
  30. package/dist/generators/angular/templates/src/main/webapp/app/admin/metrics/blocks/metrics-endpoints-requests/metrics-endpoints-requests.component.html.ejs +13 -9
  31. package/dist/generators/angular/templates/src/main/webapp/app/admin/metrics/blocks/metrics-garbagecollector/metrics-garbagecollector.component.html.ejs +13 -5
  32. package/dist/generators/angular/templates/src/main/webapp/app/admin/metrics/blocks/metrics-modal-threads/metrics-modal-threads.component.html.ejs +21 -7
  33. package/dist/generators/angular/templates/src/main/webapp/app/admin/metrics/blocks/metrics-request/metrics-request.component.html.ejs +6 -2
  34. package/dist/generators/angular/templates/src/main/webapp/app/admin/metrics/blocks/metrics-system/metrics-system.component.html.ejs +3 -1
  35. package/dist/generators/angular/templates/src/main/webapp/app/admin/metrics/metrics.component.html.ejs +16 -7
  36. package/dist/generators/angular/templates/src/main/webapp/app/admin/tracker/tracker.component.html.ejs +3 -1
  37. package/dist/generators/angular/templates/src/main/webapp/app/admin/user-management/delete/user-management-delete-dialog.component.html.ejs +3 -1
  38. package/dist/generators/angular/templates/src/main/webapp/app/admin/user-management/detail/user-management-detail.component.html.ejs +11 -4
  39. package/dist/generators/angular/templates/src/main/webapp/app/admin/user-management/list/user-management.component.html.ejs +20 -11
  40. package/dist/generators/angular/templates/src/main/webapp/app/admin/user-management/update/user-management-update.component.html.ejs +48 -34
  41. package/dist/generators/angular/templates/src/main/webapp/app/app.component.ts.ejs +73 -0
  42. package/dist/generators/angular/templates/src/main/webapp/app/app.config.ts.ejs +67 -0
  43. package/dist/generators/angular/templates/src/main/webapp/app/app.routes.ts.ejs +85 -0
  44. package/dist/generators/angular/templates/src/main/webapp/app/core/microfrontend/index.ts.ejs +5 -4
  45. package/dist/generators/angular/templates/src/main/webapp/app/core/util/alert.service.spec.ts.ejs +1 -1
  46. package/dist/generators/angular/templates/src/main/webapp/app/core/util/data-util.service.ts.ejs +2 -2
  47. package/dist/generators/angular/templates/src/main/webapp/app/core/util/event-manager.service.spec.ts.ejs +12 -12
  48. package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_.model.ts.ejs +4 -4
  49. package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/delete/_entityFile_-delete-dialog.component.html.ejs +3 -1
  50. package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/detail/_entityFile_-detail.component.html.ejs +26 -14
  51. package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/list/_entityFile_.component.html.ejs +38 -25
  52. package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/list/_entityFile_.component.ts.ejs +1 -1
  53. package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/update/_entityFile_-form.service.spec.ts.ejs +2 -2
  54. package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/update/_entityFile_-form.service.ts.ejs +5 -12
  55. package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/update/_entityFile_-update.component.html.ejs +55 -21
  56. package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/update/_entityFile_-update.component.spec.ts.ejs +2 -2
  57. package/dist/generators/angular/templates/src/main/webapp/app/entities/_entityFolder_/update/_entityFile_-update.component.ts.ejs +10 -10
  58. package/dist/generators/angular/templates/src/main/webapp/app/entities/entity.routes.ts.ejs +25 -0
  59. package/dist/generators/angular/templates/src/main/webapp/app/home/home.component.html.ejs +21 -17
  60. package/dist/generators/angular/templates/src/main/webapp/app/home/home.component.ts.ejs +1 -1
  61. package/dist/generators/angular/templates/src/main/webapp/app/layouts/error/error.component.html.ejs +3 -3
  62. package/dist/generators/angular/templates/src/main/webapp/app/layouts/main/main.component.spec.ts.ejs +5 -2
  63. package/dist/generators/angular/templates/src/main/webapp/app/layouts/main/main.component.ts.ejs +5 -1
  64. package/dist/generators/angular/templates/src/main/webapp/app/layouts/navbar/navbar.component.html.ejs +97 -78
  65. package/dist/generators/angular/templates/src/main/webapp/app/layouts/navbar/navbar.component.ts.ejs +1 -1
  66. package/dist/generators/angular/templates/src/main/webapp/app/layouts/profiles/page-ribbon.component.scss.ejs +1 -1
  67. package/dist/generators/angular/templates/src/main/webapp/app/layouts/profiles/page-ribbon.component.ts.ejs +6 -4
  68. package/dist/generators/angular/templates/src/main/webapp/app/login/login.component.html.ejs +3 -3
  69. package/dist/generators/angular/templates/src/main/webapp/app/shared/alert/alert-error.component.html.ejs +6 -2
  70. package/dist/generators/angular/templates/src/main/webapp/app/shared/alert/alert.component.html.ejs +6 -2
  71. package/dist/generators/angular/templates/src/main/webapp/app/shared/filter/filter.component.html.ejs +11 -7
  72. package/dist/generators/angular/templates/src/main/webapp/app/shared/filter/filter.model.spec.ts.ejs +1 -1
  73. package/dist/generators/angular/templates/src/main/webapp/app/shared/sort/sort-by.directive.spec.ts.ejs +3 -3
  74. package/dist/generators/angular/templates/src/main/webapp/bootstrap.ts.ejs +5 -5
  75. package/dist/generators/angular/templates/src/main/webapp/content/scss/global.scss.ejs +1 -1
  76. package/dist/generators/angular/templates/webpack/webpack.microfrontend.js.ejs +2 -2
  77. package/dist/generators/app/README.md +108 -0
  78. package/dist/generators/app/USAGE +3 -0
  79. package/dist/generators/app/command.mjs +3 -3
  80. package/dist/generators/app/generator.mjs +11 -0
  81. package/dist/generators/base/command.mjs +0 -11
  82. package/dist/generators/base-application/generator.mjs +5 -6
  83. package/dist/generators/base-application/support/entities.mjs +2 -2
  84. package/dist/generators/base-application/support/index.mjs +1 -0
  85. package/dist/generators/base-application/support/prepare-entity.mjs +0 -1
  86. package/dist/generators/base-application/support/prepare-relationship.mjs +4 -0
  87. package/dist/generators/base-application/support/update-application-entities-transform.mjs +52 -0
  88. package/dist/generators/base-core/generator.mjs +17 -4
  89. package/dist/generators/base-entity-changes/generator.mjs +1 -1
  90. package/dist/generators/bootstrap/command.mjs +6 -0
  91. package/dist/generators/bootstrap/generator.mjs +27 -9
  92. package/dist/generators/bootstrap-application/generator.mjs +1 -19
  93. package/dist/generators/bootstrap-application-base/command.mjs +30 -0
  94. package/dist/generators/bootstrap-application-base/generator.mjs +27 -5
  95. package/dist/generators/bootstrap-application-base/index.mjs +1 -0
  96. package/dist/generators/bootstrap-application-base/support/export-jdl-transform.mjs +61 -0
  97. package/dist/generators/bootstrap-application-base/support/import-jdl-transform.mjs +64 -0
  98. package/dist/generators/bootstrap-application-base/support/index.mjs +2 -0
  99. package/dist/generators/client/command.mjs +2 -0
  100. package/dist/generators/client/resources/package.json +4 -4
  101. package/dist/generators/client/support/entity-definition.mjs +3 -3
  102. package/dist/generators/client/templates/README.md.jhi.client.ejs +2 -2
  103. package/dist/generators/client/templates/src/main/webapp/index.html.ejs +2 -2
  104. package/dist/generators/common/command.mjs +2 -0
  105. package/dist/generators/common/resources/package.json +3 -3
  106. package/dist/generators/common/templates/sonar-project.properties.ejs +1 -1
  107. package/dist/generators/cypress/templates/src/test/javascript/cypress/e2e/entity/_entity_.cy.ts.ejs +0 -1
  108. package/dist/generators/docker/generator.mjs +1 -1
  109. package/dist/generators/docker/templates/docker/cassandra.yml.ejs +2 -2
  110. package/dist/generators/docker/templates/docker/keycloak.yml.ejs +1 -1
  111. package/dist/generators/docker/templates/docker/realm-config/jhipster-realm.json.ejs +4 -1
  112. package/dist/generators/docker-compose/generator.mjs +4 -11
  113. package/dist/generators/docker-compose/templates/docker-compose.yml.ejs +1 -1
  114. package/dist/generators/docker-compose/templates/realm-config/jhipster-realm.json.ejs +4 -1
  115. package/dist/generators/export-jdl/generator.mjs +1 -1
  116. package/dist/generators/feign-client/cleanup.mjs +12 -0
  117. package/dist/generators/feign-client/files.mjs +35 -0
  118. package/dist/generators/feign-client/generator.mjs +65 -0
  119. package/dist/generators/feign-client/index.mjs +19 -0
  120. package/dist/generators/feign-client/templates/src/main/java/_package_/client/AuthorizationHeaderUtil.java.ejs +174 -0
  121. package/dist/generators/feign-client/templates/src/main/java/_package_/client/AuthorizedFeignClient.java.ejs +72 -0
  122. package/dist/generators/feign-client/templates/src/main/java/_package_/client/OAuth2InterceptedFeignConfiguration.java.ejs +35 -0
  123. package/dist/generators/feign-client/templates/src/main/java/_package_/client/OAuthIdpTokenResponseDTO.java.ejs +161 -0
  124. package/dist/generators/feign-client/templates/src/main/java/_package_/client/TokenRelayRequestInterceptor.java.ejs +42 -0
  125. package/dist/generators/feign-client/templates/src/main/java/_package_/client/UserFeignClientInterceptor_jwt.java.ejs +36 -0
  126. package/dist/generators/feign-client/templates/src/main/java/_package_/config/FeignConfiguration.java.ejs +45 -0
  127. package/dist/generators/feign-client/templates/src/test/java/_package_/client/AuthorizationHeaderUtilTest.java.ejs +263 -0
  128. package/dist/generators/generate-blueprint/command.mjs +1 -1
  129. package/dist/generators/generate-blueprint/resources/package.json +1 -1
  130. package/dist/generators/generate-blueprint/templates/vitest.config.ts.ejs +1 -1
  131. package/dist/generators/generator-constants.mjs +9 -5
  132. package/dist/generators/generator-list.mjs +1 -0
  133. package/dist/generators/git/generator.mjs +3 -5
  134. package/dist/generators/gradle/constants.mjs +1 -1
  135. package/dist/generators/java/command.mjs +6 -0
  136. package/dist/generators/java/entity-files.mjs +4 -0
  137. package/dist/generators/java/generator.mjs +3 -2
  138. package/dist/generators/java/templates/src/main/java/_package_/_entityPackage_/domain/_persistClass_.java.jhi.jackson_identity_info.ejs +30 -0
  139. package/dist/generators/jdl/generator.mjs +18 -23
  140. package/dist/generators/kubernetes/templates/keycloak/keycloak-configmap.yml.ejs +4 -1
  141. package/dist/generators/kubernetes/templates/keycloak/keycloak.yml.ejs +1 -1
  142. package/dist/generators/languages/generator.mjs +24 -15
  143. package/dist/generators/languages/prompts.mjs +3 -1
  144. package/dist/generators/languages/support/translate.mjs +1 -1
  145. package/dist/generators/languages/templates/entity/i18n/entity_pt-br.json.ejs +1 -1
  146. package/dist/generators/liquibase/README.md +19 -0
  147. package/dist/generators/project-name/generator.mjs +14 -19
  148. package/dist/generators/project-name/support/name-resolver.mjs +35 -6
  149. package/dist/generators/react/resources/package.json +24 -24
  150. package/dist/generators/react/templates/src/main/webapp/app/config/notification-middleware.spec.ts.ejs +4 -4
  151. package/dist/generators/react/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_-detail.tsx.ejs +1 -2
  152. package/dist/generators/react/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_-update.tsx.ejs +12 -13
  153. package/dist/generators/react/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_.tsx.ejs +3 -8
  154. package/dist/generators/react/templates/src/main/webapp/app/entities/_entityFolder_/_entityModel_.model.ts.ejs +1 -1
  155. package/dist/generators/react/templates/src/main/webapp/app/shared/layout/header/header.scss.ejs +1 -1
  156. package/dist/generators/react/templates/src/main/webapp/app/shared/reducers/reducer.utils.ts.ejs +1 -1
  157. package/dist/generators/react/templates/src/main/webapp/app/shared/util/date-utils.ts.ejs +1 -1
  158. package/dist/generators/server/cleanup.mjs +5 -0
  159. package/dist/generators/server/command.mjs +13 -2
  160. package/dist/generators/server/entity-files.mjs +3 -3
  161. package/dist/generators/server/files.mjs +2 -38
  162. package/dist/generators/server/generator.mjs +35 -19
  163. package/dist/generators/server/jdl/application-definition.mjs +5 -2
  164. package/dist/generators/server/options/feign-client.mjs +24 -0
  165. package/dist/generators/server/options/index.mjs +1 -0
  166. package/dist/generators/server/resources/Dockerfile +16 -16
  167. package/dist/generators/server/resources/gradle/libs.versions.toml +4 -4
  168. package/dist/generators/server/resources/pom.xml +11 -11
  169. package/dist/generators/server/support/config.mjs +1 -0
  170. package/dist/generators/server/support/prepare-entity.mjs +4 -1
  171. package/dist/generators/server/templates/build.gradle.ejs +1 -2
  172. package/dist/generators/server/templates/gradle/profile_dev.gradle.ejs +3 -21
  173. package/dist/generators/server/templates/gradle/profile_prod.gradle.ejs +5 -15
  174. package/dist/generators/server/templates/pom.xml.ejs +1 -4
  175. package/dist/generators/server/templates/src/main/java/_package_/_entityPackage_/_partials_entity_/get_all_template.ejs +7 -7
  176. package/dist/generators/server/templates/src/main/java/_package_/_entityPackage_/_partials_entity_/search_template.ejs +4 -4
  177. package/dist/generators/server/templates/src/main/java/_package_/_entityPackage_/repository/_entityClass_Repository.java.ejs +1 -1
  178. package/dist/generators/server/templates/src/main/java/_package_/_entityPackage_/service/mapper/_entityClass_Mapper.java.ejs +2 -2
  179. package/dist/generators/server/templates/src/main/java/_package_/_entityPackage_/web/rest/_entityClass_Resource.java.ejs +3 -3
  180. package/dist/generators/server/templates/src/main/java/_package_/config/SecurityConfiguration_imperative.java.ejs +20 -2
  181. package/dist/generators/server/templates/src/main/java/_package_/config/SecurityConfiguration_reactive.java.ejs +4 -1
  182. package/dist/generators/server/templates/src/main/java/_package_/security/oauth2/CustomClaimConverter.java.ejs +1 -5
  183. package/dist/generators/server/templates/src/main/java/_package_/service/MailService.java.ejs +48 -12
  184. package/dist/generators/server/templates/src/main/java/_package_/web/rest/AccountResource.java.ejs +1 -1
  185. package/dist/generators/server/templates/src/main/java/_package_/web/rest/LogoutResource_imperative.java.ejs +4 -13
  186. package/dist/generators/server/templates/src/main/java/_package_/web/rest/LogoutResource_reactive.java.ejs +5 -11
  187. package/dist/generators/server/templates/src/main/java/_package_/web/rest/PublicUserResource.java.ejs +3 -3
  188. package/dist/generators/server/templates/src/main/java/_package_/web/rest/UserResource.java.ejs +6 -6
  189. package/dist/generators/server/templates/src/main/resources/config/application.yml.ejs +8 -7
  190. package/dist/generators/server/templates/src/test/java/_package_/TechnicalStructureTest.java.ejs +1 -1
  191. package/dist/generators/server/templates/src/test/java/_package_/_entityPackage_/web/rest/_entityClass_ResourceIT.java.ejs +8 -8
  192. package/dist/generators/server/templates/src/test/java/_package_/web/rest/errors/ExceptionTranslatorTestController.java.ejs +2 -2
  193. package/dist/generators/spring-cache/internal/dependencies.mjs +1 -1
  194. package/dist/generators/spring-cache/templates/gradle/cache.gradle.ejs +1 -1
  195. package/dist/generators/spring-cache/templates/src/main/java/_package_/config/CacheFactoryConfiguration.java.ejs +1 -1
  196. package/dist/generators/spring-cloud-stream/templates/src/main/java/_package_/web/rest/KafkaResource_imperative.java.ejs +1 -1
  197. package/dist/generators/spring-cloud-stream/templates/src/main/java/_package_/web/rest/KafkaResource_reactive.java.ejs +1 -1
  198. package/dist/generators/spring-cloud-stream/templates/src/test/java/_package_/web/rest/KafkaResourceIT_reactive.java.ejs +3 -0
  199. package/dist/generators/spring-data-elasticsearch/templates/src/main/java/_package_/_entityPackage_/domain/_persistClass_.java.jhi.elastic_search.ejs +1 -1
  200. package/dist/generators/spring-data-elasticsearch/templates/src/main/java/_package_/_entityPackage_/repository/search/_entityClass_SearchRepository.java.ejs +1 -1
  201. package/dist/generators/spring-data-elasticsearch/templates/src/main/java/_package_/repository/search/UserSearchRepository.java.ejs +4 -4
  202. package/dist/generators/spring-data-neo4j/generator.mjs +43 -1
  203. package/dist/generators/spring-data-neo4j/templates/src/main/java/_package_/_entityPackage_/domain/_persistClass_.java.jhi.spring_data_neo4j.ejs +1 -1
  204. package/dist/generators/spring-data-relational/README.md +7 -0
  205. package/dist/generators/spring-data-relational/generator.mjs +2 -1
  206. package/dist/generators/spring-data-relational/internal/dependencies.mjs +29 -8
  207. package/dist/generators/spring-data-relational/support/database-data.mjs +4 -0
  208. package/dist/generators/spring-data-relational/templates/src/main/java/_package_/repository/EntityManager_reactive.java.ejs +49 -8
  209. package/dist/generators/spring-data-relational/templates/src/test/java/_package_/config/SqlTestContainersSpringContextCustomizerFactory.java.ejs +1 -1
  210. package/dist/generators/upgrade/generator.mjs +3 -3
  211. package/dist/generators/vue/resources/package.json +21 -21
  212. package/dist/generators/vue/templates/package.json.ejs +1 -0
  213. package/dist/generators/vue/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_-details.vue.ejs +1 -2
  214. package/dist/generators/vue/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_-update.component.spec.ts.ejs +1 -1
  215. package/dist/generators/vue/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_-update.component.ts.ejs +3 -3
  216. package/dist/generators/vue/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_-update.vue.ejs +2 -15
  217. package/dist/generators/vue/templates/src/main/webapp/app/entities/_entityFolder_/_entityFile_.vue.ejs +2 -7
  218. package/dist/jdl/converters/jdl-to-json/jdl-to-json-basic-entity-converter.js +1 -0
  219. package/dist/jdl/converters/json-to-jdl-converter.js +1 -1
  220. package/dist/jdl/converters/json-to-jdl-entity-converter.js +1 -0
  221. package/dist/jdl/converters/parsed-jdl-to-jdl-object/entity-converter.js +5 -0
  222. package/dist/jdl/converters/parsed-jdl-to-jdl-object/parsed-jdl-to-jdl-object-converter.js +0 -27
  223. package/dist/jdl/exporters/jhipster-entity-exporter.js +3 -2
  224. package/dist/jdl/jhipster/default-application-options.js +1 -1
  225. package/dist/jdl/jhipster/field-types.js +1 -1
  226. package/dist/jdl/jhipster/json-entity.js +6 -0
  227. package/dist/jdl/models/jdl-entity.js +16 -1
  228. package/dist/jdl/models/jdl-field.js +13 -0
  229. package/dist/jdl/models/jdl-object.js +3 -3
  230. package/dist/jdl/models/jdl-relationship.js +23 -5
  231. package/dist/jdl/parsing/lexer/application-tokens.js +1 -1
  232. package/dist/testing/helpers.mjs +10 -3
  233. package/dist/types/cli/environment-builder.d.mts +2 -0
  234. package/dist/types/generators/angular/needle-api/needle-client-angular.d.mts +0 -1
  235. package/dist/types/generators/base/api.d.mts +12 -0
  236. package/dist/types/generators/base/support/needles.d.mts +1 -1
  237. package/dist/types/generators/base-application/generator.d.mts +2 -2
  238. package/dist/types/generators/base-application/support/index.d.mts +1 -0
  239. package/dist/types/generators/base-application/support/update-application-entities-transform.d.mts +4 -0
  240. package/dist/types/generators/base-application/types/relationship.d.mts +4 -0
  241. package/dist/types/generators/base-core/generator.d.mts +7 -1
  242. package/dist/types/generators/bootstrap-application-base/support/export-jdl-transform.d.mts +8 -0
  243. package/dist/types/generators/bootstrap-application-base/support/import-jdl-transform.d.mts +6 -0
  244. package/dist/types/generators/bootstrap-application-base/support/index.d.mts +2 -0
  245. package/dist/types/generators/client/support/entity-definition.d.mts +2 -2
  246. package/dist/types/generators/feign-client/types-export.d.ts +1 -0
  247. package/dist/types/generators/generator-constants.d.mts +52 -48
  248. package/dist/types/generators/generator-list.d.mts +1 -0
  249. package/dist/types/generators/project-name/support/name-resolver.d.mts +9 -1
  250. package/dist/types/generators/server/options/feign-client.d.mts +21 -0
  251. package/dist/types/generators/server/options/index.d.mts +1 -0
  252. package/dist/types/jdl/converters/json-to-jdl-converter.d.ts +1 -0
  253. package/dist/types/jdl/converters/parsed-jdl-to-jdl-object/option-converter.d.ts +1 -1
  254. package/dist/types/jdl/jhipster/json-entity.d.ts +2 -0
  255. package/dist/types/jdl/models/jdl-entity.d.ts +1 -0
  256. package/dist/types/jdl/models/jdl-relationship.d.ts +0 -18
  257. package/dist/types/jdl/types/types.d.mts +2 -2
  258. package/package.json +27 -27
@@ -8,29 +8,29 @@
8
8
 
9
9
  <properties>
10
10
  <!-- Dependency versions -->
11
- <archunit-junit5.version>1.1.0</archunit-junit5.version>
11
+ <archunit-junit5.version>1.2.1</archunit-junit5.version>
12
12
  <awaitility.version>4.2.0</awaitility.version>
13
13
  <blockhound-junit-platform.version>1.0.8.RELEASE</blockhound-junit-platform.version>
14
14
  <commons-beanutils.version>1.9.4</commons-beanutils.version>
15
15
  <gatling.version>3.9.5</gatling.version>
16
16
  <h2.version>2.2.224</h2.version>
17
17
  <hazelcast-hibernate53.version>5.1.0</hazelcast-hibernate53.version>
18
- <hazelcast-spring.version>5.3.5</hazelcast-spring.version>
18
+ <hazelcast-spring.version>5.3.6</hazelcast-spring.version>
19
19
  <jackson-databind-nullable.version>0.2.6</jackson-databind-nullable.version>
20
20
  <jaxb-runtime.version>4.0.4</jaxb-runtime.version>
21
- <junit-platform-launcher.version>1.10.0</junit-platform-launcher.version>
21
+ <junit-platform-launcher.version>1.10.1</junit-platform-launcher.version>
22
22
  <liquibase.version>4.24.0</liquibase.version>
23
23
  <mapstruct.version>1.5.5.Final</mapstruct.version>
24
- <micrometer-context-propagation.version>1.0.6</micrometer-context-propagation.version>
24
+ <micrometer-context-propagation.version>1.1.0</micrometer-context-propagation.version>
25
25
  <picocli.version>4.7.5</picocli.version>
26
26
  <spring-pulsar.version>0.2.0</spring-pulsar.version>
27
27
  <typesafe.version>1.4.3</typesafe.version>
28
28
  <validation-api.version>3.0.2</validation-api.version>
29
29
 
30
30
  <!-- Plugin versions -->
31
- <checkstyle.version>10.12.4</checkstyle.version>
31
+ <checkstyle.version>10.12.5</checkstyle.version>
32
32
  <checksum-maven-plugin.version>1.11</checksum-maven-plugin.version>
33
- <frontend-maven-plugin.version>1.14.2</frontend-maven-plugin.version>
33
+ <frontend-maven-plugin.version>1.15.0</frontend-maven-plugin.version>
34
34
  <gatling-maven-plugin.version>4.6.0</gatling-maven-plugin.version>
35
35
  <git-commit-id-maven-plugin.version>7.0.0</git-commit-id-maven-plugin.version>
36
36
  <jib-maven-plugin.version>3.4.0</jib-maven-plugin.version>
@@ -42,20 +42,20 @@
42
42
  <maven-compiler-plugin.version>3.11.0</maven-compiler-plugin.version>
43
43
  <maven-eclipse-plugin.version>2.10</maven-eclipse-plugin.version>
44
44
  <maven-enforcer-plugin.version>3.4.1</maven-enforcer-plugin.version>
45
- <maven-failsafe-plugin.version>3.2.1</maven-failsafe-plugin.version>
45
+ <maven-failsafe-plugin.version>3.2.2</maven-failsafe-plugin.version>
46
46
  <maven-idea-plugin.version>2.2.1</maven-idea-plugin.version>
47
47
  <maven-jar-plugin.version>3.3.0</maven-jar-plugin.version>
48
- <maven-javadoc-plugin.version>3.6.0</maven-javadoc-plugin.version>
48
+ <maven-javadoc-plugin.version>3.6.3</maven-javadoc-plugin.version>
49
49
  <maven-resources-plugin.version>3.3.1</maven-resources-plugin.version>
50
50
  <maven-site-plugin.version>3.12.1</maven-site-plugin.version>
51
- <maven-surefire-plugin.version>3.2.1</maven-surefire-plugin.version>
51
+ <maven-surefire-plugin.version>3.2.2</maven-surefire-plugin.version>
52
52
  <maven-war-plugin.version>3.4.0</maven-war-plugin.version>
53
53
  <modernizer-maven-plugin.version>2.7.0</modernizer-maven-plugin.version>
54
54
  <nohttp-checkstyle.version>0.0.11</nohttp-checkstyle.version>
55
- <openapi-generator-maven-plugin.version>7.0.1</openapi-generator-maven-plugin.version>
55
+ <openapi-generator-maven-plugin.version>7.1.0</openapi-generator-maven-plugin.version>
56
56
  <properties-maven-plugin.version>1.2.1</properties-maven-plugin.version>
57
57
  <sonar-maven-plugin.version>3.10.0.2594</sonar-maven-plugin.version>
58
- <spotless-maven-plugin.version>2.40.0</spotless-maven-plugin.version>
58
+ <spotless-maven-plugin.version>2.41.1</spotless-maven-plugin.version>
59
59
  </properties>
60
60
 
61
61
  <dependencyManagement>
@@ -49,6 +49,7 @@ export const loadServerConfig = ({ config, application }) => {
49
49
  'embeddableLaunchScript',
50
50
  'enableGradleEnterprise',
51
51
  'gradleEnterpriseHost',
52
+ 'feignClient',
52
53
  ]), {
53
54
  packageFolder: ({ packageFolder }) => (packageFolder ? normalizePathEnd(packageFolder) : packageFolder),
54
55
  gradleEnterpriseHost: ({ gradleEnterpriseHost }) => !gradleEnterpriseHost || gradleEnterpriseHost.startsWith('https://') ? gradleEnterpriseHost : `https://${gradleEnterpriseHost}`,
@@ -81,7 +81,10 @@ export function preparePostEntityServerDerivedProperties(entity) {
81
81
  .filter(relationship => relationship.ignoreOtherSideProperty === undefined)
82
82
  .forEach(relationship => {
83
83
  relationship.ignoreOtherSideProperty =
84
- !relationship.embedded && !!relationship.otherEntity && relationship.otherEntity.relationships.length > 0;
84
+ entity.databaseType !== 'neo4j' &&
85
+ !relationship.embedded &&
86
+ !!relationship.otherEntity &&
87
+ relationship.otherEntity.relationships.length > 0;
85
88
  });
86
89
  entity.relationshipsContainOtherSideIgnore = entity.relationships.some(relationship => relationship.ignoreOtherSideProperty);
87
90
  entity.importApiModelProperty =
@@ -266,7 +266,7 @@ dependencies {
266
266
  // to use a SNAPSHOT release instead of a stable release
267
267
  implementation "tech.jhipster:jhipster-framework"
268
268
  implementation "jakarta.annotation:jakarta.annotation-api"
269
- <%_ // This is useful for major Spring Boot migration
269
+ <%_ /* This is useful for major Spring Boot migration */
270
270
  if (addSpringMilestoneRepository) { _%>
271
271
  runtimeOnly "org.springframework.boot:spring-boot-properties-migrator"
272
272
  <%_ } _%>
@@ -421,7 +421,6 @@ if (addSpringMilestoneRepository) { _%>
421
421
  implementation "org.springframework.cloud:spring-cloud-starter-circuitbreaker-resilience4j"
422
422
  <%_ } _%>
423
423
  implementation "org.springframework.retry:spring-retry"
424
- implementation "org.springframework.cloud:spring-cloud-starter-openfeign"
425
424
  <%_ } _%>
426
425
  <%_ if (serviceDiscoveryAny) { _%>
427
426
  implementation "org.springframework.cloud:spring-cloud-starter-bootstrap"
@@ -49,29 +49,11 @@ dependencies {
49
49
  implementation "com.h2database:h2"
50
50
  <%_ } _%>
51
51
  <%_ } _%>
52
- <%_ if (devDatabaseTypeMysql) { _%>
52
+ <%_ if (devDatabaseTypeMariadb || devDatabaseTypeMssql || devDatabaseTypePostgres || devDatabaseTypeMysql) { _%>
53
53
  <%_ if (reactive) { _%>
54
- implementation ("io.asyncer:r2dbc-mysql")
54
+ implementation "<%- prodDatabaseDriver.r2dbc.groupId %>:<%- prodDatabaseDriver.r2dbc.artifactId %>"
55
55
  <%_ } _%>
56
- implementation "com.mysql:mysql-connector-j"
57
- <%_ } _%>
58
- <%_ if (devDatabaseTypePostgres) { _%>
59
- <%_ if (reactive) { _%>
60
- implementation "org.postgresql:r2dbc-postgresql"
61
- <%_ } _%>
62
- implementation "org.postgresql:postgresql"
63
- <%_ } _%>
64
- <%_ if (devDatabaseTypeMariadb) { _%>
65
- <%_ if (reactive) { _%>
66
- implementation "org.mariadb:r2dbc-mariadb"
67
- <%_ } _%>
68
- implementation "org.mariadb.jdbc:mariadb-java-client"
69
- <%_ } _%>
70
- <%_ if (devDatabaseTypeMssql) { _%>
71
- <%_ if (reactive) { _%>
72
- implementation "io.r2dbc:r2dbc-mssql"
73
- <%_ } _%>
74
- implementation "com.microsoft.sqlserver:mssql-jdbc"
56
+ implementation "<%- prodDatabaseDriver.jdbc.groupId %>:<%- prodDatabaseDriver.jdbc.artifactId %>"
75
57
  <%_ } _%>
76
58
  <%_ if (devDatabaseTypeOracle) { _%>
77
59
  implementation "com.oracle.database.jdbc:ojdbc8"
@@ -41,32 +41,22 @@ configurations {
41
41
  }
42
42
 
43
43
  dependencies {
44
- <%_ if (prodDatabaseTypeMysql) { _%>
44
+ <%_ if (prodDatabaseTypeMariadb || prodDatabaseTypeMssql || prodDatabaseTypeMysql || prodDatabaseTypePostgresql) { _%>
45
45
  <%_ if (reactive) { _%>
46
- implementation "io.asyncer:r2dbc-mysql"
46
+ implementation "<%- prodDatabaseDriver.r2dbc.groupId %>:<%- prodDatabaseDriver.r2dbc.artifactId %>"
47
47
  <%_ } _%>
48
- implementation "com.mysql:mysql-connector-j"
48
+ implementation "<%- prodDatabaseDriver.jdbc.groupId %>:<%- prodDatabaseDriver.jdbc.artifactId %>"
49
+ <%_ } _%>
50
+ <%_ if (prodDatabaseTypeMysql) { _%>
49
51
  testImplementation "org.testcontainers:mysql"
50
52
  <%_ } _%>
51
53
  <%_ if (prodDatabaseTypePostgresql) { _%>
52
- <%_ if (reactive) { _%>
53
- implementation "org.postgresql:r2dbc-postgresql"
54
- <%_ } _%>
55
- implementation "org.postgresql:postgresql"
56
54
  testImplementation "org.testcontainers:postgresql"
57
55
  <%_ } _%>
58
56
  <%_ if (prodDatabaseTypeMariadb) { _%>
59
- <%_ if (reactive) { _%>
60
- implementation "org.mariadb:r2dbc-mariadb"
61
- <%_ } _%>
62
- implementation "org.mariadb.jdbc:mariadb-java-client"
63
57
  testImplementation "org.testcontainers:mariadb"
64
58
  <%_ } _%>
65
59
  <%_ if (prodDatabaseTypeMssql) { _%>
66
- <%_ if (reactive) { _%>
67
- implementation "io.r2dbc:r2dbc-mssql"
68
- <%_ } _%>
69
- implementation "com.microsoft.sqlserver:mssql-jdbc"
70
60
  testImplementation "org.testcontainers:mssqlserver"
71
61
  <%_ } _%>
72
62
  <%_ if (prodDatabaseTypeOracle) { _%>
@@ -319,10 +319,6 @@
319
319
  <groupId>org.springframework.retry</groupId>
320
320
  <artifactId>spring-retry</artifactId>
321
321
  </dependency>
322
- <dependency>
323
- <groupId>org.springframework.cloud</groupId>
324
- <artifactId>spring-cloud-starter-openfeign</artifactId>
325
- </dependency>
326
322
  <%_ } _%>
327
323
  <%_ if (serviceDiscoveryAny) { _%>
328
324
  <dependency>
@@ -477,6 +473,7 @@
477
473
  <configuration>
478
474
  <source>${java.version}</source>
479
475
  <target>${java.version}</target>
476
+ <parameters>true</parameters>
480
477
  <annotationProcessorPaths>
481
478
  <path>
482
479
  <groupId>org.springframework.boot</groupId>
@@ -35,7 +35,7 @@ _%>
35
35
  return ResponseEntity.ok().body(entityList);
36
36
  <%_ } else { _%>
37
37
  Page<<%= instanceType %>> page = <%= entityInstance %>QueryService.findByCriteria(criteria, pageable);
38
- HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(<% if (!reactive) { %>ServletUriComponentsBuilder.fromCurrentRequest()<% } else { %>UriComponentsBuilder.fromHttpRequest(request)<% } %>, page);
38
+ HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(<% if (!reactive) { %>ServletUriComponentsBuilder.fromCurrentRequest()<% } else { %>ForwardedHeaderUtils.adaptFromForwardedHeaders(request.getURI(), request.getHeaders())<% } %>, page);
39
39
  return ResponseEntity.ok().headers(headers).body(page.getContent());
40
40
  <%_ } _%>
41
41
  <%_ } else { _%>
@@ -47,7 +47,7 @@ _%>
47
47
  ResponseEntity.ok()
48
48
  .headers(
49
49
  PaginationUtil.generatePaginationHttpHeaders(
50
- UriComponentsBuilder.fromHttpRequest(request),
50
+ ForwardedHeaderUtils.adaptFromForwardedHeaders(request.getURI(), request.getHeaders()),
51
51
  new PageImpl<>(countWithEntities.getT2(), pageable, countWithEntities.getT1())
52
52
  )
53
53
  ).body(countWithEntities.getT2())
@@ -75,7 +75,7 @@ _%>
75
75
  }
76
76
  <%_ } else { _%>
77
77
  <%_ if (paginationNo) { _%>
78
- public <% if (reactive) { %>Mono<<% } %>List<<%= instanceType %>><% if (reactive) { %>><% } %> getAll<%= entityClassPlural %>(<% if (fieldsContainNoOwnerOneToOne) { %>@RequestParam(required = false) String filter<% } %><% if (implementsEagerLoadApis && fieldsContainNoOwnerOneToOne) { %>,<% } %><% if (implementsEagerLoadApis) { %>@RequestParam(required = false, defaultValue = "true") boolean eagerload<% } %>) {<%- include('get_all_stream_template', {viaService: viaService}); -%>
78
+ public <% if (reactive) { %>Mono<<% } %>List<<%= instanceType %>><% if (reactive) { %>><% } %> getAll<%= entityClassPlural %>(<% if (fieldsContainNoOwnerOneToOne) { %>@RequestParam(name = "filter", required = false) String filter<% } %><% if (implementsEagerLoadApis && fieldsContainNoOwnerOneToOne) { %>,<% } %><% if (implementsEagerLoadApis) { %>@RequestParam(name = "eagerload", required = false, defaultValue = "true") boolean eagerload<% } %>) {<%- include('get_all_stream_template', {viaService: viaService}); -%>
79
79
  log.debug("REST request to get all <%= entityClassPlural %>");
80
80
  <%_ if (viaService) { _%>
81
81
  return <%= entityInstance %>Service.findAll()<% if (reactive) { %>.collectList()<% } %>;
@@ -96,7 +96,7 @@ _%>
96
96
  return <%= entityInstance %>Repository.findAll()<% if (reactive) { %>.collectList()<% } %>;
97
97
  <%_ } _%>
98
98
  <%_ } else { _%>
99
- public <% if (reactive) { %>Mono<ResponseEntity<List<<%= instanceType %>>>><% } else { %>ResponseEntity<List<<%= instanceType %>>><% } %> getAll<%= entityClassPlural %>(@org.springdoc.core.annotations.ParameterObject Pageable pageable<% if (reactive) { %>, ServerHttpRequest request<% } %><% if (fieldsContainNoOwnerOneToOne) { %>, @RequestParam(required = false) String filter<% } %><% if (implementsEagerLoadApis) { %>, @RequestParam(required = false, defaultValue = "true") boolean eagerload<% } %>) {<%- include('get_all_stream_template', {viaService: viaService}); -%>
99
+ public <% if (reactive) { %>Mono<ResponseEntity<List<<%= instanceType %>>>><% } else { %>ResponseEntity<List<<%= instanceType %>>><% } %> getAll<%= entityClassPlural %>(@org.springdoc.core.annotations.ParameterObject Pageable pageable<% if (reactive) { %>, ServerHttpRequest request<% } %><% if (fieldsContainNoOwnerOneToOne) { %>, @RequestParam(name = "filter", required = false) String filter<% } %><% if (implementsEagerLoadApis) { %>, @RequestParam(name = "eagerload", required = false, defaultValue = "true") boolean eagerload<% } %>) {<%- include('get_all_stream_template', {viaService: viaService}); -%>
100
100
  log.debug("REST request to get a page of <%= entityClassPlural %>");
101
101
  <%_ if (reactive) { _%>
102
102
  return <%= entityInstance %><%= viaService ? 'Service.countAll' : 'Repository.count' %>().zipWith(<%= entityInstance %><%= viaService ? 'Service.findAll' : 'Repository.findAllBy' %>(pageable)<%= reactiveEntityToDto %>.collectList())
@@ -104,7 +104,7 @@ _%>
104
104
  ResponseEntity.ok()
105
105
  .headers(
106
106
  PaginationUtil.generatePaginationHttpHeaders(
107
- UriComponentsBuilder.fromHttpRequest(request),
107
+ ForwardedHeaderUtils.adaptFromForwardedHeaders(request.getURI(), request.getHeaders()),
108
108
  new PageImpl<>(countWithEntities.getT2(), pageable, countWithEntities.getT1())
109
109
  )
110
110
  ).body(countWithEntities.getT2())
@@ -117,10 +117,10 @@ _%>
117
117
  } else {
118
118
  page = <%= entityInstance %><%= viaService ? 'Service' : 'Repository' %>.findAll(pageable)<%= reactiveEntityToDto %>;
119
119
  }
120
- HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(<% if (reactive) { %>UriComponentsBuilder.fromHttpRequest(request)<% } else { %>ServletUriComponentsBuilder.fromCurrentRequest()<% } %>, page);
120
+ HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(<% if (reactive) { %>ForwardedHeaderUtils.adaptFromForwardedHeaders(request.getURI(), request.getHeaders())<% } else { %>ServletUriComponentsBuilder.fromCurrentRequest()<% } %>, page);
121
121
  <%_ } else { _%>
122
122
  Page<<%= instanceType %>> page = <%= entityInstance %><%= viaService ? 'Service' : 'Repository' %>.findAll(pageable)<%= reactiveEntityToDto %>;
123
- HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(<% if (reactive) { %>UriComponentsBuilder.fromHttpRequest(request)<% } else { %>ServletUriComponentsBuilder.fromCurrentRequest()<% } %>, page);
123
+ HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(<% if (reactive) { %>ForwardedHeaderUtils.adaptFromForwardedHeaders(request.getURI(), request.getHeaders())<% } else { %>ServletUriComponentsBuilder.fromCurrentRequest()<% } %>, page);
124
124
  <%_ } _%>
125
125
  return ResponseEntity.ok().headers(headers).body(page.getContent());
126
126
  <%_ } _%>
@@ -24,17 +24,17 @@
24
24
  const entityToDtoReference = mapper + '::' + 'toDto';
25
25
  const entityListToDtoListReference = mapper + '.' + 'toDto';
26
26
  if (paginationNo) { %>
27
- public <% if (reactive) { %>Mono<<% } %>List<<%= instanceType %>><% if (reactive) { %>><% } %> search<%= entityClassPlural %>(@RequestParam String query) {
27
+ public <% if (reactive) { %>Mono<<% } %>List<<%= instanceType %>><% if (reactive) { %>><% } %> search<%= entityClassPlural %>(@RequestParam("query") String query) {
28
28
  log.debug("REST request to search <%= entityClassPlural %> for query {}", query);<%- include('search_stream_template', {viaService: viaService, fromResource: true}); -%>
29
29
  <% } else { %>
30
- public <% if (reactive) { %>Mono<<% } %>ResponseEntity<<%= listOrFlux %><<%= instanceType %>>><% if (reactive) { %>><% } %> search<%= entityClassPlural %>(@RequestParam String query, @org.springdoc.core.annotations.ParameterObject Pageable pageable<% if (reactive) { %>, ServerHttpRequest request<% } %>) {
30
+ public <% if (reactive) { %>Mono<<% } %>ResponseEntity<<%= listOrFlux %><<%= instanceType %>>><% if (reactive) { %>><% } %> search<%= entityClassPlural %>(@RequestParam("query") String query, @org.springdoc.core.annotations.ParameterObject Pageable pageable<% if (reactive) { %>, ServerHttpRequest request<% } %>) {
31
31
  log.debug("REST request to search for a page of <%= entityClassPlural %> for query {}", query);
32
32
  <%_ if (reactive) { _%>
33
33
  return <%= entityInstance %><%= viaService ?
34
34
  'Service.' + (searchEngineElasticsearch ? 'searchCount' : 'countAll') :
35
35
  (searchEngineElasticsearch ? 'Search' : '') + 'Repository.count' %>()
36
36
  .map(total -> new PageImpl<>(new ArrayList<>(), pageable, total))
37
- .map(page -> PaginationUtil.generatePaginationHttpHeaders(UriComponentsBuilder.fromHttpRequest(request), page))
37
+ .map(page -> PaginationUtil.generatePaginationHttpHeaders(ForwardedHeaderUtils.adaptFromForwardedHeaders(request.getURI(), request.getHeaders()), page))
38
38
  .map(headers -> ResponseEntity.ok().headers(headers).body(<%= entityInstance %><%= viaService ? 'Service' : (searchEngineElasticsearch ? 'Search' : '') + 'Repository' %>.search(query, pageable)<% if (!viaService && dtoMapstruct) { %>.map(<%= entityToDtoReference %>)<% } %>));
39
39
  <%_ } else { _%>
40
40
  try {
@@ -43,7 +43,7 @@ if (paginationNo) { %>
43
43
  <%_ } else { _%>
44
44
  Page<<%= persistClass %>> page = <%= entityInstance %><% if (searchEngineElasticsearch) { %>Search<% } %>Repository.search(query, pageable);
45
45
  <%_ } _%>
46
- HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(<% if (reactive) { %>UriComponentsBuilder.fromHttpRequest(request)<% } else { %>ServletUriComponentsBuilder.fromCurrentRequest()<% } %>, page);
46
+ HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(<% if (reactive) { %>ForwardedHeaderUtils.adaptFromForwardedHeaders(request.getURI(), request.getHeaders())<% } else { %>ServletUriComponentsBuilder.fromCurrentRequest()<% } %>, page);
47
47
  return ResponseEntity.ok().headers(headers).body(<% if (!viaService && dtoMapstruct) { %><%= entityListToDtoListReference %>(<% } %>page.getContent()<% if (!viaService && dtoMapstruct) { %>)<% } %>);
48
48
  } catch (RuntimeException e) {
49
49
  <% if (searchEngineElasticsearch) { %>
@@ -70,7 +70,7 @@ public interface <%= entityClass %>Repository extends <% if (containsBagRelation
70
70
  <%_ for (const relationship of relationships) { _%>
71
71
  <%_ if (relationship.relationshipManyToOne && relationship.otherEntityUser && databaseTypeSql) { _%>
72
72
 
73
- @Query("select <%= entityInstanceDbSafe %> from <%= persistClass %> <%= entityInstanceDbSafe %> where <%= entityInstanceDbSafe %>.<%= relationship.relationshipFieldName %>.login = ?#{principal.<% if (authenticationTypeOauth2) { %>preferredUsername<% } else { %>username<% } %>}")
73
+ @Query("select <%= entityInstanceDbSafe %> from <%= persistClass %> <%= entityInstanceDbSafe %> where <%= entityInstanceDbSafe %>.<%= relationship.relationshipFieldName %>.login = ?#{authentication.name}")
74
74
  List<<%= persistClass %>> findBy<%= relationship.relationshipNameCapitalized %>IsCurrentUser();
75
75
  <%_ } _%>
76
76
  <%_ } _%>
@@ -63,7 +63,7 @@ import java.util.UUID;
63
63
  @Mapper(componentModel = "spring")
64
64
  public interface <%= entityClass %>Mapper extends EntityMapper<<%= dtoClass %>, <%= persistClass %>> {
65
65
  <%_ if (!embedded) { _%>
66
- <%_ var renMapAnotEnt = false; //Render Mapping Annotation during Entity to DTO conversion? _%>
66
+ <%_ var renMapAnotEnt = false; /*Render Mapping Annotation during Entity to DTO conversion?*/ _%>
67
67
  <%_ for (relationship of dtoRelationships) { _%>
68
68
  <%_
69
69
  renMapAnotEnt = true;
@@ -80,7 +80,7 @@ public interface <%= entityClass %>Mapper extends EntityMapper<<%= dtoClass %>,
80
80
  <%= dtoClass %> toDto(<%= persistClass %> s);
81
81
  <%_ } _%>
82
82
 
83
- <%_ var renMapAnotDto = false; //Render Mapping Annotation during DTO to Entity conversion? _%>
83
+ <%_ var renMapAnotDto = false; /*Render Mapping Annotation during DTO to Entity conversion?*/ _%>
84
84
  <%_ if(primaryKey.ids.length > 1) { _%>
85
85
  <%_ renMapAnotDto = true; _%>
86
86
  <%_ for (const id of primaryKey.ids) { _%>
@@ -74,7 +74,7 @@ import org.springframework.http.HttpHeaders;
74
74
  import org.springframework.http.server.reactive.ServerHttpRequest;
75
75
  <%_ } _%>
76
76
  <%_ if (reactive) { _%>
77
- import org.springframework.web.util.UriComponentsBuilder;
77
+ import org.springframework.web.util.ForwardedHeaderUtils;
78
78
  <%_ } else { _%>
79
79
  import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
80
80
  <%_ } _%>
@@ -398,7 +398,7 @@ public class <%= entityClass %>Resource {
398
398
  <%_ if (databaseTypeSql && isUsingMapsId && !viaService) { _%>
399
399
  @Transactional(readOnly = true)
400
400
  <%_ } _%>
401
- public <% if (reactive) { %>Mono<<% } %>ResponseEntity<<%= instanceType %>><% if (reactive) { %>><% } %> get<%= entityClass %>(@PathVariable <%= primaryKey.type %> id) {
401
+ public <% if (reactive) { %>Mono<<% } %>ResponseEntity<<%= instanceType %>><% if (reactive) { %>><% } %> get<%= entityClass %>(@PathVariable("id") <%= primaryKey.type %> id) {
402
402
  log.debug("REST request to get <%= entityClass %> : {}", id);<%- include('../../_partials_entity_/get_template', {viaService, returnDirectly:false, implementsEagerLoadApis}); -%>
403
403
  return ResponseUtil.wrapOrNotFound(<%= instanceName %>);
404
404
  }
@@ -411,7 +411,7 @@ public class <%= entityClass %>Resource {
411
411
  * @return the {@link ResponseEntity} with status {@code 204 (NO_CONTENT)}.
412
412
  */
413
413
  @DeleteMapping("/{id}")
414
- public <% if (reactive) { %>Mono<<% } %>ResponseEntity<Void><% if (reactive) { %>><% } %> delete<%= entityClass %>(@PathVariable <%= primaryKey.type %> id) {
414
+ public <% if (reactive) { %>Mono<<% } %>ResponseEntity<Void><% if (reactive) { %>><% } %> delete<%= entityClass %>(@PathVariable("id") <%= primaryKey.type %> id) {
415
415
  log.debug("REST request to delete <%= entityClass %> : {}", id);
416
416
  <%- include('../../_partials_entity_/delete_template', {viaService: viaService, fromResource: true}); -%>
417
417
  <%_ if (reactive) { _%>
@@ -62,11 +62,18 @@ import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
62
62
  import org.springframework.security.crypto.password.PasswordEncoder;
63
63
  <%_ } _%>
64
64
  <%_ if (authenticationTypeOauth2) { _%>
65
+ import static org.springframework.security.oauth2.core.oidc.StandardClaimNames.PREFERRED_USERNAME;
66
+
65
67
  import <%= packageName %>.security.oauth2.AudienceValidator;
66
68
  import <%= packageName %>.security.SecurityUtils;
67
69
  import org.springframework.security.authentication.AbstractAuthenticationToken;
70
+ import org.springframework.security.oauth2.client.userinfo.OAuth2UserService;
71
+ import org.springframework.security.oauth2.client.oidc.userinfo.OidcUserRequest;
72
+ import org.springframework.security.oauth2.client.oidc.userinfo.OidcUserService;
68
73
  import org.springframework.security.oauth2.core.DelegatingOAuth2TokenValidator;
69
74
  import org.springframework.security.oauth2.core.OAuth2TokenValidator;
75
+ import org.springframework.security.oauth2.core.oidc.user.DefaultOidcUser;
76
+ import org.springframework.security.oauth2.core.oidc.user.OidcUser;
70
77
  import org.springframework.security.oauth2.jwt.*;
71
78
  import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationConverter;
72
79
  import org.springframework.beans.factory.annotation.Value;
@@ -261,14 +268,14 @@ public class SecurityConfiguration {
261
268
  .oauth2ResourceServer(oauth2 -> oauth2.jwt(Customizer.withDefaults()));
262
269
  <%_ } else if (authenticationTypeOauth2) { _%>
263
270
  <%_ if (applicationTypeMonolith) { _%>
264
- .oauth2Login(withDefaults())
271
+ .oauth2Login(oauth2 -> oauth2.userInfoEndpoint(userInfo -> userInfo.oidcUserService(this.oidcUserService())))
265
272
  <%_ } else if (applicationTypeMicroservice) { _%>
266
273
  .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
267
274
  <%_ } _%>
268
275
  .oauth2ResourceServer(oauth2 -> oauth2
269
276
  .jwt(jwt -> jwt
270
277
  .jwtAuthenticationConverter(authenticationConverter())))
271
- .oauth2Client();
278
+ .oauth2Client(withDefaults());
272
279
  <%_ } _%>
273
280
  <%_ if (devDatabaseTypeH2Any) { _%>
274
281
  if (env.acceptsProfiles(Profiles.of(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT))) {
@@ -291,9 +298,20 @@ public class SecurityConfiguration {
291
298
  Converter<Jwt, AbstractAuthenticationToken> authenticationConverter() {
292
299
  JwtAuthenticationConverter jwtAuthenticationConverter = new JwtAuthenticationConverter();
293
300
  jwtAuthenticationConverter.setJwtGrantedAuthoritiesConverter(new JwtGrantedAuthorityConverter());
301
+ jwtAuthenticationConverter.setPrincipalClaimName(PREFERRED_USERNAME);
294
302
  return jwtAuthenticationConverter;
295
303
  }
304
+
305
+ OAuth2UserService<OidcUserRequest, OidcUser> oidcUserService() {
306
+ final OidcUserService delegate = new OidcUserService();
307
+
308
+ return userRequest -> {
309
+ OidcUser oidcUser = delegate.loadUser(userRequest);
310
+ return new DefaultOidcUser(oidcUser.getAuthorities(), oidcUser.getIdToken(), oidcUser.getUserInfo(), PREFERRED_USERNAME);
311
+ };
312
+ }
296
313
  <%_ if (!applicationTypeMicroservice) { _%>
314
+
297
315
  /**
298
316
  * Map authorities from "groups" or "roles" claim in ID Token.
299
317
  *
@@ -20,6 +20,8 @@ package <%= packageName %>.config;
20
20
 
21
21
  import <%= packageName %>.security.AuthoritiesConstants;
22
22
  <%_ if (authenticationTypeOauth2) { _%>
23
+ import static org.springframework.security.oauth2.core.oidc.StandardClaimNames.PREFERRED_USERNAME;
24
+
23
25
  import <%= packageName %>.security.SecurityUtils;
24
26
  import <%= packageName %>.security.oauth2.AudienceValidator;
25
27
  import <%= packageName %>.security.oauth2.JwtGrantedAuthorityConverter;
@@ -339,6 +341,7 @@ public class SecurityConfiguration {
339
341
  Converter<Jwt, Mono<AbstractAuthenticationToken>> jwtAuthenticationConverter() {
340
342
  JwtAuthenticationConverter jwtAuthenticationConverter = new JwtAuthenticationConverter();
341
343
  jwtAuthenticationConverter.setJwtGrantedAuthoritiesConverter(new JwtGrantedAuthorityConverter());
344
+ jwtAuthenticationConverter.setPrincipalClaimName(PREFERRED_USERNAME);
342
345
  return new ReactiveJwtAuthenticationConverterAdapter(jwtAuthenticationConverter);
343
346
  }
344
347
 
@@ -363,7 +366,7 @@ public class SecurityConfiguration {
363
366
  }
364
367
  });
365
368
 
366
- return new DefaultOidcUser(mappedAuthorities, user.getIdToken(), user.getUserInfo());
369
+ return new DefaultOidcUser(mappedAuthorities, user.getIdToken(), user.getUserInfo(), PREFERRED_USERNAME);
367
370
  });
368
371
  };
369
372
  }
@@ -80,7 +80,7 @@ public class CustomClaimConverter implements Converter<Map<String, Object>, Map<
80
80
  // Retrieve and set the token
81
81
  String token = bearerTokenResolver.resolve(((ServletRequestAttributes) attributes).getRequest());
82
82
  HttpHeaders headers = new HttpHeaders();
83
- headers.set("Authorization", buildBearer(token));
83
+ headers.setBearerAuth(token);
84
84
 
85
85
  // Retrieve user info from OAuth provider if not already loaded
86
86
  ObjectNode user = users.get(claims.get("sub").toString(), s -> {
@@ -126,8 +126,4 @@ public class CustomClaimConverter implements Converter<Map<String, Object>, Map<
126
126
  }
127
127
  return convertedClaims;
128
128
  }
129
-
130
- private String buildBearer(String token) {
131
- return "Bearer " + token;
132
- }
133
129
  }
@@ -29,21 +29,29 @@ import jakarta.mail.internet.MimeMessage;
29
29
 
30
30
  import org.slf4j.Logger;
31
31
  import org.slf4j.LoggerFactory;
32
- import org.springframework.beans.factory.annotation.Autowired;
33
32
  import org.springframework.context.MessageSource;
34
- import org.springframework.context.annotation.Lazy;
35
33
  import org.springframework.mail.MailException;
36
34
  import org.springframework.mail.javamail.JavaMailSender;
37
35
  import org.springframework.mail.javamail.MimeMessageHelper;
38
- import org.springframework.scheduling.annotation.Async;
39
36
  import org.springframework.stereotype.Service;
40
37
  import org.thymeleaf.context.Context;
41
38
  import org.thymeleaf.spring6.SpringTemplateEngine;
39
+ <%_ if (reactive) { _%>
40
+ import reactor.core.publisher.Mono;
41
+ <%_ } else { _%>
42
+ import org.springframework.scheduling.annotation.Async;
43
+ <%_ } _%>
44
+ <%_
45
+ const localSendEmailFromTemplateApi = reactive ? 'sendEmailFromTemplate' : 'sendEmailFromTemplateSync';
46
+ _%>
47
+
42
48
 
43
49
  /**
44
- * Service for sending emails.
50
+ * Service for sending emails asynchronously.
51
+ <%_ if (!reactive) { _%>
45
52
  * <p>
46
53
  * We use the {@link Async} annotation to send emails asynchronously.
54
+ <%_ } _%>
47
55
  */
48
56
  @Service
49
57
  public class MailService {
@@ -62,10 +70,6 @@ public class MailService {
62
70
 
63
71
  private final SpringTemplateEngine templateEngine;
64
72
 
65
- @Autowired
66
- @Lazy
67
- private MailService self;
68
-
69
73
  public MailService(JHipsterProperties jHipsterProperties, JavaMailSender javaMailSender,
70
74
  MessageSource messageSource, SpringTemplateEngine templateEngine) {
71
75
 
@@ -75,8 +79,21 @@ public class MailService {
75
79
  this.templateEngine = templateEngine;
76
80
  }
77
81
 
82
+ <%_ if (!reactive) { _%>
78
83
  @Async
84
+ <%_ } _%>
79
85
  public void sendEmail(String to, String subject, String content, boolean isMultipart, boolean isHtml) {
86
+ <%_ if (reactive) { _%>
87
+ Mono.defer(() -> {
88
+ this.sendEmailSync(to, subject, content, isMultipart, isHtml);
89
+ return Mono.empty();
90
+ }).subscribe();
91
+ <%_ } else { _%>
92
+ this.sendEmailSync(to, subject, content, isMultipart, isHtml);
93
+ <%_ } _%>
94
+ }
95
+
96
+ private void sendEmailSync(String to, String subject, String content, boolean isMultipart, boolean isHtml) {
80
97
  log.debug("Send email[multipart '{}' and html '{}'] to '{}' with subject '{}' and content={}",
81
98
  isMultipart, isHtml, to, subject, content);
82
99
 
@@ -95,8 +112,21 @@ public class MailService {
95
112
  }
96
113
  }
97
114
 
115
+ <%_ if (!reactive) { _%>
98
116
  @Async
117
+ <%_ } _%>
99
118
  public void sendEmailFromTemplate(<%= user.persistClass %> user, String templateName, String titleKey) {
119
+ <%_ if (reactive) { _%>
120
+ Mono.defer(() -> {
121
+ this.sendEmailFromTemplateSync(user, templateName, titleKey);
122
+ return Mono.empty();
123
+ }).subscribe();
124
+ <%_ } else { _%>
125
+ this.sendEmailFromTemplateSync(user, templateName, titleKey);
126
+ <%_ } _%>
127
+ }
128
+
129
+ private void sendEmailFromTemplateSync(<%= user.persistClass %> user, String templateName, String titleKey) {
100
130
  if (user.getEmail() == null) {
101
131
  log.debug("Email doesn't exist for user '{}'", user.getLogin());
102
132
  return;
@@ -107,26 +137,32 @@ public class MailService {
107
137
  context.setVariable(BASE_URL, jHipsterProperties.getMail().getBaseUrl());
108
138
  String content = templateEngine.process(templateName, context);
109
139
  String subject = messageSource.getMessage(titleKey, null, locale);
110
- self.sendEmail(user.getEmail(), subject, content, false, true);
140
+ this.sendEmailSync(user.getEmail(), subject, content, false, true);
111
141
  }
112
142
  <%_ if (!authenticationTypeOauth2) { _%>
113
143
 
144
+ <%_ if (!reactive) { _%>
114
145
  @Async
146
+ <%_ } _%>
115
147
  public void sendActivationEmail(<%= user.persistClass %> user) {
116
148
  log.debug("Sending activation email to '{}'", user.getEmail());
117
- self.sendEmailFromTemplate(user, "mail/activationEmail", "email.activation.title");
149
+ this.<%- localSendEmailFromTemplateApi %>(user, "mail/activationEmail", "email.activation.title");
118
150
  }
119
151
 
152
+ <%_ if (!reactive) { _%>
120
153
  @Async
154
+ <%_ } _%>
121
155
  public void sendCreationEmail(<%= user.persistClass %> user) {
122
156
  log.debug("Sending creation email to '{}'", user.getEmail());
123
- self.sendEmailFromTemplate(user, "mail/creationEmail", "email.activation.title");
157
+ this.<%- localSendEmailFromTemplateApi %>(user, "mail/creationEmail", "email.activation.title");
124
158
  }
125
159
 
160
+ <%_ if (!reactive) { _%>
126
161
  @Async
162
+ <%_ } _%>
127
163
  public void sendPasswordResetMail(<%= user.persistClass %> user) {
128
164
  log.debug("Sending password reset email to '{}'", user.getEmail());
129
- self.sendEmailFromTemplate(user, "mail/passwordResetEmail", "email.reset.title");
165
+ this.<%- localSendEmailFromTemplateApi %>(user, "mail/passwordResetEmail", "email.reset.title");
130
166
  }
131
167
  <%_ } _%>
132
168
  }
@@ -264,7 +264,7 @@ public class AccountResource {
264
264
  * @throws IllegalArgumentException if the series couldn't be URL decoded.
265
265
  */
266
266
  @DeleteMapping("/account/sessions/{series}")
267
- public void invalidateSession(@PathVariable String series) {
267
+ public void invalidateSession(@PathVariable("series") String series) {
268
268
  String decodedSeries = URLDecoder.decode(series, StandardCharsets.UTF_8);
269
269
  SecurityUtils.getCurrentUserLogin()
270
270
  .flatMap(userRepository::findOneByLogin)
@@ -52,21 +52,12 @@ public class LogoutResource {
52
52
  @AuthenticationPrincipal(expression = "idToken") OidcIdToken idToken) {
53
53
  StringBuilder logoutUrl = new StringBuilder();
54
54
 
55
- String issuerUri = this.registration.getProviderDetails().getIssuerUri();
56
- if (issuerUri.contains("auth0.com")) {
57
- logoutUrl.append(issuerUri.endsWith("/") ? issuerUri + "v2/logout" : issuerUri + "/v2/logout");
58
- } else {
59
- logoutUrl.append(this.registration.getProviderDetails().getConfigurationMetadata().get("end_session_endpoint").toString());
60
- }
61
-
55
+ logoutUrl.append(this.registration.getProviderDetails().getConfigurationMetadata().get("end_session_endpoint").toString());
56
+
62
57
  String originUrl = request.getHeader(HttpHeaders.ORIGIN);
63
58
 
64
- if (issuerUri.contains("auth0.com")) {
65
- logoutUrl.append("?client_id=").append(this.registration.getClientId()).append("&returnTo=").append(originUrl);
66
- } else {
67
- logoutUrl.append("?id_token_hint=").append(idToken.getTokenValue()).append("&post_logout_redirect_uri=").append(originUrl);
68
- }
69
-
59
+ logoutUrl.append("?id_token_hint=").append(idToken.getTokenValue()).append("&post_logout_redirect_uri=").append(originUrl);
60
+
70
61
  request.getSession().invalidate();
71
62
  return ResponseEntity.ok().body(Map.of("logoutUrl", logoutUrl.toString()));
72
63
  }