generator-jhipster 7.9.0 → 7.9.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cli/environment-builder.js +15 -1
- package/cli/jhipster.js +0 -0
- package/generators/app/index.js +12 -1
- package/generators/bootstrap/index.js +33 -1
- package/generators/ci-cd/templates/circle.yml.ejs +3 -13
- package/generators/client/files-angular.js +1 -1
- package/generators/client/files-react.js +5 -2
- package/generators/client/files-vue.js +3 -2
- package/generators/client/templates/angular/jest.conf.js.ejs +6 -3
- package/generators/client/templates/angular/package.json +18 -18
- package/generators/client/templates/angular/package.json.ejs +3 -7
- package/generators/client/templates/angular/src/main/webapp/app/admin/admin-routing.module.ts.ejs +1 -1
- package/generators/client/templates/angular/src/main/webapp/app/admin/health/health.model.ts.ejs +1 -1
- package/generators/client/templates/angular/src/main/webapp/app/admin/user-management/update/user-management-update.component.ts.ejs +17 -15
- package/generators/client/templates/angular/src/main/webapp/app/admin/user-management/user-management.model.ts.ejs +2 -2
- package/generators/client/templates/angular/src/main/webapp/app/admin/user-management/user-management.route.ts.ejs +4 -4
- package/generators/client/templates/angular/src/main/webapp/app/core/request/request-util.ts.ejs +4 -2
- package/generators/client/templates/angular/src/main/webapp/app/core/util/data-util.service.ts.ejs +1 -1
- package/generators/client/templates/angular/src/main/webapp/app/core/util/parse-links.service.ts.ejs +1 -1
- package/generators/client/templates/angular/src/main/webapp/app/layouts/navbar/navbar.component.html.ejs +1 -1
- package/generators/client/templates/angular/src/main/webapp/app/shared/filter/filter.component.html.ejs +8 -6
- package/generators/client/templates/angular/src/main/webapp/app/shared/filter/filter.component.ts.ejs +6 -11
- package/generators/client/templates/angular/src/main/webapp/app/shared/filter/filter.model.spec.ts.ejs +227 -25
- package/generators/client/templates/angular/src/main/webapp/app/shared/filter/filter.model.ts.ejs +104 -43
- package/generators/client/templates/angular/src/main/webapp/content/scss/global.scss.ejs +8 -0
- package/generators/client/templates/angular/tsconfig.json.ejs +0 -1
- package/generators/client/templates/angular/tsconfig.spec.json.ejs +2 -3
- package/generators/client/templates/angular/webpack/webpack.microfrontend.js.ejs +0 -3
- package/generators/client/templates/common/package.json +4 -4
- package/generators/client/templates/common/src/main/webapp/swagger-ui/index.html.ejs +1 -1
- package/generators/client/templates/react/jest.conf.js.ejs +2 -2
- package/generators/client/templates/react/package.json +24 -24
- package/generators/client/templates/react/package.json.ejs +3 -7
- package/generators/client/templates/react/src/main/webapp/app/config/store.ts.ejs +0 -6
- package/generators/client/templates/react/src/main/webapp/app/index.tsx.ejs +4 -5
- package/generators/client/templates/react/src/main/webapp/app/modules/administration/administration.reducer.spec.ts.ejs +7 -7
- package/generators/client/templates/react/src/main/webapp/app/modules/administration/administration.reducer.ts.ejs +6 -6
- package/generators/client/templates/react/src/main/webapp/app/modules/administration/index.tsx.ejs +2 -2
- package/generators/client/templates/react/src/main/webapp/app/shared/layout/menus/admin.tsx.ejs +1 -1
- package/generators/client/templates/react/src/main/webapp/app/shared/reducers/authentication.spec.ts.ejs +17 -8
- package/generators/client/templates/react/src/main/webapp/app/shared/reducers/authentication.ts.ejs +1 -1
- package/generators/client/templates/react/src/main/webapp/app/shared/reducers/locale.spec.ts.ejs +176 -19
- package/generators/client/templates/react/src/main/webapp/app/shared/reducers/locale.ts.ejs +46 -13
- package/generators/client/templates/react/webpack/webpack.microfrontend.js.jhi.react.ejs +1 -1
- package/generators/client/templates/vue/package.json +17 -17
- package/generators/client/templates/vue/package.json.ejs +3 -7
- package/generators/client/templates/vue/src/main/webapp/app/core/jhi-navbar/jhi-navbar.component.ts.ejs +2 -1
- package/generators/client/templates/vue/src/main/webapp/app/core/jhi-navbar/jhi-navbar.vue.ejs +1 -1
- package/generators/client/templates/vue/src/main/webapp/app/main.ts.ejs +2 -2
- package/generators/client/templates/vue/src/main/webapp/app/router/admin.ts.ejs +2 -2
- package/generators/client/templates/vue/src/test/javascript/e2e/modules/administration/administration.spec.ts.ejs +1 -1
- package/generators/client/templates/vue/src/test/javascript/e2e/page-objects/administration-page.ts.ejs +1 -1
- package/generators/client/templates/vue/src/test/javascript/e2e/page-objects/navbar-page.ts.ejs +2 -2
- package/generators/client/templates/vue/src/test/javascript/jest.conf.js.ejs +5 -6
- package/generators/client/templates/vue/src/test/javascript/spec/app/account/account.service.spec.ts.ejs +4 -0
- package/generators/client/templates/vue/src/test/javascript/spec/app/shared/alert/alert.service.spec.ts.ejs +106 -3
- package/generators/client/templates/vue/src/test/javascript/spec/app/shared/config/axios-interceptor.spec.ts.ejs +12 -0
- package/generators/client/templates/vue/src/test/javascript/spec/app/shared/config/formatter.spec.ts.ejs +6 -0
- package/generators/client/templates/vue/src/test/javascript/spec/app/shared/sort/sorts.spec.ts.ejs +10 -0
- package/generators/client/templates/vue/webpack/webpack.common.js.ejs +1 -1
- package/generators/client/templates/vue/webpack/webpack.dev.js.ejs +2 -2
- package/generators/common/files.js +5 -4
- package/generators/common/templates/.husky/pre-commit.ejs +0 -0
- package/generators/common/templates/package.json +1 -1
- package/generators/common/templates/sonar-project.properties.ejs +19 -11
- package/generators/cypress/index.js +1 -1
- package/generators/docker-compose/templates/README-DOCKER-COMPOSE.md.ejs +3 -3
- package/generators/docker-compose/templates/docker-compose.yml.ejs +1 -1
- package/generators/docker-compose/templates/realm-config/jhipster-realm.json.ejs +32 -14
- package/generators/entity/index.js +4 -3
- package/generators/entity-client/templates/angular/src/main/webapp/app/entities/detail/entity-management-detail.component.html.ejs +1 -1
- package/generators/entity-client/templates/angular/src/main/webapp/app/entities/list/entity-management.component.html.ejs +18 -6
- package/generators/entity-client/templates/angular/src/main/webapp/app/entities/list/entity-management.component.spec.ts.ejs +1 -1
- package/generators/entity-client/templates/angular/src/main/webapp/app/entities/list/entity-management.component.ts.ejs +23 -19
- package/generators/entity-client/templates/angular/src/main/webapp/app/entities/service/entity.service.spec.ts.ejs +3 -1
- package/generators/entity-client/templates/angular/src/main/webapp/app/entities/service/entity.service.ts.ejs +1 -1
- package/generators/entity-client/templates/angular/src/main/webapp/app/entities/update/entity-form.service.ts.ejs +1 -1
- package/generators/entity-client/templates/vue/src/main/webapp/app/entities/entity.component.ts.ejs +2 -2
- package/generators/entity-server/templates/src/main/java/package/common/delete_template.ejs +7 -3
- package/generators/entity-server/templates/src/main/java/package/common/get_all_template.ejs +2 -2
- package/generators/entity-server/templates/src/main/java/package/domain/Entity.java.jhi.ejs +15 -5
- package/generators/entity-server/templates/src/main/java/package/domain/Entity.java.jhi.spring_data_persistable.ejs +8 -1
- package/generators/entity-server/templates/src/main/java/package/repository/EntityRepositoryInternalImpl_reactive.java.ejs +5 -0
- package/generators/entity-server/templates/src/main/java/package/service/EntityQueryService.java.ejs +4 -4
- package/generators/entity-server/templates/src/main/java/package/service/EntityService.java.ejs +6 -4
- package/generators/entity-server/templates/src/main/java/package/service/criteria/EntityCriteria.java.ejs +3 -26
- package/generators/entity-server/templates/src/main/java/package/service/dto/EntityDTO.java.ejs +1 -0
- package/generators/entity-server/templates/src/main/java/package/service/impl/EntityServiceImpl.java.ejs +1 -1
- package/generators/entity-server/templates/src/test/java/package/web/rest/EntityResourceIT.java.ejs +33 -28
- package/generators/generate-blueprint/constants.mjs +46 -6
- package/generators/generate-blueprint/esm.mjs +0 -0
- package/generators/generate-blueprint/files.mjs +7 -5
- package/generators/generate-blueprint/generator.mjs +73 -19
- package/generators/generate-blueprint/templates/cli/cli.mjs.ejs +0 -0
- package/generators/generate-blueprint/templates/generators/generator/generator.spec.mjs.ejs +1 -1
- package/generators/generate-blueprint/templates/generators/generator/templates/template-file.ejs +0 -0
- package/generators/generator-base-blueprint.js +23 -1
- package/generators/generator-base-entities.cjs +5 -1
- package/generators/generator-base.js +82 -15
- package/generators/generator-constants.js +17 -23
- package/generators/init/templates/.husky/pre-commit +0 -0
- package/generators/kubernetes/templates/deployment.yml.ejs +1 -1
- package/generators/kubernetes/templates/ingress.yml.ejs +1 -1
- package/generators/kubernetes/templates/istio/gateway.yml.ejs +1 -1
- package/generators/kubernetes/templates/kubectl-apply.sh.ejs +0 -0
- package/generators/kubernetes/templates/kustomize/kustomization.yml.ejs +1 -1
- package/generators/kubernetes/templates/service.yml.ejs +1 -1
- package/generators/kubernetes-knative/templates/istio/gateway.yml.ejs +1 -1
- package/generators/kubernetes-knative/templates/kubectl-apply.sh.ejs +0 -0
- package/generators/kubernetes-knative/templates/service.yml.ejs +3 -3
- package/generators/languages/templates/src/main/webapp/i18n/al/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/ar-ly/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/bg/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/bn/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/by/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/ca/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/cs/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/da/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/de/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/el/activate.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/el/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/el/password.json +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/el/register.json +3 -3
- package/generators/languages/templates/src/main/webapp/i18n/el/tracker.json +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/el/user-management.json +9 -9
- package/generators/languages/templates/src/main/webapp/i18n/en/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/es/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/et/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/fa/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/fi/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/fr/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/gl/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/hi/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/hr/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/hu/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/hy/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/in/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/it/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/ja/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/ko/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/mr/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/my/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/nl/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/pa/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/pl/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/pt-br/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/pt-pt/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/ro/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/ru/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/si/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/sk/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/sr/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/sv/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/ta/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/te/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/th/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/tr/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/ua/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/uz-Latn-uz/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/vi/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/zh-cn/health.json.ejs +1 -1
- package/generators/languages/templates/src/main/webapp/i18n/zh-tw/health.json.ejs +1 -1
- package/generators/maven/templates/mvnw +0 -0
- package/generators/openshift/templates/deployment.yml.ejs +2 -2
- package/generators/server/cleanup-elasticsearch.js +5 -0
- package/generators/server/files.js +17 -8
- package/generators/server/index.js +0 -2
- package/generators/server/templates/build.gradle.ejs +6 -14
- package/generators/server/templates/gradle/profile_dev.gradle.ejs +1 -1
- package/generators/server/templates/gradle/profile_prod.gradle.ejs +1 -1
- package/generators/server/templates/gradle.properties.ejs +6 -4
- package/generators/server/templates/gradlew +0 -0
- package/generators/server/templates/mvnw +0 -0
- package/generators/server/templates/npmw +0 -0
- package/generators/server/templates/npmw.cmd +31 -29
- package/generators/server/templates/package.json.ejs +2 -2
- package/generators/server/templates/pom.xml.ejs +12 -23
- package/generators/server/templates/sql/common/src/test/java/package/config/MsSqlTestContainer.java.ejs +2 -3
- package/generators/server/templates/src/main/docker/app.yml.ejs +7 -1
- package/generators/server/templates/src/main/docker/config/realm-config/jhipster-realm.json.ejs +32 -14
- package/generators/server/templates/src/main/docker/jhipster-control-center.yml.ejs +1 -1
- package/generators/server/templates/src/main/docker/prometheus/prometheus.yml.ejs +1 -1
- package/generators/server/templates/src/main/java/package/Application.java.ejs +11 -4
- package/generators/server/templates/src/main/java/package/config/CRLFLogConverter.java.ejs +57 -0
- package/generators/server/templates/src/main/java/package/config/EurekaWorkaroundConfiguration.java.ejs +49 -0
- package/generators/server/templates/src/main/java/package/config/LoggingConfiguration.java.ejs +4 -4
- package/generators/server/templates/src/main/java/package/config/SecurityConfiguration.java.ejs +17 -18
- package/generators/server/templates/src/main/java/package/config/SecurityConfiguration_reactive.java.ejs +13 -5
- package/generators/server/templates/src/main/java/package/domain/AbstractAuditingEntity.java.ejs +5 -6
- package/generators/server/templates/src/main/java/package/domain/User.java.ejs +1 -1
- package/generators/server/templates/src/main/java/package/repository/UserRepository.java.ejs +1 -1
- package/generators/server/templates/src/main/java/package/security/oauth2/CustomClaimConverter.java.ejs +13 -6
- package/generators/server/templates/src/main/java/package/service/dto/AdminUserDTO.java.ejs +3 -1
- package/generators/server/templates/src/main/java/package/service/dto/PasswordChangeDTO.java.ejs +5 -1
- package/generators/server/templates/src/main/java/package/service/dto/UserDTO.java.ejs +3 -1
- package/generators/server/templates/src/main/java/package/web/rest/UserResource.java.ejs +15 -42
- package/generators/server/templates/src/main/java/package/web/rest/errors/BadRequestAlertException.java.ejs +1 -0
- package/generators/server/templates/src/main/java/package/web/rest/errors/EmailAlreadyUsedException.java.ejs +1 -0
- package/generators/server/templates/src/main/java/package/web/rest/errors/InvalidPasswordException.java.ejs +1 -0
- package/generators/server/templates/src/main/java/package/web/rest/errors/LoginAlreadyUsedException.java.ejs +1 -0
- package/generators/server/templates/src/main/resources/config/application-dev.yml.ejs +1 -1
- package/generators/server/templates/src/main/resources/config/application-prod.yml.ejs +3 -3
- package/generators/server/templates/src/main/resources/config/application.yml.ejs +4 -2
- package/generators/server/templates/src/main/resources/config/liquibase/master.xml.ejs +3 -8
- package/generators/server/templates/src/main/resources/logback-spring.xml.ejs +5 -0
- package/generators/server/templates/src/test/java/package/config/{ElasticsearchReactiveTestConfiguration.java.ejs → ElasticsearchTestConfiguration.java.ejs} +3 -3
- package/generators/server/templates/src/test/java/package/config/ElasticsearchTestContainer.java.ejs +1 -0
- package/generators/server/templates/src/test/java/package/config/JHipsterBlockHoundIntegration.java.ejs +3 -0
- package/generators/server/templates/src/test/java/package/config/TestContainersSpringContextCustomizerFactory.java.ejs +2 -2
- package/generators/sql-constants.js +5 -2
- package/generators/utils.js +43 -3
- package/generators/workspaces/index.js +2 -1
- package/jdl/exporters/jdl-exporter.js +6 -1
- package/jdl/jhipster/application-options.js +2 -1
- package/jdl/jhipster/binary-options.js +2 -2
- package/jdl/jhipster/default-application-options.js +11 -8
- package/jdl/jhipster/entity-options.js +1 -0
- package/jdl/jhipster/search-engine-types.js +1 -0
- package/lib/constants/priorities.cjs +16 -0
- package/lib/constants/priorities.mjs +1 -0
- package/lib/index.js +2 -0
- package/lib/support/base.cjs +2 -1
- package/package.json +7 -6
- package/utils/blueprint.js +10 -0
- package/utils/field.js +9 -9
- package/generators/client/templates/react/src/main/webapp/app/config/translation-middleware.ts.ejs +0 -58
- package/generators/server/templates/.npmrc.ejs +0 -1
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
package <%= packageName %>.config;
|
|
2
|
+
|
|
3
|
+
import ch.qos.logback.classic.spi.ILoggingEvent;
|
|
4
|
+
import ch.qos.logback.core.pattern.CompositeConverter;
|
|
5
|
+
|
|
6
|
+
import java.util.Collections;
|
|
7
|
+
import java.util.HashMap;
|
|
8
|
+
import java.util.Map;
|
|
9
|
+
|
|
10
|
+
import org.slf4j.Marker;
|
|
11
|
+
import org.slf4j.MarkerFactory;
|
|
12
|
+
import org.springframework.boot.ansi.AnsiColor;
|
|
13
|
+
import org.springframework.boot.ansi.AnsiElement;
|
|
14
|
+
import org.springframework.boot.ansi.AnsiOutput;
|
|
15
|
+
import org.springframework.boot.ansi.AnsiStyle;
|
|
16
|
+
|
|
17
|
+
public class CRLFLogConverter extends CompositeConverter<ILoggingEvent> {
|
|
18
|
+
public static final Marker CRLF_SAFE_MARKER = MarkerFactory.getMarker("CRLF_SAFE");
|
|
19
|
+
|
|
20
|
+
private static final String[] SAFE_LOGGERS = { "org.hibernate" };
|
|
21
|
+
private static final Map<String, AnsiElement> ELEMENTS;
|
|
22
|
+
|
|
23
|
+
static {
|
|
24
|
+
Map<String, AnsiElement> ansiElements = new HashMap<>();
|
|
25
|
+
ansiElements.put("faint", AnsiStyle.FAINT);
|
|
26
|
+
ansiElements.put("red", AnsiColor.RED);
|
|
27
|
+
ansiElements.put("green", AnsiColor.GREEN);
|
|
28
|
+
ansiElements.put("yellow", AnsiColor.YELLOW);
|
|
29
|
+
ansiElements.put("blue", AnsiColor.BLUE);
|
|
30
|
+
ansiElements.put("magenta", AnsiColor.MAGENTA);
|
|
31
|
+
ansiElements.put("cyan", AnsiColor.CYAN);
|
|
32
|
+
ELEMENTS = Collections.unmodifiableMap(ansiElements);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
@Override
|
|
36
|
+
protected String transform(ILoggingEvent event, String in) {
|
|
37
|
+
AnsiElement element = ELEMENTS.get(getFirstOption());
|
|
38
|
+
if ((event.getMarker() != null && event.getMarker().contains(CRLF_SAFE_MARKER)) || isLoggerSafe(event)) {
|
|
39
|
+
return in;
|
|
40
|
+
}
|
|
41
|
+
String replacement = element == null ? "_" : toAnsiString("_", element);
|
|
42
|
+
return in.replaceAll("[\n\r\t]", replacement);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
protected boolean isLoggerSafe(ILoggingEvent event) {
|
|
46
|
+
for (String safeLogger : SAFE_LOGGERS) {
|
|
47
|
+
if (event.getLoggerName().startsWith(safeLogger)) {
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
protected String toAnsiString(String in, AnsiElement element) {
|
|
55
|
+
return AnsiOutput.toString(element, in);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
<%#
|
|
2
|
+
Copyright 2013-2022 the original author or authors from the JHipster project.
|
|
3
|
+
|
|
4
|
+
This file is part of the JHipster project, see https://www.jhipster.tech/
|
|
5
|
+
for more information.
|
|
6
|
+
|
|
7
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
you may not use this file except in compliance with the License.
|
|
9
|
+
You may obtain a copy of the License at
|
|
10
|
+
|
|
11
|
+
https://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
|
|
13
|
+
Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
See the License for the specific language governing permissions and
|
|
17
|
+
limitations under the License.
|
|
18
|
+
-%>
|
|
19
|
+
// This is a workaround for
|
|
20
|
+
// https://github.com/jhipster/jhipster-registry/issues/537
|
|
21
|
+
// https://github.com/jhipster/generator-jhipster/issues/18533
|
|
22
|
+
// The original issue will be fixed with spring cloud 2021.0.4
|
|
23
|
+
// https://github.com/spring-cloud/spring-cloud-netflix/issues/3941
|
|
24
|
+
package <%= packageName %>.config;
|
|
25
|
+
|
|
26
|
+
import org.springframework.boot.actuate.health.HealthIndicator;
|
|
27
|
+
import org.springframework.boot.actuate.health.Health;
|
|
28
|
+
import org.springframework.boot.context.event.ApplicationReadyEvent;
|
|
29
|
+
import org.springframework.context.event.EventListener;
|
|
30
|
+
import org.springframework.stereotype.Component;
|
|
31
|
+
|
|
32
|
+
@Component
|
|
33
|
+
public class EurekaWorkaroundConfiguration implements HealthIndicator {
|
|
34
|
+
|
|
35
|
+
private boolean applicationIsUp = false;
|
|
36
|
+
|
|
37
|
+
@EventListener(ApplicationReadyEvent.class)
|
|
38
|
+
public void onStartup() {
|
|
39
|
+
this.applicationIsUp = true;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
@Override
|
|
43
|
+
public Health health() {
|
|
44
|
+
if (!applicationIsUp) {
|
|
45
|
+
return Health.down().build();
|
|
46
|
+
}
|
|
47
|
+
return Health.up().build();
|
|
48
|
+
}
|
|
49
|
+
}
|
package/generators/server/templates/src/main/java/package/config/LoggingConfiguration.java.ejs
CHANGED
|
@@ -23,11 +23,11 @@ import com.fasterxml.jackson.core.JsonProcessingException;
|
|
|
23
23
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
24
24
|
import tech.jhipster.config.JHipsterProperties;
|
|
25
25
|
import org.slf4j.LoggerFactory;
|
|
26
|
-
<%_ if (serviceDiscoveryConsul || (
|
|
26
|
+
<%_ if (serviceDiscoveryConsul || (serviceDiscoveryAny && applicationTypeGateway || applicationTypeMicroservice)) { _%>
|
|
27
27
|
import org.springframework.beans.factory.ObjectProvider;
|
|
28
28
|
<%_ } _%>
|
|
29
29
|
import org.springframework.beans.factory.annotation.Value;
|
|
30
|
-
<%_ if (
|
|
30
|
+
<%_ if (serviceDiscoveryAny && (applicationTypeGateway || applicationTypeMicroservice)) { _%>
|
|
31
31
|
import org.springframework.boot.info.BuildProperties;
|
|
32
32
|
<%_ } _%>
|
|
33
33
|
<%_ if (serviceDiscoveryConsul) { _%>
|
|
@@ -58,7 +58,7 @@ public class LoggingConfiguration {
|
|
|
58
58
|
<%_ if (serviceDiscoveryConsul) { _%>
|
|
59
59
|
ObjectProvider<ConsulRegistration> consulRegistration,
|
|
60
60
|
<%_ } _%>
|
|
61
|
-
<%_ if (
|
|
61
|
+
<%_ if (serviceDiscoveryAny && (applicationTypeMicroservice || applicationTypeGateway)) { _%>
|
|
62
62
|
ObjectProvider<BuildProperties> buildProperties,
|
|
63
63
|
<%_ } _%>
|
|
64
64
|
ObjectMapper mapper) throws JsonProcessingException {
|
|
@@ -68,7 +68,7 @@ public class LoggingConfiguration {
|
|
|
68
68
|
Map<String, String> map = new HashMap<>();
|
|
69
69
|
map.put("app_name", appName);
|
|
70
70
|
map.put("app_port", serverPort);
|
|
71
|
-
<%_ if (
|
|
71
|
+
<%_ if (serviceDiscoveryAny && (applicationTypeMicroservice || applicationTypeGateway)) { _%>
|
|
72
72
|
buildProperties.ifAvailable(it -> map.put("version", it.getVersion()));
|
|
73
73
|
<%_ } _%>
|
|
74
74
|
<%_ if (serviceDiscoveryConsul) { _%>
|
package/generators/server/templates/src/main/java/package/config/SecurityConfiguration.java.ejs
CHANGED
|
@@ -37,13 +37,6 @@ import org.springframework.http.HttpMethod;
|
|
|
37
37
|
<%_ } _%>
|
|
38
38
|
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
|
|
39
39
|
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
|
40
|
-
<%_ if (!applicationTypeMicroservice || !authenticationTypeOauth2) { _%>
|
|
41
|
-
import org.springframework.security.config.annotation.web.builders.WebSecurity;
|
|
42
|
-
<%_ } else { _%>
|
|
43
|
-
<%_ if (devDatabaseTypeH2Any) { _%>
|
|
44
|
-
import org.springframework.security.config.annotation.web.builders.WebSecurity;
|
|
45
|
-
<%_ } _%>
|
|
46
|
-
<%_ } _%>
|
|
47
40
|
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
|
|
48
41
|
import org.springframework.security.web.SecurityFilterChain;
|
|
49
42
|
<%_ if (authenticationTypeJwt || (authenticationTypeOauth2 && applicationTypeMicroservice)) { _%>
|
|
@@ -91,7 +84,9 @@ import org.springframework.security.oauth2.client.registration.ClientRegistratio
|
|
|
91
84
|
import org.springframework.boot.web.client.RestTemplateBuilder;
|
|
92
85
|
import <%= packageName %>.security.oauth2.CustomClaimConverter;
|
|
93
86
|
<%_ } _%>
|
|
87
|
+
<%_ if(!skipClient) { _%>
|
|
94
88
|
import org.springframework.security.web.header.writers.ReferrerPolicyHeaderWriter;
|
|
89
|
+
<%_ } _%>
|
|
95
90
|
<%_ if (!applicationTypeMicroservice) { _%>
|
|
96
91
|
import org.springframework.web.filter.CorsFilter;
|
|
97
92
|
<%_ } _%>
|
|
@@ -165,6 +160,9 @@ public class SecurityConfiguration {
|
|
|
165
160
|
// @formatter:off
|
|
166
161
|
http
|
|
167
162
|
.csrf()
|
|
163
|
+
<%_ if (devDatabaseTypeH2Any) { _%>
|
|
164
|
+
.ignoringAntMatchers("/h2-console/**")
|
|
165
|
+
<%_ } _%>
|
|
168
166
|
<%_ if ((authenticationTypeOauth2 || authenticationTypeSession) && !applicationTypeMicroservice) { _%>
|
|
169
167
|
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
|
|
170
168
|
.and()
|
|
@@ -201,22 +199,23 @@ public class SecurityConfiguration {
|
|
|
201
199
|
.logoutSuccessHandler(ajaxLogoutSuccessHandler())
|
|
202
200
|
.permitAll()
|
|
203
201
|
<%_ } _%>
|
|
202
|
+
<%_ if (!skipClient) { _%>
|
|
204
203
|
.and()
|
|
205
204
|
.headers()
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
.and()
|
|
205
|
+
.contentSecurityPolicy(jHipsterProperties.getSecurity().getContentSecurityPolicy())
|
|
206
|
+
.and()
|
|
207
|
+
.referrerPolicy(ReferrerPolicyHeaderWriter.ReferrerPolicy.STRICT_ORIGIN_WHEN_CROSS_ORIGIN)
|
|
208
|
+
.and()
|
|
209
|
+
.permissionsPolicy().policy("camera=(), fullscreen=(self), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), midi=(), payment=(), sync-xhr=()")
|
|
210
|
+
.and()
|
|
211
|
+
.frameOptions().sameOrigin()
|
|
212
|
+
<%_ } _%>
|
|
215
213
|
<%_ if (authenticationTypeJwt || (authenticationTypeOauth2 && applicationTypeMicroservice)) { _%>
|
|
216
|
-
.sessionManagement()
|
|
217
|
-
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
|
|
218
214
|
.and()
|
|
215
|
+
.sessionManagement()
|
|
216
|
+
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
|
|
219
217
|
<%_ } _%>
|
|
218
|
+
.and()
|
|
220
219
|
.authorizeRequests()
|
|
221
220
|
<%_ if (!applicationTypeMicroservice) { _%>
|
|
222
221
|
.antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
|
|
@@ -134,6 +134,10 @@ import reactor.core.publisher.Mono;
|
|
|
134
134
|
<%_ if (!applicationTypeMicroservice) { _%>
|
|
135
135
|
import org.springframework.web.reactive.function.client.WebClient;
|
|
136
136
|
|
|
137
|
+
import com.github.benmanes.caffeine.cache.Cache;
|
|
138
|
+
import com.github.benmanes.caffeine.cache.Caffeine;
|
|
139
|
+
|
|
140
|
+
import java.time.Duration;
|
|
137
141
|
import java.util.Arrays;
|
|
138
142
|
import java.util.Map;
|
|
139
143
|
<%_ } _%>
|
|
@@ -141,7 +145,6 @@ import java.util.Map;
|
|
|
141
145
|
import java.util.HashSet;
|
|
142
146
|
import java.util.Set;
|
|
143
147
|
<%_ if (!applicationTypeMicroservice) { _%>
|
|
144
|
-
import java.util.concurrent.ConcurrentHashMap;
|
|
145
148
|
import java.util.function.Consumer;
|
|
146
149
|
<%_ } _%>
|
|
147
150
|
<%_ } _%>
|
|
@@ -170,8 +173,13 @@ public class SecurityConfiguration {
|
|
|
170
173
|
|
|
171
174
|
private final ReactiveClientRegistrationRepository clientRegistrationRepository;
|
|
172
175
|
|
|
173
|
-
//
|
|
174
|
-
|
|
176
|
+
// See https://github.com/jhipster/generator-jhipster/issues/18868
|
|
177
|
+
// We don't use a distributed cache or the user selected cache implementation here on purpose
|
|
178
|
+
private final Cache<String, Mono<Jwt>> users = Caffeine.newBuilder()
|
|
179
|
+
.maximumSize(10_000)
|
|
180
|
+
.expireAfterWrite(Duration.ofHours(1))
|
|
181
|
+
.recordStats()
|
|
182
|
+
.build();
|
|
175
183
|
|
|
176
184
|
<%_ } _%>
|
|
177
185
|
<%_ } _%>
|
|
@@ -268,7 +276,7 @@ public class SecurityConfiguration {
|
|
|
268
276
|
<%_ } _%>
|
|
269
277
|
.and()
|
|
270
278
|
.headers()
|
|
271
|
-
|
|
279
|
+
.contentSecurityPolicy(jHipsterProperties.getSecurity().getContentSecurityPolicy())
|
|
272
280
|
.and()
|
|
273
281
|
.referrerPolicy(ReferrerPolicyServerHttpHeadersWriter.ReferrerPolicy.STRICT_ORIGIN_WHEN_CROSS_ORIGIN)
|
|
274
282
|
.and()
|
|
@@ -425,7 +433,7 @@ public class SecurityConfiguration {
|
|
|
425
433
|
return Mono.just(jwt);
|
|
426
434
|
}
|
|
427
435
|
// Retrieve user info from OAuth provider if not already loaded
|
|
428
|
-
return users.
|
|
436
|
+
return users.get(jwt.getSubject(), s -> {
|
|
429
437
|
WebClient webClient = WebClient.create();
|
|
430
438
|
|
|
431
439
|
return webClient
|
package/generators/server/templates/src/main/java/package/domain/AbstractAuditingEntity.java.ejs
CHANGED
|
@@ -21,7 +21,7 @@ package <%= packageName %>.domain;
|
|
|
21
21
|
<%_ if (databaseTypeCouchbase) { _%>
|
|
22
22
|
import org.springframework.data.couchbase.core.mapping.Field;
|
|
23
23
|
<%_ } _%>
|
|
24
|
-
import com.fasterxml.jackson.annotation.
|
|
24
|
+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
|
25
25
|
<%_ if (!reactive) { _%>
|
|
26
26
|
import org.springframework.data.annotation.CreatedBy;
|
|
27
27
|
<%_ } _%>
|
|
@@ -58,10 +58,13 @@ import javax.persistence.MappedSuperclass;
|
|
|
58
58
|
@MappedSuperclass
|
|
59
59
|
@EntityListeners(AuditingEntityListener.class)
|
|
60
60
|
<%_ } _%>
|
|
61
|
-
|
|
61
|
+
@JsonIgnoreProperties(value = { "createdBy", "createdDate", "lastModifiedBy", "lastModifiedDate" }, allowGetters = true)
|
|
62
|
+
public abstract class AbstractAuditingEntity<T> implements Serializable {
|
|
62
63
|
|
|
63
64
|
private static final long serialVersionUID = 1L;
|
|
64
65
|
|
|
66
|
+
public abstract T getId();
|
|
67
|
+
|
|
65
68
|
<%_ if (!reactive) { _%>
|
|
66
69
|
@CreatedBy
|
|
67
70
|
<%_ } _%>
|
|
@@ -77,7 +80,6 @@ public abstract class AbstractAuditingEntity implements Serializable {
|
|
|
77
80
|
<%_ if (databaseTypeNeo4j) { _%>
|
|
78
81
|
@Property("created_by")
|
|
79
82
|
<%_ } _%>
|
|
80
|
-
@JsonIgnore
|
|
81
83
|
private String createdBy;
|
|
82
84
|
|
|
83
85
|
@CreatedDate
|
|
@@ -93,7 +95,6 @@ public abstract class AbstractAuditingEntity implements Serializable {
|
|
|
93
95
|
<%_ if (databaseTypeNeo4j) { _%>
|
|
94
96
|
@Property("created_date")
|
|
95
97
|
<%_ } _%>
|
|
96
|
-
@JsonIgnore
|
|
97
98
|
private Instant createdDate = Instant.now();
|
|
98
99
|
|
|
99
100
|
<%_ if (!reactive) { _%>
|
|
@@ -111,7 +112,6 @@ public abstract class AbstractAuditingEntity implements Serializable {
|
|
|
111
112
|
<%_ if (databaseTypeNeo4j) { _%>
|
|
112
113
|
@Property("last_modified_by")
|
|
113
114
|
<%_ } _%>
|
|
114
|
-
@JsonIgnore
|
|
115
115
|
private String lastModifiedBy;
|
|
116
116
|
|
|
117
117
|
@LastModifiedDate
|
|
@@ -127,7 +127,6 @@ public abstract class AbstractAuditingEntity implements Serializable {
|
|
|
127
127
|
<%_ if (databaseTypeNeo4j) { _%>
|
|
128
128
|
@Property("last_modified_date")
|
|
129
129
|
<%_ } _%>
|
|
130
|
-
@JsonIgnore
|
|
131
130
|
private Instant lastModifiedDate = Instant.now();
|
|
132
131
|
|
|
133
132
|
public String getCreatedBy() {
|
|
@@ -131,7 +131,7 @@ import static org.springframework.data.couchbase.core.mapping.id.GenerationStrat
|
|
|
131
131
|
<%_ if (searchEngineElasticsearch) { _%>
|
|
132
132
|
@org.springframework.data.elasticsearch.annotations.Document(indexName = "user")
|
|
133
133
|
<%_ } _%>
|
|
134
|
-
public class <%= asEntity('User') %><% if (databaseTypeSql || databaseTypeMongodb || databaseTypeNeo4j || databaseTypeCouchbase) { %> extends AbstractAuditingEntity
|
|
134
|
+
public class <%= asEntity('User') %><% if (databaseTypeSql || databaseTypeMongodb || databaseTypeNeo4j || databaseTypeCouchbase) { %> extends AbstractAuditingEntity<<%= user.primaryKey.type %>><% } %> implements Serializable {
|
|
135
135
|
|
|
136
136
|
private static final long serialVersionUID = 1L;
|
|
137
137
|
|
package/generators/server/templates/src/main/java/package/repository/UserRepository.java.ejs
CHANGED
|
@@ -315,7 +315,7 @@ public interface UserRepository extends R2dbcRepository<<%= asEntity('User') %>,
|
|
|
315
315
|
Mono<Void> deleteAllUserAuthorities();
|
|
316
316
|
|
|
317
317
|
@Query("DELETE FROM <%= jhiTablePrefix %>_user_authority WHERE user_id = :userId")
|
|
318
|
-
Mono<Void> deleteUserAuthorities(
|
|
318
|
+
Mono<Void> deleteUserAuthorities(<%= user.primaryKey.type %> userId);
|
|
319
319
|
|
|
320
320
|
}
|
|
321
321
|
|
|
@@ -20,6 +20,8 @@ package <%= packageName %>.security.oauth2;
|
|
|
20
20
|
|
|
21
21
|
import com.fasterxml.jackson.databind.JsonNode;
|
|
22
22
|
import com.fasterxml.jackson.databind.node.ObjectNode;
|
|
23
|
+
import com.github.benmanes.caffeine.cache.Cache;
|
|
24
|
+
import com.github.benmanes.caffeine.cache.Caffeine;
|
|
23
25
|
import <%= packageName %>.security.SecurityUtils;
|
|
24
26
|
import org.springframework.core.convert.converter.Converter;
|
|
25
27
|
import org.springframework.http.HttpEntity;
|
|
@@ -35,11 +37,11 @@ import org.springframework.web.context.request.RequestAttributes;
|
|
|
35
37
|
import org.springframework.web.context.request.RequestContextHolder;
|
|
36
38
|
import org.springframework.web.context.request.ServletRequestAttributes;
|
|
37
39
|
|
|
40
|
+
import java.time.Duration;
|
|
38
41
|
import java.util.Arrays;
|
|
39
42
|
import java.util.Collections;
|
|
40
43
|
import java.util.List;
|
|
41
44
|
import java.util.Map;
|
|
42
|
-
import java.util.concurrent.ConcurrentHashMap;
|
|
43
45
|
import java.util.stream.Collectors;
|
|
44
46
|
import java.util.stream.StreamSupport;
|
|
45
47
|
|
|
@@ -55,8 +57,13 @@ public class CustomClaimConverter implements Converter<Map<String, Object>, Map<
|
|
|
55
57
|
|
|
56
58
|
private final ClientRegistration registration;
|
|
57
59
|
|
|
58
|
-
//
|
|
59
|
-
|
|
60
|
+
// See https://github.com/jhipster/generator-jhipster/issues/18868
|
|
61
|
+
// We don't use a distributed cache or the user selected cache implementation here on purpose
|
|
62
|
+
private final Cache<String, ObjectNode> users = Caffeine.newBuilder()
|
|
63
|
+
.maximumSize(10_000)
|
|
64
|
+
.expireAfterWrite(Duration.ofHours(1))
|
|
65
|
+
.recordStats()
|
|
66
|
+
.build();
|
|
60
67
|
|
|
61
68
|
public CustomClaimConverter(ClientRegistration registration, RestTemplate restTemplate) {
|
|
62
69
|
this.registration = registration;
|
|
@@ -64,11 +71,11 @@ public class CustomClaimConverter implements Converter<Map<String, Object>, Map<
|
|
|
64
71
|
}
|
|
65
72
|
|
|
66
73
|
public Map<String, Object> convert(Map<String, Object> claims) {
|
|
74
|
+
Map<String, Object> convertedClaims = this.delegate.convert(claims);
|
|
67
75
|
// Only look up user information if identity claims are missing
|
|
68
76
|
if (claims.containsKey("given_name") && claims.containsKey("family_name")) {
|
|
69
|
-
return
|
|
77
|
+
return convertedClaims;
|
|
70
78
|
}
|
|
71
|
-
Map<String, Object> convertedClaims = this.delegate.convert(claims);
|
|
72
79
|
RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
|
|
73
80
|
if (attributes instanceof ServletRequestAttributes) {
|
|
74
81
|
// Retrieve and set the token
|
|
@@ -77,7 +84,7 @@ public class CustomClaimConverter implements Converter<Map<String, Object>, Map<
|
|
|
77
84
|
headers.set("Authorization", buildBearer(token));
|
|
78
85
|
|
|
79
86
|
// Retrieve user info from OAuth provider if not already loaded
|
|
80
|
-
ObjectNode user = users.
|
|
87
|
+
ObjectNode user = users.get(claims.get("sub").toString(), s -> {
|
|
81
88
|
ResponseEntity<ObjectNode> userInfo = restTemplate.exchange(registration.getProviderDetails().getUserInfoEndpoint().getUri(), HttpMethod.GET, new HttpEntity<String>(headers), ObjectNode.class);
|
|
82
89
|
return userInfo.getBody();
|
|
83
90
|
});
|
|
@@ -25,6 +25,7 @@ import <%= packageName %>.domain.Authority;<% } %>
|
|
|
25
25
|
import <%= packageName %>.domain.<%= asEntity('User') %>;
|
|
26
26
|
<%_ } _%>
|
|
27
27
|
|
|
28
|
+
import java.io.Serializable;
|
|
28
29
|
import javax.validation.constraints.*;
|
|
29
30
|
<%_ if (databaseTypeMongodb || databaseTypeNeo4j || databaseTypeCouchbase || databaseTypeSql) { _%>
|
|
30
31
|
import java.time.Instant;
|
|
@@ -40,7 +41,8 @@ import java.util.stream.Collectors;
|
|
|
40
41
|
/**
|
|
41
42
|
* A DTO representing a user, with his authorities.
|
|
42
43
|
*/
|
|
43
|
-
public class <%= asDto('AdminUser') %> {
|
|
44
|
+
public class <%= asDto('AdminUser') %> implements Serializable {
|
|
45
|
+
private static final long serialVersionUID = 1L;
|
|
44
46
|
|
|
45
47
|
private <%= user.primaryKey.type %> id;
|
|
46
48
|
|
package/generators/server/templates/src/main/java/package/service/dto/PasswordChangeDTO.java.ejs
CHANGED
|
@@ -18,10 +18,14 @@
|
|
|
18
18
|
-%>
|
|
19
19
|
package <%= packageName %>.service.dto;
|
|
20
20
|
|
|
21
|
+
import java.io.Serializable;
|
|
22
|
+
|
|
21
23
|
/**
|
|
22
24
|
* A DTO representing a password change required data - current and new password.
|
|
23
25
|
*/
|
|
24
|
-
public class PasswordChangeDTO {
|
|
26
|
+
public class PasswordChangeDTO implements Serializable {
|
|
27
|
+
private static final long serialVersionUID = 1L;
|
|
28
|
+
|
|
25
29
|
private String currentPassword;
|
|
26
30
|
private String newPassword;
|
|
27
31
|
|
|
@@ -22,6 +22,7 @@ package <%= packageName %>.service.dto;
|
|
|
22
22
|
import <%= packageName %>.domain.<%= asEntity('User') %>;
|
|
23
23
|
<%_ } _%>
|
|
24
24
|
|
|
25
|
+
import java.io.Serializable;
|
|
25
26
|
<%_ if (user.primaryKey.hasUUID) { _%>
|
|
26
27
|
import java.util.UUID;
|
|
27
28
|
<%_ } _%>
|
|
@@ -29,7 +30,8 @@ import java.util.UUID;
|
|
|
29
30
|
/**
|
|
30
31
|
* A DTO representing a user, with only the public attributes.
|
|
31
32
|
*/
|
|
32
|
-
public class <%= asDto('User') %> {
|
|
33
|
+
public class <%= asDto('User') %> implements Serializable {
|
|
34
|
+
private static final long serialVersionUID = 1L;
|
|
33
35
|
|
|
34
36
|
private <%= user.primaryKey.type %> id;
|
|
35
37
|
|