Initial commit: Extract base Zabbix GraphQl - API functionality from VCR Project and add dynamic schema samples

This commit is contained in:
Andreas Hilbig 2026-01-05 21:05:35 +01:00
commit 92ffe71684
42 changed files with 4234 additions and 0 deletions

59
src/api/schema.ts Normal file
View file

@ -0,0 +1,59 @@
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<GraphQLSchema> {
const resolvers = createResolvers();
let typeDefs: string = readFileSync('./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<string, any> = {
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
});
}