Filter by arbitrary attributes #40

Merged
telackey merged 3 commits from telackey/filterany into main 2023-11-28 23:22:58 +00:00
2 changed files with 23 additions and 3 deletions

View File

@ -12,6 +12,9 @@ export const builder = {
'bond-id': { 'bond-id': {
type: 'string' type: 'string'
}, },
owner: {
type: 'string'
},
type: { type: {
type: 'string' type: 'string'
}, },
@ -27,7 +30,13 @@ export const builder = {
export const handler = async (argv: Arguments) => { export const handler = async (argv: Arguments) => {
const { services: { cns: cnsConfig } } = getConfig(argv.config as string) const { services: { cns: cnsConfig } } = getConfig(argv.config as string)
const { restEndpoint, gqlEndpoint, chainId } = getConnectionInfo(argv, cnsConfig); const { restEndpoint, gqlEndpoint, chainId } = getConnectionInfo(argv, cnsConfig);
const { type, name, bondId, all } = argv; const { type, name, bondId, owner, all } = argv;
const filters: any = {};
const filterArgs = argv._.slice(3);
for (let i = 0; i < filterArgs.length-1; i+=2) {
filters[String(filterArgs[i]).replace(/^-+/,"")] = filterArgs[i+1];
}
assert(restEndpoint, 'Invalid CNS REST endpoint.'); assert(restEndpoint, 'Invalid CNS REST endpoint.');
assert(gqlEndpoint, 'Invalid CNS GQL endpoint.'); assert(gqlEndpoint, 'Invalid CNS GQL endpoint.');
@ -35,6 +44,16 @@ export const handler = async (argv: Arguments) => {
const registry = new Registry(gqlEndpoint, restEndpoint, chainId); const registry = new Registry(gqlEndpoint, restEndpoint, chainId);
const result = await registry.queryRecords({ bondId, type, name }, all as boolean); let result = await registry.queryRecords({...filters, type, name}, all as boolean);
// Apply ex post filters.
if (bondId) {
result = result.filter(v => v.bondId === bondId);
}
if (owner) {
result = result.filter(v => v.owners?.find((e: string) => e === owner));
}
queryOutput(result, argv.output) queryOutput(result, argv.output)
} }

View File

@ -6,5 +6,6 @@ export const desc = 'Record operations.';
exports.builder = (yargs: yargs.Argv) => { exports.builder = (yargs: yargs.Argv) => {
return yargs.commandDir('record-cmds') return yargs.commandDir('record-cmds')
.parserConfiguration({'unknown-options-as-args': true})
.demandCommand() .demandCommand()
} }