Skip to content

Commit

Permalink
Merge pull request #2137 from beyonnex-io/bugfix/fix-pre-defined-extr…
Browse files Browse the repository at this point in the history
…a-fields-for-created-events

fix pre-defined extraFields were causing missing extra from Thing created events
  • Loading branch information
thjaeckle authored Mar 5, 2025
2 parents 94a364c + 56b32f3 commit bc44a86
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -193,21 +193,36 @@ private CompletionStage<JsonObject> performPreDefinedExtraFieldsOptimization(fin

final JsonObject preDefinedExtraFields =
JsonObject.of(signalHeaders.get(DittoHeaderDefinition.PRE_DEFINED_EXTRA_FIELDS_OBJECT.getKey()));
final JsonObject filteredPreDefinedExtraFieldsReadGranted =
filterPreDefinedExtraReadGrantedObject(jsonFieldSelector, dittoHeaders, signalHeaders,
preDefinedExtraFields);
final JsonObject preDefinedExtraFieldsReadGrantObject = JsonObject.of(
signalHeaders.get(DittoHeaderDefinition.PRE_DEFINED_EXTRA_FIELDS_READ_GRANT_OBJECT.getKey())
);
final boolean preDefinedExtraFieldsAuthAvailable = !preDefinedExtraFieldsReadGrantObject.isEmpty();

final JsonObject filteredPreDefinedExtraFieldsReadGranted = filterPreDefinedExtraReadGrantedObject(
jsonFieldSelector, dittoHeaders, preDefinedExtraFieldsReadGrantObject, preDefinedExtraFields);

final boolean allExtraFieldsPresent =
allConfiguredPredefinedExtraFields.containsAll(jsonFieldSelector.getPointers());
if (allExtraFieldsPresent) {
final boolean allExtraFieldsPresent = jsonFieldSelector.getPointers().stream()
.allMatch(requiredField ->
allConfiguredPredefinedExtraFields.contains(requiredField) ||
allConfiguredPredefinedExtraFields.stream()
.anyMatch(configuredField ->
requiredField.toString().startsWith(configuredField.toString())
)
);

if (allExtraFieldsPresent && preDefinedExtraFieldsAuthAvailable) {
LOGGER.withCorrelationId(dittoHeaders)
.debug("All asked for extraFields for thing <{}> were present in pre-defined fields, " +
"skipping cache retrieval: <{}>", thingId, jsonFieldSelector);
return CompletableFuture.completedStage(filteredPreDefinedExtraFieldsReadGranted);
} else {
// optimization to only fetch extra fields which were not pre-defined
final List<JsonPointer> missingFieldsPointers = new ArrayList<>(jsonFieldSelector.getPointers());
missingFieldsPointers.removeAll(allConfiguredPredefinedExtraFields);
if (preDefinedExtraFieldsAuthAvailable) {
// only if we have a proper authorization, we can apply the optimization and remove existing fields
// to not load them via cache
missingFieldsPointers.removeAll(allConfiguredPredefinedExtraFields);
}
final JsonFieldSelector missingFieldsSelector = JsonFactory.newFieldSelector(missingFieldsPointers);
final var cachingParameters =
new CachingParameters(missingFieldsSelector, thingEvents, true, 0);
Expand All @@ -228,12 +243,9 @@ private CompletionStage<JsonObject> performPreDefinedExtraFieldsOptimization(fin
private static JsonObject filterPreDefinedExtraReadGrantedObject(
final JsonFieldSelector jsonFieldSelector,
final DittoHeaders dittoHeaders,
final DittoHeaders signalHeaders,
final JsonObject preDefinedExtraFieldsReadGrant,
final JsonObject preDefinedExtraFields
) {
final JsonObject preDefinedExtraFieldsReadGrant = JsonObject.of(
signalHeaders.get(DittoHeaderDefinition.PRE_DEFINED_EXTRA_FIELDS_READ_GRANT_OBJECT.getKey())
);
final JsonFieldSelector grantedReadJsonFieldSelector = filterAskedForFieldSelectorToGrantedFields(
jsonFieldSelector,
preDefinedExtraFieldsReadGrant,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,11 @@ protected void publishEvent(@Nullable final Thing previousEntity, final ThingEve
final CompletionStage<ThingEvent<?>> stage = eventPreDefinedExtraFieldsEnricher.enrichWithPredefinedExtraFields(
entityId,
entity,
Optional.ofNullable(previousEntity).flatMap(Thing::getPolicyId).orElse(null),
Optional.ofNullable(entity).flatMap(Thing::getPolicyId)
.orElse(Optional.ofNullable(previousEntity)
.flatMap(Thing::getPolicyId)
.orElse(null)
),
event
);
stage.whenComplete((modifiedEvent, ex) -> {
Expand Down

0 comments on commit bc44a86

Please sign in to comment.