const FEATURE_NAME = 'userEditTracking';
/**
* A rule specifies the entity to automatically record the creation time
* @module EntityFeature_UserEditTracking
*/
/**
* Initialize the feature
* @param {Entity} entity - Entity to apply this feature
* @param {array} options - Field options
*/
function feature(entity, [option]) {
const options = {
userEntity: 'user',
uidSource: 'state.user.id',
trackCreate: 'createdBy',
trackUpdate: 'updatedBy',
revisionField: 'revision',
addFieldsOnly: false,
...option,
};
const {
userEntity: userEntityName,
uidSource,
trackCreate,
trackUpdate,
revisionField,
addFieldsOnly,
migrationUser,
} = options;
if (!trackCreate && !trackUpdate) {
entity.linker.log(
'warn',
'Since both "trackCreate" and "trackUpdate" are disabled, the "userEditTracking" feature will not take any effect.'
);
return;
}
//todo: cross scheam support
const fields = {};
if (trackCreate) {
fields['createdBy'] = trackCreate;
entity.info.associations || (entity.info.associations = []);
entity.info.associations.push({
type: 'refersTo',
destEntity: userEntityName,
srcField: trackCreate,
fieldProps: {
readOnly: true,
writeOnce: true,
},
});
}
if (trackUpdate) {
entity.once('afterAddingFields', () => {
entity.addField(revisionField, {
type: 'integer',
default: 0,
});
});
fields['updatedBy'] = trackUpdate;
fields['revision'] = revisionField;
entity.info.associations || (entity.info.associations = []);
entity.info.associations.push({
type: 'refersTo',
destEntity: userEntityName,
srcField: trackUpdate,
fieldProps: {
readOnly: true,
optional: true,
},
});
}
if (!addFieldsOnly) {
entity.addFeature(FEATURE_NAME, {
fields,
uidSource,
migrationUser,
});
}
}
module.exports = feature;