@eluvio/elv-utils-js
Version:
Utilities for the Eluvio Content Fabric
153 lines (134 loc) • 4.86 kB
JavaScript
const getProp = require('crocks/Maybe/getProp')
const kindOf = require('kind-of')
const R = require('@eluvio/ramda-fork')
const slugify = require('@sindresorhus/slugify')
const {throwError} = require('../helpers')
const {NonBlankString} = require('../models/Models')
const {NewOpt, StdOpt} = require('../options')
const coerceAssetMetadata = arg => kindOf(arg) === 'object'
? arg
: throwError('--assetMetadata must be used with a .FIELD_NAME suffix, e.g.: --assetMetadata.catalog_id movie12345')
const blueprint = {
name: 'AssetMetadata',
options: [
NewOpt('assetMetadata', {
coerce: coerceAssetMetadata,
descTemplate: 'Additional asset metadata fields: use --assetMetadata.FIELD_NAME to specify each, e.g. --assetMetadata.catalog_id movie12345 --assetMetadata.imdb_title_id tt00000',
group: 'Asset'
}),
NewOpt('displayTitle', {
descTemplate: 'Display title{X} (set to title if not specified)',
group: 'Asset',
type: 'string'
}),
NewOpt('ipTitleId', {
descTemplate: 'Internal title/asset ID{X} (equivalent to slug if not specified)',
group: 'Asset',
type: 'string'
}),
StdOpt('name', {
descTemplate: 'Object name (derived from ipTitleId and title if not specified)',
group: 'Asset'
}),
NewOpt('slug', {
descTemplate: 'Slug for asset (generated based on title if not specified)',
group: 'Asset',
type: 'string'
}),
NewOpt('title', {
descTemplate: 'Title of asset',
group: 'Asset',
type: 'string'
})
]
}
const New = (context) => {
// -------------------------------------
// closures
// -------------------------------------
const args = context.args
// -------------------------------------
// private utility methods
// -------------------------------------
const assetMetadataArgField = fieldName => getProp(fieldName, args.assetMetadata).option(undefined)
const assetMetadataCustomFields = () => R.omit(
[
'display_title',
'ip_title_id',
'slug',
'title'
],
args.assetMetadata || {}
)
const backupName = (oldPublicMetadata, backupNameSuffix) => {
const oldAssetMetadata = oldPublicMetadata.asset_metadata || {}
return title({oldAssetMetadata})
? backupNameSuffix
? `${title({oldAssetMetadata})} ${backupNameSuffix}`
: title({oldAssetMetadata})
: undefined
}
// -------------------------------------
// public interface methods
// -------------------------------------
// oldAssetMetadata == pre-existing value stored under /public/asset_metadata/
const displayTitle = ({oldAssetMetadata = {}}) => args.displayTitle
|| assetMetadataArgField('display_title')
|| oldAssetMetadata.display_title
|| title({oldAssetMetadata})
// oldAssetMetadata == pre-existing value stored under /public/asset_metadata/
const ipTitleId = ({oldAssetMetadata = {}}) => args.ipTitleId
|| assetMetadataArgField('ip_title_id')
|| oldAssetMetadata.ip_title_id
|| slug({oldAssetMetadata})
// ** NOTE: this function takes value under /public/, e.g. {asset_metadata:{...}, name: "existing_name"}
const name = ({oldPublicMetadata = {}, backupNameSuffix}) => args.name
|| assetMetadataArgField('name')
|| oldPublicMetadata.name
|| backupName(oldPublicMetadata, backupNameSuffix)
// ** NOTE: this function takes value under /public/, e.g. {asset_metadata:{...}, name: "existing_name"}
const publicMetadata = ({oldPublicMetadata = {}, backupNameSuffix}) => {
const oldAssetMetadata = oldPublicMetadata.asset_metadata || {}
const itemsToMerge = {
asset_metadata: {
title: title({oldAssetMetadata}),
display_title: displayTitle({oldAssetMetadata}),
slug: slug({oldAssetMetadata}),
ip_title_id: ipTitleId({oldAssetMetadata}),
...assetMetadataCustomFields()
},
name: name({oldPublicMetadata, backupNameSuffix})
}
return R.mergeDeepRight(oldPublicMetadata, itemsToMerge)
}
// oldAssetMetadata == pre-existing value stored under /public/asset_metadata/
const slug = ({oldAssetMetadata = {}}) => args.slug
|| assetMetadataArgField('slug')
|| oldAssetMetadata.slug
|| slugify(displayTitle({oldAssetMetadata}))
// oldAssetMetadata == pre-existing value stored under /public/asset_metadata/
const title = ({oldAssetMetadata = {}}) => {
const t = args.title
|| assetMetadataArgField('title')
|| oldAssetMetadata.title
try {
NonBlankString(t)
} catch(e) {
throw Error('--title not supplied and could not determine from other args or existing object')
}
return t
}
// instance interface
return {
displayTitle,
ipTitleId,
name,
publicMetadata,
slug,
title
}
}
module.exports = {
blueprint,
New
}