From 3cfdf99b43c0ed99fa0de0334518fb68f90df55b Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Mon, 16 Oct 2023 08:16:18 -0500 Subject: [PATCH] Let pre-insert customizers specify when-to-run during pre-insert validation. e.g., if they need to adjust values before UK lookups are done. --- .../AbstractPreInsertCustomizer.java | 25 +++++++++ .../core/actions/tables/InsertAction.java | 51 ++++++++++++++----- 2 files changed, 62 insertions(+), 14 deletions(-) diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/customizers/AbstractPreInsertCustomizer.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/customizers/AbstractPreInsertCustomizer.java index d1e21dc4..196ea4b8 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/customizers/AbstractPreInsertCustomizer.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/customizers/AbstractPreInsertCustomizer.java @@ -55,6 +55,21 @@ public abstract class AbstractPreInsertCustomizer + ///////////////////////////////////////////////////////////////////////////////// + // allow the customizer to specify when it should be executed as part of the // + // insert action. default (per method in this class) is AFTER_ALL_VALIDATIONS // + ///////////////////////////////////////////////////////////////////////////////// + public enum WhenToRun + { + BEFORE_ALL_VALIDATIONS, + BEFORE_UNIQUE_KEY_CHECKS, + BEFORE_REQUIRED_FIELD_CHECKS, + BEFORE_SECURITY_CHECKS, + AFTER_ALL_VALIDATIONS + } + + + /******************************************************************************* ** *******************************************************************************/ @@ -62,6 +77,16 @@ public abstract class AbstractPreInsertCustomizer + /******************************************************************************* + ** + *******************************************************************************/ + public WhenToRun getWhenToRun() + { + return (WhenToRun.AFTER_ALL_VALIDATIONS); + } + + + /******************************************************************************* ** Getter for insertInput ** diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/tables/InsertAction.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/tables/InsertAction.java index 0b5adcb0..28b886a2 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/tables/InsertAction.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/tables/InsertAction.java @@ -193,25 +193,48 @@ public class InsertAction extends AbstractQActionFunction preInsertCustomizer = QCodeLoader.getTableCustomizer(AbstractPreInsertCustomizer.class, table, TableCustomizers.PRE_INSERT_RECORD.getRole()); if(preInsertCustomizer.isPresent()) { preInsertCustomizer.get().setInsertInput(insertInput); preInsertCustomizer.get().setIsPreview(isPreview); - insertInput.setRecords(preInsertCustomizer.get().apply(insertInput.getRecords())); + runPreInsertCustomizerIfItIsTime(insertInput, preInsertCustomizer, AbstractPreInsertCustomizer.WhenToRun.BEFORE_ALL_VALIDATIONS); + } + + ValueBehaviorApplier.applyFieldBehaviors(insertInput.getInstance(), table, insertInput.getRecords()); + + runPreInsertCustomizerIfItIsTime(insertInput, preInsertCustomizer, AbstractPreInsertCustomizer.WhenToRun.BEFORE_UNIQUE_KEY_CHECKS); + setErrorsIfUniqueKeyErrors(insertInput, table); + + runPreInsertCustomizerIfItIsTime(insertInput, preInsertCustomizer, AbstractPreInsertCustomizer.WhenToRun.BEFORE_REQUIRED_FIELD_CHECKS); + if(insertInput.getInputSource().shouldValidateRequiredFields()) + { + validateRequiredFields(insertInput); + } + + runPreInsertCustomizerIfItIsTime(insertInput, preInsertCustomizer, AbstractPreInsertCustomizer.WhenToRun.BEFORE_SECURITY_CHECKS); + ValidateRecordSecurityLockHelper.validateSecurityFields(insertInput.getTable(), insertInput.getRecords(), ValidateRecordSecurityLockHelper.Action.INSERT); + + runPreInsertCustomizerIfItIsTime(insertInput, preInsertCustomizer, AbstractPreInsertCustomizer.WhenToRun.AFTER_ALL_VALIDATIONS); + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + private void runPreInsertCustomizerIfItIsTime(InsertInput insertInput, Optional preInsertCustomizer, AbstractPreInsertCustomizer.WhenToRun whenToRun) throws QException + { + if(preInsertCustomizer.isPresent()) + { + if(whenToRun.equals(preInsertCustomizer.get().getWhenToRun())) + { + insertInput.setRecords(preInsertCustomizer.get().apply(insertInput.getRecords())); + } } }