agent
.customizeCollection('databaseUsers', createFilterableIdentityField)
.customizeCollection('crmUsers', createFilterableIdentityField)
.customizeCollection('databaseUsers', createRelationship)
.customizeCollection('crmUsers', createInverseRelationship);
/**
* Concatenate firstname, lastname and birthData to make a unique identifier
* and ensure that the new field is filterable
*/
function createFilterableIdentityField(collection) {
// Create foreign key on the collection from the database
collection.addField('userIdentifier', {
columnType: 'String',
dependencies: ['firstName', 'lastName', 'birthDate'],
getValues: user => user.map(u => `${u.firstName}/${u.lastName}/${u.birthDate}`),
});
// Implement 'In' filtering operator (required)
collection.replaceFieldOperator('userIdentifier', 'In', values => ({
aggregator: 'Or',
conditions: values.map(value => ({
aggregator: 'And',
conditions: [
{ field: 'firstName', operator: 'Equal', value: value.split('/')[0] },
{ field: 'lastName', operator: 'Equal', value: value.split('/')[1] },
{ field: 'birthDate', operator: 'Equal', value: value.split('/')[2] },
],
})),
}));
}
/** Create relationship between databaseUsers and crmUsers */
function createRelationship(databaseUsers) {
databaseUsers.addOneToOneRelation('userFromCrm', 'crmUsers', {
originKey: 'userIdentifier',
originKeyTarget: 'userIdentifier',
});
}
/** Create relationship between crmUsers and databaseUsers */
function createInverseRelationship(crmUsers) {
crmUsers.addManyToOneRelation('userFromDatabase', 'databaseUsers', {
foreignKey: 'userIdentifier',
foreignKeyTarget: 'userIdentifier',
});
}