diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/customizers/ChildInserterPostInsertCustomizer.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/customizers/ChildInserterPostInsertCustomizer.java index 9bb38b0a..3cb8691f 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/customizers/ChildInserterPostInsertCustomizer.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/customizers/ChildInserterPostInsertCustomizer.java @@ -120,6 +120,11 @@ public abstract class ChildInserterPostInsertCustomizer extends AbstractPostInse InsertOutput insertOutput = new InsertAction().execute(insertInput); Iterator insertedRecordIterator = insertOutput.getRecords().iterator(); + ///////////////////////////////////////////////////////////////////////////////// + // check for any errors when inserting the children, if any errors were found, // + // then set a warning in the parent with the details of the problem // + ///////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////////////////////// // iterate over the original list of records again - for any that need a child (e.g., are missing // // foreign key), set their foreign key to a newly inserted child's key, and add them to be updated. // @@ -127,6 +132,20 @@ public abstract class ChildInserterPostInsertCustomizer extends AbstractPostInse List recordsToUpdate = new ArrayList<>(); for(QRecord record : records) { + /////////////////////////////////////////////////////////////////////////////////////////////////// + // get the corresponding child record, if it has any errors, set that as a warning in the parent // + /////////////////////////////////////////////////////////////////////////////////////////////////// + QRecord childRecord = insertedRecordIterator.next(); + if(childRecord.getErrors() != null) + { + for(String childWarning : childRecord.getErrors()) + { + record.addWarning("Error creating child " + childTable.getLabel() + " (" + childWarning + ")"); + } + rs.add(record); + continue; + } + Serializable primaryKey = record.getValue(table.getPrimaryKeyField()); if(record.getValue(getForeignKeyFieldName()) == null) { diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/tables/GetAction.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/tables/GetAction.java index 0f8f99a3..6f377bbb 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/tables/GetAction.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/tables/GetAction.java @@ -53,7 +53,6 @@ import com.kingsrook.qqq.backend.core.model.actions.tables.update.UpdateInput; import com.kingsrook.qqq.backend.core.model.actions.tables.update.UpdateOutput; import com.kingsrook.qqq.backend.core.model.data.QRecord; import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldMetaData; -import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldType; import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData; import com.kingsrook.qqq.backend.core.model.metadata.tables.cache.CacheUseCase; import com.kingsrook.qqq.backend.core.modules.backend.QBackendModuleDispatcher; @@ -380,8 +379,12 @@ public class GetAction Map fields = QContext.getQInstance().getTable(getInput.getTableName()).getFields(); for(String fieldName : fields.keySet()) { - QFieldType fieldType = fields.get(fieldName).getType(); - if(fieldType != null && fieldType.needsMasked()) + QFieldMetaData field = fields.get(fieldName); + if(getInput.getShouldOmitHiddenFields() && field.getIsHidden()) + { + returnRecord.removeValue(fieldName); + } + else if(field.getType() != null && field.getType().needsMasked()) { ////////////////////////////////////////////////////////////////////// // empty out the value completely first (which will remove from // @@ -395,7 +398,6 @@ public class GetAction } } } - QValueFormatter.setDisplayValuesInRecords(getInput.getTable(), List.of(returnRecord)); } ////////////////////////////////////////////////////////////////////////////// diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/data/QRecord.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/data/QRecord.java index f6950ef3..00fbeb47 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/data/QRecord.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/data/QRecord.java @@ -65,6 +65,7 @@ public class QRecord implements Serializable private Map displayValues = new LinkedHashMap<>(); private Map backendDetails = new LinkedHashMap<>(); private List errors = new ArrayList<>(); + private List warnings = new ArrayList<>(); private Map> associatedRecords = new HashMap<>(); @@ -652,4 +653,46 @@ public class QRecord implements Serializable return (this); } + + + /******************************************************************************* + ** Getter for warnings + *******************************************************************************/ + public List getWarnings() + { + return (this.warnings); + } + + + + /******************************************************************************* + ** Setter for warnings + *******************************************************************************/ + public void setWarnings(List warnings) + { + this.warnings = warnings; + } + + + + /******************************************************************************* + ** Fluent setter for warnings + *******************************************************************************/ + public QRecord withWarnings(List warnings) + { + this.warnings = warnings; + return (this); + } + + + + /******************************************************************************* + ** Add one warning to this record + ** + *******************************************************************************/ + public void addWarning(String warning) + { + this.warnings.add(warning); + } + } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/AdornmentType.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/AdornmentType.java index fd59545a..e46f4c2c 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/AdornmentType.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/AdornmentType.java @@ -39,6 +39,7 @@ public enum AdornmentType SIZE, CODE_EDITOR, RENDER_HTML, + REVEAL, ERROR; ////////////////////////////////////////////////////////////////////////// // keep these values in sync with AdornmentType.ts in qqq-frontend-core // diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/modules/authentication/implementations/Auth0AuthenticationModule.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/modules/authentication/implementations/Auth0AuthenticationModule.java index a0279503..0960faed 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/modules/authentication/implementations/Auth0AuthenticationModule.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/modules/authentication/implementations/Auth0AuthenticationModule.java @@ -151,7 +151,7 @@ public class Auth0AuthenticationModule implements QAuthenticationModuleInterface /////////////////////////////////////////////////////////// if(context.containsKey(BASIC_AUTH_KEY)) { - AuthAPI auth = new AuthAPI(metaData.getBaseUrl(), metaData.getClientId(), metaData.getClientSecret()); + AuthAPI auth = AuthAPI.newBuilder(metaData.getBaseUrl(), metaData.getClientId(), metaData.getClientSecret()).build(); try { ///////////////////////////////////////////////// diff --git a/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/javalin/QJavalinApiHandler.java b/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/javalin/QJavalinApiHandler.java index 0cb92760..a2890898 100644 --- a/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/javalin/QJavalinApiHandler.java +++ b/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/javalin/QJavalinApiHandler.java @@ -1546,13 +1546,20 @@ public class QJavalinApiHandler LinkedHashMap outputRecord = new LinkedHashMap<>(); response.add(outputRecord); - List errors = record.getErrors(); + List errors = record.getErrors(); + List warnings = record.getWarnings(); if(CollectionUtils.nullSafeHasContents(errors)) { outputRecord.put("statusCode", HttpStatus.Code.BAD_REQUEST.getCode()); outputRecord.put("statusText", HttpStatus.Code.BAD_REQUEST.getMessage()); outputRecord.put("error", "Error inserting " + table.getLabel() + ": " + StringUtils.joinWithCommasAndAnd(errors)); } + else if(CollectionUtils.nullSafeHasContents(warnings)) + { + outputRecord.put("statusCode", HttpStatus.Code.BAD_REQUEST.getCode()); + outputRecord.put("statusText", HttpStatus.Code.BAD_REQUEST.getMessage()); + outputRecord.put("error", "Warning inserting " + table.getLabel() + ", some data may have been inserted: " + StringUtils.joinWithCommasAndAnd(warnings)); + } else { outputRecord.put("statusCode", HttpStatus.Code.CREATED.getCode()); diff --git a/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementation.java b/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementation.java index 62c88550..cb6adfff 100644 --- a/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementation.java +++ b/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementation.java @@ -687,6 +687,10 @@ public class QJavalinImplementation { throw (new QUserFacingException("Error inserting " + qInstance.getTable(tableName).getLabel() + ": " + insertOutput.getRecords().get(0).getErrors().get(0))); } + if(CollectionUtils.nullSafeHasContents(insertOutput.getRecords().get(0).getWarnings())) + { + throw (new QUserFacingException("Warning inserting " + qInstance.getTable(tableName).getLabel() + ": " + insertOutput.getRecords().get(0).getWarnings().get(0))); + } QJavalinAccessLogger.logEndSuccess(logPair("primaryKey", () -> (insertOutput.getRecords().get(0).getValue(qInstance.getTable(tableName).getPrimaryKeyField())))); context.result(JsonUtils.toJson(insertOutput));