diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index 6e70aca..884029d 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -1,6 +1,7 @@
-
+
+
\ No newline at end of file
diff --git a/.idea/runConfigurations/index_ts.xml b/.idea/runConfigurations/index_ts.xml
index d0a877b..9443e41 100644
--- a/.idea/runConfigurations/index_ts.xml
+++ b/.idea/runConfigurations/index_ts.xml
@@ -1,8 +1,8 @@
-
+
-
-
+
+
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index d8954de..0bf46a2 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -4,9 +4,21 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -63,7 +75,9 @@
"node.js.selected.package.tslint": "(autodetect)",
"nodejs_interpreter_path": "wsl://Ubuntu@/home/ahilbig/.nvm/versions/node/v24.12.0/bin/node",
"nodejs_package_manager_path": "npm",
- "settings.editor.selected.configurable": "settings.typescriptcompiler",
+ "npm.compile.executor": "Run",
+ "npm.prod.executor": "Run",
+ "settings.editor.selected.configurable": "preferences.sourceCode.TypeScript",
"ts.external.directory.path": "\\\\wsl.localhost\\Ubuntu\\home\\ahilbig\\git\\vcr\\zabbix-graphql-api\\node_modules\\typescript\\lib",
"vue.rearranger.settings.migration": "true"
}
@@ -82,11 +96,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -102,8 +132,33 @@
1768273021451
-
+
+
+
+ 1768310046741
+
+
+
+ 1768310046741
+
+
+
+ 1768310076697
+
+
+
+ 1768310076697
+
+
+
+ 1768310176163
+
+
+
+ 1768310176163
+
+
@@ -121,9 +176,11 @@
-
-
+
+
+
+
\ No newline at end of file
diff --git a/extensions/location_tracker_commons.graphql b/extensions/location_tracker_commons.graphql
index 4e592d9..fd417af 100644
--- a/extensions/location_tracker_commons.graphql
+++ b/extensions/location_tracker_commons.graphql
@@ -1,17 +1,5 @@
-"""
-Concrete implementation of a DeviceValueMessage for sensor distance data.
-"""
-type SensorDistanceMessage implements DeviceValueMessage {
- deviceKey: String
- timestamp: String
- attributeName: String
- topicName: String
- deviceType: String
- value: SensorDistanceValue
-}
-
"""
Represents the payload for a sensor distance measurement.
"""
@@ -58,3 +46,15 @@ type PositionCalculatorResult {
position: Position
accuracy: Float
}
+
+"""
+Concrete implementation of a DeviceValueMessage for sensor distance data.
+"""
+type SensorDistanceMessage implements DeviceValueMessage {
+ deviceKey: String
+ timestamp: String
+ attributeName: String
+ topicName: String
+ deviceType: String
+ value: SensorDistanceValue
+}
diff --git a/extensions/location_tracker_devices.graphql b/extensions/location_tracker_devices.graphql
index 22607c4..1865863 100644
--- a/extensions/location_tracker_devices.graphql
+++ b/extensions/location_tracker_devices.graphql
@@ -18,30 +18,13 @@ type DistanceTrackerDevice implements Host & Device {
type DistanceTrackerState implements DeviceState {
operational: OperationalDeviceData
- current: DistanceTrackerCurrentState
-}
-
-type DistanceTrackerCurrentState {
- values: DistanceTrackerValues
+ current: DistanceTrackerValues
}
+"""
+Aggregated information of devices detected around the tracker
+"""
type DistanceTrackerValues {
- """
- Aggregated information of devices detected around the tracker
- """
- countValues: DeviceCountValues
- """
- Information about devices detected nearby
- """
- distanceValues: String
-
-}
-
-type DeviceCountValues {
- """
- Number of unique deviceKeys detected between timeFrom and timeUnti
- """
- count: Int
"""
Start of time interval for the delivered device counting value
"""
@@ -50,19 +33,13 @@ type DeviceCountValues {
End of time interval for the delivered device counting value
"""
timeUntil: Time
-}
-type DeviceDistanceValues {
"""
Number of unique deviceKeys detected between timeFrom and timeUnti
"""
count: Int
"""
- Start of time interval for the delivered device counting value
+ Detailed information about devices detected nearby
"""
- timeFrom: Time
- """
- End of time interval for the delivered device counting value
- """
- timeUntil: Time
+ distances: [SensorDistanceValue!]
}
diff --git a/src/api/resolver_helpers.ts b/src/api/resolver_helpers.ts
index a462cc0..4a4c37c 100644
--- a/src/api/resolver_helpers.ts
+++ b/src/api/resolver_helpers.ts
@@ -1,6 +1,6 @@
import {isObjectType} from "graphql";
import {logger} from "../logging/logger.js";
-import {Device, Host} from "../schema/generated/graphql";
+import {Device, Host} from "../schema/generated/graphql.js";
export const isDevice = (value: Host): value is Device => !!(value as Device).deviceType;
diff --git a/src/api/resolvers.ts b/src/api/resolvers.ts
index 0333017..66616f6 100644
--- a/src/api/resolvers.ts
+++ b/src/api/resolvers.ts
@@ -17,8 +17,8 @@ import {
StorageItemType,
} from "../schema/generated/graphql.js";
-import {HostImporter} from "../execution/host_importer";
-import {HostValueExporter} from "../execution/host_exporter";
+import {HostImporter} from "../execution/host_importer.js";
+import {HostValueExporter} from "../execution/host_exporter.js";
import {logger} from "../logging/logger.js";
import {ParsedArgs, ZabbixRequest} from "../datasources/zabbix-request.js";
import {ZabbixCreateHostRequest, ZabbixQueryHostsRequestWithItemsAndInventory,} from "../datasources/zabbix-hosts.js";
@@ -34,10 +34,10 @@ import {
ZabbixImportUserRolesRequest,
ZabbixQueryUserRolesRequest
} from "../datasources/zabbix-userroles.js";
-import {ZABBIX_EDGE_DEVICE_BASE_GROUP, zabbixAPI} from "../datasources/zabbix-api";
-import {GraphQLInterfaceType, GraphQLList} from "graphql/type";
-import {isDevice} from "./resolver_helpers";
-import {ZabbixPermissionsHelper} from "../datasources/zabbix-permissions";
+import {ZABBIX_EDGE_DEVICE_BASE_GROUP, zabbixAPI} from "../datasources/zabbix-api.js";
+import {GraphQLInterfaceType, GraphQLList} from "graphql/type/index.js";
+import {isDevice} from "./resolver_helpers.js";
+import {ZabbixPermissionsHelper} from "../datasources/zabbix-permissions.js";
export function createResolvers(): Resolvers {
diff --git a/src/api/schema.ts b/src/api/schema.ts
index 5beef23..686b25e 100644
--- a/src/api/schema.ts
+++ b/src/api/schema.ts
@@ -7,6 +7,7 @@ import {makeExecutableSchema, mergeSchemas} from "@graphql-tools/schema";
import {readFileSync} from "fs";
import {GraphQLSchema} from "graphql/type";
import {createResolvers} from "./resolvers.js";
+import {readdirSync} from "node:fs";
const createZabbixHierarchicalDeviceFieldResolver =
@@ -25,7 +26,12 @@ const createZabbixHierarchicalDeviceTagsResolver =
}
export async function schema_loader(): Promise {
const resolvers = createResolvers();
- let typeDefs: string = readFileSync('./src/schema/*.graphql', {encoding: 'utf-8'});
+ const schemaPath = process.env.SCHEMA_PATH || './src/schema/';
+ var schemaFiles = readdirSync(schemaPath).filter(fn => fn.endsWith('.graphql'));
+ let typeDefs: string = "";
+ for (const schemaFile of schemaFiles) {
+ typeDefs += readFileSync(schemaPath + schemaFile, {encoding: 'utf-8'});
+ }
if (process.env.ADDITIONAL_SCHEMAS) {
for (const schema of process.env.ADDITIONAL_SCHEMAS.split(",")){
typeDefs += readFileSync(schema, {encoding: 'utf-8'});
diff --git a/src/api/start.ts b/src/api/start.ts
index f61fdb0..8c436fa 100644
--- a/src/api/start.ts
+++ b/src/api/start.ts
@@ -8,7 +8,7 @@ import express from 'express';
import cors from "cors";
import {ApolloServerPluginDrainHttpServer} from '@apollo/server/plugin/drainHttpServer';
import {logger} from "../logging/logger.js";
-import {zabbixAPI, zabbixRequestAuthToken} from "../datasources/zabbix-api";
+import {zabbixAPI, zabbixRequestAuthToken} from "../datasources/zabbix-api.js";
import {WebSocketServer} from "ws";
import {useServer} from "graphql-ws/lib/use/ws";
diff --git a/src/datasources/zabbix-hostgroups.ts b/src/datasources/zabbix-hostgroups.ts
index 4f18203..03d0664 100644
--- a/src/datasources/zabbix-hostgroups.ts
+++ b/src/datasources/zabbix-hostgroups.ts
@@ -1,13 +1,13 @@
-import {isZabbixErrorResult, ParsedArgs, ZabbixParams, ZabbixRequest} from "./zabbix-request.js";
+import {isZabbixErrorResult, ParsedArgs, ZabbixParams} from "./zabbix-request.js";
import {Permission} from "../schema/generated/graphql.js";
import {
FIND_ZABBIX_EDGE_DEVICE_BASE_GROUP_PREFIX,
ZABBIX_EDGE_DEVICE_BASE_GROUP,
ZabbixAPI,
zabbixSuperAuthToken
-} from "./zabbix-api";
-import {logger} from "../logging/logger";
-import {ZabbixRequestWithPermissions} from "./zabbix-permissions";
+} from "./zabbix-api.js";
+import {logger} from "../logging/logger.js";
+import {ZabbixRequestWithPermissions} from "./zabbix-permissions.js";
export interface CreateHostGroupResult {
groupids: string[]
diff --git a/src/datasources/zabbix-items.ts b/src/datasources/zabbix-items.ts
index 981f74e..24b1314 100644
--- a/src/datasources/zabbix-items.ts
+++ b/src/datasources/zabbix-items.ts
@@ -1,5 +1,5 @@
import {ParsedArgs, ZabbixRequest} from "./zabbix-request.js";
-import {ZabbixItem} from "../schema/generated/graphql";
+import {ZabbixItem} from "../schema/generated/graphql.js";
export class ZabbixQueryItemsRequest extends ZabbixRequest {
diff --git a/src/datasources/zabbix-permissions.ts b/src/datasources/zabbix-permissions.ts
index 5af0a3d..c75fce9 100644
--- a/src/datasources/zabbix-permissions.ts
+++ b/src/datasources/zabbix-permissions.ts
@@ -1,7 +1,7 @@
import {ParsedArgs, ZabbixErrorResult, ZabbixRequest, ZabbixResult} from "./zabbix-request.js";
-import {ZabbixAPI} from "./zabbix-api";
-import {InputMaybe, Permission, QueryHasPermissionsArgs, UserPermission} from "../schema/generated/graphql";
-import {ApiErrorCode, PermissionNumber} from "../model/model_enum_values";
+import {ZabbixAPI} from "./zabbix-api.js";
+import {InputMaybe, Permission, QueryHasPermissionsArgs, UserPermission} from "../schema/generated/graphql.js";
+import {ApiErrorCode, PermissionNumber} from "../model/model_enum_values.js";
export class ZabbixRequestWithPermissions extends ZabbixRequest {
diff --git a/src/execution/host_exporter.ts b/src/execution/host_exporter.ts
index 4606e77..084c060 100644
--- a/src/execution/host_exporter.ts
+++ b/src/execution/host_exporter.ts
@@ -8,7 +8,7 @@ import {ApiErrorCode, ApiErrorMessage} from "../model/model_enum_values.js";
import {ZabbixQueryItemsRequest} from "../datasources/zabbix-items.js";
import {isZabbixErrorResult, ParsedArgs, ZabbixErrorResult} from "../datasources/zabbix-request.js";
import {ZabbixHistoryGetParams, ZabbixQueryHistoryRequest} from "../datasources/zabbix-history.js";
-import {zabbixAPI} from "../datasources/zabbix-api";
+import {zabbixAPI} from "../datasources/zabbix-api.js";
type FilterCombo = {
deviceKey: string,
diff --git a/src/execution/host_importer.ts b/src/execution/host_importer.ts
index 1439292..3fa4624 100644
--- a/src/execution/host_importer.ts
+++ b/src/execution/host_importer.ts
@@ -9,7 +9,7 @@ import {logger} from "../logging/logger.js";
import {ZabbixQueryTemplatesRequest} from "../datasources/zabbix-templates.js";
import {isZabbixErrorResult, ParsedArgs, ZabbixErrorResult} from "../datasources/zabbix-request.js";
import {CreateHostGroupResult, GroupHelper, ZabbixCreateHostGroupRequest} from "../datasources/zabbix-hostgroups.js";
-import {ZABBIX_EDGE_DEVICE_BASE_GROUP, zabbixAPI} from "../datasources/zabbix-api";
+import {ZABBIX_EDGE_DEVICE_BASE_GROUP, zabbixAPI} from "../datasources/zabbix-api.js";
export class HostImporter {
public static getHostGroupHierarchyNames(hostGroups: Array) {
diff --git a/src/schema/zabbix.graphql b/src/schema/zabbix.graphql
index 37d7330..6f85fca 100644
--- a/src/schema/zabbix.graphql
+++ b/src/schema/zabbix.graphql
@@ -16,6 +16,11 @@ interface Host {
hostgroups: [HostGroup!]
name: String
tags: JSONObject
+ """
+ Specifies the type or category of the device. Used to define the classification
+ of a device in the system (capabilities, functionalities, or purpose).
+ """
+ deviceType: String
}
type ZabbixItem {
@@ -56,6 +61,11 @@ type ZabbixHost implements Host {
name: String
tags: JSONObject
+ """
+ Specifies the type or category of the device. Used to define the classification
+ of a device in the system (capabilities, functionalities, or purpose).
+ """
+ deviceType: String
items: [ZabbixItem!]
inventory: Inventory