/** * Resolvers for Process fields * * @package: HoloREA * @since: 2019-09-12 */ import { DNAIdMappings, injectTypename, DEFAULT_VF_MODULES, VfModule, ReadParams, ProcessSpecificationAddress, AgentAddress } from '../types.js' import { mapZomeFn, extractEdges } from '../connection.js' import { Process, EconomicEvent, Commitment, Intent, ProcessSpecification, Plan, EconomicEventConnection, CommitmentConnection, IntentConnection, ProcessSpecificationResponse, Agent, AccountingScope } from '@valueflows/vf-graphql' import planQueries from '../queries/plan.js' import { CommitmentSearchInput, EconomicEventSearchInput, IntentSearchInput } from './zomeSearchInputTypes.js' import { AgentResponse } from '../mutations/agent.js' export default (enabledVFModules: VfModule[] = DEFAULT_VF_MODULES, dnaConfig: DNAIdMappings, conductorUri: string) => { const hasObservation = -1 !== enabledVFModules.indexOf(VfModule.Observation) const hasProcessSpecification = -1 !== enabledVFModules.indexOf(VfModule.ProcessSpecification) const hasCommitment = -1 !== enabledVFModules.indexOf(VfModule.Commitment) const hasIntent = -1 !== enabledVFModules.indexOf(VfModule.Intent) const hasPlan = -1 !== enabledVFModules.indexOf(VfModule.Plan) const hasAgent = -1 !== enabledVFModules.indexOf(VfModule.Agent) const readEvents = mapZomeFn(dnaConfig, conductorUri, 'observation', 'economic_event_index', 'query_economic_events') const readCommitments = mapZomeFn(dnaConfig, conductorUri, 'planning', 'commitment_index', 'query_commitments') const readIntents = mapZomeFn(dnaConfig, conductorUri, 'planning', 'intent_index', 'query_intents') const readProcessBasedOn = mapZomeFn(dnaConfig, conductorUri, 'specification', 'process_specification', 'get_process_specification') const readPlan = planQueries(dnaConfig, conductorUri)['plan'] const readAgent = mapZomeFn(dnaConfig, conductorUri, 'agent', 'agent', 'get_agent') return Object.assign( { nextProcesses: () => { throw new Error('resolver unimplemented') }, previousProcesses: () => { throw new Error('resolver unimplemented') }, }, (hasObservation ? { observedInputs: injectTypename('EconomicEvent', async (record: Process): Promise => { const results = await readEvents({ params: { inputOf: record.id } }) return extractEdges(results) }), observedOutputs: injectTypename('EconomicEvent', async (record: Process): Promise => { const results = await readEvents({ params: { outputOf: record.id } }) return extractEdges(results) }), unplannedInputs: () => { throw new Error('resolver unimplemented') }, unplannedOutputs: () => { throw new Error('resolver unimplemented') }, previous: () => { throw new Error('resolver unimplemented') }, next: () => { throw new Error('resolver unimplemented') }, } : {}), (hasCommitment ? { committedInputs: injectTypename('Commitment', async (record: Process): Promise => { const results = await readCommitments({ params: { inputOf: record.id } }) return extractEdges(results) }), committedOutputs: injectTypename('Commitment', async (record: Process): Promise => { const results = await readCommitments({ params: { outputOf: record.id } }) return extractEdges(results) }), } : {}), (hasIntent ? { intendedInputs: async (record: Process): Promise => { const results = await readIntents({ params: { inputOf: record.id } }) return extractEdges(results) }, intendedOutputs: async (record: Process): Promise => { const results = await readIntents({ params: { outputOf: record.id } }) return extractEdges(results) }, } : {}), (hasProcessSpecification ? { basedOn: async (record: { basedOn: ProcessSpecificationAddress }): Promise => { return (await readProcessBasedOn({ address: record.basedOn })).processSpecification }, } : {}), (hasPlan ? { plannedWithin: async (record: Process): Promise => { return (await readPlan(record, { id: record.plannedWithin })) }, } : {}), (hasAgent ? { involvedAgents: () => { throw new Error('resolver unimplemented') }, workingAgents: async (record: { workingAgents: AgentAddress[] }): Promise => { return (await Promise.all((record.workingAgents || []).map((address)=>readAgent({address})))).map((agentResponse) => agentResponse.agent) }, inScopeOf: async (record: { inScopeOf: AgentAddress[] }): Promise => { return (await Promise.all((record.inScopeOf || []).map((address)=>readAgent({address})))).map((agentResponse) => agentResponse.agent) }, } : {}), ) }