More BLOB; FILE_DOWNLOAD adornment; javalin field download endpoint

This commit is contained in:
2023-05-24 17:07:19 -05:00
parent 614aead348
commit 36efc4c2d9
7 changed files with 301 additions and 4 deletions

View File

@ -22,6 +22,7 @@
package com.kingsrook.qqq.backend.core.instances;
import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
@ -52,6 +53,8 @@ import com.kingsrook.qqq.backend.core.model.metadata.QMiddlewareInstanceMetaData
import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeReference;
import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeType;
import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeUsage;
import com.kingsrook.qqq.backend.core.model.metadata.fields.AdornmentType;
import com.kingsrook.qqq.backend.core.model.metadata.fields.FieldAdornment;
import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldMetaData;
import com.kingsrook.qqq.backend.core.model.metadata.fields.ValueTooLongBehavior;
import com.kingsrook.qqq.backend.core.model.metadata.joins.JoinOn;
@ -82,6 +85,7 @@ import com.kingsrook.qqq.backend.core.model.metadata.tables.cache.CacheOf;
import com.kingsrook.qqq.backend.core.model.metadata.tables.cache.CacheUseCase;
import com.kingsrook.qqq.backend.core.utils.CollectionUtils;
import com.kingsrook.qqq.backend.core.utils.StringUtils;
import com.kingsrook.qqq.backend.core.utils.ValueUtils;
/*******************************************************************************
@ -418,7 +422,7 @@ public class QInstanceValidator
{
table.getFields().forEach((fieldName, field) ->
{
validateTableField(qInstance, tableName, fieldName, field);
validateTableField(qInstance, tableName, fieldName, table, field);
});
}
@ -659,7 +663,7 @@ public class QInstanceValidator
/*******************************************************************************
**
*******************************************************************************/
private void validateTableField(QInstance qInstance, String tableName, String fieldName, QFieldMetaData field)
private void validateTableField(QInstance qInstance, String tableName, String fieldName, QTableMetaData table, QFieldMetaData field)
{
assertCondition(Objects.equals(fieldName, field.getName()),
"Inconsistent naming in table " + tableName + " for field " + fieldName + "/" + field.getName() + ".");
@ -701,6 +705,55 @@ public class QInstanceValidator
assertCondition(fieldSecurityLock.getDefaultBehavior() != null, prefix + "has a fieldSecurityLock that is missing a defaultBehavior");
assertCondition(CollectionUtils.nullSafeHasContents(fieldSecurityLock.getOverrideValues()), prefix + "has a fieldSecurityLock that is missing overrideValues");
}
for(FieldAdornment adornment : CollectionUtils.nonNullList(field.getAdornments()))
{
Map<String, Serializable> adornmentValues = CollectionUtils.nonNullMap(adornment.getValues());
if(assertCondition(adornment.getType() != null, prefix + "has an adornment that is missing a type"))
{
String adornmentPrefix = prefix.trim() + ", " + adornment.getType() + " adornment ";
switch(adornment.getType())
{
case SIZE ->
{
String width = ValueUtils.getValueAsString(adornmentValues.get("width"));
if(assertCondition(StringUtils.hasContent(width), adornmentPrefix + "is missing a width value"))
{
assertNoException(() -> AdornmentType.Size.valueOf(width.toUpperCase()), adornmentPrefix + "has an unrecognized width value [" + width + "]");
}
}
case FILE_DOWNLOAD ->
{
String fileNameField = ValueUtils.getValueAsString(adornmentValues.get(AdornmentType.FileDownloadValues.FILE_NAME_FIELD));
if(StringUtils.hasContent(fileNameField)) // file name isn't required - but if given, must be a field on the table.
{
assertNoException(() -> table.getField(fileNameField), adornmentPrefix + "specifies an unrecognized fileNameField [" + fileNameField + "]");
}
if(adornmentValues.containsKey(AdornmentType.FileDownloadValues.FILE_NAME_FORMAT_FIELDS))
{
try
{
@SuppressWarnings("unchecked")
List<String> formatFieldNames = (List<String>) adornmentValues.get(AdornmentType.FileDownloadValues.FILE_NAME_FORMAT_FIELDS);
for(String formatFieldName : CollectionUtils.nonNullList(formatFieldNames))
{
assertNoException(() -> table.getField(formatFieldName), adornmentPrefix + "specifies an unrecognized field name in fileNameFormatFields [" + formatFieldName + "]");
}
}
catch(Exception e)
{
errors.add(adornmentPrefix + "fileNameFormatFields could not be accessed (is it a List<String>?)");
}
}
}
default ->
{
// no validations by default
}
}
}
}
}

View File

@ -40,6 +40,7 @@ public enum AdornmentType
CODE_EDITOR,
RENDER_HTML,
REVEAL,
FILE_DOWNLOAD,
ERROR;
//////////////////////////////////////////////////////////////////////////
// keep these values in sync with AdornmentType.ts in qqq-frontend-core //
@ -58,6 +59,26 @@ public enum AdornmentType
/*******************************************************************************
**
*******************************************************************************/
public interface FileDownloadValues
{
String FILE_NAME_FIELD = "fileNameField";
String DEFAULT_EXTENSION = "defaultExtension";
String DEFAULT_MIME_TYPE = "defaultMimeType";
////////////////////////////////////////////////////
// use these two together, as in: //
// FILE_NAME_FORMAT = "Order %s Packing Slip.pdf" //
// FILE_NAME_FORMAT_FIELDS = "orderId" //
////////////////////////////////////////////////////
String FILE_NAME_FORMAT = "fileNameFormat";
String FILE_NAME_FORMAT_FIELDS = "fileNameFormatFields";
}
/*******************************************************************************
**
*******************************************************************************/
@ -112,6 +133,7 @@ public enum AdornmentType
XSMALL,
SMALL,
MEDIUM,
MEDLARGE,
LARGE,
XLARGE;

View File

@ -43,6 +43,7 @@ public class QFrontendFieldMetaData
private QFieldType type;
private boolean isRequired;
private boolean isEditable;
private boolean isHeavy;
private String possibleValueSourceName;
private String displayFormat;
@ -64,6 +65,7 @@ public class QFrontendFieldMetaData
this.type = fieldMetaData.getType();
this.isRequired = fieldMetaData.getIsRequired();
this.isEditable = fieldMetaData.getIsEditable();
this.isHeavy = fieldMetaData.getIsHeavy();
this.possibleValueSourceName = fieldMetaData.getPossibleValueSourceName();
this.displayFormat = fieldMetaData.getDisplayFormat();
this.adornments = fieldMetaData.getAdornments();
@ -126,6 +128,17 @@ public class QFrontendFieldMetaData
/*******************************************************************************
** Getter for isHeavy
**
*******************************************************************************/
public boolean getIsHeavy()
{
return isHeavy;
}
/*******************************************************************************
** Getter for displayFormat
**