UNPKG

@valueflows/vf-graphql-holochain

Version:

GraphQL schema bindings for the Holochain implementation of ValueFlows

73 lines 16.1 kB
/** * Intent record reference resolvers * * @package: HoloREA * @since: 2019-08-31 */ import { DEFAULT_VF_MODULES, VfModule } from '../types.js'; import { extractEdges, mapZomeFn } from '../connection.js'; import agentQueries from '../queries/agent.js'; const extractProposedIntent = (data) => data.proposedIntent; export default (enabledVFModules = DEFAULT_VF_MODULES, dnaConfig, conductorUri) => { const hasHistory = -1 !== enabledVFModules.indexOf(VfModule.History); const hasAgent = -1 !== enabledVFModules.indexOf(VfModule.Agent); const hasSatisfaction = -1 !== enabledVFModules.indexOf(VfModule.Satisfaction); const hasResourceSpecification = -1 !== enabledVFModules.indexOf(VfModule.ResourceSpecification); const hasAction = -1 !== enabledVFModules.indexOf(VfModule.Action); const hasProcess = -1 !== enabledVFModules.indexOf(VfModule.Process); const hasProposal = -1 !== enabledVFModules.indexOf(VfModule.Proposal); const hasObservation = -1 !== enabledVFModules.indexOf(VfModule.Observation); const readRevision = mapZomeFn(dnaConfig, conductorUri, 'planning', 'intent', 'get_revision'); const readSatisfactions = mapZomeFn(dnaConfig, conductorUri, 'planning', 'satisfaction_index', 'query_satisfactions'); const readProcesses = mapZomeFn(dnaConfig, conductorUri, 'observation', 'process_index', 'query_processes'); const readProposedIntent = mapZomeFn(dnaConfig, conductorUri, 'proposal', 'proposed_intent', 'get_proposed_intent'); const readResourceSpecification = mapZomeFn(dnaConfig, conductorUri, 'specification', 'resource_specification', 'get_resource_specification'); const readAction = mapZomeFn(dnaConfig, conductorUri, 'specification', 'action', 'get_action'); const readAgent = agentQueries(dnaConfig, conductorUri)['agent']; return Object.assign((hasSatisfaction ? { satisfiedBy: async (record) => { const results = await readSatisfactions({ params: { satisfies: record.id } }); return extractEdges(results); }, } : {}), (hasAgent ? { provider: async (record) => { return record.provider ? readAgent(record, { id: record.provider }) : null; }, receiver: async (record) => { return record.receiver ? readAgent(record, { id: record.receiver }) : null; }, inScopeOf: async (record) => { return (await Promise.all((record.inScopeOf || []).map((address) => readAgent(record, { address })))); }, } : {}), (hasProcess ? { inputOf: async (record) => { const results = await readProcesses({ params: { intendedInputs: record.id } }); return results.edges.pop()['node']; }, outputOf: async (record) => { const results = await readProcesses({ params: { intendedOutputs: record.id } }); return results.edges.pop()['node']; }, } : {}), (hasProposal ? { publishedIn: async (record) => { return (await Promise.all((record.publishedIn || []).map((address) => readProposedIntent({ address })))).map(extractProposedIntent); }, } : {}), (hasResourceSpecification ? { resourceConformsTo: async (record) => { return (await readResourceSpecification({ address: record.resourceConformsTo })).resourceSpecification; }, } : {}), (hasAction ? { action: async (record) => { return (await readAction({ id: record.action })); }, } : {}), (hasObservation ? { resourceInventoriedAs: () => { throw new Error('resolver unimplemented'); }, } : {}), (hasHistory ? { revision: async (record, args) => { return (await readRevision(args)).intent; }, } : {})); }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vcmVzb2x2ZXJzL2ludGVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILE9BQU8sRUFBaUIsa0JBQWtCLEVBQUUsUUFBUSxFQUEwSCxNQUFNLGFBQWEsQ0FBQTtBQUNqTSxPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBbUIxRCxPQUFPLFlBQVksTUFBTSxxQkFBcUIsQ0FBQTtBQUc5QyxNQUFNLHFCQUFxQixHQUFHLENBQUMsSUFBSSxFQUFrQixFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQTtBQUUzRSxlQUFlLENBQUMsbUJBQStCLGtCQUFrQixFQUFFLFNBQXdCLEVBQUUsWUFBb0IsRUFBRSxFQUFFO0lBQ25ILE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBQyxLQUFLLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDcEUsTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFDLEtBQUssZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNoRSxNQUFNLGVBQWUsR0FBRyxDQUFDLENBQUMsS0FBSyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFBO0lBQzlFLE1BQU0sd0JBQXdCLEdBQUcsQ0FBQyxDQUFDLEtBQUssZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFBO0lBQ2hHLE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBQyxLQUFLLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDbEUsTUFBTSxVQUFVLEdBQUcsQ0FBQyxDQUFDLEtBQUssZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJ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QyxFQUFFLENBQUMsRUFDUCxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDWCxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQXlDLEVBQW1CLEVBQUU7WUFDM0UsT0FBTyxDQUFDLE1BQU0sVUFBVSxDQUFDLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDbEQsQ0FBQztLQUNGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUNQLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztRQUNoQixxQkFBcUIsRUFBRSxHQUFHLEVBQUU7WUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFBO1FBQzNDLENBQUM7S0FDRixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFDUCxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDWixRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQWMsRUFBRSxJQUEyQyxFQUFtQixFQUFFO1lBQy9GLE9BQU8sQ0FBQyxNQUFNLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQTtRQUMxQyxDQUFDO0tBQ0YsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQ1IsQ0FBQTtBQUNILENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSW50ZW50IHJlY29yZCByZWZlcmVuY2UgcmVzb2x2ZXJzXG4gKlxuICogQHBhY2thZ2U6IEhvbG9SRUFcbiAqIEBzaW5jZTogICAyMDE5LTA4LTMxXG4gKi9cblxuaW1wb3J0IHsgRE5BSWRNYXBwaW5ncywgREVGQVVMVF9WRl9NT0RVTEVTLCBWZk1vZHVsZSwgUmVhZFBhcmFtcywgQnlJZCwgQnlSZXZpc2lvbiwgUHJvcG9zZWRJbnRlbnRBZGRyZXNzLCBSZXNvdXJjZVNwZWNpZmljYXRpb25BZGRyZXNzLCBBZGRyZXNzYWJsZUlkZW50aWZpZXIsIEFnZW50QWRkcmVzcyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuaW1wb3J0IHsgZXh0cmFjdEVkZ2VzLCBtYXBab21lRm4gfSBmcm9tICcuLi9jb25uZWN0aW9uLmpzJ1xuXG5pbXBvcnQge1xuICBNYXliZSxcbiAgQWdlbnQsXG4gIEludGVudCxcbiAgSW50ZW50UmVzcG9uc2UsXG4gIFNhdGlzZmFjdGlvbixcbiAgUHJvY2VzcyxcbiAgUmVzb3VyY2VTcGVjaWZpY2F0aW9uLFxuICBQcm9wb3NlZEludGVudCxcbiAgQWN0aW9uLFxuICBTYXRpc2ZhY3Rpb25Db25uZWN0aW9uLFxuICBQcm9jZXNzQ29ubmVjdGlvbixcbiAgUHJvcG9zZWRJbnRlbnRSZXNwb25zZSxcbiAgUmVzb3VyY2VTcGVjaWZpY2F0aW9uUmVzcG9uc2UsXG4gIEFjY291bnRpbmdTY29wZSxcbn0gZnJvbSAnQHZhbHVlZmxvd3MvdmYtZ3JhcGhxbCdcblxuaW1wb3J0IGFnZW50UXVlcmllcyBmcm9tICcuLi9xdWVyaWVzL2FnZW50LmpzJ1xuaW1wb3J0IHsgUHJvY2Vzc1NlYXJjaElucHV0LCBTYXRpc2ZhY3Rpb25TZWFyY2hJbnB1dCB9IGZyb20gJy4vem9tZVNlYXJjaElucHV0VHlwZXMuanMnXG5cbmNvbnN0IGV4dHJhY3RQcm9wb3NlZEludGVudCA9IChkYXRhKTogUHJvcG9zZWRJbnRlbnQgPT4gZGF0YS5wcm9wb3NlZEludGVudFxuXG5leHBvcnQgZGVmYXVsdCAoZW5hYmxlZFZGTW9kdWxlczogVmZNb2R1bGVbXSA9IERFRkFVTFRfVkZfTU9EVUxFUywgZG5hQ29uZmlnOiBETkFJZE1hcHBpbmdzLCBjb25kdWN0b3JVcmk6IHN0cmluZykgPT4ge1xuICBjb25zdCBoYXNIaXN0b3J5ID0gLTEgIT09IGVuYWJsZWRWRk1vZHVsZXMuaW5kZXhPZihWZk1vZHVsZS5IaXN0b3J5KVxuICBjb25zdCBoYXNBZ2VudCA9IC0xICE9PSBlbmFibGVkVkZNb2R1bGVzLmluZGV4T2YoVmZNb2R1bGUuQWdlbnQpXG4gIGNvbnN0IGhhc1NhdGlzZmFjdGlvbiA9IC0xICE9PSBlbmFibGVkVkZNb2R1bGVzLmluZGV4T2YoVmZNb2R1bGUuU2F0aXNmYWN0aW9uKVxuICBjb25zdCBoYXNSZXNvdXJjZVNwZWNpZmljYXRpb24gPSAtMSAhPT0gZW5hYmxlZFZGTW9kdWxlcy5pbmRleE9mKFZmTW9kdWxlLlJlc291cmNlU3BlY2lmaWNhdGlvbilcbiAgY29uc3QgaGFzQWN0aW9uID0gLTEgIT09IGVuYWJsZWRWRk1vZHVsZXMuaW5kZXhPZihWZk1vZHVsZS5BY3Rpb24pXG4gIGNvbnN0IGhhc1Byb2Nlc3MgPSAtMSAhPT0gZW5hYmxlZFZGTW9kdWxlcy5pbmRleE9mKFZmTW9kdWxlLlByb2Nlc3MpXG4gIGNvbnN0IGhhc1Byb3Bvc2FsID0gLTEgIT09IGVuYWJsZWRWRk1vZHVsZXMuaW5kZXhPZihWZk1vZHVsZS5Qcm9wb3NhbClcbiAgY29uc3QgaGFzT2JzZXJ2YXRpb24gPSAtMSAhPT0gZW5hYmxlZFZGTW9kdWxlcy5pbmRleE9mKFZmTW9kdWxlLk9ic2VydmF0aW9uKVxuXG4gIGNvbnN0IHJlYWRSZXZpc2lvbiA9IG1hcFpvbWVGbjxCeVJldmlzaW9uLCBJbnRlbnRSZXNwb25zZT4oZG5hQ29uZmlnLCBjb25kdWN0b3JVcmksICdwbGFubmluZycsICdpbnRlbnQnLCAnZ2V0X3JldmlzaW9uJylcbiAgY29uc3QgcmVhZFNhdGlzZmFjdGlvbnMgPSBtYXBab21lRm48U2F0aXNmYWN0aW9uU2VhcmNoSW5wdXQsIFNhdGlzZmFjdGlvbkNvbm5lY3Rpb24+KGRuYUNvbmZpZywgY29uZHVjdG9yVXJpLCAncGxhbm5pbmcnLCAnc2F0aXNmYWN0aW9uX2luZGV4JywgJ3F1ZXJ5X3NhdGlzZmFjdGlvbnMnKVxuICBjb25zdCByZWFkUHJvY2Vzc2VzID0gbWFwWm9tZUZuPFByb2Nlc3NTZWFyY2hJbnB1dCwgUHJvY2Vzc0Nvbm5lY3Rpb24+KGRuYUNvbmZpZywgY29uZHVjdG9yVXJpLCAnb2JzZXJ2YXRpb24nLCAncHJvY2Vzc19pbmRleCcsICdxdWVyeV9wcm9jZXNzZXMnKVxuICBjb25zdCByZWFkUHJvcG9zZWRJbnRlbnQgPSBtYXBab21lRm48UmVhZFBhcmFtcywgUHJvcG9zZWRJbnRlbnRSZXNwb25zZT4oZG5hQ29uZmlnLCBjb25kdWN0b3JVcmksICdwcm9wb3NhbCcsICdwcm9wb3NlZF9pbnRlbnQnLCAnZ2V0X3Byb3Bvc2VkX2ludGVudCcpXG4gIGNvbnN0IHJlYWRSZXNvdXJjZVNwZWNpZmljYXRpb24gPSBtYXBab21lRm48UmVhZFBhcmFtcywgUmVzb3VyY2VTcGVjaWZpY2F0aW9uUmVzcG9uc2U+KGRuYUNvbmZpZywgY29uZHVjdG9yVXJpLCAnc3BlY2lmaWNhdGlvbicsICdyZXNvdXJjZV9zcGVjaWZpY2F0aW9uJywgJ2dldF9yZXNvdXJjZV9zcGVjaWZpY2F0aW9uJylcbiAgY29uc3QgcmVhZEFjdGlvbiA9IG1hcFpvbWVGbjxCeUlkLCBBY3Rpb24+KGRuYUNvbmZpZywgY29uZHVjdG9yVXJpLCAnc3BlY2lmaWNhdGlvbicsICdhY3Rpb24nLCAnZ2V0X2FjdGlvbicpXG4gIGNvbnN0IHJlYWRBZ2VudCA9IGFnZW50UXVlcmllcyhkbmFDb25maWcsIGNvbmR1Y3RvclVyaSlbJ2FnZW50J11cblxuICByZXR1cm4gT2JqZWN0LmFzc2lnbihcbiAgICAoaGFzU2F0aXNmYWN0aW9uID8ge1xuICAgICAgc2F0aXNmaWVkQnk6IGFzeW5jIChyZWNvcmQ6IEludGVudCk6IFByb21pc2U8U2F0aXNmYWN0aW9uW10+ID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHJlYWRTYXRpc2ZhY3Rpb25zKHsgcGFyYW1zOiB7IHNhdGlzZmllczogcmVjb3JkLmlkIH0gfSlcbiAgICAgICAgcmV0dXJuIGV4dHJhY3RFZGdlcyhyZXN1bHRzKVxuICAgICAgfSxcbiAgICB9IDoge30pLFxuICAgIChoYXNBZ2VudCA/IHtcbiAgICAgIHByb3ZpZGVyOiBhc3luYyAocmVjb3JkOiBJbnRlbnQpOiBQcm9taXNlPE1heWJlPEFnZW50Pj4gPT4ge1xuICAgICAgICByZXR1cm4gcmVjb3JkLnByb3ZpZGVyID8gcmVhZEFnZW50KHJlY29yZCwgeyBpZDogcmVjb3JkLnByb3ZpZGVyIH0pIDogbnVsbFxuICAgICAgfSxcblxuICAgICAgcmVjZWl2ZXI6IGFzeW5jIChyZWNvcmQ6IEludGVudCk6IFByb21pc2U8TWF5YmU8QWdlbnQ+PiA9PiB7XG4gICAgICAgIHJldHVybiByZWNvcmQucmVjZWl2ZXIgPyByZWFkQWdlbnQocmVjb3JkLCB7IGlkOiByZWNvcmQucmVjZWl2ZXIgfSkgOiBudWxsXG4gICAgICB9LFxuICAgICAgaW5TY29wZU9mOiBhc3luYyAocmVjb3JkOiB7IGluU2NvcGVPZjogQWdlbnRBZGRyZXNzW10gfSk6IFByb21pc2U8QWNjb3VudGluZ1Njb3BlW10+ID0+IHtcbiAgICAgICAgcmV0dXJuIChhd2FpdCBQcm9taXNlLmFsbCgocmVjb3JkLmluU2NvcGVPZiB8fCBbXSkubWFwKChhZGRyZXNzKT0+cmVhZEFnZW50KHJlY29yZCwge2FkZHJlc3N9KSkpKVxuICAgICAgfSxcbiAgICB9IDoge30pLFxuICAgIChoYXNQcm9jZXNzID8ge1xuICAgICAgaW5wdXRPZjogYXN5bmMgKHJlY29yZDogSW50ZW50KTogUHJvbWlzZTxQcm9jZXNzPiA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCByZWFkUHJvY2Vzc2VzKHsgcGFyYW1zOiB7IGludGVuZGVkSW5wdXRzOiByZWNvcmQuaWQgfSB9KVxuICAgICAgICByZXR1cm4gcmVzdWx0cy5lZGdlcy5wb3AoKSFbJ25vZGUnXVxuICAgICAgfSxcblxuICAgICAgb3V0cHV0T2Y6IGFzeW5jIChyZWNvcmQ6IEludGVudCk6IFByb21pc2U8UHJvY2Vzcz4gPT4ge1xuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgcmVhZFByb2Nlc3Nlcyh7IHBhcmFtczogeyBpbnRlbmRlZE91dHB1dHM6IHJlY29yZC5pZCB9IH0pXG4gICAgICAgIHJldHVybiByZXN1bHRzLmVkZ2VzLnBvcCgpIVsnbm9kZSddXG4gICAgICB9LFxuICAgIH0gOiB7fSksXG4gICAgKGhhc1Byb3Bvc2FsID8ge1xuICAgICAgcHVibGlzaGVkSW46IGFzeW5jIChyZWNvcmQ6IHsgcHVibGlzaGVkSW46IFByb3Bvc2VkSW50ZW50QWRkcmVzc1tdIH0pOiBQcm9taXNlPFByb3Bvc2VkSW50ZW50W10+ID0+IHtcbiAgICAgICAgcmV0dXJuIChhd2FpdCBQcm9taXNlLmFsbCgocmVjb3JkLnB1Ymxpc2hlZEluIHx8IFtdKS5tYXAoKGFkZHJlc3MpPT5yZWFkUHJvcG9zZWRJbnRlbnQoe2FkZHJlc3N9KSkpKS5tYXAoZXh0cmFjdFByb3Bvc2VkSW50ZW50KVxuICAgICAgfSxcbiAgICB9IDoge30pLFxuICAgIChoYXNSZXNvdXJjZVNwZWNpZmljYXRpb24gPyB7XG4gICAgICByZXNvdXJjZUNvbmZvcm1zVG86IGFzeW5jIChyZWNvcmQ6IHsgcmVzb3VyY2VDb25mb3Jtc1RvOiBSZXNvdXJjZVNwZWNpZmljYXRpb25BZGRyZXNzIH0pOiBQcm9taXNlPFJlc291cmNlU3BlY2lmaWNhdGlvbj4gPT4ge1xuICAgICAgICByZXR1cm4gKGF3YWl0IHJlYWRSZXNvdXJjZVNwZWNpZmljYXRpb24oeyBhZGRyZXNzOiByZWNvcmQucmVzb3VyY2VDb25mb3Jtc1RvIH0pKS5yZXNvdXJjZVNwZWNpZmljYXRpb25cbiAgICAgIH0sXG4gICAgfSA6IHt9KSxcbiAgICAoaGFzQWN0aW9uID8ge1xuICAgICAgYWN0aW9uOiBhc3luYyAocmVjb3JkOiB7IGFjdGlvbjogQWRkcmVzc2FibGVJZGVudGlmaWVyIH0pOiBQcm9taXNlPEFjdGlvbj4gPT4ge1xuICAgICAgICByZXR1cm4gKGF3YWl0IHJlYWRBY3Rpb24oeyBpZDogcmVjb3JkLmFjdGlvbiB9KSlcbiAgICAgIH0sXG4gICAgfSA6IHt9KSxcbiAgICAoaGFzT2JzZXJ2YXRpb24gPyB7XG4gICAgICByZXNvdXJjZUludmVudG9yaWVkQXM6ICgpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZXNvbHZlciB1bmltcGxlbWVudGVkJylcbiAgICAgIH0sXG4gICAgfSA6IHt9KSxcbiAgICAoaGFzSGlzdG9yeSA/IHtcbiAgICAgIHJldmlzaW9uOiBhc3luYyAocmVjb3JkOiBJbnRlbnQsIGFyZ3M6IHsgcmV2aXNpb25JZDogQWRkcmVzc2FibGVJZGVudGlmaWVyIH0pOiBQcm9taXNlPEludGVudD4gPT4ge1xuICAgICAgICByZXR1cm4gKGF3YWl0IHJlYWRSZXZpc2lvbihhcmdzKSkuaW50ZW50XG4gICAgICB9LFxuICAgIH0gOiB7fSksXG4gIClcbn1cbiJdfQ==