Single View Patch
This feature is supported from version 5.6.1
of the Single View Creator
Pre Requisites
To configure a Single View Creator dedicated to Single View Patch operations, some steps have to be followed:
- Set the env var
KAFKA_PROJECTION_UPDATE_TOPICS
with the comma separated list of thepr-update
topics corresponding to the SV-Patch Projection. - Configure the service to consume from Kafka (see the Consuming from Kafka section)
- Create a new ConfigMap with this Runtime Mount Path:
/home/node/app/svTriggerHandlerCustomConfig
- Set the env var
SV_TRIGGER_HANDLER_CUSTOM_CONFIG
with the path to the main file defining SV-Patches actions, for example/home/node/app/svTriggerHandlerCustomConfig/svTriggerHandlerCustomConfig.json
Main Configuration
The main file, usually referred to as svTriggerHandlerCustomConfig.json
, assign to each Projection one or more Patch Actions.
It is structured as following:
{
"patchRules": [
{
"projection": "projection_A",
"patchAction": "__fromFile__[customPatchForA.js]"
},
{
"projection": "projection_B",
"patchAction": "__fromFile__[customPatchForB.js]"
},
{
"projection": "projection_B",
"patchAction": "__fromFile__[secondCustomPatchForB.js]"
}
]
}
Patch Action
In the same config map, we can insert the other files that are defined in the __fromFile__
directive of the patchActions
field in the patchRules
array from the svTriggerHandlerCustomConfig.json
(in the above example, customPatchForA.js
and customPatchForB.js
).
They are structured as following:
'use strict'
module.exports = (logger, projection) => {
logger.info('Function custom patch for projection A')
return {
filter: { 'sv-field': projection['projection-field'] },
update: { $set: { 'sv-field-to-update': projection['changed-field'] } },
}
}
A Patch Action works as follows: the MongoDB update
object will be applied to all single view records matching the MongoDB query defined in the filter
object.
Filtering which elements to update inside arrays
To patch fields of specific elements within an array, you can add the arrayFilters
property inside the object returned by your patch action: this field behaves exactly like the arrayFilters
option while using the positional operator $[]
.
'use strict'
module.exports = (logger, projection) => {
logger.info('Function custom patch for projection A')
return {
filter: { 'sv-field': 'someValue' }, // This can be an empty object if needed
update: {
$set: {
"array-field.$[item-name].array-item-field": projection['changed-field']
}
},
arrayFilters: [{
"item-name.array-item-field-id": projection['projection-A-field-id']
}]
}
}