Skip to content

Commit

Permalink
queue with atomic changes do not include generated value fields for i…
Browse files Browse the repository at this point in the history
…nsert

rename the feature naming and include object default fields

update the naming

DATAAPI-21 tweak usage of BIFs and camel case for BIFs

DATAAPI-21 Fix regression: change StructAppend to ArrayAppend

add generated fields as part of the formula fields
  • Loading branch information
pixl8-brayden authored and sebduggan committed Aug 11, 2023
1 parent 3a48837 commit 9c5c1da
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 16 deletions.
5 changes: 3 additions & 2 deletions config/Config.cfc
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,9 @@ component {
settings.features.restTokenAuth.enabled = true;

settings.features.dataApiQueue = settings.features.dataApiQueue ?: { enabled=true };
settings.features.dataApiUseNullForNumerics = settings.features.dataApiUseNullForNumerics ?: { enabled=true };
settings.features.dataApiUseNullForStrings = settings.features.dataApiUseNullForStrings ?: { enabled=true };
settings.features.dataApiUseNullForNumerics = settings.features.dataApiUseNullForNumerics ?: { enabled=true };
settings.features.dataApiUseNullForStrings = settings.features.dataApiUseNullForStrings ?: { enabled=true };
settings.features.dataApiFormulaFieldsForAtomic = settings.features.dataApiFormulaFieldsForAtomic ?: { enabled=true };
}

private void function _setupRestApis( required struct settings ) {
Expand Down
47 changes: 47 additions & 0 deletions services/DataApiConfigurationService.cfc
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,27 @@ component {
} );
}

public array function getEntityFormulaFields( required string entity, boolean aliases=false ) {
var args = arguments;
var cacheKey = "getEntityFormulaFields" & _getDataApiNamespace() & args.entity & args.aliases;

return _simpleLocalCache( cacheKey, function(){
var entities = getEntities();
var fields = entities[ args.entity ].formulaFields ?: [];

if ( !args.aliases ) {
return fields;
}

var aliases = [];
var fieldSettings = getFieldSettings( args.entity );
for( var field in fields ) {
ArrayAppend( aliases, fieldSettings[ field ].alias ?: field );
}
return aliases;
} );
}

public array function getFilterFields( required string entity ) {
var args = arguments;
var cacheKey = "getFilterFields" & _getDataApiNamespace() & args.entity;
Expand Down Expand Up @@ -235,6 +256,10 @@ component {

entities[ entityName ].upsertFields = _cleanupUpsertFields( objectName, entities[ entityName ].upsertFields, entities[ entityName ].allowIdInsert );

if ( $isFeatureEnabled( "dataApiFormulaFieldsForAtomic" ) ) {
entities[ entityName ].formulaFields = _formulaFields( objectName, namespace );
}

if ( excludeFields.len() ) {
for( var field in ListToArray( excludeFields ) ) {
entities[ entityName ].selectFields.delete( field );
Expand Down Expand Up @@ -645,6 +670,28 @@ component {
return fields;
}

private array function _formulaFields( required string objectName, required string namespace ) {
var props = $getPresideObjectService().getObjectProperties( arguments.objectName );
var propEnabledKey = "dataApiEnabled#arguments.namespace#";
var fields = [];

for( var fieldName in props ) {
var isFormulaFields = Len( Trim( props[ fieldName ].formula ?: "" ) ) ||
Len( Trim( props[ fieldName ].default ?: "" ) ) ||
(
Len( Trim( props[ fieldName ].generate ?: "" ) ) &&
ArrayFindNoCase( [ "insert", "always" ], props[ fieldName ].generate ) &&
!ArrayFindNoCase( [ "UUID", "none" ], props[ fieldName ].generator ?: "" )
);

if ( isFormulaFields && ( !isBoolean( props[ fieldName ][ propEnabledKey ] ?: "" ) || !props[ fieldName ][ propEnabledKey ] ) ) {
arrayAppend( fields, fieldName );
}
}

return fields;
}

private array function _cleanupUpsertFields( required string objectName, required array fields, required boolean allowIdInsert ) {
var props = $getPresideObjectService().getObjectProperties( objectName );
var idField = $getPresideObjectService().getIdField( objectName );
Expand Down
38 changes: 24 additions & 14 deletions services/DataApiQueueService.cfc
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ component {

switch( record.operation ) {
case "delete":
returnStruct.data.append( {
ArrayAppend( returnStruct.data, {
operation = "delete"
, entity = entity
, recordId = record.record_id
Expand All @@ -72,14 +72,24 @@ component {
};
if ( queueSettings.atomicChanges && Len( Trim( record.data ) ) ) {
try {
dataEntry.record = _aliasFields( record.object_name, DeserializeJson( record.data ) );
var recordData = DeserializeJson( record.data );

if ( $isFeatureEnabled( "dataApiFormulaFieldsForAtomic" ) ) {
var formulaFields = configSvc.getEntityFormulaFields( entity=entity );

if ( ArrayLen( formulaFields ) ) {
StructAppend( recordData, apiSvc.getSingleRecord( entity=entity, recordId=record.record_id, fields=formulaFields ), false );
}
}

dataEntry.record = _aliasFields( record.object_name, recordData );
} catch( any e ) {
dataEntry.record = record.data;
}
} else {
dataEntry.record = apiSvc.getSingleRecord( entity=entity, recordId=record.record_id, fields=[] )
}
returnStruct.data.append( dataEntry );
ArrayAppend( returnStruct.data, dataEntry );
}
}
}
Expand Down Expand Up @@ -184,7 +194,7 @@ component {
if ( isEmpty( subscribers ) ) {
continue;
}

var queueSettings = configService.getQueueForObject( objectName, namespace );
var dao = $getPresideObject( "data_api_queue" );
var objDao = $getPresideObject( objectName );
Expand All @@ -195,13 +205,13 @@ component {
if ( savedFilters.len() && !objDao.dataExists( id=recordId, savedFilters=savedFilters ) ) {
continue;
}

var relevantRecordFieldChanges = _calculateRelevantFieldChanges( entity=objEntity, namespace=namespace, changedFields=actualChanges[ recordId ] );

if ( isEmpty( relevantRecordFieldChanges ) ) {
continue;
}

for( var subscriber in subscribers ) {

var alreadyQueued = !queueSettings.atomicChanges && dao.dataExists( filter={
Expand Down Expand Up @@ -398,28 +408,28 @@ component {
var configService = _getConfigService();
for( var key in arguments.data ) {
var alias = configService.getAliasForPropertyName( arguments.objectName, key );
aliased[ alias ] = arguments.data[ key ];
aliased[ alias ] = arguments.data[ key ] ?: nullValue();
}

return aliased;
}

private struct function _calculateRelevantFieldChanges( required string entity, required string namespace, required struct changedFields ) {

var relevantFields = _getConfigService().getRelevantQueueFields( entity=arguments.entity, namespace=arguments.namespace );

if ( isEmpty( relevantFields ) ) {
return arguments.changedFields;
}

var relevantChangedFields = {};

for ( var field in arguments.changedFields ) {
if ( relevantFields.findNoCase( field ) ) {
relevantChangedFields[ field ] = arguments.changedFields[ field ];
}
}

return relevantChangedFields;
}

Expand Down

0 comments on commit 9c5c1da

Please sign in to comment.