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 3, 2024
1 parent d0019a7 commit af16184
Show file tree
Hide file tree
Showing 13 changed files with 1,216 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 || 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;
};
20 changes: 20 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 @@ -359,6 +361,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 @@ -446,6 +450,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 @@ -528,6 +534,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 @@ -610,6 +618,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 @@ -697,6 +707,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 @@ -780,6 +792,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 @@ -854,6 +868,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 @@ -1140,6 +1156,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 @@ -1479,6 +1497,8 @@ describe(`generator - ${generator}`, () => {
"createRandexp": Any<Function>,
"dynamic": false,
"entity": Any<Object>,
"fieldDefaultValueDefined": false,
"fieldHasAnyDefaultValue": false,
"fieldInJavaBeanMethod": "Id",
"fieldIsEnum": false,
"fieldName": "id",
Expand Down
Loading

0 comments on commit af16184

Please sign in to comment.