UNPKG

@leosprograms/vf-graphql-holochain

Version:

GraphQL schema bindings for the Holochain implementation of ValueFlows

162 lines (152 loc) 7.07 kB
/** * Resolvers for EconomicEvent fields * * @package: HoloREA * @since: 2019-08-27 */ import { DNAIdMappings, DEFAULT_VF_MODULES, VfModule, ById, ByRevision, ReadParams, ResourceSpecificationAddress, AddressableIdentifier, AgentAddress, EconomicResourceAddress } from '../types.js' import { extractEdges, mapZomeFn } from '../connection.js' import { Agent, EconomicEvent, EconomicEventResponse, EconomicResource, Fulfillment, Satisfaction, Process, ResourceSpecification, Action, Agreement, FulfillmentConnection, SatisfactionConnection, ProcessConnection, ResourceSpecificationResponse, AccountingScope, } from '@leosprograms/vf-graphql' import agentQueries from '../queries/agent.js' import agreementQueries from '../queries/agreement.js' import resourceQueries from '../queries/economicResource.js' import { FulfillmentSearchInput, ProcessSearchInput, SatisfactionSearchInput } from './zomeSearchInputTypes.js' export default (enabledVFModules: VfModule[] = DEFAULT_VF_MODULES, dnaConfig: DNAIdMappings, conductorUri: string) => { const hasHistory = -1 !== enabledVFModules.indexOf(VfModule.History) const hasAgent = -1 !== enabledVFModules.indexOf(VfModule.Agent) const hasResourceSpecification = -1 !== enabledVFModules.indexOf(VfModule.ResourceSpecification) const hasAction = -1 !== enabledVFModules.indexOf(VfModule.Action) const hasFulfillment = -1 !== enabledVFModules.indexOf(VfModule.Fulfillment) const hasSatisfaction = -1 !== enabledVFModules.indexOf(VfModule.Satisfaction) const hasAgreement = -1 !== enabledVFModules.indexOf(VfModule.Agreement) const hasProcess = -1 !== enabledVFModules.indexOf(VfModule.Process) const readRevision = mapZomeFn<ByRevision, EconomicEventResponse>(dnaConfig, conductorUri, 'combined', 'economic_event', 'get_revision') const readFulfillments = mapZomeFn<FulfillmentSearchInput, FulfillmentConnection>(dnaConfig, conductorUri, 'combined', 'indexing', 'query_fulfillments') const readSatisfactions = mapZomeFn<SatisfactionSearchInput, SatisfactionConnection>(dnaConfig, conductorUri, 'combined', 'indexing', 'query_satisfactions') const readProcesses = mapZomeFn<ProcessSearchInput, ProcessConnection>(dnaConfig, conductorUri, 'combined', 'indexing', 'query_processes') const readAction = mapZomeFn<ById, Action>(dnaConfig, conductorUri, 'combined', 'action', 'get_action') const readResourceSpecification = mapZomeFn<ReadParams, ResourceSpecificationResponse>(dnaConfig, conductorUri, 'combined', 'resource_specification', 'get_resource_specification') const readAgent = agentQueries(dnaConfig, conductorUri)['agent'] const readAgreement = agreementQueries(dnaConfig, conductorUri)['agreement'] const readResource = resourceQueries(dnaConfig, conductorUri)['economicResource'] return Object.assign( { resourceInventoriedAs: async (record: { resourceInventoriedAs: EconomicResourceAddress }): Promise<EconomicResource | null> => { if (!record.resourceInventoriedAs) return null return await readResource(record, { id: record.resourceInventoriedAs }) }, toResourceInventoriedAs: async (record: { toResourceInventoriedAs: EconomicResourceAddress }): Promise<EconomicResource | null> => { if (!record.toResourceInventoriedAs) return null return await readResource(record, { id: record.toResourceInventoriedAs }) }, triggeredBy: () => { throw new Error('resolver unimplemented') }, triggers: () => { throw new Error('resolver unimplemented') }, previous: () => { throw new Error('resolver unimplemented') }, next: () => { throw new Error('resolver unimplemented') }, track: () => { throw new Error('resolver unimplemented') }, trace: () => { throw new Error('resolver unimplemented') }, }, (hasProcess ? { inputOfId: async (record: EconomicEvent): Promise<any> => { return record.inputOf ? record.inputOf : "" }, inputOf: async (record: EconomicEvent): Promise<Process | {}> => { const results = await readProcesses({ params: { observedInputs: record.id } }) if (results.edges?.length > 0) { return results.edges.pop()!['node'] } else { return {} } }, outputOfId: async (record: EconomicEvent): Promise<any> => { return record.outputOf ? record.outputOf : "" }, outputOf: async (record: EconomicEvent): Promise<Process | {}> => { const results = await readProcesses({ params: { observedOutputs: record.id } }) if (results.edges?.length > 0) { return results.edges.pop()!['node'] } else { return {} } }, } : {}), (hasAgent ? { providerId: async (record: EconomicEvent): Promise<any> => { return record.provider ? record.provider : null }, provider: async (record: EconomicEvent): Promise<Agent> => { return readAgent(record, { id: record.provider }) }, receiverId: async (record: EconomicEvent): Promise<any> => { return record.receiver ? record.receiver : null }, receiver: async (record: EconomicEvent): Promise<Agent> => { return readAgent(record, { id: record.receiver }) }, inScopeOf: async (record: { inScopeOf: AgentAddress[] }): Promise<AccountingScope[]> => { return (await Promise.all((record.inScopeOf || []).map((address)=>readAgent(record, {address})))) }, } : {}), (hasFulfillment ? { fulfills: async (record: EconomicEvent): Promise<Fulfillment[]> => { const results = await readFulfillments({ params: { fulfilledBy: record.id } }) return extractEdges(results) }, } : {}), (hasSatisfaction ? { satisfies: async (record: EconomicEvent): Promise<Satisfaction[]> => { const results = await readSatisfactions({ params: { satisfiedBy: record.id } }) return extractEdges(results) }, } : {}), (hasResourceSpecification ? { resourceConformsTo: async (record: { resourceConformsTo: ResourceSpecificationAddress }): Promise<ResourceSpecification> => { // record isn't quite an `EconomicEvent` since it stores ids for linked types, not the type itself, right? return (await readResourceSpecification({ address: record.resourceConformsTo })).resourceSpecification }, } : {}), (hasAction ? { action: async (record: { action: AddressableIdentifier }): Promise<Action> => { return (await readAction({ id: record.action })) }, } : {}), (hasAgreement ? { realizationOf: async (record: EconomicEvent): Promise<Agreement> => { return readAgreement(record, { id: record.realizationOf }) }, } : {}), (hasHistory ? { revision: async (record: EconomicEvent, args: { revisionId: AddressableIdentifier }): Promise<EconomicEvent> => { return (await readRevision(args)).economicEvent }, } : {}), ) }