From ce89b7e52cd625f4b3f573a6fabb53c5a20fadcd Mon Sep 17 00:00:00 2001 From: Marcelo Boveto Shima Date: Wed, 17 Jan 2024 14:49:12 -0300 Subject: [PATCH] add UserManagement entity --- .../app/__snapshots__/generator.spec.ts.snap | 2 + generators/app/generator.spec.ts | 2 + generators/base-application/generator.spec.ts | 100 +-- .../support/prepare-entity.ts | 16 +- .../support/prepare-relationship.js | 1 + generators/base-application/types.d.ts | 4 + generators/base/support/config.ts | 17 +- .../bootstrap-application-base/generator.ts | 20 +- .../bootstrap-application-base/utils.js | 141 +++- .../bootstrap-application/generator.spec.ts | 750 ++++++++++++++++-- 10 files changed, 936 insertions(+), 117 deletions(-) diff --git a/generators/app/__snapshots__/generator.spec.ts.snap b/generators/app/__snapshots__/generator.spec.ts.snap index aa8cbe3578ea..c19bdfdbf271 100644 --- a/generators/app/__snapshots__/generator.spec.ts.snap +++ b/generators/app/__snapshots__/generator.spec.ts.snap @@ -750,6 +750,7 @@ exports[`generator - app with default config should match snapshot 1`] = ` "upperFirstCamelCaseBaseName": "Jhipster", "useNpmWrapper": true, "user": Any, + "userManagement": Any, "webappEnumerationsDir": "src/main/webapp/app/entities/enumerations/", "webappLoginRegExp": "^[a-zA-Z0-9!$&*+=?^_\`{|}~.-]+@[a-zA-Z0-9-]+(?:\\\\.[a-zA-Z0-9-]+)*$|^[_.@A-Za-z0-9-]+$", "websocket": "no", @@ -1324,6 +1325,7 @@ exports[`generator - app with gateway should match snapshot 1`] = ` "upperFirstCamelCaseBaseName": "Jhipster", "useNpmWrapper": true, "user": Any, + "userManagement": Any, "webappEnumerationsDir": "src/main/webapp/app/entities/enumerations/", "webappLoginRegExp": "^[a-zA-Z0-9!$&*+=?^_\`{|}~.-]+@[a-zA-Z0-9-]+(?:\\\\.[a-zA-Z0-9-]+)*$|^[_.@A-Za-z0-9-]+$", "websocket": "no", diff --git a/generators/app/generator.spec.ts b/generators/app/generator.spec.ts index b33a4d3ac856..22e9ec605046 100644 --- a/generators/app/generator.spec.ts +++ b/generators/app/generator.spec.ts @@ -55,6 +55,7 @@ describe(`generator - ${generator}`, () => { expect(runResult.generator.sharedData.getApplication()).toMatchSnapshot({ user: expect.any(Object), authority: expect.any(Object), + userManagement: expect.any(Object), jhipsterPackageJson: expect.any(Object), }); }); @@ -75,6 +76,7 @@ describe(`generator - ${generator}`, () => { expect(runResult.generator.sharedData.getApplication()).toMatchSnapshot({ user: expect.any(Object), authority: expect.any(Object), + userManagement: expect.any(Object), jhipsterPackageJson: expect.any(Object), jwtSecretKey: expect.any(String), }); diff --git a/generators/base-application/generator.spec.ts b/generators/base-application/generator.spec.ts index 6bdaa1c48d4d..55c8b9dcdd6c 100644 --- a/generators/base-application/generator.spec.ts +++ b/generators/base-application/generator.spec.ts @@ -233,7 +233,7 @@ describe(`generator - ${generator}`, () => { const entitiesArg = { ...controlArg, ...applicationArg, - entities: [expect.any(Object), expect.any(Object), expect.any(Object), expect.any(Object), expect.any(Object)], + entities: [expect.any(Object), expect.any(Object), expect.any(Object), expect.any(Object), expect.any(Object), expect.any(Object)], }; expect(initializing).toBeCalledWith(controlArg); @@ -248,35 +248,39 @@ describe(`generator - ${generator}`, () => { expect(configuringEachEntity).toHaveBeenNthCalledWith(2, { ...entityConfiguringArg, entityName: 'Two' }); expect(configuringEachEntity).toHaveBeenNthCalledWith(3, { ...entityConfiguringArg, entityName: 'Three' }); - expect(preparingEachEntity).toBeCalledTimes(5); + expect(preparingEachEntity).toBeCalledTimes(6); expect(preparingEachEntity).toHaveBeenNthCalledWith(1, { ...entityArg, entityName: 'User' }); - expect(preparingEachEntity).toHaveBeenNthCalledWith(2, { ...entityArg, entityName: 'Authority' }); - expect(preparingEachEntity).toHaveBeenNthCalledWith(3, { ...entityArg, entityName: 'One' }); - expect(preparingEachEntity).toHaveBeenNthCalledWith(4, { ...entityArg, entityName: 'Two' }); - expect(preparingEachEntity).toHaveBeenNthCalledWith(5, { ...entityArg, entityName: 'Three' }); + expect(preparingEachEntity).toHaveBeenNthCalledWith(2, { ...entityArg, entityName: 'UserManagement' }); + expect(preparingEachEntity).toHaveBeenNthCalledWith(3, { ...entityArg, entityName: 'Authority' }); + expect(preparingEachEntity).toHaveBeenNthCalledWith(4, { ...entityArg, entityName: 'One' }); + expect(preparingEachEntity).toHaveBeenNthCalledWith(5, { ...entityArg, entityName: 'Two' }); + expect(preparingEachEntity).toHaveBeenNthCalledWith(6, { ...entityArg, entityName: 'Three' }); - expect(preparingEachEntityField).toBeCalledTimes(9); + expect(preparingEachEntityField).toBeCalledTimes(29); expect(preparingEachEntityField).toHaveBeenNthCalledWith(1, { ...fieldArg, description: 'User#id' }); expect(preparingEachEntityField).toHaveBeenNthCalledWith(2, { ...fieldArg, description: 'User#login' }); expect(preparingEachEntityField).toHaveBeenNthCalledWith(3, { ...fieldArg, description: 'User#firstName' }); expect(preparingEachEntityField).toHaveBeenNthCalledWith(4, { ...fieldArg, description: 'User#lastName' }); - expect(preparingEachEntityField).toHaveBeenNthCalledWith(5, { ...fieldArg, description: 'Authority#name' }); - expect(preparingEachEntityField).toHaveBeenNthCalledWith(6, { ...fieldArg, description: 'One#id' }); - expect(preparingEachEntityField).toHaveBeenNthCalledWith(7, { ...fieldArg, description: 'Two#id' }); - expect(preparingEachEntityField).toHaveBeenNthCalledWith(8, { ...fieldArg, description: 'Two#name' }); - expect(preparingEachEntityField).toHaveBeenNthCalledWith(9, { ...fieldArg, description: 'Three#id' }); - - expect(preparingEachEntityRelationship).toBeCalledTimes(3); - expect(preparingEachEntityRelationship).toHaveBeenNthCalledWith(1, { ...relationshipArg, description: 'One#two' }); - expect(preparingEachEntityRelationship).toHaveBeenNthCalledWith(2, { ...relationshipArg, description: 'Two#one' }); - expect(preparingEachEntityRelationship).toHaveBeenNthCalledWith(3, { ...relationshipArg, description: 'Two#three' }); - - expect(postPreparingEachEntity).toBeCalledTimes(5); + // Ommit UserManagement fields + expect(preparingEachEntityField).toHaveBeenNthCalledWith(25, { ...fieldArg, description: 'Authority#name' }); + expect(preparingEachEntityField).toHaveBeenNthCalledWith(26, { ...fieldArg, description: 'One#id' }); + expect(preparingEachEntityField).toHaveBeenNthCalledWith(27, { ...fieldArg, description: 'Two#id' }); + expect(preparingEachEntityField).toHaveBeenNthCalledWith(28, { ...fieldArg, description: 'Two#name' }); + expect(preparingEachEntityField).toHaveBeenNthCalledWith(29, { ...fieldArg, description: 'Three#id' }); + + expect(preparingEachEntityRelationship).toBeCalledTimes(4); + // Ommit UserManagement relationships + expect(preparingEachEntityRelationship).toHaveBeenNthCalledWith(2, { ...relationshipArg, description: 'One#two' }); + expect(preparingEachEntityRelationship).toHaveBeenNthCalledWith(3, { ...relationshipArg, description: 'Two#one' }); + expect(preparingEachEntityRelationship).toHaveBeenNthCalledWith(4, { ...relationshipArg, description: 'Two#three' }); + + expect(postPreparingEachEntity).toBeCalledTimes(6); expect(postPreparingEachEntity).toHaveBeenNthCalledWith(1, { ...entityArg, entityName: 'User' }); - expect(postPreparingEachEntity).toHaveBeenNthCalledWith(2, { ...entityArg, entityName: 'Authority' }); - expect(postPreparingEachEntity).toHaveBeenNthCalledWith(3, { ...entityArg, entityName: 'One' }); - expect(postPreparingEachEntity).toHaveBeenNthCalledWith(4, { ...entityArg, entityName: 'Two' }); - expect(postPreparingEachEntity).toHaveBeenNthCalledWith(5, { ...entityArg, entityName: 'Three' }); + expect(postPreparingEachEntity).toHaveBeenNthCalledWith(2, { ...entityArg, entityName: 'UserManagement' }); + expect(postPreparingEachEntity).toHaveBeenNthCalledWith(3, { ...entityArg, entityName: 'Authority' }); + expect(postPreparingEachEntity).toHaveBeenNthCalledWith(4, { ...entityArg, entityName: 'One' }); + expect(postPreparingEachEntity).toHaveBeenNthCalledWith(5, { ...entityArg, entityName: 'Two' }); + expect(postPreparingEachEntity).toHaveBeenNthCalledWith(6, { ...entityArg, entityName: 'Three' }); expect(defaultTask).toBeCalledWith(entitiesArg); expect(writingEntities).toBeCalledWith(entitiesArg); @@ -471,7 +475,7 @@ describe(`generator - ${generator}`, () => { const entitiesArg = { ...applicationArg, - entities: [expect.any(Object), expect.any(Object), expect.any(Object), expect.any(Object), expect.any(Object)], + entities: [expect.any(Object), expect.any(Object), expect.any(Object), expect.any(Object), expect.any(Object), expect.any(Object)], }; const writingEntitiesArg = { @@ -495,35 +499,39 @@ describe(`generator - ${generator}`, () => { expect(configuringEachEntity).toHaveBeenNthCalledWith(2, { ...entityConfiguringArg, entityName: 'Two' }); expect(configuringEachEntity).toHaveBeenNthCalledWith(3, { ...entityConfiguringArg, entityName: 'Three' }); - expect(preparingEachEntity).toBeCalledTimes(5); + expect(preparingEachEntity).toBeCalledTimes(6); expect(preparingEachEntity).toHaveBeenNthCalledWith(1, { ...entityArg, entityName: 'User' }); - expect(preparingEachEntity).toHaveBeenNthCalledWith(2, { ...entityArg, entityName: 'Authority' }); - expect(preparingEachEntity).toHaveBeenNthCalledWith(3, { ...entityArg, entityName: 'One' }); - expect(preparingEachEntity).toHaveBeenNthCalledWith(4, { ...entityArg, entityName: 'Two' }); - expect(preparingEachEntity).toHaveBeenNthCalledWith(5, { ...entityArg, entityName: 'Three' }); + expect(preparingEachEntity).toHaveBeenNthCalledWith(2, { ...entityArg, entityName: 'UserManagement' }); + expect(preparingEachEntity).toHaveBeenNthCalledWith(3, { ...entityArg, entityName: 'Authority' }); + expect(preparingEachEntity).toHaveBeenNthCalledWith(4, { ...entityArg, entityName: 'One' }); + expect(preparingEachEntity).toHaveBeenNthCalledWith(5, { ...entityArg, entityName: 'Two' }); + expect(preparingEachEntity).toHaveBeenNthCalledWith(6, { ...entityArg, entityName: 'Three' }); - expect(preparingEachEntityField).toBeCalledTimes(9); + expect(preparingEachEntityField).toBeCalledTimes(29); expect(preparingEachEntityField).toHaveBeenNthCalledWith(1, { ...fieldArg, description: 'User#id' }); expect(preparingEachEntityField).toHaveBeenNthCalledWith(2, { ...fieldArg, description: 'User#login' }); expect(preparingEachEntityField).toHaveBeenNthCalledWith(3, { ...fieldArg, description: 'User#firstName' }); expect(preparingEachEntityField).toHaveBeenNthCalledWith(4, { ...fieldArg, description: 'User#lastName' }); - expect(preparingEachEntityField).toHaveBeenNthCalledWith(5, { ...fieldArg, description: 'Authority#name' }); - expect(preparingEachEntityField).toHaveBeenNthCalledWith(6, { ...fieldArg, description: 'One#id' }); - expect(preparingEachEntityField).toHaveBeenNthCalledWith(7, { ...fieldArg, description: 'Two#id' }); - expect(preparingEachEntityField).toHaveBeenNthCalledWith(8, { ...fieldArg, description: 'Two#name' }); - expect(preparingEachEntityField).toHaveBeenNthCalledWith(9, { ...fieldArg, description: 'Three#id' }); - - expect(preparingEachEntityRelationship).toBeCalledTimes(3); - expect(preparingEachEntityRelationship).toHaveBeenNthCalledWith(1, { ...relationshipArg, description: 'One#two' }); - expect(preparingEachEntityRelationship).toHaveBeenNthCalledWith(2, { ...relationshipArg, description: 'Two#one' }); - expect(preparingEachEntityRelationship).toHaveBeenNthCalledWith(3, { ...relationshipArg, description: 'Two#three' }); - - expect(postPreparingEachEntity).toBeCalledTimes(5); + // Ommit UserManagement fields + expect(preparingEachEntityField).toHaveBeenNthCalledWith(25, { ...fieldArg, description: 'Authority#name' }); + expect(preparingEachEntityField).toHaveBeenNthCalledWith(26, { ...fieldArg, description: 'One#id' }); + expect(preparingEachEntityField).toHaveBeenNthCalledWith(27, { ...fieldArg, description: 'Two#id' }); + expect(preparingEachEntityField).toHaveBeenNthCalledWith(28, { ...fieldArg, description: 'Two#name' }); + expect(preparingEachEntityField).toHaveBeenNthCalledWith(29, { ...fieldArg, description: 'Three#id' }); + + expect(preparingEachEntityRelationship).toBeCalledTimes(4); + // Ommit UserManagement relationships + expect(preparingEachEntityRelationship).toHaveBeenNthCalledWith(2, { ...relationshipArg, description: 'One#two' }); + expect(preparingEachEntityRelationship).toHaveBeenNthCalledWith(3, { ...relationshipArg, description: 'Two#one' }); + expect(preparingEachEntityRelationship).toHaveBeenNthCalledWith(4, { ...relationshipArg, description: 'Two#three' }); + + expect(postPreparingEachEntity).toBeCalledTimes(6); expect(postPreparingEachEntity).toHaveBeenNthCalledWith(1, { ...entityArg, entityName: 'User' }); - expect(postPreparingEachEntity).toHaveBeenNthCalledWith(2, { ...entityArg, entityName: 'Authority' }); - expect(postPreparingEachEntity).toHaveBeenNthCalledWith(3, { ...entityArg, entityName: 'One' }); - expect(postPreparingEachEntity).toHaveBeenNthCalledWith(4, { ...entityArg, entityName: 'Two' }); - expect(postPreparingEachEntity).toHaveBeenNthCalledWith(5, { ...entityArg, entityName: 'Three' }); + expect(postPreparingEachEntity).toHaveBeenNthCalledWith(2, { ...entityArg, entityName: 'UserManagement' }); + expect(postPreparingEachEntity).toHaveBeenNthCalledWith(3, { ...entityArg, entityName: 'Authority' }); + expect(postPreparingEachEntity).toHaveBeenNthCalledWith(4, { ...entityArg, entityName: 'One' }); + expect(postPreparingEachEntity).toHaveBeenNthCalledWith(5, { ...entityArg, entityName: 'Two' }); + expect(postPreparingEachEntity).toHaveBeenNthCalledWith(6, { ...entityArg, entityName: 'Three' }); expect(defaultTask).toBeCalledWith(entitiesArg); diff --git a/generators/base-application/support/prepare-entity.ts b/generators/base-application/support/prepare-entity.ts index 1a8b4d9a0d9c..2f12f161c6a8 100644 --- a/generators/base-application/support/prepare-entity.ts +++ b/generators/base-application/support/prepare-entity.ts @@ -77,6 +77,7 @@ const BASE_TEMPLATE_DATA = { entityAuthority: undefined, entityReadAuthority: undefined, adminEntity: undefined, + builtInUserManagement: undefined, requiresPersistableImplementation: false, updatableEntity: undefined, @@ -209,8 +210,11 @@ export default function prepareEntity(entityWithConfig, generator, application) }); mutateData(entityWithConfig, { - entityFileName: data => - data.entityFileName ?? kebabCase(entityWithConfig.entityNameCapitalized + upperFirst(entityWithConfig.entityAngularJSSuffix)), + __override__: false, + entityFileName: data => kebabCase(data.entityNameCapitalized + upperFirst(data.entityAngularJSSuffix)), + entityAngularName: data => data.entityClass + upperFirstCamelCase(entityWithConfig.entityAngularJSSuffix), + entityAngularNamePlural: data => pluralize(data.entityAngularName), + entityApiUrl: data => data.entityNamePluralizedAndSpinalCased, }); entityWithConfig.entityFolderName = entityWithConfig.clientRootFolder ? `${entityWithConfig.clientRootFolder}/${entityWithConfig.entityFileName}` @@ -220,11 +224,8 @@ export default function prepareEntity(entityWithConfig, generator, application) entityWithConfig.entityPluralFileName = entityWithConfig.entityNamePluralizedAndSpinalCased + entityWithConfig.entityAngularJSSuffix; entityWithConfig.entityServiceFileName = entityWithConfig.entityFileName; - entityWithConfig.entityAngularName = entityWithConfig.entityClass + upperFirstCamelCase(entityWithConfig.entityAngularJSSuffix); - entityWithConfig.entityAngularNamePlural = pluralize(entityWithConfig.entityAngularName); entityWithConfig.entityReactName = entityWithConfig.entityClass + upperFirstCamelCase(entityWithConfig.entityAngularJSSuffix); - entityWithConfig.entityApiUrl = entityWithConfig.entityNamePluralizedAndSpinalCased; entityWithConfig.entityStateName = kebabCase(entityWithConfig.entityAngularName); entityWithConfig.entityUrl = entityWithConfig.entityStateName; @@ -248,9 +249,10 @@ export default function prepareEntity(entityWithConfig, generator, application) const { microserviceName, entityFileName, microfrontend } = entityWithConfig; entityWithConfig.entityApi = microserviceName ? `services/${microserviceName.toLowerCase()}/` : ''; entityWithConfig.entityPage = - microfrontend && microserviceName && entityWithConfig.applicationType === MICROSERVICE + entityWithConfig.entityPage ?? + (microfrontend && microserviceName && entityWithConfig.applicationType === MICROSERVICE ? `${microserviceName.toLowerCase()}/${entityFileName}` - : `${entityFileName}`; + : `${entityFileName}`); const hasBuiltInUserField = entityWithConfig.relationships.some(relationship => relationship.otherEntity.builtInUser); entityWithConfig.saveUserSnapshot = diff --git a/generators/base-application/support/prepare-relationship.js b/generators/base-application/support/prepare-relationship.js index 492fe5cbcab5..04e83ec5d245 100644 --- a/generators/base-application/support/prepare-relationship.js +++ b/generators/base-application/support/prepare-relationship.js @@ -90,6 +90,7 @@ export default function prepareRelationship(entityWithConfig, relationship, gene }); } else if ( !ignoreMissingRequiredRelationship && + !relationship.relationshipIgnoreBackReference && entityWithConfig.databaseType !== NEO4J && entityWithConfig.databaseType !== DATABASE_NO && (relationship.relationshipType === 'one-to-many' || relationship.ownerSide === false) diff --git a/generators/base-application/types.d.ts b/generators/base-application/types.d.ts index c5753e191fe5..e507cca66c5c 100644 --- a/generators/base-application/types.d.ts +++ b/generators/base-application/types.d.ts @@ -56,13 +56,16 @@ type ApplicationType = DeterministicOptionWithDerivedProperties< type UserManagement = | { skipUserManagement: true; + generateUserManagement: false; generateBuiltInUserEntity?: false; generateBuiltInAuthorityEntity: false; } | { skipUserManagement: false; generateBuiltInUserEntity?: boolean; + generateUserManagement: true; user: any; + userManagement: any; generateBuiltInAuthorityEntity: boolean; authority: any; }; @@ -76,6 +79,7 @@ type Oauth2Application = { generateBuiltInUserEntity?: boolean; user: any; generateBuiltInAuthorityEntity: false; + generateUserManagement: false; }; type SessionApplication = UserManagement & { diff --git a/generators/base/support/config.ts b/generators/base/support/config.ts index e695f70f57b9..ce4954a7aaad 100644 --- a/generators/base/support/config.ts +++ b/generators/base/support/config.ts @@ -74,11 +74,22 @@ export const pickFields = (source: Record, fields: (string * { prop: ({ prop }) => prop + '-bar', prop2: 'won\'t override' }, * ); */ -export const mutateData = (context: Record, ...mutations: Record[]) => { +export const mutateData = ( + context: Record, + ...mutations: Array< + Record & { + /** Set to false if you don't want functions to override the value */ + __override__?: boolean; + } + > +) => { for (const mutation of mutations) { - for (const [key, value] of Object.entries(mutation)) { + const override = mutation.__override__; + for (const [key, value] of Object.entries(mutation).filter(([key]) => key !== '__override__')) { if (typeof value === 'function') { - context[key] = value(context); + if (override !== false || context[key] === undefined) { + context[key] = value(context); + } } else if (context[key] === undefined) { context[key] = value; } diff --git a/generators/bootstrap-application-base/generator.ts b/generators/bootstrap-application-base/generator.ts index 657537e2d638..78b1fc4ad7b5 100644 --- a/generators/bootstrap-application-base/generator.ts +++ b/generators/bootstrap-application-base/generator.ts @@ -33,7 +33,7 @@ import { prepareField as prepareFieldForTemplates, prepareRelationship, } from '../base-application/support/index.js'; -import { createAuthorityEntity, createUserEntity } from './utils.js'; +import { createAuthorityEntity, createUserEntity, createUserManagementEntity } from './utils.js'; import { JAVA_DOCKER_DIR } from '../generator-constants.js'; import { GENERATOR_BOOTSTRAP, GENERATOR_BOOTSTRAP_APPLICATION_BASE, GENERATOR_COMMON, GENERATOR_PROJECT_NAME } from '../generator-list.js'; import { packageJson } from '../../lib/index.js'; @@ -233,6 +233,24 @@ export default class BootstrapApplicationBase extends BaseApplicationGenerator { application.user = user; } }, + loadUserManagement({ application, entitiesToLoad }) { + if (application.generateBuiltInUserEntity && application.generateUserManagement) { + if (this.sharedData.hasEntity('UserManagement')) { + throw new Error("Fail to bootstrap 'User', already exists."); + } + + const customUserManagement = entitiesToLoad.find(entityToLoad => entityToLoad.entityName === 'UserManagement'); + const customUserManagementData: any = customUserManagement?.entityStorage.getAll() ?? {}; + + const userManagement = createUserManagementEntity.call( + this, + { ...customUserManagementData, ...customUserManagementData.annotations }, + application, + ); + this.sharedData.setEntity('UserManagement', userManagement); + application.userManagement = userManagement; + } + }, loadAuthority({ application, entitiesToLoad }) { if (application.generateBuiltInAuthorityEntity) { const authority = 'Authority'; diff --git a/generators/bootstrap-application-base/utils.js b/generators/bootstrap-application-base/utils.js index d54dae22e664..aac72920cebc 100644 --- a/generators/bootstrap-application-base/utils.js +++ b/generators/bootstrap-application-base/utils.js @@ -19,13 +19,46 @@ import * as _ from 'lodash-es'; import { Validations, authenticationTypes, databaseTypes, fieldTypes } from '../../jdl/jhipster/index.js'; import { loadRequiredConfigIntoEntity } from '../base-application/support/index.js'; +import { PaginationTypes } from '../../jdl/jhipster/entity-options.js'; import { LOGIN_REGEX, LOGIN_REGEX_JS } from '../generator-constants.js'; +import { getDatabaseTypeData } from '../server/support/database.js'; const { CASSANDRA } = databaseTypes; const { OAUTH2 } = authenticationTypes; const { CommonDBTypes } = fieldTypes; -const { STRING: TYPE_STRING } = CommonDBTypes; +const { STRING: TYPE_STRING, BOOLEAN: TYPE_BOOLEAN } = CommonDBTypes; + +const auditableEntityFields = () => [ + { + fieldName: 'createdBy', + fieldType: TYPE_STRING, + readonly: true, + skipServer: true, + builtIn: true, + }, + { + fieldName: 'createdDate', + fieldType: TYPE_STRING, + readonly: true, + skipServer: true, + builtIn: true, + }, + { + fieldName: 'lastModifiedBy', + fieldType: TYPE_STRING, + readonly: true, + skipServer: true, + builtIn: true, + }, + { + fieldName: 'lastModifiedDate', + fieldType: TYPE_STRING, + readonly: true, + skipServer: true, + builtIn: true, + }, +]; const authorityEntityName = 'Authority'; @@ -41,6 +74,7 @@ export function createUserEntity(customUserData = {}, application) { } } + const cassandraOrNoDatabase = application.databaseTypeNo || application.databaseTypeCassandra; // Create entity definition for built-in entity to make easier to deal with relationships. const user = { name: 'User', @@ -57,7 +91,10 @@ export function createUserEntity(customUserData = {}, application) { entityPersistenceLayer: false, entityRestLayer: false, entitySearchLayer: false, - hasImageField: !application.databaseTypeNo && !application.databaseTypeCassandra, + hasImageField: !cassandraOrNoDatabase, + pagination: cassandraOrNoDatabase ? PaginationTypes.NO : PaginationTypes.PAGINATION, + auditableEntity: !cassandraOrNoDatabase, + i18nKeyPrefix: 'userManagement', ...customUserData, }; @@ -77,14 +114,15 @@ export function createUserEntity(customUserData = {}, application) { fieldValidateRulesMaxlength, fieldTranslationKey: 'global.field.id', fieldNameHumanized: 'ID', + readonly: true, id: true, builtIn: true, }, { fieldName: 'login', fieldType: TYPE_STRING, - fieldValidateRules: [Validations.REQUIRED, Validations.MAX, Validations.PATTERN], - fieldValidateRulesMax: 50, + fieldValidateRules: [Validations.REQUIRED, Validations.MAXLENGTH, Validations.PATTERN], + fieldValidateRulesMaxlength: 50, fieldValidateRulesPattern: LOGIN_REGEX_JS, fieldValidateRulesPatternJava: LOGIN_REGEX, builtIn: true, @@ -92,18 +130,99 @@ export function createUserEntity(customUserData = {}, application) { { fieldName: 'firstName', fieldType: TYPE_STRING, + fieldValidateRules: [Validations.MAXLENGTH], + fieldValidateRulesMaxlength: 50, builtIn: true, }, { fieldName: 'lastName', fieldType: TYPE_STRING, + fieldValidateRules: [Validations.MAXLENGTH], + fieldValidateRulesMaxlength: 50, + builtIn: true, + }, + { + fieldName: 'email', + fieldType: TYPE_STRING, + fieldValidateRules: [Validations.REQUIRED, Validations.MAXLENGTH, Validations.MINLENGTH], + fieldValidateRulesMinlength: 5, + fieldValidateRulesMaxlength: 100, + builtIn: true, + }, + ...(user.hasImageField + ? [ + { + fieldName: 'imageUrl', + fieldType: TYPE_STRING, + fieldValidateRules: [Validations.MAXLENGTH], + fieldValidateRulesMaxlength: 256, + builtIn: true, + }, + ] + : []), + { + fieldName: 'activated', + fieldType: TYPE_BOOLEAN, builtIn: true, }, + ...(application.enableTranslation + ? [ + { + fieldName: 'langKey', + fieldType: TYPE_STRING, + builtIn: true, + }, + ] + : []), + ...(user.auditableEntity ? auditableEntityFields() : []), ]); return user; } +export function createUserManagementEntity(customUserManagementData = {}, application) { + const user = createUserEntity.call(this, {}, application); + for (const field of user.fields) { + // Login is used as the id field in rest api. + if (field.fieldName === 'login') { + field.id = true; + } else if (field.fieldName === 'id') { + field.id = false; + field.fieldValidateRules = [Validations.REQUIRED]; + // Set id type fallback since it's not id anymore and will not be calculated. + field.fieldType = field.fieldType ?? getDatabaseTypeData(application.databaseType).defaultPrimaryKeyType; + } + } + + const userManagement = { + ...user, + skipClient: true, + skipServer: true, + clientRootFolder: 'admin-entities', + entityAngularName: 'UserManagement', + entityApiUrl: 'admin/users', + entityFileName: 'user-management', + entityPage: 'user-management', + ...customUserManagementData, + adminEntity: true, + builtInUser: false, + builtInUserManagement: true, + }; + + if (application.generateBuiltInAuthorityEntity) { + addOrExtendRelationships(userManagement.relationships, [ + { + otherEntityName: 'Authority', + relationshipName: 'authority', + relationshipType: 'many-to-many', + relationshipIgnoreBackReference: true, + }, + ]); + } + + return userManagement; +} + export function createAuthorityEntity(customAuthorityData = {}, application) { const entityDefinition = this.getEntityConfig(authorityEntityName)?.getAll(); if (entityDefinition) { @@ -173,3 +292,17 @@ function addOrExtendFields(fields, fieldsToAdd) { } } } + +function addOrExtendRelationships(relationships, relationshipsToAdd) { + relationshipsToAdd = [].concat(relationshipsToAdd); + for (const relationshipToAdd of relationshipsToAdd) { + const { relationshipName: newrelationshipName } = relationshipToAdd; + let relationship = relationships.find(relationship => relationship.relationshipName === newrelationshipName); + if (!relationship) { + relationship = { ...relationshipToAdd }; + relationships.push(relationship); + } else { + _.defaults(relationship, relationshipToAdd); + } + } +} diff --git a/generators/bootstrap-application/generator.spec.ts b/generators/bootstrap-application/generator.spec.ts index 09394cb92e04..1d236c815ad2 100644 --- a/generators/bootstrap-application/generator.spec.ts +++ b/generators/bootstrap-application/generator.spec.ts @@ -46,10 +46,6 @@ const expectedField = () => ({ reference: expect.any(Object), }); -const expectedRelationship = () => ({ - otherEntity: expect.any(Object), -}); - const expectedPrimaryKeyId = () => ({ field: expect.any(Object), }); @@ -78,7 +74,7 @@ const expectedEntity = entity => ({ otherDtoReferences: expect.any(Array), fields: entity.fields.map(expectedField), - relationships: entity.relationships.map(expectedRelationship), + relationships: expect.any(Array), primaryKey: expectedPrimaryKey(entity.primaryKey), reactiveOtherEntities: expect.any(Set), reactiveUniqueEntityTypes: expect.any(Set), @@ -163,6 +159,7 @@ describe(`generator - ${generator}`, () => { expect(Object.keys(runResult.generator.sharedData.getEntitiesMap())).toMatchInlineSnapshot(` [ "User", + "UserManagement", "Authority", "EntityA", ] @@ -195,10 +192,12 @@ describe(`generator - ${generator}`, () => { "anyFieldIsZonedDateTime": false, "anyPropertyHasValidation": true, "applicationType": "monolith", + "auditableEntity": true, "authenticationType": "jwt", "baseName": "jhipster", "builtIn": true, "builtInUser": true, + "builtInUserManagement": undefined, "changelogDate": "20220129025420", "changelogDateForRecent": 2022-01-29T02:54:20.000Z, "clientFramework": "angular", @@ -357,7 +356,7 @@ describe(`generator - ${generator}`, () => { "blobContentTypeText": false, "builtIn": true, "columnName": "login", - "columnType": "varchar(255)", + "columnType": "varchar(50)", "createRandexp": Any, "entity": Any, "fieldInJavaBeanMethod": "Login", @@ -367,7 +366,7 @@ describe(`generator - ${generator}`, () => { "fieldNameCapitalized": "Login", "fieldNameHumanized": "Login", "fieldNameUnderscored": "login", - "fieldTranslationKey": "jhipsterApp.user.login", + "fieldTranslationKey": "userManagement.login", "fieldType": "String", "fieldTypeAnyBlob": false, "fieldTypeBigDecimal": false, @@ -395,17 +394,17 @@ describe(`generator - ${generator}`, () => { "fieldValidate": true, "fieldValidateRules": [ "required", - "max", + "maxlength", "pattern", ], - "fieldValidateRulesMax": 50, + "fieldValidateRulesMaxlength": 50, "fieldValidateRulesPattern": "^[a-zA-Z0-9!$&*+=?^_\`{|}~.-]+@[a-zA-Z0-9-]+(?:\\\\.[a-zA-Z0-9-]+)*$|^[_.@A-Za-z0-9-]+$", "fieldValidateRulesPatternAngular": "^[a-zA-Z0-9!$&*+=?^_\`{|}~.-]+@[a-zA-Z0-9-]+(?:\\\\.[a-zA-Z0-9-]+)*$|^[_.@A-Za-z0-9-]+$", "fieldValidateRulesPatternJava": "^(?>[a-zA-Z0-9!$&*+=?^_\`{|}~.-]+@[a-zA-Z0-9-]+(?:\\\\.[a-zA-Z0-9-]+)*)|(?>[_.@A-Za-z0-9-]+)$", "fieldValidateRulesPatternReact": "^[a-zA-Z0-9!$&*+=?^_\`{|}~.-]+@[a-zA-Z0-9-]+(?:\\\\.[a-zA-Z0-9-]+)*$|^[_.@A-Za-z0-9-]+$", - "fieldValidationMax": true, + "fieldValidationMax": false, "fieldValidationMaxBytes": false, - "fieldValidationMaxLength": false, + "fieldValidationMaxLength": true, "fieldValidationMin": false, "fieldValidationMinBytes": false, "fieldValidationMinLength": false, @@ -420,6 +419,7 @@ describe(`generator - ${generator}`, () => { "javaValueSample1": ""login1"", "javaValueSample2": ""login2"", "loadColumnType": "string", + "maxlength": 50, "nullable": false, "path": [ "login", @@ -440,7 +440,7 @@ describe(`generator - ${generator}`, () => { "blobContentTypeText": false, "builtIn": true, "columnName": "first_name", - "columnType": "varchar(255)", + "columnType": "varchar(50)", "createRandexp": Any, "entity": Any, "fieldInJavaBeanMethod": "FirstName", @@ -450,7 +450,7 @@ describe(`generator - ${generator}`, () => { "fieldNameCapitalized": "FirstName", "fieldNameHumanized": "First Name", "fieldNameUnderscored": "first_name", - "fieldTranslationKey": "jhipsterApp.user.firstName", + "fieldTranslationKey": "userManagement.firstName", "fieldType": "String", "fieldTypeAnyBlob": false, "fieldTypeBigDecimal": false, @@ -475,13 +475,17 @@ describe(`generator - ${generator}`, () => { "fieldTypeTimed": false, "fieldTypeUUID": false, "fieldTypeZonedDateTime": false, - "fieldValidate": false, + "fieldValidate": true, + "fieldValidateRules": [ + "maxlength", + ], + "fieldValidateRulesMaxlength": 50, "fieldValidateRulesPatternAngular": undefined, "fieldValidateRulesPatternJava": undefined, "fieldValidateRulesPatternReact": undefined, "fieldValidationMax": false, "fieldValidationMaxBytes": false, - "fieldValidationMaxLength": false, + "fieldValidationMaxLength": true, "fieldValidationMin": false, "fieldValidationMinBytes": false, "fieldValidationMinLength": false, @@ -496,6 +500,7 @@ describe(`generator - ${generator}`, () => { "javaValueSample1": ""firstName1"", "javaValueSample2": ""firstName2"", "loadColumnType": "string", + "maxlength": 50, "nullable": true, "path": [ "firstName", @@ -516,7 +521,7 @@ describe(`generator - ${generator}`, () => { "blobContentTypeText": false, "builtIn": true, "columnName": "last_name", - "columnType": "varchar(255)", + "columnType": "varchar(50)", "createRandexp": Any, "entity": Any, "fieldInJavaBeanMethod": "LastName", @@ -526,7 +531,7 @@ describe(`generator - ${generator}`, () => { "fieldNameCapitalized": "LastName", "fieldNameHumanized": "Last Name", "fieldNameUnderscored": "last_name", - "fieldTranslationKey": "jhipsterApp.user.lastName", + "fieldTranslationKey": "userManagement.lastName", "fieldType": "String", "fieldTypeAnyBlob": false, "fieldTypeBigDecimal": false, @@ -551,13 +556,17 @@ describe(`generator - ${generator}`, () => { "fieldTypeTimed": false, "fieldTypeUUID": false, "fieldTypeZonedDateTime": false, - "fieldValidate": false, + "fieldValidate": true, + "fieldValidateRules": [ + "maxlength", + ], + "fieldValidateRulesMaxlength": 50, "fieldValidateRulesPatternAngular": undefined, "fieldValidateRulesPatternJava": undefined, "fieldValidateRulesPatternReact": undefined, "fieldValidationMax": false, "fieldValidationMaxBytes": false, - "fieldValidationMaxLength": false, + "fieldValidationMaxLength": true, "fieldValidationMin": false, "fieldValidationMinBytes": false, "fieldValidationMinLength": false, @@ -572,6 +581,7 @@ describe(`generator - ${generator}`, () => { "javaValueSample1": ""lastName1"", "javaValueSample2": ""lastName2"", "loadColumnType": "string", + "maxlength": 50, "nullable": true, "path": [ "lastName", @@ -586,40 +596,666 @@ describe(`generator - ${generator}`, () => { "unique": false, "uniqueValue": [], }, - ], - "fieldsContainNoOwnerOneToOne": false, - "fluentMethods": true, - "frontendAppName": "jhipsterApp", - "generateFakeData": Any, - "hasCyclicRequiredRelationship": false, - "hasImageField": true, - "i18nAlertHeaderPrefix": "jhipsterApp.user", - "i18nKeyPrefix": "jhipsterApp.user", - "implementsEagerLoadApis": false, - "importApiModelProperty": false, - "isUsingMapsId": false, - "jhiPrefix": "jhi", - "jhiTablePrefix": "jhi", - "jpaMetamodelFiltering": false, - "mapsIdAssoc": null, - "microfrontend": false, - "microserviceAppName": "", - "microserviceName": undefined, - "name": "User", - "officialDatabaseType": "SQL", - "otherDtoReferences": Any, - "otherEntities": Any, - "otherEntitiesWithPersistableRelationship": [], - "otherEntityPrimaryKeyTypes": [], - "otherEntityPrimaryKeyTypesIncludesUUID": false, - "otherReferences": Any, - "otherRelationships": [], - "packageFolder": "com/mycompany/myapp/", - "packageName": "com.mycompany.myapp", - "pagination": "no", - "paginationInfiniteScroll": false, - "paginationNo": true, - "paginationPagination": false, + { + "blobContentTypeAny": false, + "blobContentTypeImage": false, + "blobContentTypeText": false, + "builtIn": true, + "columnName": "email", + "columnType": "varchar(100)", + "createRandexp": Any, + "entity": Any, + "fieldInJavaBeanMethod": "Email", + "fieldIsEnum": false, + "fieldName": "email", + "fieldNameAsDatabaseColumn": "email", + "fieldNameCapitalized": "Email", + "fieldNameHumanized": "Email", + "fieldNameUnderscored": "email", + "fieldTranslationKey": "userManagement.email", + "fieldType": "String", + "fieldTypeAnyBlob": false, + "fieldTypeBigDecimal": false, + "fieldTypeBinary": false, + "fieldTypeBlob": false, + "fieldTypeBoolean": false, + "fieldTypeByteBuffer": false, + "fieldTypeBytes": false, + "fieldTypeCharSequence": true, + "fieldTypeDouble": false, + "fieldTypeDuration": false, + "fieldTypeFloat": false, + "fieldTypeImageBlob": false, + "fieldTypeInstant": false, + "fieldTypeInteger": false, + "fieldTypeLocalDate": false, + "fieldTypeLong": false, + "fieldTypeNumeric": false, + "fieldTypeString": true, + "fieldTypeTemporal": false, + "fieldTypeTextBlob": false, + "fieldTypeTimed": false, + "fieldTypeUUID": false, + "fieldTypeZonedDateTime": false, + "fieldValidate": true, + "fieldValidateRules": [ + "required", + "maxlength", + "minlength", + ], + "fieldValidateRulesMaxlength": 100, + "fieldValidateRulesMinlength": 5, + "fieldValidateRulesPatternAngular": undefined, + "fieldValidateRulesPatternJava": undefined, + "fieldValidateRulesPatternReact": undefined, + "fieldValidationMax": false, + "fieldValidationMaxBytes": false, + "fieldValidationMaxLength": true, + "fieldValidationMin": false, + "fieldValidationMinBytes": false, + "fieldValidationMinLength": true, + "fieldValidationPattern": false, + "fieldValidationRequired": true, + "fieldValidationUnique": false, + "fieldWithContentType": false, + "filterableField": true, + "generateFakeData": Any, + "javaFieldType": "String", + "javaValueGenerator": "UUID.randomUUID().toString()", + "javaValueSample1": ""email1"", + "javaValueSample2": ""email2"", + "loadColumnType": "string", + "maxlength": 100, + "nullable": false, + "path": [ + "email", + ], + "propertyName": "email", + "propertyNameCapitalized": "Email", + "reference": Any, + "relationshipsPath": [], + "shouldCreateContentType": false, + "shouldDropDefaultValue": false, + "tsType": "string", + "unique": false, + "uniqueValue": [], + }, + { + "blobContentTypeAny": false, + "blobContentTypeImage": false, + "blobContentTypeText": false, + "builtIn": true, + "columnName": "image_url", + "columnType": "varchar(256)", + "createRandexp": Any, + "entity": Any, + "fieldInJavaBeanMethod": "ImageUrl", + "fieldIsEnum": false, + "fieldName": "imageUrl", + "fieldNameAsDatabaseColumn": "image_url", + "fieldNameCapitalized": "ImageUrl", + "fieldNameHumanized": "Image Url", + "fieldNameUnderscored": "image_url", + "fieldTranslationKey": "userManagement.imageUrl", + "fieldType": "String", + "fieldTypeAnyBlob": false, + "fieldTypeBigDecimal": false, + "fieldTypeBinary": false, + "fieldTypeBlob": false, + "fieldTypeBoolean": false, + "fieldTypeByteBuffer": false, + "fieldTypeBytes": false, + "fieldTypeCharSequence": true, + "fieldTypeDouble": false, + "fieldTypeDuration": false, + "fieldTypeFloat": false, + "fieldTypeImageBlob": false, + "fieldTypeInstant": false, + "fieldTypeInteger": false, + "fieldTypeLocalDate": false, + "fieldTypeLong": false, + "fieldTypeNumeric": false, + "fieldTypeString": true, + "fieldTypeTemporal": false, + "fieldTypeTextBlob": false, + "fieldTypeTimed": false, + "fieldTypeUUID": false, + "fieldTypeZonedDateTime": false, + "fieldValidate": true, + "fieldValidateRules": [ + "maxlength", + ], + "fieldValidateRulesMaxlength": 256, + "fieldValidateRulesPatternAngular": undefined, + "fieldValidateRulesPatternJava": undefined, + "fieldValidateRulesPatternReact": undefined, + "fieldValidationMax": false, + "fieldValidationMaxBytes": false, + "fieldValidationMaxLength": true, + "fieldValidationMin": false, + "fieldValidationMinBytes": false, + "fieldValidationMinLength": false, + "fieldValidationPattern": false, + "fieldValidationRequired": false, + "fieldValidationUnique": false, + "fieldWithContentType": false, + "filterableField": true, + "generateFakeData": Any, + "javaFieldType": "String", + "javaValueGenerator": "UUID.randomUUID().toString()", + "javaValueSample1": ""imageUrl1"", + "javaValueSample2": ""imageUrl2"", + "loadColumnType": "string", + "maxlength": 256, + "nullable": true, + "path": [ + "imageUrl", + ], + "propertyName": "imageUrl", + "propertyNameCapitalized": "ImageUrl", + "reference": Any, + "relationshipsPath": [], + "shouldCreateContentType": false, + "shouldDropDefaultValue": false, + "tsType": "string", + "unique": false, + "uniqueValue": [], + }, + { + "blobContentTypeAny": false, + "blobContentTypeImage": false, + "blobContentTypeText": false, + "builtIn": true, + "columnName": "activated", + "columnType": "boolean", + "createRandexp": Any, + "entity": Any, + "fieldInJavaBeanMethod": "Activated", + "fieldIsEnum": false, + "fieldName": "activated", + "fieldNameAsDatabaseColumn": "activated", + "fieldNameCapitalized": "Activated", + "fieldNameHumanized": "Activated", + "fieldNameUnderscored": "activated", + "fieldTranslationKey": "userManagement.activated", + "fieldType": "Boolean", + "fieldTypeAnyBlob": false, + "fieldTypeBigDecimal": false, + "fieldTypeBinary": false, + "fieldTypeBlob": false, + "fieldTypeBoolean": true, + "fieldTypeByteBuffer": false, + "fieldTypeBytes": false, + "fieldTypeCharSequence": false, + "fieldTypeDouble": false, + "fieldTypeDuration": false, + "fieldTypeFloat": false, + "fieldTypeImageBlob": false, + "fieldTypeInstant": false, + "fieldTypeInteger": false, + "fieldTypeLocalDate": false, + "fieldTypeLong": false, + "fieldTypeNumeric": false, + "fieldTypeString": false, + "fieldTypeTemporal": false, + "fieldTypeTextBlob": false, + "fieldTypeTimed": false, + "fieldTypeUUID": false, + "fieldTypeZonedDateTime": false, + "fieldValidate": false, + "fieldValidateRulesPatternAngular": undefined, + "fieldValidateRulesPatternJava": undefined, + "fieldValidateRulesPatternReact": undefined, + "fieldValidationMax": false, + "fieldValidationMaxBytes": false, + "fieldValidationMaxLength": false, + "fieldValidationMin": false, + "fieldValidationMinBytes": false, + "fieldValidationMinLength": false, + "fieldValidationPattern": false, + "fieldValidationRequired": false, + "fieldValidationUnique": false, + "fieldWithContentType": false, + "filterableField": true, + "generateFakeData": Any, + "javaFieldType": "Boolean", + "loadColumnType": "boolean", + "nullable": true, + "path": [ + "activated", + ], + "propertyName": "activated", + "propertyNameCapitalized": "Activated", + "reference": Any, + "relationshipsPath": [], + "shouldCreateContentType": false, + "shouldDropDefaultValue": false, + "tsType": "boolean", + "unique": false, + "uniqueValue": [], + }, + { + "blobContentTypeAny": false, + "blobContentTypeImage": false, + "blobContentTypeText": false, + "builtIn": true, + "columnName": "lang_key", + "columnType": "varchar(255)", + "createRandexp": Any, + "entity": Any, + "fieldInJavaBeanMethod": "LangKey", + "fieldIsEnum": false, + "fieldName": "langKey", + "fieldNameAsDatabaseColumn": "lang_key", + "fieldNameCapitalized": "LangKey", + "fieldNameHumanized": "Lang Key", + "fieldNameUnderscored": "lang_key", + "fieldTranslationKey": "userManagement.langKey", + "fieldType": "String", + "fieldTypeAnyBlob": false, + "fieldTypeBigDecimal": false, + "fieldTypeBinary": false, + "fieldTypeBlob": false, + "fieldTypeBoolean": false, + "fieldTypeByteBuffer": false, + "fieldTypeBytes": false, + "fieldTypeCharSequence": true, + "fieldTypeDouble": false, + "fieldTypeDuration": false, + "fieldTypeFloat": false, + "fieldTypeImageBlob": false, + "fieldTypeInstant": false, + "fieldTypeInteger": false, + "fieldTypeLocalDate": false, + "fieldTypeLong": false, + "fieldTypeNumeric": false, + "fieldTypeString": true, + "fieldTypeTemporal": false, + "fieldTypeTextBlob": false, + "fieldTypeTimed": false, + "fieldTypeUUID": false, + "fieldTypeZonedDateTime": false, + "fieldValidate": false, + "fieldValidateRulesPatternAngular": undefined, + "fieldValidateRulesPatternJava": undefined, + "fieldValidateRulesPatternReact": undefined, + "fieldValidationMax": false, + "fieldValidationMaxBytes": false, + "fieldValidationMaxLength": false, + "fieldValidationMin": false, + "fieldValidationMinBytes": false, + "fieldValidationMinLength": false, + "fieldValidationPattern": false, + "fieldValidationRequired": false, + "fieldValidationUnique": false, + "fieldWithContentType": false, + "filterableField": true, + "generateFakeData": Any, + "javaFieldType": "String", + "javaValueGenerator": "UUID.randomUUID().toString()", + "javaValueSample1": ""langKey1"", + "javaValueSample2": ""langKey2"", + "loadColumnType": "string", + "nullable": true, + "path": [ + "langKey", + ], + "propertyName": "langKey", + "propertyNameCapitalized": "LangKey", + "reference": Any, + "relationshipsPath": [], + "shouldCreateContentType": false, + "shouldDropDefaultValue": false, + "tsType": "string", + "unique": false, + "uniqueValue": [], + }, + { + "blobContentTypeAny": false, + "blobContentTypeImage": false, + "blobContentTypeText": false, + "builtIn": true, + "columnName": "created_by", + "columnType": "varchar(255)", + "createRandexp": Any, + "entity": Any, + "fieldInJavaBeanMethod": "CreatedBy", + "fieldIsEnum": false, + "fieldName": "createdBy", + "fieldNameAsDatabaseColumn": "created_by", + "fieldNameCapitalized": "CreatedBy", + "fieldNameHumanized": "Created By", + "fieldNameUnderscored": "created_by", + "fieldTranslationKey": "userManagement.createdBy", + "fieldType": "String", + "fieldTypeAnyBlob": false, + "fieldTypeBigDecimal": false, + "fieldTypeBinary": false, + "fieldTypeBlob": false, + "fieldTypeBoolean": false, + "fieldTypeByteBuffer": false, + "fieldTypeBytes": false, + "fieldTypeCharSequence": true, + "fieldTypeDouble": false, + "fieldTypeDuration": false, + "fieldTypeFloat": false, + "fieldTypeImageBlob": false, + "fieldTypeInstant": false, + "fieldTypeInteger": false, + "fieldTypeLocalDate": false, + "fieldTypeLong": false, + "fieldTypeNumeric": false, + "fieldTypeString": true, + "fieldTypeTemporal": false, + "fieldTypeTextBlob": false, + "fieldTypeTimed": false, + "fieldTypeUUID": false, + "fieldTypeZonedDateTime": false, + "fieldValidate": false, + "fieldValidateRulesPatternAngular": undefined, + "fieldValidateRulesPatternJava": undefined, + "fieldValidateRulesPatternReact": undefined, + "fieldValidationMax": false, + "fieldValidationMaxBytes": false, + "fieldValidationMaxLength": false, + "fieldValidationMin": false, + "fieldValidationMinBytes": false, + "fieldValidationMinLength": false, + "fieldValidationPattern": false, + "fieldValidationRequired": false, + "fieldValidationUnique": false, + "fieldWithContentType": false, + "filterableField": true, + "generateFakeData": Any, + "javaFieldType": "String", + "javaValueGenerator": "UUID.randomUUID().toString()", + "javaValueSample1": ""createdBy1"", + "javaValueSample2": ""createdBy2"", + "loadColumnType": "string", + "nullable": true, + "path": [ + "createdBy", + ], + "propertyName": "createdBy", + "propertyNameCapitalized": "CreatedBy", + "readonly": true, + "reference": Any, + "relationshipsPath": [], + "shouldCreateContentType": false, + "shouldDropDefaultValue": false, + "skipServer": true, + "tsType": "string", + "unique": false, + "uniqueValue": [], + }, + { + "blobContentTypeAny": false, + "blobContentTypeImage": false, + "blobContentTypeText": false, + "builtIn": true, + "columnName": "created_date", + "columnType": "varchar(255)", + "createRandexp": Any, + "entity": Any, + "fieldInJavaBeanMethod": "CreatedDate", + "fieldIsEnum": false, + "fieldName": "createdDate", + "fieldNameAsDatabaseColumn": "created_date", + "fieldNameCapitalized": "CreatedDate", + "fieldNameHumanized": "Created Date", + "fieldNameUnderscored": "created_date", + "fieldTranslationKey": "userManagement.createdDate", + "fieldType": "String", + "fieldTypeAnyBlob": false, + "fieldTypeBigDecimal": false, + "fieldTypeBinary": false, + "fieldTypeBlob": false, + "fieldTypeBoolean": false, + "fieldTypeByteBuffer": false, + "fieldTypeBytes": false, + "fieldTypeCharSequence": true, + "fieldTypeDouble": false, + "fieldTypeDuration": false, + "fieldTypeFloat": false, + "fieldTypeImageBlob": false, + "fieldTypeInstant": false, + "fieldTypeInteger": false, + "fieldTypeLocalDate": false, + "fieldTypeLong": false, + "fieldTypeNumeric": false, + "fieldTypeString": true, + "fieldTypeTemporal": false, + "fieldTypeTextBlob": false, + "fieldTypeTimed": false, + "fieldTypeUUID": false, + "fieldTypeZonedDateTime": false, + "fieldValidate": false, + "fieldValidateRulesPatternAngular": undefined, + "fieldValidateRulesPatternJava": undefined, + "fieldValidateRulesPatternReact": undefined, + "fieldValidationMax": false, + "fieldValidationMaxBytes": false, + "fieldValidationMaxLength": false, + "fieldValidationMin": false, + "fieldValidationMinBytes": false, + "fieldValidationMinLength": false, + "fieldValidationPattern": false, + "fieldValidationRequired": false, + "fieldValidationUnique": false, + "fieldWithContentType": false, + "filterableField": true, + "generateFakeData": Any, + "javaFieldType": "String", + "javaValueGenerator": "UUID.randomUUID().toString()", + "javaValueSample1": ""createdDate1"", + "javaValueSample2": ""createdDate2"", + "loadColumnType": "string", + "nullable": true, + "path": [ + "createdDate", + ], + "propertyName": "createdDate", + "propertyNameCapitalized": "CreatedDate", + "readonly": true, + "reference": Any, + "relationshipsPath": [], + "shouldCreateContentType": false, + "shouldDropDefaultValue": false, + "skipServer": true, + "tsType": "string", + "unique": false, + "uniqueValue": [], + }, + { + "blobContentTypeAny": false, + "blobContentTypeImage": false, + "blobContentTypeText": false, + "builtIn": true, + "columnName": "last_modified_by", + "columnType": "varchar(255)", + "createRandexp": Any, + "entity": Any, + "fieldInJavaBeanMethod": "LastModifiedBy", + "fieldIsEnum": false, + "fieldName": "lastModifiedBy", + "fieldNameAsDatabaseColumn": "last_modified_by", + "fieldNameCapitalized": "LastModifiedBy", + "fieldNameHumanized": "Last Modified By", + "fieldNameUnderscored": "last_modified_by", + "fieldTranslationKey": "userManagement.lastModifiedBy", + "fieldType": "String", + "fieldTypeAnyBlob": false, + "fieldTypeBigDecimal": false, + "fieldTypeBinary": false, + "fieldTypeBlob": false, + "fieldTypeBoolean": false, + "fieldTypeByteBuffer": false, + "fieldTypeBytes": false, + "fieldTypeCharSequence": true, + "fieldTypeDouble": false, + "fieldTypeDuration": false, + "fieldTypeFloat": false, + "fieldTypeImageBlob": false, + "fieldTypeInstant": false, + "fieldTypeInteger": false, + "fieldTypeLocalDate": false, + "fieldTypeLong": false, + "fieldTypeNumeric": false, + "fieldTypeString": true, + "fieldTypeTemporal": false, + "fieldTypeTextBlob": false, + "fieldTypeTimed": false, + "fieldTypeUUID": false, + "fieldTypeZonedDateTime": false, + "fieldValidate": false, + "fieldValidateRulesPatternAngular": undefined, + "fieldValidateRulesPatternJava": undefined, + "fieldValidateRulesPatternReact": undefined, + "fieldValidationMax": false, + "fieldValidationMaxBytes": false, + "fieldValidationMaxLength": false, + "fieldValidationMin": false, + "fieldValidationMinBytes": false, + "fieldValidationMinLength": false, + "fieldValidationPattern": false, + "fieldValidationRequired": false, + "fieldValidationUnique": false, + "fieldWithContentType": false, + "filterableField": true, + "generateFakeData": Any, + "javaFieldType": "String", + "javaValueGenerator": "UUID.randomUUID().toString()", + "javaValueSample1": ""lastModifiedBy1"", + "javaValueSample2": ""lastModifiedBy2"", + "loadColumnType": "string", + "nullable": true, + "path": [ + "lastModifiedBy", + ], + "propertyName": "lastModifiedBy", + "propertyNameCapitalized": "LastModifiedBy", + "readonly": true, + "reference": Any, + "relationshipsPath": [], + "shouldCreateContentType": false, + "shouldDropDefaultValue": false, + "skipServer": true, + "tsType": "string", + "unique": false, + "uniqueValue": [], + }, + { + "blobContentTypeAny": false, + "blobContentTypeImage": false, + "blobContentTypeText": false, + "builtIn": true, + "columnName": "last_modified_date", + "columnType": "varchar(255)", + "createRandexp": Any, + "entity": Any, + "fieldInJavaBeanMethod": "LastModifiedDate", + "fieldIsEnum": false, + "fieldName": "lastModifiedDate", + "fieldNameAsDatabaseColumn": "last_modified_date", + "fieldNameCapitalized": "LastModifiedDate", + "fieldNameHumanized": "Last Modified Date", + "fieldNameUnderscored": "last_modified_date", + "fieldTranslationKey": "userManagement.lastModifiedDate", + "fieldType": "String", + "fieldTypeAnyBlob": false, + "fieldTypeBigDecimal": false, + "fieldTypeBinary": false, + "fieldTypeBlob": false, + "fieldTypeBoolean": false, + "fieldTypeByteBuffer": false, + "fieldTypeBytes": false, + "fieldTypeCharSequence": true, + "fieldTypeDouble": false, + "fieldTypeDuration": false, + "fieldTypeFloat": false, + "fieldTypeImageBlob": false, + "fieldTypeInstant": false, + "fieldTypeInteger": false, + "fieldTypeLocalDate": false, + "fieldTypeLong": false, + "fieldTypeNumeric": false, + "fieldTypeString": true, + "fieldTypeTemporal": false, + "fieldTypeTextBlob": false, + "fieldTypeTimed": false, + "fieldTypeUUID": false, + "fieldTypeZonedDateTime": false, + "fieldValidate": false, + "fieldValidateRulesPatternAngular": undefined, + "fieldValidateRulesPatternJava": undefined, + "fieldValidateRulesPatternReact": undefined, + "fieldValidationMax": false, + "fieldValidationMaxBytes": false, + "fieldValidationMaxLength": false, + "fieldValidationMin": false, + "fieldValidationMinBytes": false, + "fieldValidationMinLength": false, + "fieldValidationPattern": false, + "fieldValidationRequired": false, + "fieldValidationUnique": false, + "fieldWithContentType": false, + "filterableField": true, + "generateFakeData": Any, + "javaFieldType": "String", + "javaValueGenerator": "UUID.randomUUID().toString()", + "javaValueSample1": ""lastModifiedDate1"", + "javaValueSample2": ""lastModifiedDate2"", + "loadColumnType": "string", + "nullable": true, + "path": [ + "lastModifiedDate", + ], + "propertyName": "lastModifiedDate", + "propertyNameCapitalized": "LastModifiedDate", + "readonly": true, + "reference": Any, + "relationshipsPath": [], + "shouldCreateContentType": false, + "shouldDropDefaultValue": false, + "skipServer": true, + "tsType": "string", + "unique": false, + "uniqueValue": [], + }, + ], + "fieldsContainNoOwnerOneToOne": false, + "fluentMethods": true, + "frontendAppName": "jhipsterApp", + "generateFakeData": Any, + "hasCyclicRequiredRelationship": false, + "hasImageField": true, + "i18nAlertHeaderPrefix": "userManagement", + "i18nKeyPrefix": "userManagement", + "implementsEagerLoadApis": false, + "importApiModelProperty": false, + "isUsingMapsId": false, + "jhiPrefix": "jhi", + "jhiTablePrefix": "jhi", + "jpaMetamodelFiltering": false, + "mapsIdAssoc": null, + "microfrontend": false, + "microserviceAppName": "", + "microserviceName": undefined, + "name": "User", + "officialDatabaseType": "SQL", + "otherDtoReferences": Any, + "otherEntities": Any, + "otherEntitiesWithPersistableRelationship": [], + "otherEntityPrimaryKeyTypes": [], + "otherEntityPrimaryKeyTypesIncludesUUID": false, + "otherReferences": Any, + "otherRelationships": [], + "packageFolder": "com/mycompany/myapp/", + "packageName": "com.mycompany.myapp", + "pagination": "pagination", + "paginationInfiniteScroll": false, + "paginationNo": false, + "paginationPagination": true, "persistClass": "User", "persistInstance": "user", "persistableOtherEntities": [], @@ -667,7 +1303,7 @@ describe(`generator - ${generator}`, () => { "reactiveUniqueEntityTypes": Any, "readOnly": false, "regularEagerRelations": Any, - "relationships": [], + "relationships": Any, "relationshipsByOtherEntity": {}, "relationshipsContainEagerLoad": false, "relationshipsContainOtherSideIgnore": false, @@ -727,6 +1363,7 @@ describe(`generator - ${generator}`, () => { "applicationType": "monolith", "authenticationType": "jwt", "baseName": "jhipster", + "builtInUserManagement": undefined, "changelogDate": "20220129025419", "changelogDateForRecent": 2022-01-29T02:54:19.000Z, "clientFramework": "angular", @@ -951,7 +1588,7 @@ describe(`generator - ${generator}`, () => { "reactiveUniqueEntityTypes": Any, "readOnly": false, "regularEagerRelations": Any, - "relationships": [], + "relationships": Any, "relationshipsByOtherEntity": {}, "relationshipsContainEagerLoad": false, "relationshipsContainOtherSideIgnore": false, @@ -1064,6 +1701,7 @@ describe(`generator - ${generator}`, () => { "applicationType": "monolith", "authenticationType": "jwt", "baseName": "jhipster", + "builtInUserManagement": undefined, "changelogDate": "20220129025419", "changelogDateForRecent": 2022-01-29T02:54:19.000Z, "clientFramework": "angular", @@ -1288,7 +1926,7 @@ describe(`generator - ${generator}`, () => { "reactiveUniqueEntityTypes": Any, "readOnly": false, "regularEagerRelations": Any, - "relationships": [], + "relationships": Any, "relationshipsByOtherEntity": {}, "relationshipsContainEagerLoad": false, "relationshipsContainOtherSideIgnore": false,