import { createHierarchicalValueFieldResolver, zabbixItemValueSourceFieldMapper, zabbixTagsValueSourceFieldMapper } from "./resolver_helpers.js"; import {makeExecutableSchema, mergeSchemas} from "@graphql-tools/schema"; import {readFileSync} from "fs"; import {GraphQLSchema} from "graphql/type"; import {createResolvers} from "./resolvers.js"; const createZabbixHierarchicalDeviceFieldResolver = (typename: string, schema: any, additionalMappings: { [p: string]: any } = {}) => { return { ...createHierarchicalValueFieldResolver(schema, typename, zabbixItemValueSourceFieldMapper), ...additionalMappings } } const createZabbixHierarchicalDeviceTagsResolver = (typename: string, schema: any, additionalMappings: { [p: string]: any } = {}) => { return { ...createHierarchicalValueFieldResolver(schema, typename, zabbixTagsValueSourceFieldMapper), ...additionalMappings } } export async function schema_loader(): Promise { const resolvers = createResolvers(); let typeDefs: string = readFileSync('./src/schema/*.graphql', {encoding: 'utf-8'}); if (process.env.ADDITIONAL_SCHEMAS) { for (const schema of process.env.ADDITIONAL_SCHEMAS.split(",")){ typeDefs += readFileSync(schema, {encoding: 'utf-8'}); } } let originalSchema = makeExecutableSchema({ typeDefs, resolvers, }); let additionalMappings = { tags: (parent: { tags: any; inheritedTags: any }) => { return (parent.tags || []).concat(parent.inheritedTags || []) } } let genericResolvers: Record = { Device: createZabbixHierarchicalDeviceFieldResolver("Device", originalSchema,additionalMappings ), GenericDevice: createZabbixHierarchicalDeviceFieldResolver("GenericDevice", originalSchema, additionalMappings), } if (process.env.ADDITIONAL_RESOLVERS) { for (const resolver of process.env.ADDITIONAL_RESOLVERS.split(",")){ genericResolvers[resolver] = createZabbixHierarchicalDeviceFieldResolver(resolver, originalSchema, additionalMappings) } } return mergeSchemas({ schemas: [originalSchema], // TODO Generate resolvers for all schema types with @generateZabbix directive automatically resolvers: genericResolvers }); }