@eluvio/elv-utils-js
Version:
Utilities for the Eluvio Content Fabric
118 lines (99 loc) • 3.74 kB
JavaScript
// List all object IDs in a library
const R = require('@eluvio/ramda-fork')
const {ModOpt, NewOpt} = require('./lib/options')
const Utility = require('./lib/Utility')
const {PublicMetadataPathArrayModel} = require('./lib/models/PublicMetadataPath')
const JSON = require('./lib/concerns/JSON')
const ArgLibraryId = require('./lib/concerns/ArgLibraryId')
const Metadata = require('./lib/concerns/Metadata')
const FabricObject = require('./lib/concerns/libs/FabricObject')
class LibraryListObjects extends Utility {
static blueprint() {
return {
concerns: [JSON, ArgLibraryId, Metadata, FabricObject],
options: [
ModOpt('libraryId', {demand: true}),
NewOpt('filter', {
descTemplate: 'JSON expression (or path to JSON file if starting with \'@\') to filter objects by (public) metadata',
type: 'string'
}),
NewOpt('date', {
descTemplate: 'include latest commit date/time if available',
type: 'boolean'
}),
NewOpt('fields', {
coerce: PublicMetadataPathArrayModel,
descTemplate: 'Path(s) for additional metadata values to include (each must start with /public/)',
string: true,
type: 'array'
}),
NewOpt('hash', {
descTemplate: 'include latest version hash',
type: 'boolean'
}),
NewOpt('name', {
descTemplate: 'include object name if available',
type: 'boolean'
}),
NewOpt('size', {
descTemplate: 'include object total size',
type: 'boolean'
})
]
}
}
async body() {
const logger = this.logger
const filter = this.args.filter && this.concerns.JSON.parseStringOrFile({strOrPath: this.args.filter})
if(!this.args.fields) this.args.fields = []
const select = ['/public/name', ...this.args.fields]
const objectList = await this.concerns.ArgLibraryId.libObjectList(
{
filterOptions: {
select,
filter
}
}
)
const formattedObjList = []
this.logger.log(`Found ${objectList.length} object(s)`)
for(let i = 0; i < objectList.length; i++) {
const e = objectList[i]
const libraryId = this.args.libraryId
const objectId = e.objectId
// console.log(JSON.stringify(e,null,2));
const formattedObj = {objectId: e.objectId}
if(this.args.hash) formattedObj.latestHash = e.latestHash
if(this.args.name) formattedObj.name = R.path(['metadata', 'public', 'name'], e)
// get additional fields if requested
if(this.args.fields.length > 0) {
for(let j = 0; j < this.args.fields.length; j++) {
const metaPath = this.args.fields[j].split('/').slice(1)
// remove 'public' from start of label
const label = metaPath.slice(1).join('/')
formattedObj[label] = R.path(['metadata', ...metaPath], e)
}
}
if(this.args.date) {
const commitInfo = await this.concerns.Metadata.commitInfo({
libraryId,
objectId
})
formattedObj.commitDate = commitInfo && commitInfo.timestamp
}
if(this.args.size) formattedObj.size = await this.concerns.FabricObject.size({libraryId, objectId})
formattedObjList.push(formattedObj)
}
logger.data('object_list', formattedObjList)
logger.logTable({list: formattedObjList})
if(formattedObjList.length === 0) logger.warn('No visible objects found using supplied private key.')
}
header() {
return `List objects in library ${this.args.libraryId}`
}
}
if(require.main === module) {
Utility.cmdLineInvoke(LibraryListObjects)
} else {
module.exports = LibraryListObjects
}