@eluvio/elv-utils-js
Version:
Utilities for the Eluvio Content Fabric
101 lines (85 loc) • 2.99 kB
JavaScript
// Replace metadata at a key
const objectPath = require('object-path')
const R = require('@eluvio/ramda-fork')
const {fabricItemDesc} = require('./lib/helpers')
const {ModOpt, NewOpt} = require('./lib/options')
const Utility = require('./lib/Utility')
const ExistLibOrObjOrDft = require('./lib/concerns/kits/ExistLibOrObjOrDft')
const Metadata = require('./lib/concerns/Metadata')
const ArgMetadata = require('./lib/concerns/ArgMetadata')
const ArgCommitMsg = require('./lib/concerns/args/ArgCommitMsg')
class MetaSet extends Utility {
static blueprint() {
return {
concerns: [
ExistLibOrObjOrDft,
Metadata,
ArgMetadata,
ArgCommitMsg
],
options: [
ModOpt('writeToken', {ofX: ' item to modify'}),
ModOpt('objectId', {ofX: ' item to modify'}),
ModOpt('libraryId', {ofX: ' item to modify'}),
NewOpt('path', {
demand: true,
descTemplate: 'Path within metadata to set (start with \'/\').',
type: 'string'
}),
NewOpt('force', {
descTemplate: 'If target metadata path within object exists, overwrite and replace',
type: 'boolean'
}),
ModOpt('metadata', {demand:true}),
ModOpt('commitMsg', {conflicts: 'writeToken'}),
]
}
}
async body() {
const logger = this.logger
const {path, force} = this.args
const commitMessage = this.args.commitMsg || (
this.args.writeToken
? undefined
: `Set metadata path: '${path}'`
)
// Check that path is a valid path string
Metadata.validatePathFormat({path})
const metadataFromArg = this.concerns.ArgMetadata.asObject()
// operations that may need to wait on network access
// ----------------------------------------------------
const {libraryId, objectId, writeToken} = await this.concerns.ExistLibOrObjOrDft.argsProc()
logger.log('Retrieving existing metadata from object...')
const currentMetadata = await this.concerns.ExistLibOrObjOrDft.metadata()
// check that targetPath can be set
Metadata.validateTargetPath({
metadata: currentMetadata,
path
})
// make sure targetPath does NOT exist, or --force specified
this.concerns.Metadata.checkTargetPath({
force,
metadata: currentMetadata,
targetPath: path
})
const revisedMetadata = R.clone(currentMetadata)
objectPath.set(revisedMetadata, Metadata.pathToArray({path}), metadataFromArg)
// Write back metadata
const newHash = await this.concerns.Metadata.write({
commitMessage,
libraryId,
metadata: revisedMetadata,
objectId,
writeToken
})
if (!writeToken) this.logger.data('version_hash', newHash)
}
header() {
return `Set metadata ${this.args.path ? `at ${this.args.path} ` : ''}for ${fabricItemDesc(this.args)}`
}
}
if(require.main === module) {
Utility.cmdLineInvoke(MetaSet)
} else {
module.exports = MetaSet
}