Record processors
The recordProcessor property in a control file allows custom code to be written to adjust Records after they have been read before executing the Instructions, for example, combining multiple files into one.
Example
{
"files": {
// ...
},
"recordProcessor": "example:combine-files"
}
Implementing a record processor service
A plugin must implement a Services named after the filter name in the control file, with a prefix of "haplo:data-import-framework:record-processor:".
The service takes a single argument of an array of objects with name and reader properties. The reader property is a function which when called with an iterator function as an argument, calls that iterator with each Record in order.
The service returns a similar array.
Example
This example combines two input files. The main file contains most of the user details, but the “role” is provided in a separate file. As the user sync needs this in a single record, custom logic is required to combine the two files.
P.implementService(
"haplo:data-import-framework:record-processor:example:combine-files",
function(readers) {
let readerByName = {};
readers.forEach((r) => { readerByName[r.name] = r.reader; });
// Mapping of staff ID => staff role
let staffRoles = {};
readerByName.staff_roles((row) => {
staffRoles[row.ID] = row.ROLE_ID;
});
// Make a new reader for users which adds in the extra info
let combinedReader = function(iterator) {
readerByName.users((user) => {
let staffRole = staffRoles[user.ID];
if(staffRole) {
user.staffRole = staffRole;
}
iterator(user);
});
};
// Replace the readers with this single combined reader
return [{name:"users", reader:combinedReader}];
}
);