"use strict"; const Promise = require("bluebird"); const graphql = require("graphql"); const fs = require("fs"); const path = require("path"); const createGraphQLInterface = require("../packages/graphql-interface/index"); const All = require("../packages/graphql-interface/symbols/all"); const loadTypes = require("../packages/graphql-interface/type-loader"); const createLoaders = require("./loaders"); /* FIXME: This seems to be added into a global registry somehow? How to specify this explicitly on a query without relying on globals? */ new graphql.GraphQLScalarType({ name: "ByteSize", description: "A value that represents a value on a byte scale", serialize: (value) => { return JSON.stringify(value); }, parseValue: (value) => { return JSON.parse(value); }, parseLiteral: (value) => { return JSON.parse(value); }, }); new graphql.GraphQLScalarType({ name: "TimeSize", description: "A value that represents a value on a time scale", serialize: (value) => { return JSON.stringify(value); }, parseValue: (value) => { return JSON.parse(value); }, parseLiteral: (value) => { return JSON.parse(value); }, }); let schema = graphql.buildSchema(fs.readFileSync(path.resolve(__dirname, "../schemas/main.gql"), "utf8")); let types = loadTypes({ Drive: require("./types/drive"), BlockDevice: require("./types/block-device"), Mount: require("./types/mount"), LVMPhysicalVolume: require("./types/lvm-physical-volume"), LVMVolumeGroup: require("./types/lvm-volume-group"), }); module.exports = function () { return createGraphQLInterface(schema, { loaderFactory: createLoaders }, { hardware: { drives: function ({ paths }, { data }) { return Promise.try(() => { if (paths != null) { return data.smartctlScan.loadMany(paths); } else { return data.smartctlScan.load(All); } }).then((devices) => { return devices.map((device) => { return types.Drive({ path: device.path }); }); }); } }, resources: { blockDevices: function ({ names }, { data }) { return Promise.try(() => { if (names != null) { return data.lsblk.loadMany(names); } else { return data.lsblk.load(All); } }).then((devices) => { return devices.map((device) => { return types.BlockDevice({ name: device.name }); }); }); }, lvm: { physicalVolumes: function ({ paths }, { data }) { return Promise.try(() => { if (paths != null) { return data.lvmPhysicalVolumes.loadMany(paths); } else { return data.lvmPhysicalVolumes.load(All); } }).then((volumes) => { return volumes.map((volume) => { return types.LVMPhysicalVolume({ path: volume.path }); }); }); } } } }); };