ndlib/marble-website-starter

View on GitHub
@ndlib/gatsby-source-appsync-marble/src/getItems/transform/merge.js

Summary

Maintainability
A
1 hr
Test Coverage
module.exports = (parent, child) => {
  const mergedObject = {
    sequence: 0,
  }

  const chooseParentFields = [
    'TYPE',
    'collectionId',
    'copyrightStatement',
    'copyrightStatus',
    'copyrightUrl',
    'createdDate',
    'dedication',
    'defaultFilePath',
    'description',
    'digitalAccess',
    'dimensions',
    'format',
    'id',
    'iiifUri',
    'level',
    'linkToSource',
    'imageGroupId',
    'parentId',
    'partiallyDigitized',
    'repository',
    'sourceSystem',
    'suppliedWebsiteId',
    'title',
    'treePath',
    'uniqueIdentifier',
    'workType',
  ]
  const chooseChildFields = [
    'children',
    'images',
    'media',
  ]
  const mergeArrayFields = [
    'creators',
    'languages',
    'publishers',
    'subjects',
  ]

  chooseParentFields.forEach(field => {
    mergedObject[field] = preferParent(parent, child, field)
  })
  chooseChildFields.forEach(field => {
    mergedObject[field] = preferChild(parent, child, field)
  })
  mergeArrayFields.forEach(field => {
    mergedObject[field] = mergeFieldArray(parent, child, field)
  })

  return mergedObject
}

const preferParent = (parent, child, field) => {
  return parent[field] || child[field] || null
}
const preferChild = (parent, child, field) => {
  return child[field] || parent[field] || null
}

const mergeFieldArray = (parent, child, field) => {
  if (!parent[field] && !child[field]) {
    return null
  } else if (!parent[field]) {
    return child[field]
  } else if (!child[field]) {
    return parent[field]
  }
  return [...parent[field], ...child[field]]
}