NatLibFi/marc-record-validators-melinda

View on GitHub
src/duplicates-ind1.js

Summary

Maintainability
A
2 hrs
Test Coverage
export default function (tagPattern) {
  if (tagPattern instanceof RegExp) {
    return {
      description:
        'Handles data fields that only differ in the first indicator',
      validate,
      fix
    };
  }

  throw new Error('No tagPattern provided');

  function validate(record) {
    const invalid = iterateFields(record)
      .find(obj => obj.validation === true);
    return invalid ? {valid: false, messages: [`Multiple ${invalid.obj.tag} fields which only differ in the first indicator`]} : {valid: true, messages: []};
  }

  function fix(record) {
    iterateFields(record)
      .filter(item => item.validation === false)
      .map(({validation, ...item}) => item) // eslint-disable-line no-unused-vars
      .forEach(({obj}) => record.removeField(obj));
  }

  function iterateFields(record) {
    return record.fields.map(obj => ({validation: matches(obj, record.fields), obj}));
  }

  function matches(field, fields) {
    return tagPattern.test(field.tag) && field.ind1 === ' ' && hasDuplicate(field, fields);
  }

  function hasDuplicate(fieldA, fields) {
    return fields.some(fieldB => fieldA !== fieldB &&
      fieldA.tag === fieldB.tag &&
      fieldA.ind1 !== fieldB.ind1 &&
      fieldA.subfields.length === fieldB.subfields.length &&
      fieldA.subfields.every(aSf => fieldB.subfields.some(bSf => aSf.code === bSf.code && aSf.value === bSf.value)));
  }
}