Skip to content

Commit

Permalink
Allow defining default values on entity fields
Browse files Browse the repository at this point in the history
  • Loading branch information
OmarHawk committed Apr 12, 2024
1 parent 2ee82c4 commit b467379
Show file tree
Hide file tree
Showing 13 changed files with 1,229 additions and 112 deletions.
36 changes: 36 additions & 0 deletions generators/angular/generator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,42 @@ export default class AngularGenerator extends BaseApplicationGenerator {
return this.delegateTasksToBlueprint(() => this.preparingEachEntity);
}

get preparingEachEntityField() {
return this.asPreparingEachEntityFieldTaskGroup({
prepareField({ field }) {
mutateData(field, {
fieldTsDefaultValue: ({ fieldTsDefaultValue, defaultValue, fieldTypeCharSequence, fieldTypeTimed }) => {
let returnValue: string | undefined;
if (fieldTsDefaultValue !== undefined || defaultValue !== undefined) {
let fieldDefaultValue;
if (fieldTsDefaultValue !== undefined) {
fieldDefaultValue = fieldTsDefaultValue;
} else {
fieldDefaultValue = defaultValue;
}

fieldDefaultValue = String(fieldDefaultValue).replace(/'/g, "\\'");

if (fieldTypeCharSequence) {
returnValue = `'${fieldDefaultValue}'`;
} else if (fieldTypeTimed) {
returnValue = `dayjs('${fieldDefaultValue}')`;
} else {
returnValue = fieldDefaultValue;
}
}

return returnValue;
},
});
},
});
}

get [BaseApplicationGenerator.PREPARING_EACH_ENTITY_FIELD]() {
return this.delegateTasksToBlueprint(() => this.preparingEachEntityField);
}

get default() {
return this.asDefaultTaskGroup({
loadEntities() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -200,12 +200,16 @@ _%>
<%_ for (field of fields) {
const { fieldName, fieldTypeBoolean, fieldTypeTimed, fieldTypeLocalDate } = field;
_%>
<%_ if (field.id) { _%>
<%= fieldName %>: null,
<%_ } else if (fieldTypeBoolean) { _%>
<%= fieldName %>: false,
<%_ } else if (fieldTypeTimed) { _%>
<%= fieldName %>: currentTime,
<%_ if (field.fieldTsDefaultValue) { _%>
<%= fieldName %>: <%- field.fieldTsDefaultValue %>,
<%_ } else { _%>
<%_ if (field.id) { _%>
<%= fieldName %>: null,
<%_ } else if (fieldTypeBoolean) { _%>
<%= fieldName %>: false,
<%_ } else if (fieldTypeTimed) { _%>
<%= fieldName %>: currentTime,
<%_ } _%>
<%_ } _%>
<%_ } _%>
<%_ for (const relationship of relationships.filter(({ persistableRelationship }) => persistableRelationship)) {
Expand Down
2 changes: 1 addition & 1 deletion generators/base-application/support/prepare-field.js
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,7 @@ function _derivedProperties(field) {
fieldType === INTEGER || fieldType === LONG || fieldType === FLOAT || fieldType === DOUBLE || fieldType === BIG_DECIMAL,
fieldTypeBinary: fieldType === BYTES || fieldType === BYTE_BUFFER,
fieldTypeTimed: fieldType === ZONED_DATE_TIME || fieldType === INSTANT,
fieldTypeCharSequence: fieldType === STRING || fieldType === UUID,
fieldTypeCharSequence: fieldType === STRING || fieldType === UUID || fieldType === TEXT_BLOB,
fieldTypeTemporal: fieldType === ZONED_DATE_TIME || fieldType === INSTANT || fieldType === LOCAL_DATE,
fieldValidationRequired: validationRules.includes(REQUIRED),
fieldValidationMin: validationRules.includes(MIN),
Expand Down
39 changes: 39 additions & 0 deletions generators/base-entity-changes/generator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ const baseChangelog: () => Omit<BaseChangelog, 'changelogDate' | 'entityName' |
addedRelationships: [],
removedRelationships: [],
relationshipsToRecreateForeignKeysOnly: [],
removedDefaultValueFields: [],
addedDefaultValueFields: [],
changelogData: {},
});

Expand Down Expand Up @@ -164,6 +166,33 @@ export default abstract class GeneratorBaseEntityChanges extends GeneratorBaseAp
),
);

const oldFieldsWithDefaultValues = oldFields.filter(field => this.hasAnyDefaultValue(field));
const newFieldsWithDefaultValues = newFields.filter(field => this.hasAnyDefaultValue(field));

// find the old fields that have not been deleted anyway or otherwise where the default value is different on the same new field
const removedDefaultValueFields = oldFieldsWithDefaultValues
.filter(oldField => !removedFieldNames.includes(oldField.fieldName))
.filter(
// field was not removed, so check its default value
oldField =>
this.doDefaultValuesDiffer(
oldField,
newFields.find(newField => newField.fieldName === oldField.fieldName),
),
);

// find the new fields that have not been added newly anyway or otherwise where the old field had a different default value
const addedDefaultValueFields = newFieldsWithDefaultValues
.filter(newField => !addedFieldNames.includes(newField.fieldName))
.filter(
// field was not added newly, so check its default value
newField =>
this.doDefaultValuesDiffer(
oldFields.find(oldField => oldField.fieldName === newField.fieldName),
newField,
),
);

return {
...baseChangelog(),
previousEntity: oldConfig,
Expand All @@ -176,7 +205,17 @@ export default abstract class GeneratorBaseEntityChanges extends GeneratorBaseAp
addedRelationships,
removedRelationships,
relationshipsToRecreateForeignKeysOnly,
removedDefaultValueFields,
addedDefaultValueFields,
};
});
}

private hasAnyDefaultValue(field) {
return field.defaultValue !== undefined || field.defaultValueComputed;
}

private doDefaultValuesDiffer(field1, field2) {
return field1.defaultValue !== field2.defaultValue || field1.defaultValueComputed !== field2.defaultValueComputed;
}
}
2 changes: 2 additions & 0 deletions generators/base-entity-changes/types.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,7 @@ export type BaseChangelog = {
addedRelationships: any[];
removedRelationships: any[];
relationshipsToRecreateForeignKeysOnly: any[];
removedDefaultValueFields: any[];
addedDefaultValueFields: any[];
changelogData: any;
};
40 changes: 40 additions & 0 deletions generators/bootstrap-application/generator.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -275,6 +275,8 @@ describe(`generator - ${generator}`, () => {
"createRandexp": Any<Function>,
"dynamic": false,
"entity": Any<Object>,
"fieldDefaultValueDefined": false,
"fieldHasAnyDefaultValue": false,
"fieldInJavaBeanMethod": "Id",
"fieldIsEnum": false,
"fieldName": "id",
Expand Down Expand Up @@ -331,6 +333,8 @@ describe(`generator - ${generator}`, () => {
"jpaGeneratedValue": true,
"jpaGeneratedValueIdentity": false,
"jpaGeneratedValueSequence": false,
"liquibaseDefaultValueAttributeName": undefined,
"liquibaseDefaultValueAttributeValue": undefined,
"loadColumnType": "\${uuidType}",
"nullable": true,
"path": [
Expand Down Expand Up @@ -359,6 +363,8 @@ describe(`generator - ${generator}`, () => {
"columnType": "varchar(50)",
"createRandexp": Any<Function>,
"entity": Any<Object>,
"fieldDefaultValueDefined": false,
"fieldHasAnyDefaultValue": false,
"fieldInJavaBeanMethod": "Login",
"fieldIsEnum": false,
"fieldName": "login",
Expand Down Expand Up @@ -418,6 +424,8 @@ describe(`generator - ${generator}`, () => {
"javaValueGenerator": "UUID.randomUUID().toString()",
"javaValueSample1": ""login1"",
"javaValueSample2": ""login2"",
"liquibaseDefaultValueAttributeName": undefined,
"liquibaseDefaultValueAttributeValue": undefined,
"loadColumnType": "string",
"maxlength": 50,
"nullable": false,
Expand Down Expand Up @@ -446,6 +454,8 @@ describe(`generator - ${generator}`, () => {
"columnType": "varchar(50)",
"createRandexp": Any<Function>,
"entity": Any<Object>,
"fieldDefaultValueDefined": false,
"fieldHasAnyDefaultValue": false,
"fieldInJavaBeanMethod": "FirstName",
"fieldIsEnum": false,
"fieldName": "firstName",
Expand Down Expand Up @@ -501,6 +511,8 @@ describe(`generator - ${generator}`, () => {
"javaValueGenerator": "UUID.randomUUID().toString()",
"javaValueSample1": ""firstName1"",
"javaValueSample2": ""firstName2"",
"liquibaseDefaultValueAttributeName": undefined,
"liquibaseDefaultValueAttributeValue": undefined,
"loadColumnType": "string",
"maxlength": 50,
"nullable": true,
Expand Down Expand Up @@ -528,6 +540,8 @@ describe(`generator - ${generator}`, () => {
"columnType": "varchar(50)",
"createRandexp": Any<Function>,
"entity": Any<Object>,
"fieldDefaultValueDefined": false,
"fieldHasAnyDefaultValue": false,
"fieldInJavaBeanMethod": "LastName",
"fieldIsEnum": false,
"fieldName": "lastName",
Expand Down Expand Up @@ -583,6 +597,8 @@ describe(`generator - ${generator}`, () => {
"javaValueGenerator": "UUID.randomUUID().toString()",
"javaValueSample1": ""lastName1"",
"javaValueSample2": ""lastName2"",
"liquibaseDefaultValueAttributeName": undefined,
"liquibaseDefaultValueAttributeValue": undefined,
"loadColumnType": "string",
"maxlength": 50,
"nullable": true,
Expand Down Expand Up @@ -610,6 +626,8 @@ describe(`generator - ${generator}`, () => {
"columnType": "varchar(191)",
"createRandexp": Any<Function>,
"entity": Any<Object>,
"fieldDefaultValueDefined": false,
"fieldHasAnyDefaultValue": false,
"fieldInJavaBeanMethod": "Email",
"fieldIsEnum": false,
"fieldName": "email",
Expand Down Expand Up @@ -669,6 +687,8 @@ describe(`generator - ${generator}`, () => {
"javaValueGenerator": "UUID.randomUUID().toString()",
"javaValueSample1": ""email1"",
"javaValueSample2": ""email2"",
"liquibaseDefaultValueAttributeName": undefined,
"liquibaseDefaultValueAttributeValue": undefined,
"loadColumnType": "string",
"maxlength": 191,
"nullable": false,
Expand Down Expand Up @@ -697,6 +717,8 @@ describe(`generator - ${generator}`, () => {
"columnType": "varchar(256)",
"createRandexp": Any<Function>,
"entity": Any<Object>,
"fieldDefaultValueDefined": false,
"fieldHasAnyDefaultValue": false,
"fieldInJavaBeanMethod": "ImageUrl",
"fieldIsEnum": false,
"fieldName": "imageUrl",
Expand Down Expand Up @@ -752,6 +774,8 @@ describe(`generator - ${generator}`, () => {
"javaValueGenerator": "UUID.randomUUID().toString()",
"javaValueSample1": ""imageUrl1"",
"javaValueSample2": ""imageUrl2"",
"liquibaseDefaultValueAttributeName": undefined,
"liquibaseDefaultValueAttributeValue": undefined,
"loadColumnType": "string",
"maxlength": 256,
"nullable": true,
Expand Down Expand Up @@ -780,6 +804,8 @@ describe(`generator - ${generator}`, () => {
"columnType": "boolean",
"createRandexp": Any<Function>,
"entity": Any<Object>,
"fieldDefaultValueDefined": false,
"fieldHasAnyDefaultValue": false,
"fieldInJavaBeanMethod": "Activated",
"fieldIsEnum": false,
"fieldName": "activated",
Expand Down Expand Up @@ -828,6 +854,8 @@ describe(`generator - ${generator}`, () => {
"fieldWithContentType": false,
"generateFakeData": Any<Function>,
"javaFieldType": "Boolean",
"liquibaseDefaultValueAttributeName": undefined,
"liquibaseDefaultValueAttributeValue": undefined,
"loadColumnType": "boolean",
"nullable": true,
"path": [
Expand All @@ -854,6 +882,8 @@ describe(`generator - ${generator}`, () => {
"columnType": "varchar(10)",
"createRandexp": Any<Function>,
"entity": Any<Object>,
"fieldDefaultValueDefined": false,
"fieldHasAnyDefaultValue": false,
"fieldInJavaBeanMethod": "LangKey",
"fieldIsEnum": false,
"fieldName": "langKey",
Expand Down Expand Up @@ -909,6 +939,8 @@ describe(`generator - ${generator}`, () => {
"javaValueGenerator": "UUID.randomUUID().toString()",
"javaValueSample1": ""langKey1"",
"javaValueSample2": ""langKey2"",
"liquibaseDefaultValueAttributeName": undefined,
"liquibaseDefaultValueAttributeValue": undefined,
"loadColumnType": "string",
"maxlength": 10,
"nullable": true,
Expand Down Expand Up @@ -1140,6 +1172,8 @@ describe(`generator - ${generator}`, () => {
"createRandexp": Any<Function>,
"dynamic": false,
"entity": Any<Object>,
"fieldDefaultValueDefined": false,
"fieldHasAnyDefaultValue": false,
"fieldInJavaBeanMethod": "Id",
"fieldIsEnum": false,
"fieldName": "id",
Expand Down Expand Up @@ -1195,6 +1229,8 @@ describe(`generator - ${generator}`, () => {
"jpaGeneratedValue": true,
"jpaGeneratedValueIdentity": false,
"jpaGeneratedValueSequence": false,
"liquibaseDefaultValueAttributeName": undefined,
"liquibaseDefaultValueAttributeValue": undefined,
"loadColumnType": "\${uuidType}",
"nullable": true,
"path": [
Expand Down Expand Up @@ -1479,6 +1515,8 @@ describe(`generator - ${generator}`, () => {
"createRandexp": Any<Function>,
"dynamic": false,
"entity": Any<Object>,
"fieldDefaultValueDefined": false,
"fieldHasAnyDefaultValue": false,
"fieldInJavaBeanMethod": "Id",
"fieldIsEnum": false,
"fieldName": "id",
Expand Down Expand Up @@ -1534,6 +1572,8 @@ describe(`generator - ${generator}`, () => {
"jpaGeneratedValue": true,
"jpaGeneratedValueIdentity": false,
"jpaGeneratedValueSequence": false,
"liquibaseDefaultValueAttributeName": undefined,
"liquibaseDefaultValueAttributeValue": undefined,
"loadColumnType": "\${uuidType}",
"nullable": true,
"path": [
Expand Down
Loading

0 comments on commit b467379

Please sign in to comment.