], async function (ctx, args) { if (!_.has(args, 'rid')) { throw new Error('engine:uninstallRuleset needs a rid string or array') } let picoId = picoArgOrCtxPico('uninstallRuleset', ctx, args) picoId = await core.db.assertPicoID(picoId) let ridIsString = ktypes.isString(args.rid) if (!ridIsString && !ktypes.isArray(args.rid)) { throw new TypeError('engine:uninstallRuleset was given ' + ktypes.toString(args.rid) + ' instead of a rid string or array') } if (ridIsString) { await core.uninstallRuleset(picoId, args.rid) return } let rids = _.uniq(args.rid) for (let rid of rids) { if (!ktypes.isString(rid)) { throw new TypeError('engine:uninstallRuleset was given a rid array containing a non-string (' + ktypes.toString(rid) + ')') } } for (let rid of rids) { await core.uninstallRuleset(picoId, rid) } }),
], async function (ctx, args) { let ridGiven = _.has(args, 'rid') if (!ridGiven && !_.has(args, 'url')) { throw new Error('engine:installRuleset needs either a rid string or array, or a url string') } let picoId = picoArgOrCtxPico('installRuleset', ctx, args) picoId = await core.db.assertPicoID(picoId) let install = function (rid) { return core.installRuleset(picoId, rid) .then(function () { return rid }) } if (ridGiven) { let ridIsString = ktypes.isString(args.rid) if (!ridIsString && !ktypes.isArray(args.rid)) { throw new TypeError('engine:installRuleset was given ' + ktypes.toString(args.rid) + ' instead of a rid string or array') } if (ridIsString) { return install(args.rid) } let rids = _.uniq(args.rid) for (let rid of rids) { if (!ktypes.isString(rid)) { throw new TypeError('engine:installRuleset was given a rid array containing a non-string (' + ktypes.toString(rid) + ')') } } return Promise.all(_.map(rids, install)) } if (!ktypes.isString(args.url)) { throw new TypeError('engine:installRuleset was given ' + ktypes.toString(args.url) + ' instead of a url string') } let uri = ktypes.isString(args.base) ? urllib.resolve(args.base, args.url) : args.url let results = await core.db.findRulesetsByURL(uri) let rids = _.uniq(_.map(results, 'rid')) if (_.size(rids) === 0) { let data = await core.registerRulesetURL(uri) return install(data.rid) } if (_.size(rids) !== 1) { throw new Error('More than one rid found for the given url: ' + rids.join(' , ')) } return install(_.head(rids)) }),
], async function (ctx, args) { if (!_.has(args, 'url')) { throw new Error('engine:registerRuleset needs a url string') } if (!ktypes.isString(args.url)) { throw new TypeError('engine:registerRuleset was given ' + ktypes.toString(args.url) + ' instead of a url string') } let uri = ktypes.isString(args.base) ? urllib.resolve(args.base, args.url) : args.url let data = await core.registerRulesetURL(uri) return data.rid }),
], async function (ctx, args) { let picoId = picoArgOrCtxPico('newChannel', ctx, args) let policyId = ADMIN_POLICY_ID if (_.has(args, 'policy_id')) { if (!ktypes.isString(args.policy_id)) { throw new TypeError('engine:newChannel argument `policy_id` should be String but was ' + ktypes.typeOf(args.policy_id)) } policyId = args.policy_id } if (!_.has(args, 'name')) { throw new Error('engine:newChannel needs a name string') } if (!_.has(args, 'type')) { throw new Error('engine:newChannel needs a type string') } picoId = await core.db.assertPicoID(picoId) policyId = await core.db.assertPolicyID(policyId) return core.db.newChannel({ pico_id: picoId, name: ktypes.toString(args.name), type: ktypes.toString(args.type), policy_id: policyId }) }),
], async function (ctx, args) { if (!_.has(args, 'rid')) { throw new Error('engine:describeRuleset needs a rid string') } if (!ktypes.isString(args.rid)) { throw new TypeError('engine:describeRuleset was given ' + ktypes.toString(args.rid) + ' instead of a rid string') } let data = await core.db.getEnabledRuleset(args.rid) if (!data) { return } let rid = data.rid return { rid: rid, src: data.src, hash: data.hash, url: data.url, timestamp_stored: data.timestamp_stored, timestamp_enable: data.timestamp_enable, meta: { name: _.get(core.rsreg.get(rid), ['meta', 'name']), description: _.get(core.rsreg.get(rid), ['meta', 'description']), author: _.get(core.rsreg.get(rid), ['meta', 'author']) } } }),
let picoArgOrCtxPico = function (fnName, ctx, args, key) { key = key || 'pico_id' let picoId = _.has(args, key) ? args[key] : ctx.pico_id if (!ktypes.isString(picoId)) { throw new TypeError('engine:' + fnName + ' was given ' + ktypes.toString(args.eci) + ' instead of a ' + key + ' string') } return picoId }
], async function (ctx, args) { let picoId = picoArgOrCtxPico('setPicoStatus', ctx, args) let isLeaving = args.isLeaving === true let movedToHost = ktypes.isString(args.movedToHost) ? args.movedToHost : null await core.db.setPicoStatus(picoId, isLeaving, movedToHost) return true }),
], async function (ctx, args) { if (!_.has(args, 'rid')) { throw new Error('engine:unregisterRuleset needs a rid string or array') } if (ktypes.isString(args.rid)) { await core.unregisterRuleset(args.rid) return } if (!ktypes.isArray(args.rid)) { throw new TypeError('engine:unregisterRuleset was given ' + ktypes.toString(args.rid) + ' instead of a rid string or array') } let rids = _.uniq(args.rid) for (let rid of rids) { if (!ktypes.isString(rid)) { throw new TypeError('engine:unregisterRuleset was given a rid array containing a non-string (' + ktypes.toString(rid) + ')') } } for (let rid of rids) { await core.unregisterRuleset(rid) } }),
], async function (ctx, args) { if (!_.has(args, 'eci')) { throw new Error('engine:removeChannel needs an eci string') } if (!ktypes.isString(args.eci)) { throw new TypeError('engine:removeChannel was given ' + ktypes.toString(args.eci) + ' instead of an eci string') } try { await core.db.removeChannel(args.eci) return true } catch (err) { if (err && err.notFound) return false throw err } }),
], async function (ctx, args) { if (!_.has(args, 'eci')) { throw new Error('engine:getPicoIDByECI needs an eci string') } if (!ktypes.isString(args.eci)) { throw new TypeError('engine:getPicoIDByECI was given ' + ktypes.toString(args.eci) + ' instead of an eci string') } let pico try { pico = await core.db.getPicoIDByECI(args.eci) } catch (err) { if (err && err.notFound) return throw err } return pico }),