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
@@ -59,19 +59,13 @@ public class LogoutResource {
59
59
 
60
60
  private Map<String, String> prepareLogoutUri(ServerHttpRequest request, ClientRegistration clientRegistration, OidcIdToken idToken) {
61
61
  StringBuilder logoutUrl = new StringBuilder();
62
- String issuerUri = clientRegistration.getProviderDetails().getIssuerUri();
63
- if (issuerUri.contains("auth0.com")) {
64
- logoutUrl.append(issuerUri.endsWith("/") ? issuerUri + "v2/logout" : issuerUri + "/v2/logout");
65
- } else {
66
- logoutUrl.append(clientRegistration.getProviderDetails().getConfigurationMetadata().get("end_session_endpoint").toString());
67
- }
62
+
63
+ logoutUrl.append(clientRegistration.getProviderDetails().getConfigurationMetadata().get("end_session_endpoint").toString());
68
64
 
69
65
  String originUrl = request.getHeaders().getOrigin();
70
- if (issuerUri.contains("auth0.com")) {
71
- logoutUrl.append("?client_id=").append(clientRegistration.getClientId()).append("&returnTo=").append(originUrl);
72
- } else {
73
- logoutUrl.append("?id_token_hint=").append(idToken.getTokenValue()).append("&post_logout_redirect_uri=").append(originUrl);
74
- }
66
+
67
+ logoutUrl.append("?id_token_hint=").append(idToken.getTokenValue()).append("&post_logout_redirect_uri=").append(originUrl);
68
+
75
69
  return Map.of("logoutUrl", logoutUrl.toString());
76
70
  }
77
71
  }
@@ -59,7 +59,7 @@ import org.springframework.http.server.reactive.ServerHttpRequest;
59
59
  import org.springframework.web.bind.annotation.*;
60
60
  <%_ if (reactive) { _%>
61
61
  import org.springframework.web.server.ResponseStatusException;
62
- import org.springframework.web.util.UriComponentsBuilder;
62
+ import org.springframework.web.util.ForwardedHeaderUtils;
63
63
  import reactor.core.publisher.Flux;
64
64
  import reactor.core.publisher.Mono;
65
65
  <%_ } else {_%>
@@ -133,7 +133,7 @@ public class PublicUserResource {
133
133
 
134
134
  return userService.countManagedUsers()
135
135
  .map(total -> new PageImpl<>(new ArrayList<>(), pageable, total))
136
- .map(page -> PaginationUtil.generatePaginationHttpHeaders(UriComponentsBuilder.fromHttpRequest(request), page))
136
+ .map(page -> PaginationUtil.generatePaginationHttpHeaders(ForwardedHeaderUtils.adaptFromForwardedHeaders(request.getURI(), request.getHeaders()), page))
137
137
  .map(headers -> ResponseEntity.ok().headers(headers).body(userService.getAllPublicUsers(pageable)));
138
138
  }
139
139
  <%_ } else { _%>
@@ -181,7 +181,7 @@ public class PublicUserResource {
181
181
  * @return the result of the search.
182
182
  */
183
183
  @GetMapping("/users/_search/{query}")
184
- public <% if(reactive) { %>Mono<<% } %>List<<%= user.dtoClass %>><% if(reactive) { %>><% } %> search(@PathVariable String query) {
184
+ public <% if(reactive) { %>Mono<<% } %>List<<%= user.dtoClass %>><% if(reactive) { %>><% } %> search(@PathVariable("query") String query) {
185
185
  <%_ if (searchEngineElasticsearch) { _%>
186
186
  <%_ if (reactive) { _%>
187
187
  return userSearchRepository.search(query).map(<%= user.dtoClass %>::new).collectList();
@@ -62,7 +62,7 @@ import org.springframework.security.access.prepost.PreAuthorize;
62
62
  import org.springframework.web.bind.annotation.*;
63
63
  <%_ if (reactive) { _%>
64
64
  import org.springframework.web.server.ResponseStatusException;
65
- import org.springframework.web.util.UriComponentsBuilder;
65
+ import org.springframework.web.util.ForwardedHeaderUtils;
66
66
  import reactor.core.publisher.Flux;
67
67
  import reactor.core.publisher.Mono;
68
68
  <%_ } else { _%>
@@ -270,7 +270,7 @@ public class UserResource {
270
270
 
271
271
  return userService.countManagedUsers()
272
272
  .map(total -> new PageImpl<>(new ArrayList<>(), pageable, total))
273
- .map(page -> PaginationUtil.generatePaginationHttpHeaders(UriComponentsBuilder.fromHttpRequest(request), page))
273
+ .map(page -> PaginationUtil.generatePaginationHttpHeaders(ForwardedHeaderUtils.adaptFromForwardedHeaders(request.getURI(), request.getHeaders()), page))
274
274
  .map(headers -> ResponseEntity.ok().headers(headers).body(userService.getAllManagedUsers(pageable)));
275
275
  <%_ } else { _%>
276
276
  public ResponseEntity<List<<%= user.adminUserDto %>>> getAllUsers(@org.springdoc.core.annotations.ParameterObject Pageable pageable) {
@@ -306,13 +306,13 @@ public class UserResource {
306
306
  @GetMapping("/users/{login}")
307
307
  @PreAuthorize("hasAuthority(\"" + AuthoritiesConstants.ADMIN + "\")")
308
308
  <%_ if (reactive) { _%>
309
- public Mono<<%= user.adminUserDto %>> getUser(@PathVariable String login) {
309
+ public Mono<<%= user.adminUserDto %>> getUser(@PathVariable("login") String login) {
310
310
  log.debug("REST request to get User : {}", login);
311
311
  return userService.getUserWithAuthoritiesByLogin(login)
312
312
  .map(<%= user.adminUserDto %>::new)
313
313
  .switchIfEmpty(Mono.error(new ResponseStatusException(HttpStatus.NOT_FOUND)));
314
314
  <%_ } else { _%>
315
- public ResponseEntity<<%= user.adminUserDto %>> getUser(@PathVariable @Pattern(regexp = Constants.LOGIN_REGEX) String login) {
315
+ public ResponseEntity<<%= user.adminUserDto %>> getUser(@PathVariable("login") @Pattern(regexp = Constants.LOGIN_REGEX) String login) {
316
316
  log.debug("REST request to get User : {}", login);
317
317
  return ResponseUtil.wrapOrNotFound(
318
318
  userService.getUserWithAuthoritiesByLogin(login)
@@ -329,12 +329,12 @@ public class UserResource {
329
329
  @DeleteMapping("/users/{login}")
330
330
  @PreAuthorize("hasAuthority(\"" + AuthoritiesConstants.ADMIN + "\")")
331
331
  <%_ if (reactive) { _%>
332
- public Mono<ResponseEntity<Void>> deleteUser(@PathVariable @Pattern(regexp = Constants.LOGIN_REGEX) String login) {
332
+ public Mono<ResponseEntity<Void>> deleteUser(@PathVariable("login") @Pattern(regexp = Constants.LOGIN_REGEX) String login) {
333
333
  log.debug("REST request to delete User: {}", login);
334
334
  return userService.deleteUser(login)
335
335
  .then(Mono.just(ResponseEntity.noContent().headers(HeaderUtil.createAlert( applicationName, <% if (enableTranslation) { %> "userManagement.deleted"<% } else { %> "A user is deleted with identifier " + login<% } %>, login)).build()));
336
336
  <%_ } else { _%>
337
- public ResponseEntity<Void> deleteUser(@PathVariable @Pattern(regexp = Constants.LOGIN_REGEX) String login) {
337
+ public ResponseEntity<Void> deleteUser(@PathVariable("login") @Pattern(regexp = Constants.LOGIN_REGEX) String login) {
338
338
  log.debug("REST request to delete User: {}", login);
339
339
  userService.deleteUser(login);
340
340
  return ResponseEntity.noContent().headers(HeaderUtil.createAlert(applicationName, <% if (enableTranslation) { %> "userManagement.deleted"<% } else { %> "A user is deleted with identifier " + login<% } %>, login)).build();
@@ -142,6 +142,10 @@ management:
142
142
  export:
143
143
  enabled: true
144
144
  step: 60
145
+ observations:
146
+ key-values:
147
+ application: ${spring.application.name}
148
+ metrics:
145
149
  enable:
146
150
  http: true
147
151
  jvm: true
@@ -153,13 +157,10 @@ management:
153
157
  all: true
154
158
  percentiles:
155
159
  all: 0, 0.5, 0.75, 0.95, 0.99, 1.0
156
- tags:
157
- application: ${spring.application.name}
158
- web:
159
- server:
160
- request:
161
- autotime:
162
- enabled: true
160
+ data:
161
+ repository:
162
+ autotime:
163
+ enabled: true
163
164
 
164
165
  <%_ if (databaseTypeMongodb) { _%>
165
166
  mongock:
@@ -28,7 +28,7 @@ import static com.tngtech.archunit.core.domain.JavaClass.Predicates.belongToAnyO
28
28
  import static com.tngtech.archunit.library.Architectures.layeredArchitecture;
29
29
 
30
30
  <%_
31
- const hasClientLayer = !reactive && (applicationTypeMicroservice || applicationTypeGateway);
31
+ const hasClientLayer = feignClient;
32
32
  const hasDomainLayer = !databaseTypeNo;
33
33
  const hasConstants = !skipUserManagement || databaseTypeSql || databaseTypeMongodb || databaseTypeCouchbase || databaseTypeNeo4j;
34
34
  _%>
@@ -152,9 +152,6 @@ import org.springframework.test.web.servlet.MockMvc;
152
152
  import org.springframework.transaction.annotation.Transactional;
153
153
  <%_ } _%>
154
154
  <%_ } _%>
155
- <%_ if (anyFieldIsBlobDerived) { _%>
156
- import org.springframework.util.Base64Utils;
157
- <%_ } _%>
158
155
  <%_ if (reactive && (implementsEagerLoadApis || searchEngineElasticsearch)) { _%>
159
156
  import reactor.core.publisher.Flux;
160
157
  import reactor.core.publisher.Mono;
@@ -190,6 +187,9 @@ import java.time.temporal.ChronoUnit;
190
187
  <%_ if (!reactive && implementsEagerLoadApis) { _%>
191
188
  import java.util.ArrayList;
192
189
  <%_ } _%>
190
+ <%_ if (anyFieldIsBlobDerived) { _%>
191
+ import java.util.Base64;
192
+ <%_ } _%>
193
193
  <%_ if (searchEngineElasticsearch && !reactive) { _%>
194
194
  import java.util.Collections;
195
195
  <%_ if (paginationNo) { _%>
@@ -933,7 +933,7 @@ _%>
933
933
  <%= !reactive ? '.andExpect(' : '.' %>jsonPath("$.[*].<%= field.fieldName %>ContentType").value(hasItem(<%= 'DEFAULT_' + field.fieldNameUnderscored.toUpperCase() %>_CONTENT_TYPE))<%= !reactive ? ')' : '' %>
934
934
  <%_ } _%>
935
935
  <%= !reactive ? '.andExpect(' : '.' %>jsonPath("$.[*].<%= field.fieldName %>").value(hasItem(<%
936
- if (field.fieldTypeBinary && !field.blobContentTypeText) { %>Base64Utils.encodeToString(<% } else
936
+ if (field.fieldTypeBinary && !field.blobContentTypeText) { %>Base64.getEncoder().encodeToString(<% } else
937
937
  if (field.fieldTypeZonedDateTime) { %>sameInstant(<% } else
938
938
  if (field.fieldTypeBigDecimal) { %>sameNumber(<% } %><%= 'DEFAULT_' + field.fieldNameUnderscored.toUpperCase() %><%
939
939
  if (field.fieldTypeBinary && !field.blobContentTypeText) { %><%
@@ -1020,7 +1020,7 @@ _%>
1020
1020
  <%= !reactive ? '.andExpect(' : '.' %>jsonPath("$.<%= field.fieldName %>ContentType").value(<%= reactive ? 'is(' : '' %><%= 'DEFAULT_' + field.fieldNameUnderscored.toUpperCase() %>_CONTENT_TYPE))
1021
1021
  <%_ } _%>
1022
1022
  <%= !reactive ? '.andExpect(' : '.' %>jsonPath("$.<%= field.fieldName %>").value(<%= reactive ? 'is(' : '' %><%
1023
- if (field.fieldTypeBinary && !field.blobContentTypeText) { %>Base64Utils.encodeToString(<% } else
1023
+ if (field.fieldTypeBinary && !field.blobContentTypeText) { %>Base64.getEncoder().encodeToString(<% } else
1024
1024
  if (field.fieldTypeZonedDateTime) { %>sameInstant(<% } else
1025
1025
  if (field.fieldTypeBigDecimal) { %>sameNumber(<% } %><%= 'DEFAULT_' + field.fieldNameUnderscored.toUpperCase() %><%
1026
1026
  if (field.fieldTypeBinary && !field.blobContentTypeText) { %><%
@@ -1259,7 +1259,7 @@ _%>
1259
1259
  .jsonPath("$.[*].<%= field.fieldName %>ContentType").value(hasItem(<%= 'DEFAULT_' + field.fieldNameUnderscored.toUpperCase() %>_CONTENT_TYPE))
1260
1260
  <%_ } _%>
1261
1261
  .jsonPath("$.[*].<%= field.fieldName %>").value(hasItem(<% if
1262
- (field.fieldTypeBinary && !field.blobContentTypeText) { %>Base64Utils.encodeToString(<% } else
1262
+ (field.fieldTypeBinary && !field.blobContentTypeText) { %>Base64.getEncoder().encodeToString(<% } else
1263
1263
  if (field.fieldTypeZonedDateTime) { %>sameInstant(<% } else
1264
1264
  if (field.fieldTypeBigDecimal) { %>sameNumber(<% } %><%= 'DEFAULT_' + field.fieldNameUnderscored.toUpperCase() %><%
1265
1265
  if (field.fieldTypeBinary && !field.blobContentTypeText) { %><% if (databaseTypeCassandra) { %>.array()<% } %>)<% } else
@@ -1301,7 +1301,7 @@ _%>
1301
1301
  .andExpect(jsonPath("$.[*].<%= field.fieldName %>ContentType").value(hasItem(<%= 'DEFAULT_' + field.fieldNameUnderscored.toUpperCase() %>_CONTENT_TYPE)))
1302
1302
  <%_ } _%>
1303
1303
  .andExpect(jsonPath("$.[*].<%= field.fieldName %>").value(hasItem(<%
1304
- if (field.fieldTypeBinary && !field.blobContentTypeText) { %>Base64Utils.encodeToString(<% } else
1304
+ if (field.fieldTypeBinary && !field.blobContentTypeText) { %>Base64.getEncoder().encodeToString(<% } else
1305
1305
  if (field.fieldTypeZonedDateTime) { %>sameInstant(<% } else
1306
1306
  if (field.fieldTypeBigDecimal) { %>sameNumber(<% } %><%= 'DEFAULT_' + field.fieldNameUnderscored.toUpperCase() %><%
1307
1307
  if (field.fieldTypeBinary && !field.blobContentTypeText) { %><%
@@ -1831,7 +1831,7 @@ _%>
1831
1831
  <%= !reactive ? '.andExpect(' : '.' %>jsonPath("$.[*].<%= field.fieldName %>ContentType").value(hasItem(<%= 'DEFAULT_' + field.fieldNameUnderscored.toUpperCase() %>_CONTENT_TYPE))<%= !reactive ? ')' : '' %>
1832
1832
  <%_ } _%>
1833
1833
  <%= !reactive ? '.andExpect(' : '.' %>jsonPath("$.[*].<%= field.fieldName %>").value(hasItem(<%
1834
- if (field.fieldTypeBinary && !field.blobContentTypeText) { %>Base64Utils.encodeToString(<% } else
1834
+ if (field.fieldTypeBinary && !field.blobContentTypeText) { %>Base64.getEncoder().encodeToString(<% } else
1835
1835
  if (field.fieldTypeZonedDateTime) { %>sameInstant(<% } else
1836
1836
  if (field.fieldTypeBigDecimal) { %>sameNumber(<% } %><%= 'DEFAULT_' + field.fieldNameUnderscored.toUpperCase() %><%
1837
1837
  if (field.fieldTypeBinary && !field.blobContentTypeText) { %><%
@@ -45,11 +45,11 @@ public class ExceptionTranslatorTestController {
45
45
  }
46
46
 
47
47
  @GetMapping("/missing-servlet-request-part")
48
- public void missingServletRequestPartException(@RequestPart String part) {
48
+ public void missingServletRequestPartException(@RequestPart("part") String part) {
49
49
  }
50
50
 
51
51
  @GetMapping("/missing-servlet-request-parameter")
52
- public void missingServletRequestParameterException(@RequestParam String param) {
52
+ public void missingServletRequestParameterException(@RequestParam("param") String param) {
53
53
  }
54
54
 
55
55
  @GetMapping("/access-denied")
@@ -139,7 +139,7 @@ export const getCacheProviderMavenDefinition = (cacheProvider, javaDependencies)
139
139
  javaxCacheApi,
140
140
  {
141
141
  groupId: 'org.infinispan',
142
- artifactId: 'infinispan-hibernate-cache-v60',
142
+ artifactId: 'infinispan-hibernate-cache-v62',
143
143
  },
144
144
  {
145
145
  groupId: 'org.infinispan',
@@ -24,7 +24,7 @@ dependencies {
24
24
  implementation "com.hazelcast:hazelcast-spring:${hazelcastSpringVersion}"
25
25
  <%_ } _%>
26
26
  <%_ if (cacheProviderInfinispan) { _%>
27
- implementation "org.infinispan:infinispan-hibernate-cache-v60"
27
+ implementation "org.infinispan:infinispan-hibernate-cache-v62"
28
28
  implementation "org.infinispan:infinispan-spring-boot3-starter-embedded"
29
29
  implementation "org.infinispan:infinispan-commons-jakarta"
30
30
  implementation "org.infinispan:infinispan-core-jakarta"
@@ -19,7 +19,7 @@
19
19
  package <%= packageName %>.config;
20
20
 
21
21
  import org.hibernate.service.ServiceRegistry;
22
- import org.infinispan.hibernate.cache.v60.InfinispanRegionFactory;
22
+ import org.infinispan.hibernate.cache.v62.InfinispanRegionFactory;
23
23
  import org.infinispan.manager.EmbeddedCacheManager;
24
24
  import org.springframework.stereotype.Component;
25
25
 
@@ -43,7 +43,7 @@ public class <%= upperFirstCamelCaseBaseName %>KafkaResource {
43
43
  }
44
44
 
45
45
  @PostMapping("/publish")
46
- public void publish(@RequestParam String message) {
46
+ public void publish(@RequestParam("message") String message) {
47
47
  log.debug("REST request the message : {} to send to Kafka topic ", message);
48
48
  streamBridge.send(PRODUCER_BINDING_NAME, message);
49
49
  }
@@ -44,7 +44,7 @@ public class <%= upperFirstCamelCaseBaseName %>KafkaResource {
44
44
  }
45
45
 
46
46
  @PostMapping("/publish")
47
- public Mono<ResponseEntity<Void>> publish(@RequestParam String message) {
47
+ public Mono<ResponseEntity<Void>> publish(@RequestParam("message") String message) {
48
48
  log.debug("REST request the message : {} to send to Kafka topic", message);
49
49
  streamBridge.send(PRODUCER_BINDING_NAME, message);
50
50
  return Mono.just(ResponseEntity.noContent().build());
@@ -35,9 +35,11 @@ import java.util.Map;
35
35
 
36
36
  import org.junit.jupiter.api.Test;
37
37
  import org.springframework.beans.factory.annotation.Autowired;
38
+ import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
38
39
  import org.springframework.boot.test.autoconfigure.web.reactive.AutoConfigureWebTestClient;
39
40
  import org.springframework.cloud.stream.binder.test.InputDestination;
40
41
  import org.springframework.cloud.stream.binder.test.OutputDestination;
42
+ import org.springframework.cloud.stream.binder.test.TestChannelBinderConfiguration;
41
43
  import org.springframework.http.MediaType;
42
44
  import org.springframework.messaging.Message;
43
45
  import org.springframework.messaging.MessageHeaders;
@@ -50,6 +52,7 @@ import org.springframework.util.MimeTypeUtils;
50
52
  @WithMockUser
51
53
  @EmbeddedKafka
52
54
  @IntegrationTest
55
+ @ImportAutoConfiguration(TestChannelBinderConfiguration.class)
53
56
  class <%= upperFirstCamelCaseBaseName %>KafkaResourceIT {
54
57
  private static String KAFKA_API = "/api/<%= dasherizedBaseName %>-kafka/{command}";
55
58
 
@@ -45,7 +45,7 @@
45
45
 
46
46
  <%_ for (const relationship of relationships) { -%>
47
47
  <&_ if (fragment.relationship<%- relationship.relationshipNameCapitalized %>AnnotationSection) { -&>
48
- <% // just break the cycle // in the reactive area, we already have the annotation in place
48
+ <% /* just break the cycle in the reactive area, we already have the annotation in place */
49
49
  if (!relationship.ownerSide && !reactive) { %>
50
50
  @org.springframework.data.annotation.Transient
51
51
  <% } %>
@@ -19,7 +19,7 @@
19
19
  package <%= entityAbsolutePackage %>.repository.search;
20
20
 
21
21
  import <%= entityAbsolutePackage %>.domain.<%= persistClass %>;
22
- import <%= entityAbsolutePackage %>.repository.<%= persistClass %>Repository;
22
+ import <%= entityAbsolutePackage %>.repository.<%= entityClass %>Repository;
23
23
 
24
24
  <%_ if (!paginationNo) { _%>
25
25
  <%_ if (!reactive) { _%>
@@ -19,7 +19,7 @@
19
19
  package <%= packageName %>.repository.search;
20
20
 
21
21
  import <%= user.entityAbsoluteClass %>;
22
- import <%= packageName %>.repository.<%= user.persistClass %>Repository;
22
+ import <%= packageName %>.repository.<%= user.entityClass %>Repository;
23
23
 
24
24
  <%_ if (reactive) { _%>
25
25
  import org.springframework.data.elasticsearch.client.elc.ReactiveElasticsearchTemplate;
@@ -49,7 +49,7 @@ import java.util.UUID;
49
49
  import static org.springframework.data.elasticsearch.client.elc.QueryBuilders.queryStringQuery;
50
50
 
51
51
  /**
52
- * Spring Data Elasticsearch repository for the User entity.
52
+ * Spring Data Elasticsearch repository for the <%= user.persistClass %> entity.
53
53
  */
54
54
  public interface UserSearchRepository extends <% if (reactive) {%>Reactive<% } %>ElasticsearchRepository<<%= user.persistClass %>, <%= user.primaryKey.type %>>, UserSearchRepositoryInternal {
55
55
  }
@@ -70,7 +70,7 @@ class UserSearchRepositoryInternalImpl implements UserSearchRepositoryInternal {
70
70
  @Override
71
71
  public Flux<<%= user.persistClass %>> search(String query) {
72
72
  NativeQuery nativeQuery = new NativeQuery(QueryStringQuery.of(qs -> qs.query(query))._toQuery());
73
- return reactiveElasticsearchTemplate.search(nativeQuery, User.class).map(SearchHit::getContent);
73
+ return reactiveElasticsearchTemplate.search(nativeQuery, <%= user.persistClass %>.class).map(SearchHit::getContent);
74
74
  }
75
75
  }
76
76
  <%_ } else { _%>
@@ -105,7 +105,7 @@ class UserSearchRepositoryInternalImpl implements UserSearchRepositoryInternal {
105
105
  public Stream<<%= user.persistClass %>> search(String query) {
106
106
  NativeQuery nativeQuery = new NativeQuery(QueryStringQuery.of(qs -> qs.query(query))._toQuery());
107
107
  return elasticsearchTemplate
108
- .search(nativeQuery, User.class)
108
+ .search(nativeQuery, <%= user.persistClass %>.class)
109
109
  .map(SearchHit::getContent)
110
110
  .stream();
111
111
  }
@@ -17,7 +17,7 @@
17
17
  * limitations under the License.
18
18
  */
19
19
  import BaseApplicationGenerator from '../base-application/index.mjs';
20
- import { GENERATOR_BOOTSTRAP_APPLICATION, GENERATOR_LIQUIBASE, GENERATOR_SPRING_DATA_NEO4J } from '../generator-list.mjs';
20
+ import { GENERATOR_BOOTSTRAP_APPLICATION, GENERATOR_JAVA, GENERATOR_LIQUIBASE, GENERATOR_SPRING_DATA_NEO4J } from '../generator-list.mjs';
21
21
  import writeTask from './files.mjs';
22
22
  import cleanupTask from './cleanup.mjs';
23
23
  import writeEntitiesTask, { cleanupEntitiesTask } from './entity-files.mjs';
@@ -28,6 +28,8 @@ export default class Neo4jGenerator extends BaseApplicationGenerator {
28
28
  }
29
29
  if (!this.delegateToBlueprint) {
30
30
  await this.dependsOnJHipster(GENERATOR_BOOTSTRAP_APPLICATION);
31
+ const javaGenerator = await this.dependsOnJHipster(GENERATOR_JAVA);
32
+ javaGenerator.useJacksonIdentityInfo = true;
31
33
  }
32
34
  }
33
35
  get composing() {
@@ -57,6 +59,46 @@ export default class Neo4jGenerator extends BaseApplicationGenerator {
57
59
  get [BaseApplicationGenerator.PREPARING]() {
58
60
  return this.delegateTasksToBlueprint(() => this.preparing);
59
61
  }
62
+ get configuringEachEntity() {
63
+ return this.asConfiguringEachEntityTaskGroup({
64
+ async configuringEachEntity({ entityConfig }) {
65
+ if (entityConfig.dto && entityConfig.dto !== 'no') {
66
+ this.log.warn(`The DTO option is not supported for Neo4j database. Neo4j persists the entire constellation, DTO causes the constelation to be incomplete. DTO is found in entity ${entityConfig.name}.`);
67
+ }
68
+ },
69
+ });
70
+ }
71
+ get [BaseApplicationGenerator.CONFIGURING_EACH_ENTITY]() {
72
+ return this.delegateTasksToBlueprint(() => this.configuringEachEntity);
73
+ }
74
+ get preparingEachEntity() {
75
+ return this.asPreparingEachEntityTaskGroup({
76
+ prepareEntity({ entity }) {
77
+ entity.relationships.forEach(relationship => {
78
+ if (relationship.persistableRelationship === undefined) {
79
+ relationship.persistableRelationship = true;
80
+ }
81
+ });
82
+ },
83
+ });
84
+ }
85
+ get [BaseApplicationGenerator.PREPARING_EACH_ENTITY]() {
86
+ return this.delegateTasksToBlueprint(() => this.preparingEachEntity);
87
+ }
88
+ get default() {
89
+ return this.asDefaultTaskGroup({
90
+ async checkUserRelationship({ entities }) {
91
+ entities.forEach(entity => {
92
+ if (entity.relationships.some(relationship => relationship.otherEntity.builtInUser)) {
93
+ this.log.warn(`Relationship with User entity should be avoided for Neo4j database. Neo4j persists the entire constelation, related User entity will be updated causing security problems. Relationship with User entity is found in entity ${entity.name}.`);
94
+ }
95
+ });
96
+ },
97
+ });
98
+ }
99
+ get [BaseApplicationGenerator.DEFAULT]() {
100
+ return this.delegateTasksToBlueprint(() => this.default);
101
+ }
60
102
  get writing() {
61
103
  return this.asWritingTaskGroup({
62
104
  cleanupTask,
@@ -57,7 +57,7 @@ import org.springframework.data.neo4j.core.schema.Relationship;
57
57
  <%_ if (relationship.relationshipLeftSide) { _%>
58
58
  @Relationship(value = "HAS_<%= this._.toUpper(this._.snakeCase(relationship.relationshipName)) %>", direction = Relationship.Direction.OUTGOING)
59
59
  <%_ } else { _%>
60
- @Relationship(value = "IS_<%= this._.toUpper(this._.snakeCase(relationship.relationshipName)) %>_<%= this._.toUpper(this._.snakeCase(relationship.otherRelationship.relationshipName)) %>", direction = Relationship.Direction.INCOMING)
60
+ @Relationship(value = "HAS_<%= this._.toUpper(this._.snakeCase(relationship.otherRelationship.relationshipName)) %>", direction = Relationship.Direction.INCOMING)
61
61
  <%_ } _%>
62
62
  <&_ } -&>
63
63
  <%_ } -%>
@@ -0,0 +1,7 @@
1
+ # SQL/spring-data-relational sub-generador
2
+
3
+ Adds support to spring-data-relational and provides sql related utilities.
4
+
5
+ ## Customizing
6
+
7
+ Customizing basics can be found at [Customizing](../app/README.md#customizing)
@@ -24,7 +24,7 @@ import writeEntitiesTask, { cleanupEntitiesTask } from './entity-files.mjs';
24
24
  import { isReservedTableName } from '../../jdl/jhipster/reserved-keywords.js';
25
25
  import { databaseTypes } from '../../jdl/jhipster/index.mjs';
26
26
  import { getDBCExtraOption, getJdbcUrl, getR2dbcUrl } from './support/index.mjs';
27
- import { getCommonMavenDefinition, getDatabaseTypeMavenDefinition, getH2MavenDefinition, getImperativeMavenDefinition, getReactiveMavenDefinition, } from './internal/dependencies.mjs';
27
+ import { getCommonMavenDefinition, getDatabaseDriverForDatabase, getDatabaseTypeMavenDefinition, getH2MavenDefinition, getImperativeMavenDefinition, getReactiveMavenDefinition, } from './internal/dependencies.mjs';
28
28
  import command from './command.mjs';
29
29
  const { SQL } = databaseTypes;
30
30
  export default class SqlGenerator extends BaseApplicationGenerator {
@@ -62,6 +62,7 @@ export default class SqlGenerator extends BaseApplicationGenerator {
62
62
  const anyApp = application;
63
63
  anyApp.devDatabaseExtraOptions = getDBCExtraOption(anyApp.devDatabaseType);
64
64
  anyApp.prodDatabaseExtraOptions = getDBCExtraOption(anyApp.prodDatabaseType);
65
+ anyApp.prodDatabaseDriver = getDatabaseDriverForDatabase(application.prodDatabaseType);
65
66
  },
66
67
  });
67
68
  }
@@ -22,6 +22,27 @@ const testcontainerFileForDB = {
22
22
  mysql: 'MysqlTestContainer.java',
23
23
  postgresql: 'PostgreSqlTestContainer.java',
24
24
  };
25
+ const databaseArtifactForDB = {
26
+ mariadb: {
27
+ jdbc: { groupId: 'org.mariadb.jdbc', artifactId: 'mariadb-java-client' },
28
+ // maria-r2dbc driver is failing.
29
+ // r2dbc: { groupId: 'org.mariadb', artifactId: 'r2dbc-mariadb' },
30
+ r2dbc: { groupId: 'io.asyncer', artifactId: 'r2dbc-mysql' },
31
+ },
32
+ mssql: {
33
+ jdbc: { groupId: 'com.microsoft.sqlserver', artifactId: 'mssql-jdbc' },
34
+ r2dbc: { groupId: 'io.r2dbc', artifactId: 'r2dbc-mssql' },
35
+ },
36
+ mysql: {
37
+ jdbc: { groupId: 'com.mysql', artifactId: 'mysql-connector-j' },
38
+ r2dbc: { groupId: 'io.asyncer', artifactId: 'r2dbc-mysql' },
39
+ },
40
+ postgresql: {
41
+ jdbc: { groupId: 'org.postgresql', artifactId: 'postgresql' },
42
+ r2dbc: { groupId: 'org.postgresql', artifactId: 'r2dbc-postgresql' },
43
+ },
44
+ };
45
+ export const getDatabaseDriverForDatabase = (databaseType) => databaseArtifactForDB[databaseType];
25
46
  export const getCommonMavenDefinition = ({ javaDependencies }) => ({
26
47
  properties: [
27
48
  { property: 'jaxb-runtime.version', value: javaDependencies['jaxb-runtime'] },
@@ -98,34 +119,34 @@ export const getDatabaseTypeMavenDefinition = (databaseType, { inProfile }) => {
98
119
  mariadb: {
99
120
  jdbc: {
100
121
  dependencies: [
101
- { inProfile, groupId: 'org.mariadb.jdbc', artifactId: 'mariadb-java-client' },
122
+ { inProfile, ...databaseArtifactForDB.mariadb.jdbc },
102
123
  { groupId: 'org.testcontainers', artifactId: 'mariadb', scope: 'test' },
103
124
  ],
104
125
  },
105
126
  r2dbc: {
106
- dependencies: [{ inProfile, groupId: 'org.mariadb', artifactId: 'r2dbc-mariadb' }],
127
+ dependencies: [{ inProfile, ...databaseArtifactForDB.mariadb.r2dbc }],
107
128
  },
108
129
  },
109
130
  mssql: {
110
131
  jdbc: {
111
132
  dependencies: [
112
- { inProfile, groupId: 'com.microsoft.sqlserver', artifactId: 'mssql-jdbc' },
133
+ { inProfile, ...databaseArtifactForDB.mssql.jdbc },
113
134
  { groupId: 'org.testcontainers', artifactId: 'mssqlserver', scope: 'test' },
114
135
  ],
115
136
  },
116
137
  r2dbc: {
117
- dependencies: [{ inProfile, groupId: 'io.r2dbc', artifactId: 'r2dbc-mssql' }],
138
+ dependencies: [{ inProfile, ...databaseArtifactForDB.mssql.r2dbc }],
118
139
  },
119
140
  },
120
141
  mysql: {
121
142
  jdbc: {
122
143
  dependencies: [
123
- { inProfile, groupId: 'com.mysql', artifactId: 'mysql-connector-j' },
144
+ { inProfile, ...databaseArtifactForDB.mysql.jdbc },
124
145
  { groupId: 'org.testcontainers', artifactId: 'mysql', scope: 'test' },
125
146
  ],
126
147
  },
127
148
  r2dbc: {
128
- dependencies: [{ inProfile, groupId: 'io.asyncer', artifactId: 'r2dbc-mysql' }],
149
+ dependencies: [{ inProfile, ...databaseArtifactForDB.mysql.r2dbc }],
129
150
  },
130
151
  },
131
152
  oracle: {
@@ -140,12 +161,12 @@ export const getDatabaseTypeMavenDefinition = (databaseType, { inProfile }) => {
140
161
  postgresql: {
141
162
  jdbc: {
142
163
  dependencies: [
143
- { inProfile, groupId: 'org.postgresql', artifactId: 'postgresql' },
164
+ { inProfile, ...databaseArtifactForDB.postgresql.jdbc },
144
165
  { groupId: 'org.testcontainers', artifactId: 'postgresql', scope: 'test' },
145
166
  ],
146
167
  },
147
168
  r2dbc: {
148
- dependencies: [{ inProfile, groupId: 'org.postgresql', artifactId: 'r2dbc-postgresql' }],
169
+ dependencies: [{ inProfile, ...databaseArtifactForDB.postgresql.r2dbc }],
149
170
  },
150
171
  },
151
172
  };
@@ -75,6 +75,10 @@ const databaseData = {
75
75
  defaultUsername: 'root',
76
76
  constraintNameMaxLength: 64,
77
77
  tableNameMaxLength: 64,
78
+ r2dbc: {
79
+ // TODO switch to mariadb if r2dbc-mariadb is reinstated
80
+ protocolSuffix: 'mysql://',
81
+ },
78
82
  },
79
83
  [MYSQL]: {
80
84
  name: 'MySQL',
@@ -21,27 +21,22 @@ package <%= packageName %>.repository;
21
21
  import java.util.ArrayList;
22
22
  import java.util.Collection;
23
23
  import java.util.List;
24
- import java.util.Map;
25
- import java.util.Map.Entry;
26
24
  import java.util.stream.Stream;
27
25
 
28
26
  import org.springframework.data.domain.Pageable;
29
27
  import org.springframework.data.domain.Sort;
30
- import org.springframework.data.r2dbc.convert.R2dbcConverter;
31
28
  import org.springframework.data.r2dbc.core.R2dbcEntityTemplate;
32
29
  import org.springframework.data.r2dbc.core.StatementMapper;
33
- import org.springframework.data.r2dbc.mapping.OutboundRow;
34
30
  import org.springframework.data.r2dbc.query.UpdateMapper;
31
+ import org.springframework.data.relational.core.mapping.RelationalPersistentEntity;
35
32
  import org.springframework.data.relational.core.query.Criteria;
36
33
  import org.springframework.data.relational.core.sql.Condition;
37
- import org.springframework.data.relational.core.mapping.RelationalPersistentEntity;
38
- import org.springframework.data.relational.core.sql.Conditions;
34
+ import org.springframework.data.relational.core.sql.Column;
39
35
  import org.springframework.data.relational.core.sql.OrderByField;
40
36
  import org.springframework.data.relational.core.sql.Select;
41
37
  import org.springframework.data.relational.core.sql.SelectBuilder.SelectFromAndJoin;
42
38
  import org.springframework.data.relational.core.sql.SelectBuilder.SelectFromAndJoinCondition;
43
39
  import org.springframework.data.relational.core.sql.SelectBuilder.SelectOrdered;
44
- import org.springframework.data.relational.core.sql.SqlIdentifier;
45
40
  import org.springframework.data.relational.core.sql.Table;
46
41
  import org.springframework.data.relational.core.sql.render.SqlRenderer;
47
42
  import org.springframework.r2dbc.core.Parameter;
@@ -240,11 +235,57 @@ public class EntityManager {
240
235
  for (Sort.Order order : sortToUse) {
241
236
 
242
237
  String propertyName = order.getProperty();
243
- OrderByField orderByField = OrderByField.from(table.column(propertyName).as(EntityManager.ALIAS_PREFIX + propertyName));
238
+ OrderByField orderByField = !propertyName.contains(".")
239
+ ? OrderByField.from(table.column(propertyName).as(EntityManager.ALIAS_PREFIX + propertyName))
240
+ : createOrderByField(propertyName);
244
241
 
245
242
  fields.add(order.isAscending() ? orderByField.asc() : orderByField.desc());
246
243
  }
247
244
 
248
245
  return fields;
249
246
  }
247
+
248
+ /**
249
+ * Creates an OrderByField instance for sorting a query by the specified property.
250
+ *
251
+ * @param propertyName The full property name in the format "tableName.columnName".
252
+ * @return An OrderByField instance for sorting by the specified property.
253
+ */
254
+ private static OrderByField createOrderByField(String propertyName) {
255
+ // Split the propertyName into table name and column name
256
+ String[] parts = propertyName.split("\\.");
257
+ String tableName = parts[0];
258
+ String columnName = parts[1];
259
+
260
+ // Create and return an OrderByField instance
261
+ return OrderByField.from(
262
+ // Create a column with the given name and alias it with the table name and column name
263
+ Column.aliased(
264
+ columnName,
265
+ // Create a table alias with the same name as the table
266
+ Table.aliased(camelCaseToSnakeCase(tableName), tableName),
267
+ // Use a composite alias of "tableName_columnName"
268
+ String.format("%s_%s", tableName, columnName)
269
+ )
270
+ );
271
+ }
272
+
273
+ /**
274
+ * Converts a camel case string to snake case.
275
+ *
276
+ * @param input The camel case string to be converted to snake case.
277
+ * @return The input string converted to snake case.
278
+ */
279
+ public static String camelCaseToSnakeCase(String input) {
280
+ // Regular Expression
281
+ String regex = "([a-z])([A-Z]+)";
282
+
283
+ // Replacement string
284
+ String replacement = "$1_$2";
285
+
286
+ // Replace the given regex
287
+ // with replacement string
288
+ // and convert it to lower case.
289
+ return input.replaceAll(regex, replacement).toLowerCase();
290
+ }
250
291
  }