diff --git a/.firebaserc b/.firebaserc new file mode 100644 index 0000000..b27009b --- /dev/null +++ b/.firebaserc @@ -0,0 +1,5 @@ +{ + "projects": { + "default": "demo-everything" + } +} diff --git a/.gitignore b/.gitignore index 89097a6..8bd230a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,7 @@ # Dependency directories node_modules/ -everything-dev-pk.json \ No newline at end of file +everything-dev-pk.json + +#firebase +ui-debug.log +firebase-debug.log \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 7831c79..7f01db3 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,7 +3,7 @@ version: '3.5' services: postgres: container_name: postgres_container - image: postgres + image: postgis/postgis environment: POSTGRES_USER: ${POSTGRES_USER:-postgres} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-changeme} @@ -25,17 +25,30 @@ services: PGADMIN_CONFIG_SERVER_MODE: 'False' volumes: - pgadmin:/var/lib/pgadmin - ports: - "${PGADMIN_PORT:-5050}:80" networks: - postgres restart: unless-stopped + firebase: + build: + context: ./docker + dockerfile: firebase.Dockerfile + image: firebase-emulator:firebase-emulator + volumes: + - .:/src + ports: + - 8001:8001 + - 9099:9099 + - 9199:9199 + command: firebase emulators:start --only 'auth','storage' + networks: postgres: driver: bridge volumes: postgres: - pgadmin: \ No newline at end of file + pgadmin: + firebase: \ No newline at end of file diff --git a/docker/firebase.Dockerfile b/docker/firebase.Dockerfile new file mode 100644 index 0000000..e79dcad --- /dev/null +++ b/docker/firebase.Dockerfile @@ -0,0 +1,13 @@ +FROM node:16.16.0 + +ADD . ../src +WORKDIR /src +# Install OpenJDK-11 +RUN echo 'deb http://ftp.debian.org/debian stretch-backports main' | tee /etc/apt/sources.list.d/stretch-backports.list + +RUN apt-get update && \ + apt-get install -y openjdk-11-jre-headless && \ + apt-get clean; +RUN npm i -g firebase-tools +RUN firebase --version +EXPOSE 8001 9099 \ No newline at end of file diff --git a/firebase.json b/firebase.json new file mode 100644 index 0000000..d254fa2 --- /dev/null +++ b/firebase.json @@ -0,0 +1,20 @@ +{ + "storage": { + "rules": "storage.rules" + }, + "emulators": { + "auth": { + "host": "0.0.0.0", + "port": 9099 + }, + "ui": { + "host": "0.0.0.0", + "enabled": true, + "port": 8001 + }, + "storage": { + "host": "0.0.0.0", + "port": 9199 + } + } +} diff --git a/package-lock.json b/package-lock.json index 9e43f28..0d3815d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,12 +6,12 @@ "": { "dependencies": { "@graphile-contrib/pg-simplify-inflector": "^6.1.0", + "@graphile/postgis": "^0.1.0", "cors": "^2.8.5", "dotenv": "^16.0.1", "express": "^4.18.1", "firebase-admin": "^11.0.0", "path": "^0.12.7", - "pg": "^8.7.3", "postgraphile": "^4.12.9" } }, @@ -49,6 +49,11 @@ "tslib": "^2.1.0" } }, + "node_modules/@firebase/component/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, "node_modules/@firebase/database": { "version": "0.13.3", "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.13.3.tgz", @@ -75,6 +80,11 @@ "tslib": "^2.1.0" } }, + "node_modules/@firebase/database-compat/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, "node_modules/@firebase/database-types": { "version": "0.9.11", "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.9.11.tgz", @@ -84,6 +94,11 @@ "@firebase/util": "1.6.3" } }, + "node_modules/@firebase/database/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, "node_modules/@firebase/logger": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.3.3.tgz", @@ -92,6 +107,11 @@ "tslib": "^2.1.0" } }, + "node_modules/@firebase/logger/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, "node_modules/@firebase/util": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.6.3.tgz", @@ -100,6 +120,11 @@ "tslib": "^2.1.0" } }, + "node_modules/@firebase/util/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, "node_modules/@google-cloud/firestore": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-5.0.2.tgz", @@ -147,9 +172,9 @@ } }, "node_modules/@google-cloud/storage": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-6.2.2.tgz", - "integrity": "sha512-KhAOxmGfmELKKn6cdvgGfAi/YBLi19hI1jX3QI7xQmbeajSFMgUKrIPbbyfMIxQPOEQ9vG0MQX1uganlA/HTRA==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-6.2.3.tgz", + "integrity": "sha512-UJqn3Ln8wFBPLuwBaNu3PlhzQDL3EKKfP1+3mzLRQhcFqgpBSMPLDgAXxc6e9S0l0kqsi4GOuAA7fA+l/VAMjQ==", "optional": true, "dependencies": { "@google-cloud/paginator": "^3.0.7", @@ -177,18 +202,6 @@ "node": ">=12" } }, - "node_modules/@google-cloud/storage/node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "optional": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/@graphile-contrib/pg-simplify-inflector": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@graphile-contrib/pg-simplify-inflector/-/pg-simplify-inflector-6.1.0.tgz", @@ -205,19 +218,91 @@ "node": ">=8.6" } }, + "node_modules/@graphile/lru/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "node_modules/@graphile/postgis": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@graphile/postgis/-/postgis-0.1.0.tgz", + "integrity": "sha512-67lTNvyTnng2oPU9OoA1NRvbAvS/zyTGQIK+d77OFhNi41NHNZynNVRZ+R/UpotcWVQL6rAmo2w8EkI1o4xfAg==", + "dependencies": { + "@types/debug": "^4.1.2", + "@types/graphql": "^14.0.7", + "debug": "^4.1.1", + "tslib": "^1.9.3" + }, + "peerDependencies": { + "graphile-build": "^4.3.0", + "graphile-build-pg": "^4.3.0", + "graphql": ">=0.6 <15", + "pg-sql2": "^2.2.1" + } + }, "node_modules/@grpc/grpc-js": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.6.7.tgz", - "integrity": "sha512-eBM03pu9hd3VqDQG+kHahiG1x80RGkkqqRb1Pchcwqej/KkAH95gAvKs6laqaHCycYaPK+TKuNQnOz9UXYA8qw==", + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.6.8.tgz", + "integrity": "sha512-Nt5tufF/O5Q310kP0cDzxznWMZW58GCTZhUUiAQ9B0K0ANKNQ4Lj/K9XK0vZg+UBKq5/7z7+8mXHHfrcwoeFJQ==", "optional": true, "dependencies": { - "@grpc/proto-loader": "^0.6.4", + "@grpc/proto-loader": "^0.7.0", "@types/node": ">=12.12.47" }, "engines": { "node": "^8.13.0 || >=10.10.0" } }, + "node_modules/@grpc/grpc-js/node_modules/@grpc/proto-loader": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.0.tgz", + "integrity": "sha512-SGPZtVmqOvNfPFOA/nNPn+0Weqa5wubBgQ56+JgTbeLY2VezwtMjwPPFzh0kvQccwWT3a2TXT0ZGK/pJoOTk1A==", + "optional": true, + "dependencies": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^7.0.0", + "yargs": "^16.2.0" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@grpc/grpc-js/node_modules/protobufjs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.0.0.tgz", + "integrity": "sha512-ffNIEm+quOcYtQvHdW406v1NQmZSuqVklxsXk076BtuFnlYZfigLU+JOMrTD8TUOyqHYbRI/fSVNvgd25YeN3w==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@grpc/grpc-js/node_modules/protobufjs/node_modules/long": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.0.tgz", + "integrity": "sha512-9RTUNjK60eJbx3uz+TEGF7fUr29ZDxR5QzXcyDpeSfeH28S9ycINflOgOlppit5U+4kNTe83KQnMEerw7GmE8w==", + "optional": true + }, "node_modules/@grpc/proto-loader": { "version": "0.6.13", "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.13.tgz", @@ -335,6 +420,14 @@ "@types/node": "*" } }, + "node_modules/@types/debug": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", + "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "dependencies": { + "@types/ms": "*" + } + }, "node_modules/@types/express": { "version": "4.17.13", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", @@ -347,15 +440,24 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.29", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.29.tgz", - "integrity": "sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q==", + "version": "4.17.30", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.30.tgz", + "integrity": "sha512-gstzbTWro2/nFed1WXtf+TtrpwxH7Ggs4RLYTLbeVgIkUQOI3WG/JKjgeOU1zXDvezllupjrf8OPIdvTbIaVOQ==", "dependencies": { "@types/node": "*", "@types/qs": "*", "@types/range-parser": "*" } }, + "node_modules/@types/graphql": { + "version": "14.5.0", + "resolved": "https://registry.npmjs.org/@types/graphql/-/graphql-14.5.0.tgz", + "integrity": "sha512-MOkzsEp1Jk5bXuAsHsUi6BVv0zCO+7/2PTiZMXWDSsMXvNU6w/PLMQT2vHn8hy2i0JqojPz1Sz6rsFjHtsU0lA==", + "deprecated": "This is a stub types definition. graphql provides its own type definitions, so you do not need this installed.", + "dependencies": { + "graphql": "*" + } + }, "node_modules/@types/json5": { "version": "0.0.30", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.30.tgz", @@ -380,18 +482,23 @@ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, + "node_modules/@types/ms": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" + }, "node_modules/@types/node": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.0.tgz", - "integrity": "sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA==" + "version": "18.6.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.2.tgz", + "integrity": "sha512-KcfkBq9H4PI6Vpu5B/KoPeuVDAbmi+2mDBqGPGUgoL7yXQtcWGu2vJWmmRkneWK3Rh0nIAX192Aa87AqKHYChQ==" }, "node_modules/@types/pg": { - "version": "8.6.5", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.5.tgz", - "integrity": "sha512-tOkGtAqRVkHa/PVZicq67zuujI4Oorfglsr2IbKofDwBSysnaqSx7W1mDqFqdkGE6Fbgh+PZAl0r/BWON/mozw==", + "version": "7.14.11", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-7.14.11.tgz", + "integrity": "sha512-EnZkZ1OMw9DvNfQkn2MTJrwKmhJYDEs5ujWrPfvseWNoI95N8B4HzU/Ltrq5ZfYxDX/Zg8mTzwr6UAyTjjFvXA==", "dependencies": { "@types/node": "*", - "pg-protocol": "*", + "pg-protocol": "^1.2.0", "pg-types": "^2.2.0" } }, @@ -458,29 +565,6 @@ "node": ">= 6.0.0" } }, - "node_modules/agent-base/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "optional": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/agent-base/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "optional": true - }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -581,6 +665,19 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, "node_modules/buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -713,11 +810,19 @@ } }, "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { - "ms": "2.0.0" + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, "node_modules/depd": { @@ -884,6 +989,19 @@ "node": ">= 0.10.0" } }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -930,13 +1048,26 @@ "node": ">= 0.8" } }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, "node_modules/firebase-admin": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-11.0.0.tgz", - "integrity": "sha512-x56u+Q1P8QDvQKaYRe29ZUM/3f829cP8tsKCDXOhaIX/GbGfgcdjRhPmCafzlwgCWP5wW9NkOgIhnrw94zucvw==", + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-11.0.1.tgz", + "integrity": "sha512-rL3wlZbi2Kb/KJgcmj1YHlD4ZhfmhfgRO2YJialxAllm0tj1IQea878hHuBLGmv4DpbW9t9nLvX9kddNR2Y65Q==", "dependencies": { "@fastify/busboy": "^1.1.0", - "@firebase/database-compat": "^0.2.0", + "@firebase/database-compat": "^0.2.3", "@firebase/database-types": "^0.9.7", "@types/node": ">=12.12.47", "jsonwebtoken": "^8.5.1", @@ -1030,9 +1161,9 @@ } }, "node_modules/google-auth-library": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-8.1.0.tgz", - "integrity": "sha512-J/fNXEnqLgbr3kmeUshZCtHQia6ZiNbbrebVzpt/+LTeY6Ka9CtbQvloTjVGVO7nyYbs0KYeuIwgUC/t2Gp1Jw==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-8.1.1.tgz", + "integrity": "sha512-eG3pCfrLgVJe19KhAeZwW0m1LplNEo0FX1GboWf3hu18zD2jq8TUH2K8900AB2YRAuJ7A+1aSXDp1BODjwwRzg==", "optional": true, "dependencies": { "arrify": "^2.0.0", @@ -1049,45 +1180,6 @@ "node": ">=12" } }, - "node_modules/google-auth-library/node_modules/jwa": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", - "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", - "optional": true, - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/google-auth-library/node_modules/jws": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", - "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", - "optional": true, - "dependencies": { - "jwa": "^2.0.0", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/google-auth-library/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "optional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/google-auth-library/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "optional": true - }, "node_modules/google-gax": { "version": "2.30.5", "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-2.30.5.tgz", @@ -1115,23 +1207,6 @@ "node": ">=10" } }, - "node_modules/google-gax/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "optional": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/google-gax/node_modules/gaxios": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.3.tgz", @@ -1210,45 +1285,6 @@ "node": ">=10" } }, - "node_modules/google-gax/node_modules/jwa": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", - "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", - "optional": true, - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/google-gax/node_modules/jws": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", - "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", - "optional": true, - "dependencies": { - "jwa": "^2.0.0", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/google-gax/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "optional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/google-gax/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "optional": true - }, "node_modules/google-gax/node_modules/retry-request": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.2.2.tgz", @@ -1262,12 +1298,6 @@ "node": ">=8.10.0" } }, - "node_modules/google-gax/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "optional": true - }, "node_modules/google-p12-pem": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-4.0.0.tgz", @@ -1284,14 +1314,14 @@ } }, "node_modules/graphile-build": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/graphile-build/-/graphile-build-4.12.2.tgz", - "integrity": "sha512-UqomiSnWPj4pjO6Q6PzT1YeH96k7e0JzCBI3X8kkELG+PP2BOQCNE5e+xLJvohJmUr0YBTgflPQo7P1ZESPwww==", + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/graphile-build/-/graphile-build-4.12.3.tgz", + "integrity": "sha512-xwNNNrieWm78DVkB29epKLBAMEd5U9nXY1tQQn2n5pMisbqYMtIQOnfZzLhwM6AsNEyAfaQYyV0fD6wCkyYQpA==", "dependencies": { "@graphile/lru": "4.11.0", "chalk": "^2.4.2", "debug": "^4.1.1", - "graphql-parse-resolve-info": "4.12.0", + "graphql-parse-resolve-info": "4.12.3", "iterall": "^1.2.2", "lodash": ">=4 <5", "lru-cache": "^5.0.0", @@ -1306,18 +1336,18 @@ } }, "node_modules/graphile-build-pg": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/graphile-build-pg/-/graphile-build-pg-4.12.2.tgz", - "integrity": "sha512-4zWS7yb2L3afNpzADX9iBc2do4UOd3abiHd/WG0ao8lharU4YxEDS5qKlE2/2s+gSNqW2okKXEuI1/ci9DXVbw==", + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/graphile-build-pg/-/graphile-build-pg-4.12.3.tgz", + "integrity": "sha512-Gnwwxm2NRuyxOx5xchU+Po9a6XagRJpEgoezzHmfBRHwFBY2zprCMYdLvllqRrPJBBWdYAjx7H1NxctBiYiIoQ==", "dependencies": { "@graphile/lru": "4.11.0", "chalk": "^2.4.2", "debug": "^4.1.1", - "graphile-build": "4.12.2", + "graphile-build": "4.12.3", "jsonwebtoken": "^8.5.1", "lodash": ">=4 <5", "lru-cache": ">=4 <5", - "pg-sql2": "4.12.1" + "pg-sql2": "4.12.3" }, "engines": { "node": ">=8.6" @@ -1326,22 +1356,6 @@ "pg": ">=6.1.0 <9" } }, - "node_modules/graphile-build-pg/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/graphile-build-pg/node_modules/lru-cache": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", @@ -1351,41 +1365,50 @@ "yallist": "^2.1.2" } }, - "node_modules/graphile-build-pg/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "node_modules/graphile-build-pg/node_modules/pg-sql2": { + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/pg-sql2/-/pg-sql2-4.12.3.tgz", + "integrity": "sha512-xPVNoN7O5fT9ssq+j/IRbq0OOtD7Sagz0Xbzb5Z6M3T5cU1pi43QdBv6nvZ7wIuvi/iSq2/02wYridSp7B69EQ==", + "dependencies": { + "@graphile/lru": "4.11.0", + "@types/pg": ">=6 <9", + "debug": ">=3 <5", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=8.6" + }, + "peerDependencies": { + "pg": ">=6.1.0 <9" + } + }, + "node_modules/graphile-build-pg/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/graphile-build-pg/node_modules/yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" }, - "node_modules/graphile-build/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/graphile-build/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "yallist": "^3.0.2" } }, - "node_modules/graphile-build/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "node_modules/graphile-build/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "node_modules/graphile-utils": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/graphile-utils/-/graphile-utils-4.12.2.tgz", - "integrity": "sha512-2UcTWWMFLFkKwbDLqlN0mF5sxLqz9y0p7I3zNOJpXtHVjrHyp7oQZsWComPsit/PWIrIgtDUagP+HPkypBRrqA==", + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/graphile-utils/-/graphile-utils-4.12.3.tgz", + "integrity": "sha512-Kls1TNZnPAZ3iLphTTagB+xM+EP+ry33o+4s1vEkl0JE1c0B8ztVTfs3fUl04vyQ2q1K24QTwLYrJ4LN8+Xbuw==", "dependencies": { "debug": "^4.1.1", "graphql": ">=0.9 <0.14 || ^14.0.2 || ^15.4.0", @@ -1399,39 +1422,26 @@ "graphile-build-pg": "^4.5.0" } }, - "node_modules/graphile-utils/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/graphile-utils/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "node_modules/graphile-utils/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/graphql": { - "version": "15.8.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz", - "integrity": "sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw==", + "version": "14.7.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.7.0.tgz", + "integrity": "sha512-l0xWZpoPKpppFzMfvVyFmp9vLN7w/ZZJPefUicMCepfJeQ8sMcztloGYY9DfjVPo6tIUDzU5Hw3MUbIjj9AVVA==", + "dependencies": { + "iterall": "^1.2.2" + }, "engines": { - "node": ">= 10.x" + "node": ">= 6.x" } }, "node_modules/graphql-parse-resolve-info": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/graphql-parse-resolve-info/-/graphql-parse-resolve-info-4.12.0.tgz", - "integrity": "sha512-sQyJeWCzFQwLj8SdgrWeAQG46Nc+VLxof91/AtvEVdbvFCvb+S6OoA4OtIp5OpWBrFo+JzW6LIKifNHXtRKPpA==", + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/graphql-parse-resolve-info/-/graphql-parse-resolve-info-4.12.3.tgz", + "integrity": "sha512-Lxb+v+SCxzBZHKohK4xje3CBQ1iZ968DiKuFtmwzSaI45oP8FgPJjJv35TOzgv73QLijEdgH4NDZGwIvwJM7Kw==", "dependencies": { "debug": "^4.1.1", "tslib": "^2.0.1" @@ -1443,31 +1453,15 @@ "graphql": ">=0.9 <0.14 || ^14.0.2 || ^15.4.0" } }, - "node_modules/graphql-parse-resolve-info/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/graphql-parse-resolve-info/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "node_modules/graphql-parse-resolve-info/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/graphql-ws": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-5.9.0.tgz", - "integrity": "sha512-CXv0l0nI1bgChwl4Rm+BqNOAKwL/C9T2N8RfmTkhQ38YLFdUXCi2WNW4oFp8BJP+t75nCLzjHHgR04sP1oF02w==", + "version": "5.9.1", + "resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-5.9.1.tgz", + "integrity": "sha512-mL/SWGBwIT9Meq0NlfS55yXXTOeWPMbK7bZBEZhFu46bcGk1coTx2Sdtzxdk+9yHWngD+Fk1PZDWaAutQa9tpw==", "engines": { "node": ">=10" }, @@ -1505,27 +1499,6 @@ "node": ">=10" } }, - "node_modules/gtoken/node_modules/jwa": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", - "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", - "optional": true, - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/gtoken/node_modules/jws": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", - "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", - "optional": true, - "dependencies": { - "jwa": "^2.0.0", - "safe-buffer": "^5.0.1" - } - }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -1590,29 +1563,6 @@ "node": ">= 6" } }, - "node_modules/http-proxy-agent/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "optional": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/http-proxy-agent/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "optional": true - }, "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", @@ -1626,29 +1576,6 @@ "node": ">= 6" } }, - "node_modules/https-proxy-agent/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "optional": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/https-proxy-agent/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "optional": true - }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -1760,10 +1687,24 @@ "npm": ">=1.4.28" } }, - "node_modules/jsonwebtoken/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "node_modules/jsonwebtoken/node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jsonwebtoken/node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } }, "node_modules/jsonwebtoken/node_modules/semver": { "version": "5.7.1", @@ -1774,9 +1715,10 @@ } }, "node_modules/jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "optional": true, "dependencies": { "buffer-equal-constant-time": "1.0.1", "ecdsa-sig-formatter": "1.0.11", @@ -1799,33 +1741,13 @@ "node": ">=10 < 13 || >=14" } }, - "node_modules/jwks-rsa/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/jwks-rsa/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, "node_modules/jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "optional": true, "dependencies": { - "jwa": "^1.4.1", + "jwa": "^2.0.0", "safe-buffer": "^5.0.1" } }, @@ -1892,11 +1814,15 @@ "optional": true }, "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "optional": true, "dependencies": { - "yallist": "^3.0.2" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" } }, "node_modules/lru-memoizer": { @@ -1944,14 +1870,15 @@ } }, "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "optional": true, "bin": { "mime": "cli.js" }, "engines": { - "node": ">=4" + "node": ">=10.0.0" } }, "node_modules/mime-db": { @@ -1974,9 +1901,9 @@ } }, "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/negotiator": { "version": "0.6.3", @@ -2153,43 +2080,18 @@ "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ==" }, "node_modules/pg-sql2": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/pg-sql2/-/pg-sql2-4.12.1.tgz", - "integrity": "sha512-3N6i0EIBYc3uKpGGJntZA7HG2cyphC2R3d00kOoc0H7MxeAP+5dN1VfHJjj9vFGlrUy40Ttq8z3UkNtWR6ySAA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/pg-sql2/-/pg-sql2-2.2.3.tgz", + "integrity": "sha512-1faHscJdFTWbeqHC4dsn4l6L4XqYvzd6teBcQ3pHhcK53Iw3I0VQvW8kM6TVxU0vXtGkA49/n928x7+NQ7sRgw==", + "peer": true, "dependencies": { - "@graphile/lru": "4.11.0", - "@types/pg": ">=6 <9", - "debug": ">=3 <5", - "tslib": "^2.0.1" + "@types/pg": ">=6 <8", + "debug": ">=3 <5" }, "engines": { "node": ">=8.6" - }, - "peerDependencies": { - "pg": ">=6.1.0 <9" } }, - "node_modules/pg-sql2/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/pg-sql2/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, "node_modules/pg-types": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", @@ -2222,9 +2124,9 @@ } }, "node_modules/postgraphile": { - "version": "4.12.9", - "resolved": "https://registry.npmjs.org/postgraphile/-/postgraphile-4.12.9.tgz", - "integrity": "sha512-4yxCleFqLH3o0eyM1ybMDCyDJvKNsYQ/d7VKtU8l62B12iNNL/xGipYYoYrLkEdEQdXlOwRxXxagRrvbZU1nIw==", + "version": "4.12.11", + "resolved": "https://registry.npmjs.org/postgraphile/-/postgraphile-4.12.11.tgz", + "integrity": "sha512-rESMT7ZyQe2zeYT75/6/nbsOwnF5e20YBzZGu2EZqbNS6zcUNEvyClJuwSdpVP4Q9hnNvE2xc7khUyniEAucQw==", "dependencies": { "@graphile/lru": "4.11.0", "@types/json5": "^0.0.30", @@ -2236,9 +2138,9 @@ "commander": "^2.19.0", "debug": "^4.1.1", "finalhandler": "^1.0.6", - "graphile-build": "4.12.2", - "graphile-build-pg": "4.12.2", - "graphile-utils": "^4.12.2", + "graphile-build": "4.12.3", + "graphile-build-pg": "4.12.3", + "graphile-utils": "^4.12.3", "graphql": "^0.6.0 || ^0.7.0 || ^0.8.0-b || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.2 || ^15.0.0", "graphql-ws": "^5.6.2", "http-errors": "^1.5.1", @@ -2248,8 +2150,8 @@ "parseurl": "^1.3.2", "pg": ">=6.1.0 <9", "pg-connection-string": "^2.0.0", - "pg-sql2": "4.12.1", - "postgraphile-core": "4.12.2", + "pg-sql2": "4.12.3", + "postgraphile-core": "4.12.3", "subscriptions-transport-ws": "^0.9.18", "tslib": "^2.1.0", "ws": "^7.4.2" @@ -2262,12 +2164,12 @@ } }, "node_modules/postgraphile-core": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/postgraphile-core/-/postgraphile-core-4.12.2.tgz", - "integrity": "sha512-+2OWlPVsMAVjYRMBSI/CT4GUB0mkSmPKGopKapfvhW40SCUBiPB/kqTylX2viRRnN8FuZtS3cRaTPiWr1K+DIg==", + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/postgraphile-core/-/postgraphile-core-4.12.3.tgz", + "integrity": "sha512-rr/UCIWQ0o0qXwynTPZbMhEzexdSUtcgmnktfAhr4V8StlexKIaYzg8oiW2ihI/DVWS9NkzD+eNF2EpcyqXAPA==", "dependencies": { - "graphile-build": "4.12.2", - "graphile-build-pg": "4.12.2", + "graphile-build": "4.12.3", + "graphile-build-pg": "4.12.3", "tslib": "^2.0.1" }, "engines": { @@ -2278,21 +2180,10 @@ "pg": ">=6.1.0 <9" } }, - "node_modules/postgraphile/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } + "node_modules/postgraphile-core/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/postgraphile/node_modules/depd": { "version": "1.1.2", @@ -2317,10 +2208,22 @@ "node": ">= 0.6" } }, - "node_modules/postgraphile/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "node_modules/postgraphile/node_modules/pg-sql2": { + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/pg-sql2/-/pg-sql2-4.12.3.tgz", + "integrity": "sha512-xPVNoN7O5fT9ssq+j/IRbq0OOtD7Sagz0Xbzb5Z6M3T5cU1pi43QdBv6nvZ7wIuvi/iSq2/02wYridSp7B69EQ==", + "dependencies": { + "@graphile/lru": "4.11.0", + "@types/pg": ">=6 <9", + "debug": ">=3 <5", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=8.6" + }, + "peerDependencies": { + "pg": ">=6.1.0 <9" + } }, "node_modules/postgraphile/node_modules/statuses": { "version": "1.5.0", @@ -2330,6 +2233,11 @@ "node": ">= 0.6" } }, + "node_modules/postgraphile/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, "node_modules/postgres-array": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", @@ -2527,29 +2435,6 @@ "node": ">=12" } }, - "node_modules/retry-request/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "optional": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/retry-request/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "optional": true - }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -2605,6 +2490,30 @@ "node": ">= 0.8.0" } }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/send/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -2785,9 +2694,9 @@ "optional": true }, "node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/type-is": { "version": "1.6.18", @@ -2946,9 +2855,9 @@ "optional": true }, "node_modules/ws": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.8.tgz", - "integrity": "sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw==", + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", "engines": { "node": ">=8.3.0" }, @@ -2983,9 +2892,10 @@ } }, "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "optional": true }, "node_modules/yargs": { "version": "16.2.0", @@ -3054,6 +2964,13 @@ "requires": { "@firebase/util": "1.6.3", "tslib": "^2.1.0" + }, + "dependencies": { + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + } } }, "@firebase/database": { @@ -3067,6 +2984,13 @@ "@firebase/util": "1.6.3", "faye-websocket": "0.11.4", "tslib": "^2.1.0" + }, + "dependencies": { + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + } } }, "@firebase/database-compat": { @@ -3080,6 +3004,13 @@ "@firebase/logger": "0.3.3", "@firebase/util": "1.6.3", "tslib": "^2.1.0" + }, + "dependencies": { + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + } } }, "@firebase/database-types": { @@ -3097,6 +3028,13 @@ "integrity": "sha512-POTJl07jOKTOevLXrTvJD/VZ0M6PnJXflbAh5J9VGkmtXPXNG6MdZ9fmRgqYhXKTaDId6AQenQ262uwgpdtO0Q==", "requires": { "tslib": "^2.1.0" + }, + "dependencies": { + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + } } }, "@firebase/util": { @@ -3105,6 +3043,13 @@ "integrity": "sha512-FujteO6Zjv6v8A4HS+t7c+PjU0Kaxj+rOnka0BsI/twUaCC9t8EQPmXpWZdk7XfszfahJn2pqsflUWUhtUkRlg==", "requires": { "tslib": "^2.1.0" + }, + "dependencies": { + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + } } }, "@google-cloud/firestore": { @@ -3142,9 +3087,9 @@ "optional": true }, "@google-cloud/storage": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-6.2.2.tgz", - "integrity": "sha512-KhAOxmGfmELKKn6cdvgGfAi/YBLi19hI1jX3QI7xQmbeajSFMgUKrIPbbyfMIxQPOEQ9vG0MQX1uganlA/HTRA==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-6.2.3.tgz", + "integrity": "sha512-UJqn3Ln8wFBPLuwBaNu3PlhzQDL3EKKfP1+3mzLRQhcFqgpBSMPLDgAXxc6e9S0l0kqsi4GOuAA7fA+l/VAMjQ==", "optional": true, "requires": { "@google-cloud/paginator": "^3.0.7", @@ -3167,14 +3112,6 @@ "stream-events": "^1.0.4", "teeny-request": "^8.0.0", "uuid": "^8.0.0" - }, - "dependencies": { - "mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "optional": true - } } }, "@graphile-contrib/pg-simplify-inflector": { @@ -3188,16 +3125,78 @@ "integrity": "sha512-Fakuk190EAKxWSa9YQyr/87g8mvAv8HBvk6yPCPuIoA3bYXF7n6kl0XSqKjSd5VfjEqhtnzQ6zJGzDf1Gv/tJg==", "requires": { "tslib": "^2.0.1" + }, + "dependencies": { + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + } + } + }, + "@graphile/postgis": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@graphile/postgis/-/postgis-0.1.0.tgz", + "integrity": "sha512-67lTNvyTnng2oPU9OoA1NRvbAvS/zyTGQIK+d77OFhNi41NHNZynNVRZ+R/UpotcWVQL6rAmo2w8EkI1o4xfAg==", + "requires": { + "@types/debug": "^4.1.2", + "@types/graphql": "^14.0.7", + "debug": "^4.1.1", + "tslib": "^1.9.3" } }, "@grpc/grpc-js": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.6.7.tgz", - "integrity": "sha512-eBM03pu9hd3VqDQG+kHahiG1x80RGkkqqRb1Pchcwqej/KkAH95gAvKs6laqaHCycYaPK+TKuNQnOz9UXYA8qw==", + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.6.8.tgz", + "integrity": "sha512-Nt5tufF/O5Q310kP0cDzxznWMZW58GCTZhUUiAQ9B0K0ANKNQ4Lj/K9XK0vZg+UBKq5/7z7+8mXHHfrcwoeFJQ==", "optional": true, "requires": { - "@grpc/proto-loader": "^0.6.4", + "@grpc/proto-loader": "^0.7.0", "@types/node": ">=12.12.47" + }, + "dependencies": { + "@grpc/proto-loader": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.0.tgz", + "integrity": "sha512-SGPZtVmqOvNfPFOA/nNPn+0Weqa5wubBgQ56+JgTbeLY2VezwtMjwPPFzh0kvQccwWT3a2TXT0ZGK/pJoOTk1A==", + "optional": true, + "requires": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^7.0.0", + "yargs": "^16.2.0" + } + }, + "protobufjs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.0.0.tgz", + "integrity": "sha512-ffNIEm+quOcYtQvHdW406v1NQmZSuqVklxsXk076BtuFnlYZfigLU+JOMrTD8TUOyqHYbRI/fSVNvgd25YeN3w==", + "optional": true, + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "dependencies": { + "long": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.0.tgz", + "integrity": "sha512-9RTUNjK60eJbx3uz+TEGF7fUr29ZDxR5QzXcyDpeSfeH28S9ycINflOgOlppit5U+4kNTe83KQnMEerw7GmE8w==", + "optional": true + } + } + } } }, "@grpc/proto-loader": { @@ -3305,6 +3304,14 @@ "@types/node": "*" } }, + "@types/debug": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", + "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "requires": { + "@types/ms": "*" + } + }, "@types/express": { "version": "4.17.13", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", @@ -3317,15 +3324,23 @@ } }, "@types/express-serve-static-core": { - "version": "4.17.29", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.29.tgz", - "integrity": "sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q==", + "version": "4.17.30", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.30.tgz", + "integrity": "sha512-gstzbTWro2/nFed1WXtf+TtrpwxH7Ggs4RLYTLbeVgIkUQOI3WG/JKjgeOU1zXDvezllupjrf8OPIdvTbIaVOQ==", "requires": { "@types/node": "*", "@types/qs": "*", "@types/range-parser": "*" } }, + "@types/graphql": { + "version": "14.5.0", + "resolved": "https://registry.npmjs.org/@types/graphql/-/graphql-14.5.0.tgz", + "integrity": "sha512-MOkzsEp1Jk5bXuAsHsUi6BVv0zCO+7/2PTiZMXWDSsMXvNU6w/PLMQT2vHn8hy2i0JqojPz1Sz6rsFjHtsU0lA==", + "requires": { + "graphql": "*" + } + }, "@types/json5": { "version": "0.0.30", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.30.tgz", @@ -3350,18 +3365,23 @@ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, + "@types/ms": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" + }, "@types/node": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.0.tgz", - "integrity": "sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA==" + "version": "18.6.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.2.tgz", + "integrity": "sha512-KcfkBq9H4PI6Vpu5B/KoPeuVDAbmi+2mDBqGPGUgoL7yXQtcWGu2vJWmmRkneWK3Rh0nIAX192Aa87AqKHYChQ==" }, "@types/pg": { - "version": "8.6.5", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.5.tgz", - "integrity": "sha512-tOkGtAqRVkHa/PVZicq67zuujI4Oorfglsr2IbKofDwBSysnaqSx7W1mDqFqdkGE6Fbgh+PZAl0r/BWON/mozw==", + "version": "7.14.11", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-7.14.11.tgz", + "integrity": "sha512-EnZkZ1OMw9DvNfQkn2MTJrwKmhJYDEs5ujWrPfvseWNoI95N8B4HzU/Ltrq5ZfYxDX/Zg8mTzwr6UAyTjjFvXA==", "requires": { "@types/node": "*", - "pg-protocol": "*", + "pg-protocol": "^1.2.0", "pg-types": "^2.2.0" } }, @@ -3417,23 +3437,6 @@ "optional": true, "requires": { "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "optional": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "optional": true - } } }, "ansi-regex": { @@ -3504,6 +3507,21 @@ "raw-body": "2.5.1", "type-is": "~1.6.18", "unpipe": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } } }, "buffer-equal-constant-time": { @@ -3611,11 +3629,11 @@ } }, "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { - "ms": "2.0.0" + "ms": "2.1.2" } }, "depd": { @@ -3752,6 +3770,21 @@ "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } } }, "extend": { @@ -3792,15 +3825,30 @@ "parseurl": "~1.3.3", "statuses": "2.0.1", "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } } }, "firebase-admin": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-11.0.0.tgz", - "integrity": "sha512-x56u+Q1P8QDvQKaYRe29ZUM/3f829cP8tsKCDXOhaIX/GbGfgcdjRhPmCafzlwgCWP5wW9NkOgIhnrw94zucvw==", + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-11.0.1.tgz", + "integrity": "sha512-rL3wlZbi2Kb/KJgcmj1YHlD4ZhfmhfgRO2YJialxAllm0tj1IQea878hHuBLGmv4DpbW9t9nLvX9kddNR2Y65Q==", "requires": { "@fastify/busboy": "^1.1.0", - "@firebase/database-compat": "^0.2.0", + "@firebase/database-compat": "^0.2.3", "@firebase/database-types": "^0.9.7", "@google-cloud/firestore": "^5.0.2", "@google-cloud/storage": "^6.1.0", @@ -3871,9 +3919,9 @@ } }, "google-auth-library": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-8.1.0.tgz", - "integrity": "sha512-J/fNXEnqLgbr3kmeUshZCtHQia6ZiNbbrebVzpt/+LTeY6Ka9CtbQvloTjVGVO7nyYbs0KYeuIwgUC/t2Gp1Jw==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-8.1.1.tgz", + "integrity": "sha512-eG3pCfrLgVJe19KhAeZwW0m1LplNEo0FX1GboWf3hu18zD2jq8TUH2K8900AB2YRAuJ7A+1aSXDp1BODjwwRzg==", "optional": true, "requires": { "arrify": "^2.0.0", @@ -3885,44 +3933,6 @@ "gtoken": "^6.0.0", "jws": "^4.0.0", "lru-cache": "^6.0.0" - }, - "dependencies": { - "jwa": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", - "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", - "optional": true, - "requires": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "jws": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", - "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", - "optional": true, - "requires": { - "jwa": "^2.0.0", - "safe-buffer": "^5.0.1" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "optional": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "optional": true - } } }, "google-gax": { @@ -3946,15 +3956,6 @@ "retry-request": "^4.0.0" }, "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "optional": true, - "requires": { - "ms": "2.1.2" - } - }, "gaxios": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.3.tgz", @@ -4015,42 +4016,6 @@ "jws": "^4.0.0" } }, - "jwa": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", - "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", - "optional": true, - "requires": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "jws": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", - "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", - "optional": true, - "requires": { - "jwa": "^2.0.0", - "safe-buffer": "^5.0.1" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "optional": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "optional": true - }, "retry-request": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.2.2.tgz", @@ -4060,12 +4025,6 @@ "debug": "^4.1.1", "extend": "^3.0.2" } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "optional": true } } }, @@ -4079,14 +4038,14 @@ } }, "graphile-build": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/graphile-build/-/graphile-build-4.12.2.tgz", - "integrity": "sha512-UqomiSnWPj4pjO6Q6PzT1YeH96k7e0JzCBI3X8kkELG+PP2BOQCNE5e+xLJvohJmUr0YBTgflPQo7P1ZESPwww==", + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/graphile-build/-/graphile-build-4.12.3.tgz", + "integrity": "sha512-xwNNNrieWm78DVkB29epKLBAMEd5U9nXY1tQQn2n5pMisbqYMtIQOnfZzLhwM6AsNEyAfaQYyV0fD6wCkyYQpA==", "requires": { "@graphile/lru": "4.11.0", "chalk": "^2.4.2", "debug": "^4.1.1", - "graphql-parse-resolve-info": "4.12.0", + "graphql-parse-resolve-info": "4.12.3", "iterall": "^1.2.2", "lodash": ">=4 <5", "lru-cache": "^5.0.0", @@ -4094,44 +4053,36 @@ "semver": "^6.0.0" }, "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "requires": { - "ms": "2.1.2" + "yallist": "^3.0.2" } }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" } } }, "graphile-build-pg": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/graphile-build-pg/-/graphile-build-pg-4.12.2.tgz", - "integrity": "sha512-4zWS7yb2L3afNpzADX9iBc2do4UOd3abiHd/WG0ao8lharU4YxEDS5qKlE2/2s+gSNqW2okKXEuI1/ci9DXVbw==", + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/graphile-build-pg/-/graphile-build-pg-4.12.3.tgz", + "integrity": "sha512-Gnwwxm2NRuyxOx5xchU+Po9a6XagRJpEgoezzHmfBRHwFBY2zprCMYdLvllqRrPJBBWdYAjx7H1NxctBiYiIoQ==", "requires": { "@graphile/lru": "4.11.0", "chalk": "^2.4.2", "debug": "^4.1.1", - "graphile-build": "4.12.2", + "graphile-build": "4.12.3", "jsonwebtoken": "^8.5.1", "lodash": ">=4 <5", "lru-cache": ">=4 <5", - "pg-sql2": "4.12.1" + "pg-sql2": "4.12.3" }, "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, "lru-cache": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", @@ -4141,10 +4092,21 @@ "yallist": "^2.1.2" } }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "pg-sql2": { + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/pg-sql2/-/pg-sql2-4.12.3.tgz", + "integrity": "sha512-xPVNoN7O5fT9ssq+j/IRbq0OOtD7Sagz0Xbzb5Z6M3T5cU1pi43QdBv6nvZ7wIuvi/iSq2/02wYridSp7B69EQ==", + "requires": { + "@graphile/lru": "4.11.0", + "@types/pg": ">=6 <9", + "debug": ">=3 <5", + "tslib": "^2.0.1" + } + }, + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "yallist": { "version": "2.1.2", @@ -4154,63 +4116,50 @@ } }, "graphile-utils": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/graphile-utils/-/graphile-utils-4.12.2.tgz", - "integrity": "sha512-2UcTWWMFLFkKwbDLqlN0mF5sxLqz9y0p7I3zNOJpXtHVjrHyp7oQZsWComPsit/PWIrIgtDUagP+HPkypBRrqA==", + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/graphile-utils/-/graphile-utils-4.12.3.tgz", + "integrity": "sha512-Kls1TNZnPAZ3iLphTTagB+xM+EP+ry33o+4s1vEkl0JE1c0B8ztVTfs3fUl04vyQ2q1K24QTwLYrJ4LN8+Xbuw==", "requires": { "debug": "^4.1.1", "graphql": ">=0.9 <0.14 || ^14.0.2 || ^15.4.0", "tslib": "^2.0.1" }, "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" } } }, "graphql": { - "version": "15.8.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz", - "integrity": "sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw==" + "version": "14.7.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.7.0.tgz", + "integrity": "sha512-l0xWZpoPKpppFzMfvVyFmp9vLN7w/ZZJPefUicMCepfJeQ8sMcztloGYY9DfjVPo6tIUDzU5Hw3MUbIjj9AVVA==", + "requires": { + "iterall": "^1.2.2" + } }, "graphql-parse-resolve-info": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/graphql-parse-resolve-info/-/graphql-parse-resolve-info-4.12.0.tgz", - "integrity": "sha512-sQyJeWCzFQwLj8SdgrWeAQG46Nc+VLxof91/AtvEVdbvFCvb+S6OoA4OtIp5OpWBrFo+JzW6LIKifNHXtRKPpA==", + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/graphql-parse-resolve-info/-/graphql-parse-resolve-info-4.12.3.tgz", + "integrity": "sha512-Lxb+v+SCxzBZHKohK4xje3CBQ1iZ968DiKuFtmwzSaI45oP8FgPJjJv35TOzgv73QLijEdgH4NDZGwIvwJM7Kw==", "requires": { "debug": "^4.1.1", "tslib": "^2.0.1" }, "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" } } }, "graphql-ws": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-5.9.0.tgz", - "integrity": "sha512-CXv0l0nI1bgChwl4Rm+BqNOAKwL/C9T2N8RfmTkhQ38YLFdUXCi2WNW4oFp8BJP+t75nCLzjHHgR04sP1oF02w==", + "version": "5.9.1", + "resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-5.9.1.tgz", + "integrity": "sha512-mL/SWGBwIT9Meq0NlfS55yXXTOeWPMbK7bZBEZhFu46bcGk1coTx2Sdtzxdk+9yHWngD+Fk1PZDWaAutQa9tpw==", "requires": {} }, "gtoken": { @@ -4236,27 +4185,6 @@ "is-stream": "^2.0.0", "node-fetch": "^2.6.7" } - }, - "jwa": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", - "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", - "optional": true, - "requires": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "jws": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", - "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", - "optional": true, - "requires": { - "jwa": "^2.0.0", - "safe-buffer": "^5.0.1" - } } } }, @@ -4304,23 +4232,6 @@ "@tootallnate/once": "2", "agent-base": "6", "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "optional": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "optional": true - } } }, "https-proxy-agent": { @@ -4331,23 +4242,6 @@ "requires": { "agent-base": "6", "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "optional": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "optional": true - } } }, "iconv-lite": { @@ -4430,10 +4324,24 @@ "semver": "^5.6.0" }, "dependencies": { - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "requires": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } }, "semver": { "version": "5.7.1", @@ -4443,9 +4351,10 @@ } }, "jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "optional": true, "requires": { "buffer-equal-constant-time": "1.0.1", "ecdsa-sig-formatter": "1.0.11", @@ -4463,29 +4372,15 @@ "jose": "^2.0.5", "limiter": "^1.1.5", "lru-memoizer": "^2.1.4" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } } }, "jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "optional": true, "requires": { - "jwa": "^1.4.1", + "jwa": "^2.0.0", "safe-buffer": "^5.0.1" } }, @@ -4552,11 +4447,12 @@ "optional": true }, "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "optional": true, "requires": { - "yallist": "^3.0.2" + "yallist": "^4.0.0" } }, "lru-memoizer": { @@ -4600,9 +4496,10 @@ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" }, "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "optional": true }, "mime-db": { "version": "1.52.0", @@ -4618,9 +4515,9 @@ } }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "negotiator": { "version": "0.6.3", @@ -4743,29 +4640,13 @@ "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ==" }, "pg-sql2": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/pg-sql2/-/pg-sql2-4.12.1.tgz", - "integrity": "sha512-3N6i0EIBYc3uKpGGJntZA7HG2cyphC2R3d00kOoc0H7MxeAP+5dN1VfHJjj9vFGlrUy40Ttq8z3UkNtWR6ySAA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/pg-sql2/-/pg-sql2-2.2.3.tgz", + "integrity": "sha512-1faHscJdFTWbeqHC4dsn4l6L4XqYvzd6teBcQ3pHhcK53Iw3I0VQvW8kM6TVxU0vXtGkA49/n928x7+NQ7sRgw==", + "peer": true, "requires": { - "@graphile/lru": "4.11.0", - "@types/pg": ">=6 <9", - "debug": ">=3 <5", - "tslib": "^2.0.1" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } + "@types/pg": ">=6 <8", + "debug": ">=3 <5" } }, "pg-types": { @@ -4794,9 +4675,9 @@ "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==" }, "postgraphile": { - "version": "4.12.9", - "resolved": "https://registry.npmjs.org/postgraphile/-/postgraphile-4.12.9.tgz", - "integrity": "sha512-4yxCleFqLH3o0eyM1ybMDCyDJvKNsYQ/d7VKtU8l62B12iNNL/xGipYYoYrLkEdEQdXlOwRxXxagRrvbZU1nIw==", + "version": "4.12.11", + "resolved": "https://registry.npmjs.org/postgraphile/-/postgraphile-4.12.11.tgz", + "integrity": "sha512-rESMT7ZyQe2zeYT75/6/nbsOwnF5e20YBzZGu2EZqbNS6zcUNEvyClJuwSdpVP4Q9hnNvE2xc7khUyniEAucQw==", "requires": { "@graphile/lru": "4.11.0", "@types/json5": "^0.0.30", @@ -4808,9 +4689,9 @@ "commander": "^2.19.0", "debug": "^4.1.1", "finalhandler": "^1.0.6", - "graphile-build": "4.12.2", - "graphile-build-pg": "4.12.2", - "graphile-utils": "^4.12.2", + "graphile-build": "4.12.3", + "graphile-build-pg": "4.12.3", + "graphile-utils": "^4.12.3", "graphql": "^0.6.0 || ^0.7.0 || ^0.8.0-b || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.2 || ^15.0.0", "graphql-ws": "^5.6.2", "http-errors": "^1.5.1", @@ -4820,21 +4701,13 @@ "parseurl": "^1.3.2", "pg": ">=6.1.0 <9", "pg-connection-string": "^2.0.0", - "pg-sql2": "4.12.1", - "postgraphile-core": "4.12.2", + "pg-sql2": "4.12.3", + "postgraphile-core": "4.12.3", "subscriptions-transport-ws": "^0.9.18", "tslib": "^2.1.0", "ws": "^7.4.2" }, "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -4852,26 +4725,44 @@ "toidentifier": "1.0.1" } }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "pg-sql2": { + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/pg-sql2/-/pg-sql2-4.12.3.tgz", + "integrity": "sha512-xPVNoN7O5fT9ssq+j/IRbq0OOtD7Sagz0Xbzb5Z6M3T5cU1pi43QdBv6nvZ7wIuvi/iSq2/02wYridSp7B69EQ==", + "requires": { + "@graphile/lru": "4.11.0", + "@types/pg": ">=6 <9", + "debug": ">=3 <5", + "tslib": "^2.0.1" + } }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" + }, + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" } } }, "postgraphile-core": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/postgraphile-core/-/postgraphile-core-4.12.2.tgz", - "integrity": "sha512-+2OWlPVsMAVjYRMBSI/CT4GUB0mkSmPKGopKapfvhW40SCUBiPB/kqTylX2viRRnN8FuZtS3cRaTPiWr1K+DIg==", + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/postgraphile-core/-/postgraphile-core-4.12.3.tgz", + "integrity": "sha512-rr/UCIWQ0o0qXwynTPZbMhEzexdSUtcgmnktfAhr4V8StlexKIaYzg8oiW2ihI/DVWS9NkzD+eNF2EpcyqXAPA==", "requires": { - "graphile-build": "4.12.2", - "graphile-build-pg": "4.12.2", + "graphile-build": "4.12.3", + "graphile-build-pg": "4.12.3", "tslib": "^2.0.1" + }, + "dependencies": { + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + } } }, "postgres-array": { @@ -5022,23 +4913,6 @@ "requires": { "debug": "^4.1.1", "extend": "^3.0.2" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "optional": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "optional": true - } } }, "safe-buffer": { @@ -5076,6 +4950,26 @@ "statuses": "2.0.1" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -5224,9 +5118,9 @@ "optional": true }, "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "type-is": { "version": "1.6.18", @@ -5353,9 +5247,9 @@ "optional": true }, "ws": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.8.tgz", - "integrity": "sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw==", + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", "requires": {} }, "xtend": { @@ -5370,9 +5264,10 @@ "optional": true }, "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "optional": true }, "yargs": { "version": "16.2.0", diff --git a/package.json b/package.json index 26e1540..f2ec57e 100644 --- a/package.json +++ b/package.json @@ -5,12 +5,12 @@ }, "dependencies": { "@graphile-contrib/pg-simplify-inflector": "^6.1.0", + "@graphile/postgis": "^0.1.0", "cors": "^2.8.5", "dotenv": "^16.0.1", "express": "^4.18.1", "firebase-admin": "^11.0.0", "path": "^0.12.7", - "pg": "^8.7.3", "postgraphile": "^4.12.9" } } diff --git a/schema.graphql b/schema.graphql index b3b8cb5..6506351 100644 --- a/schema.graphql +++ b/schema.graphql @@ -1,82 +1,119 @@ -"""The root query type which gives access points into the data universe.""" -type Query implements Node { - """ - Exposes the root query type nested one level down. This is helpful for Relay 1 - which can only query top level fields if they are in a particular form. - """ - query: Query! +input ApproveInviteInput { + phoneNumber: String! +} + +type ApproveInvitePayload { + invite: Invite + query: Query +} +type Association implements Node { """ - The root query type must be a `Node` to work well with Relay 1 mutations. This just resolves to `query`. + A globally unique identifier. Can be used in various places throughout the system to identify this single value. """ nodeId: ID! + createdAt: Datetime + updatedAt: Datetime + createdBy: String + subcategoryId: Int! + attributeId: Int! - """Fetches an object given its globally unique `ID`.""" - node( - """The globally unique `ID`.""" - nodeId: ID! - ): Node + """Reads a single `Subcategory` that is related to this `Association`.""" + subcategory: Subcategory - """Reads and enables pagination through a set of `Association`.""" - associations( - """Only read the first `n` values of the set.""" - first: Int + """Reads a single `Attribute` that is related to this `Association`.""" + attribute: Attribute +} - """Only read the last `n` values of the set.""" - last: Int +""" +A condition to be used against `Association` object types. All fields are tested +for equality and combined with a logical ‘and.’ +""" +input AssociationCondition { + """Checks for equality with the object’s `createdAt` field.""" + createdAt: Datetime - """ - Skip the first `n` values from our `after` cursor, an alternative to cursor - based pagination. May not be used with `last`. - """ - offset: Int + """Checks for equality with the object’s `updatedAt` field.""" + updatedAt: Datetime - """Read all values in the set before (above) this cursor.""" - before: Cursor + """Checks for equality with the object’s `createdBy` field.""" + createdBy: String - """Read all values in the set after (below) this cursor.""" - after: Cursor + """Checks for equality with the object’s `subcategoryId` field.""" + subcategoryId: Int - """The method to use when ordering `Association`.""" - orderBy: [AssociationsOrderBy!] = [PRIMARY_KEY_ASC] + """Checks for equality with the object’s `attributeId` field.""" + attributeId: Int +} - """ - A condition to be used in determining which values should be returned by the collection. - """ - condition: AssociationCondition - ): AssociationsConnection +"""An input for mutations affecting `Association`""" +input AssociationInput { + createdAt: Datetime + updatedAt: Datetime + createdBy: String + subcategoryId: Int! + attributeId: Int! +} - """Reads and enables pagination through a set of `Attribute`.""" - attributes( - """Only read the first `n` values of the set.""" - first: Int +"""A connection to a list of `Association` values.""" +type AssociationsConnection { + """A list of `Association` objects.""" + nodes: [Association!]! - """Only read the last `n` values of the set.""" - last: Int + """ + A list of edges which contains the `Association` and cursor to aid in pagination. + """ + edges: [AssociationsEdge!]! - """ - Skip the first `n` values from our `after` cursor, an alternative to cursor - based pagination. May not be used with `last`. - """ - offset: Int + """Information to aid in pagination.""" + pageInfo: PageInfo! - """Read all values in the set before (above) this cursor.""" - before: Cursor + """The count of *all* `Association` you could get from the connection.""" + totalCount: Int! +} - """Read all values in the set after (below) this cursor.""" - after: Cursor +"""A `Association` edge in the connection.""" +type AssociationsEdge { + """A cursor for use in pagination.""" + cursor: Cursor - """The method to use when ordering `Attribute`.""" - orderBy: [AttributesOrderBy!] = [PRIMARY_KEY_ASC] + """The `Association` at the end of the edge.""" + node: Association! +} - """ - A condition to be used in determining which values should be returned by the collection. - """ - condition: AttributeCondition - ): AttributesConnection +"""Methods to use when ordering `Association`.""" +enum AssociationsOrderBy { + NATURAL + CREATED_AT_ASC + CREATED_AT_DESC + UPDATED_AT_ASC + UPDATED_AT_DESC + CREATED_BY_ASC + CREATED_BY_DESC + SUBCATEGORY_ID_ASC + SUBCATEGORY_ID_DESC + ATTRIBUTE_ID_ASC + ATTRIBUTE_ID_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +type Attribute implements Node { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + createdAt: Datetime + updatedAt: Datetime + createdBy: String + id: Int! + name: String! + description: String + type: OptionType + isApproved: Boolean - """Reads and enables pagination through a set of `Base`.""" - bases( + """Reads and enables pagination through a set of `Association`.""" + associations( """Only read the first `n` values of the set.""" first: Int @@ -95,17 +132,17 @@ type Query implements Node { """Read all values in the set after (below) this cursor.""" after: Cursor - """The method to use when ordering `Base`.""" - orderBy: [BasesOrderBy!] = [NATURAL] + """The method to use when ordering `Association`.""" + orderBy: [AssociationsOrderBy!] = [PRIMARY_KEY_ASC] """ A condition to be used in determining which values should be returned by the collection. """ - condition: BaseCondition - ): BasesConnection + condition: AssociationCondition + ): AssociationsConnection! - """Reads and enables pagination through a set of `Category`.""" - categories( + """Reads and enables pagination through a set of `Relationship`.""" + relationships( """Only read the first `n` values of the set.""" first: Int @@ -124,14 +161,14 @@ type Query implements Node { """Read all values in the set after (below) this cursor.""" after: Cursor - """The method to use when ordering `Category`.""" - orderBy: [CategoriesOrderBy!] = [PRIMARY_KEY_ASC] + """The method to use when ordering `Relationship`.""" + orderBy: [RelationshipsOrderBy!] = [PRIMARY_KEY_ASC] """ A condition to be used in determining which values should be returned by the collection. """ - condition: CategoryCondition - ): CategoriesConnection + condition: RelationshipCondition + ): RelationshipsConnection! """Reads and enables pagination through a set of `Characteristic`.""" characteristics( @@ -160,123 +197,161 @@ type Query implements Node { A condition to be used in determining which values should be returned by the collection. """ condition: CharacteristicCondition - ): CharacteristicsConnection + ): CharacteristicsConnection! +} - """Reads and enables pagination through a set of `Invite`.""" - invites( - """Only read the first `n` values of the set.""" - first: Int +""" +A condition to be used against `Attribute` object types. All fields are tested +for equality and combined with a logical ‘and.’ +""" +input AttributeCondition { + """Checks for equality with the object’s `createdAt` field.""" + createdAt: Datetime - """Only read the last `n` values of the set.""" - last: Int + """Checks for equality with the object’s `updatedAt` field.""" + updatedAt: Datetime - """ - Skip the first `n` values from our `after` cursor, an alternative to cursor - based pagination. May not be used with `last`. - """ - offset: Int + """Checks for equality with the object’s `createdBy` field.""" + createdBy: String - """Read all values in the set before (above) this cursor.""" - before: Cursor + """Checks for equality with the object’s `id` field.""" + id: Int - """Read all values in the set after (below) this cursor.""" - after: Cursor + """Checks for equality with the object’s `name` field.""" + name: String - """The method to use when ordering `Invite`.""" - orderBy: [InvitesOrderBy!] = [PRIMARY_KEY_ASC] + """Checks for equality with the object’s `description` field.""" + description: String - """ - A condition to be used in determining which values should be returned by the collection. - """ - condition: InviteCondition - ): InvitesConnection + """Checks for equality with the object’s `type` field.""" + type: OptionType - """Reads and enables pagination through a set of `Item`.""" - items( - """Only read the first `n` values of the set.""" - first: Int + """Checks for equality with the object’s `isApproved` field.""" + isApproved: Boolean +} - """Only read the last `n` values of the set.""" - last: Int +""" +Represents an update to a `Attribute`. Fields that are set will be updated. +""" +input AttributePatch { + createdAt: Datetime + updatedAt: Datetime + createdBy: String + id: Int + name: String + description: String + type: OptionType + isApproved: Boolean +} - """ - Skip the first `n` values from our `after` cursor, an alternative to cursor - based pagination. May not be used with `last`. - """ - offset: Int +"""A connection to a list of `Attribute` values.""" +type AttributesConnection { + """A list of `Attribute` objects.""" + nodes: [Attribute!]! - """Read all values in the set before (above) this cursor.""" - before: Cursor + """ + A list of edges which contains the `Attribute` and cursor to aid in pagination. + """ + edges: [AttributesEdge!]! - """Read all values in the set after (below) this cursor.""" - after: Cursor + """Information to aid in pagination.""" + pageInfo: PageInfo! - """The method to use when ordering `Item`.""" - orderBy: [ItemsOrderBy!] = [PRIMARY_KEY_ASC] + """The count of *all* `Attribute` you could get from the connection.""" + totalCount: Int! +} - """ - A condition to be used in determining which values should be returned by the collection. - """ - condition: ItemCondition - ): ItemsConnection +"""A `Attribute` edge in the connection.""" +type AttributesEdge { + """A cursor for use in pagination.""" + cursor: Cursor - """Reads and enables pagination through a set of `Option`.""" - options( - """Only read the first `n` values of the set.""" - first: Int - - """Only read the last `n` values of the set.""" - last: Int - - """ - Skip the first `n` values from our `after` cursor, an alternative to cursor - based pagination. May not be used with `last`. - """ - offset: Int - - """Read all values in the set before (above) this cursor.""" - before: Cursor - - """Read all values in the set after (below) this cursor.""" - after: Cursor + """The `Attribute` at the end of the edge.""" + node: Attribute! +} - """The method to use when ordering `Option`.""" - orderBy: [OptionsOrderBy!] = [PRIMARY_KEY_ASC] +"""Methods to use when ordering `Attribute`.""" +enum AttributesOrderBy { + NATURAL + CREATED_AT_ASC + CREATED_AT_DESC + UPDATED_AT_ASC + UPDATED_AT_DESC + CREATED_BY_ASC + CREATED_BY_DESC + ID_ASC + ID_DESC + NAME_ASC + NAME_DESC + DESCRIPTION_ASC + DESCRIPTION_DESC + TYPE_ASC + TYPE_DESC + IS_APPROVED_ASC + IS_APPROVED_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} - """ - A condition to be used in determining which values should be returned by the collection. - """ - condition: OptionCondition - ): OptionsConnection +"""A connection to a list of `Category` values.""" +type CategoriesConnection { + """A list of `Category` objects.""" + nodes: [Category!]! - """Reads and enables pagination through a set of `Relationship`.""" - relationships( - """Only read the first `n` values of the set.""" - first: Int + """ + A list of edges which contains the `Category` and cursor to aid in pagination. + """ + edges: [CategoriesEdge!]! - """Only read the last `n` values of the set.""" - last: Int + """Information to aid in pagination.""" + pageInfo: PageInfo! - """ - Skip the first `n` values from our `after` cursor, an alternative to cursor - based pagination. May not be used with `last`. - """ - offset: Int + """The count of *all* `Category` you could get from the connection.""" + totalCount: Int! +} - """Read all values in the set before (above) this cursor.""" - before: Cursor +"""A `Category` edge in the connection.""" +type CategoriesEdge { + """A cursor for use in pagination.""" + cursor: Cursor - """Read all values in the set after (below) this cursor.""" - after: Cursor + """The `Category` at the end of the edge.""" + node: Category! +} - """The method to use when ordering `Relationship`.""" - orderBy: [RelationshipsOrderBy!] = [PRIMARY_KEY_ASC] +"""Methods to use when ordering `Category`.""" +enum CategoriesOrderBy { + NATURAL + CREATED_AT_ASC + CREATED_AT_DESC + UPDATED_AT_ASC + UPDATED_AT_DESC + CREATED_BY_ASC + CREATED_BY_DESC + ID_ASC + ID_DESC + NAME_ASC + NAME_DESC + DESCRIPTION_ASC + DESCRIPTION_DESC + IS_APPROVED_ASC + IS_APPROVED_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} - """ - A condition to be used in determining which values should be returned by the collection. - """ - condition: RelationshipCondition - ): RelationshipsConnection +type Category implements Node { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + createdAt: Datetime + updatedAt: Datetime + createdBy: String + id: Int! + name: String! + description: String + isApproved: Boolean """Reads and enables pagination through a set of `Subcategory`.""" subcategories( @@ -305,10 +380,10 @@ type Query implements Node { A condition to be used in determining which values should be returned by the collection. """ condition: SubcategoryCondition - ): SubcategoriesConnection + ): SubcategoriesConnection! - """Reads and enables pagination through a set of `User`.""" - users( + """Reads and enables pagination through a set of `Thing`.""" + things( """Only read the first `n` values of the set.""" first: Int @@ -327,2433 +402,3320 @@ type Query implements Node { """Read all values in the set after (below) this cursor.""" after: Cursor - """The method to use when ordering `User`.""" - orderBy: [UsersOrderBy!] = [PRIMARY_KEY_ASC] + """The method to use when ordering `Thing`.""" + orderBy: [ThingsOrderBy!] = [PRIMARY_KEY_ASC] """ A condition to be used in determining which values should be returned by the collection. """ - condition: UserCondition - ): UsersConnection - association(subcategoryId: Int!, attributeId: Int!): Association - attribute(id: Int!): Attribute - attributeByName(name: String!): Attribute - category(id: Int!): Category - categoryByName(name: String!): Category - characteristic(itemId: Int!, attributeId: Int!, optionId: Int!): Characteristic - invite(phoneNumber: String!): Invite - item(id: Int!): Item - option(id: Int!): Option - relationship(attributeId: Int!, optionId: Int!): Relationship - subcategory(id: Int!): Subcategory - subcategoryByCategoryIdAndName(categoryId: Int!, name: String!): Subcategory - user(id: String!): User - - """Reads a single `Association` using its globally unique `ID`.""" - associationByNodeId( - """ - The globally unique `ID` to be used in selecting a single `Association`. - """ - nodeId: ID! - ): Association - - """Reads a single `Attribute` using its globally unique `ID`.""" - attributeByNodeId( - """The globally unique `ID` to be used in selecting a single `Attribute`.""" - nodeId: ID! - ): Attribute - - """Reads a single `Category` using its globally unique `ID`.""" - categoryByNodeId( - """The globally unique `ID` to be used in selecting a single `Category`.""" - nodeId: ID! - ): Category + condition: ThingCondition + ): ThingsConnection! +} - """Reads a single `Characteristic` using its globally unique `ID`.""" - characteristicByNodeId( - """ - The globally unique `ID` to be used in selecting a single `Characteristic`. - """ - nodeId: ID! - ): Characteristic +""" +A condition to be used against `Category` object types. All fields are tested +for equality and combined with a logical ‘and.’ +""" +input CategoryCondition { + """Checks for equality with the object’s `createdAt` field.""" + createdAt: Datetime - """Reads a single `Invite` using its globally unique `ID`.""" - inviteByNodeId( - """The globally unique `ID` to be used in selecting a single `Invite`.""" - nodeId: ID! - ): Invite + """Checks for equality with the object’s `updatedAt` field.""" + updatedAt: Datetime - """Reads a single `Item` using its globally unique `ID`.""" - itemByNodeId( - """The globally unique `ID` to be used in selecting a single `Item`.""" - nodeId: ID! - ): Item + """Checks for equality with the object’s `createdBy` field.""" + createdBy: String - """Reads a single `Option` using its globally unique `ID`.""" - optionByNodeId( - """The globally unique `ID` to be used in selecting a single `Option`.""" - nodeId: ID! - ): Option + """Checks for equality with the object’s `id` field.""" + id: Int - """Reads a single `Relationship` using its globally unique `ID`.""" - relationshipByNodeId( - """ - The globally unique `ID` to be used in selecting a single `Relationship`. - """ - nodeId: ID! - ): Relationship + """Checks for equality with the object’s `name` field.""" + name: String - """Reads a single `Subcategory` using its globally unique `ID`.""" - subcategoryByNodeId( - """ - The globally unique `ID` to be used in selecting a single `Subcategory`. - """ - nodeId: ID! - ): Subcategory + """Checks for equality with the object’s `description` field.""" + description: String - """Reads a single `User` using its globally unique `ID`.""" - userByNodeId( - """The globally unique `ID` to be used in selecting a single `User`.""" - nodeId: ID! - ): User + """Checks for equality with the object’s `isApproved` field.""" + isApproved: Boolean } -"""An object with a globally unique `ID`.""" -interface Node { - """ - A globally unique identifier. Can be used in various places throughout the system to identify this single value. - """ - nodeId: ID! +"""An input for mutations affecting `Category`""" +input CategoryInput { + createdAt: Datetime + updatedAt: Datetime + createdBy: String + id: Int + name: String! + description: String + isApproved: Boolean } -"""A connection to a list of `Association` values.""" -type AssociationsConnection { - """A list of `Association` objects.""" - nodes: [Association!]! - - """ - A list of edges which contains the `Association` and cursor to aid in pagination. - """ - edges: [AssociationsEdge!]! - - """Information to aid in pagination.""" - pageInfo: PageInfo! - - """The count of *all* `Association` you could get from the connection.""" - totalCount: Int! +""" +Represents an update to a `Category`. Fields that are set will be updated. +""" +input CategoryPatch { + createdAt: Datetime + updatedAt: Datetime + createdBy: String + id: Int + name: String + description: String + isApproved: Boolean } -type Association implements Node { +type Characteristic implements Node { """ A globally unique identifier. Can be used in various places throughout the system to identify this single value. """ nodeId: ID! createdAt: Datetime updatedAt: Datetime - subcategoryId: Int! + createdBy: String + thingId: Int! attributeId: Int! + optionId: Int! - """Reads a single `Subcategory` that is related to this `Association`.""" - subcategory: Subcategory + """Reads a single `Thing` that is related to this `Characteristic`.""" + thing: Thing - """Reads a single `Attribute` that is related to this `Association`.""" + """Reads a single `Attribute` that is related to this `Characteristic`.""" attribute: Attribute + + """Reads a single `Option` that is related to this `Characteristic`.""" + option: Option } """ -A point in time as described by the [ISO -8601](https://en.wikipedia.org/wiki/ISO_8601) standard. May or may not include a timezone. +A condition to be used against `Characteristic` object types. All fields are +tested for equality and combined with a logical ‘and.’ """ -scalar Datetime - -type Subcategory implements Node { - """ - A globally unique identifier. Can be used in various places throughout the system to identify this single value. - """ - nodeId: ID! +input CharacteristicCondition { + """Checks for equality with the object’s `createdAt` field.""" createdAt: Datetime - updatedAt: Datetime - id: Int! - categoryId: Int! - name: String! - description: String - isProposal: Boolean - - """Reads a single `Category` that is related to this `Subcategory`.""" - category: Category - - """Reads and enables pagination through a set of `Association`.""" - associations( - """Only read the first `n` values of the set.""" - first: Int - - """Only read the last `n` values of the set.""" - last: Int - - """ - Skip the first `n` values from our `after` cursor, an alternative to cursor - based pagination. May not be used with `last`. - """ - offset: Int - - """Read all values in the set before (above) this cursor.""" - before: Cursor - - """Read all values in the set after (below) this cursor.""" - after: Cursor - - """The method to use when ordering `Association`.""" - orderBy: [AssociationsOrderBy!] = [PRIMARY_KEY_ASC] - """ - A condition to be used in determining which values should be returned by the collection. - """ - condition: AssociationCondition - ): AssociationsConnection! - - """Reads and enables pagination through a set of `Item`.""" - items( - """Only read the first `n` values of the set.""" - first: Int - - """Only read the last `n` values of the set.""" - last: Int - - """ - Skip the first `n` values from our `after` cursor, an alternative to cursor - based pagination. May not be used with `last`. - """ - offset: Int + """Checks for equality with the object’s `updatedAt` field.""" + updatedAt: Datetime - """Read all values in the set before (above) this cursor.""" - before: Cursor + """Checks for equality with the object’s `createdBy` field.""" + createdBy: String - """Read all values in the set after (below) this cursor.""" - after: Cursor + """Checks for equality with the object’s `thingId` field.""" + thingId: Int - """The method to use when ordering `Item`.""" - orderBy: [ItemsOrderBy!] = [PRIMARY_KEY_ASC] + """Checks for equality with the object’s `attributeId` field.""" + attributeId: Int - """ - A condition to be used in determining which values should be returned by the collection. - """ - condition: ItemCondition - ): ItemsConnection! + """Checks for equality with the object’s `optionId` field.""" + optionId: Int } -type Category implements Node { - """ - A globally unique identifier. Can be used in various places throughout the system to identify this single value. - """ - nodeId: ID! +"""An input for mutations affecting `Characteristic`""" +input CharacteristicInput { createdAt: Datetime updatedAt: Datetime - id: Int! - name: String! - description: String - isProposal: Boolean - - """Reads and enables pagination through a set of `Subcategory`.""" - subcategories( - """Only read the first `n` values of the set.""" - first: Int - - """Only read the last `n` values of the set.""" - last: Int - - """ - Skip the first `n` values from our `after` cursor, an alternative to cursor - based pagination. May not be used with `last`. - """ - offset: Int - - """Read all values in the set before (above) this cursor.""" - before: Cursor - - """Read all values in the set after (below) this cursor.""" - after: Cursor - - """The method to use when ordering `Subcategory`.""" - orderBy: [SubcategoriesOrderBy!] = [PRIMARY_KEY_ASC] - - """ - A condition to be used in determining which values should be returned by the collection. - """ - condition: SubcategoryCondition - ): SubcategoriesConnection! - - """Reads and enables pagination through a set of `Item`.""" - items( - """Only read the first `n` values of the set.""" - first: Int - - """Only read the last `n` values of the set.""" - last: Int - - """ - Skip the first `n` values from our `after` cursor, an alternative to cursor - based pagination. May not be used with `last`. - """ - offset: Int - - """Read all values in the set before (above) this cursor.""" - before: Cursor - - """Read all values in the set after (below) this cursor.""" - after: Cursor - - """The method to use when ordering `Item`.""" - orderBy: [ItemsOrderBy!] = [PRIMARY_KEY_ASC] + createdBy: String + thingId: Int! + attributeId: Int! + optionId: Int! +} - """ - A condition to be used in determining which values should be returned by the collection. - """ - condition: ItemCondition - ): ItemsConnection! +""" +Represents an update to a `Characteristic`. Fields that are set will be updated. +""" +input CharacteristicPatch { + createdAt: Datetime + updatedAt: Datetime + createdBy: String + thingId: Int + attributeId: Int + optionId: Int } -"""A connection to a list of `Subcategory` values.""" -type SubcategoriesConnection { - """A list of `Subcategory` objects.""" - nodes: [Subcategory!]! +"""A connection to a list of `Characteristic` values.""" +type CharacteristicsConnection { + """A list of `Characteristic` objects.""" + nodes: [Characteristic!]! """ - A list of edges which contains the `Subcategory` and cursor to aid in pagination. + A list of edges which contains the `Characteristic` and cursor to aid in pagination. """ - edges: [SubcategoriesEdge!]! + edges: [CharacteristicsEdge!]! """Information to aid in pagination.""" pageInfo: PageInfo! - """The count of *all* `Subcategory` you could get from the connection.""" + """The count of *all* `Characteristic` you could get from the connection.""" totalCount: Int! } -"""A `Subcategory` edge in the connection.""" -type SubcategoriesEdge { +"""A `Characteristic` edge in the connection.""" +type CharacteristicsEdge { """A cursor for use in pagination.""" cursor: Cursor - """The `Subcategory` at the end of the edge.""" - node: Subcategory! -} - -"""A location in a connection that can be used for resuming pagination.""" -scalar Cursor - -"""Information about pagination in a connection.""" -type PageInfo { - """When paginating forwards, are there more items?""" - hasNextPage: Boolean! - - """When paginating backwards, are there more items?""" - hasPreviousPage: Boolean! - - """When paginating backwards, the cursor to continue.""" - startCursor: Cursor - - """When paginating forwards, the cursor to continue.""" - endCursor: Cursor + """The `Characteristic` at the end of the edge.""" + node: Characteristic! } -"""Methods to use when ordering `Subcategory`.""" -enum SubcategoriesOrderBy { +"""Methods to use when ordering `Characteristic`.""" +enum CharacteristicsOrderBy { NATURAL CREATED_AT_ASC CREATED_AT_DESC UPDATED_AT_ASC UPDATED_AT_DESC - ID_ASC - ID_DESC - CATEGORY_ID_ASC - CATEGORY_ID_DESC - NAME_ASC - NAME_DESC - DESCRIPTION_ASC - DESCRIPTION_DESC - IS_PROPOSAL_ASC - IS_PROPOSAL_DESC + CREATED_BY_ASC + CREATED_BY_DESC + THING_ID_ASC + THING_ID_DESC + ATTRIBUTE_ID_ASC + ATTRIBUTE_ID_DESC + OPTION_ID_ASC + OPTION_ID_DESC PRIMARY_KEY_ASC PRIMARY_KEY_DESC } +type Concern { + createdAt: Datetime + updatedAt: Datetime + createdBy: String + description: String! +} + """ -A condition to be used against `Subcategory` object types. All fields are tested -for equality and combined with a logical ‘and.’ +A condition to be used against `Concern` object types. All fields are tested for equality and combined with a logical ‘and.’ """ -input SubcategoryCondition { +input ConcernCondition { """Checks for equality with the object’s `createdAt` field.""" createdAt: Datetime """Checks for equality with the object’s `updatedAt` field.""" updatedAt: Datetime - """Checks for equality with the object’s `id` field.""" - id: Int - - """Checks for equality with the object’s `categoryId` field.""" - categoryId: Int - - """Checks for equality with the object’s `name` field.""" - name: String + """Checks for equality with the object’s `createdBy` field.""" + createdBy: String """Checks for equality with the object’s `description` field.""" description: String +} - """Checks for equality with the object’s `isProposal` field.""" - isProposal: Boolean +"""An input for mutations affecting `Concern`""" +input ConcernInput { + createdAt: Datetime + updatedAt: Datetime + createdBy: String + description: String! } -"""A connection to a list of `Item` values.""" -type ItemsConnection { - """A list of `Item` objects.""" - nodes: [Item!]! +"""A connection to a list of `Concern` values.""" +type ConcernsConnection { + """A list of `Concern` objects.""" + nodes: [Concern!]! """ - A list of edges which contains the `Item` and cursor to aid in pagination. + A list of edges which contains the `Concern` and cursor to aid in pagination. """ - edges: [ItemsEdge!]! + edges: [ConcernsEdge!]! """Information to aid in pagination.""" pageInfo: PageInfo! - """The count of *all* `Item` you could get from the connection.""" + """The count of *all* `Concern` you could get from the connection.""" totalCount: Int! } -type Item implements Node { - """ - A globally unique identifier. Can be used in various places throughout the system to identify this single value. - """ - nodeId: ID! - createdAt: Datetime - updatedAt: Datetime - id: Int! - categoryId: Int! - subcategoryId: Int! - ownerId: String! - media: [String] - quantity: Int! - isRequest: Boolean! - metadata: JSON +"""A `Concern` edge in the connection.""" +type ConcernsEdge { + """A cursor for use in pagination.""" + cursor: Cursor - """Reads a single `Category` that is related to this `Item`.""" - category: Category + """The `Concern` at the end of the edge.""" + node: Concern! +} - """Reads a single `Subcategory` that is related to this `Item`.""" - subcategory: Subcategory +"""Methods to use when ordering `Concern`.""" +enum ConcernsOrderBy { + NATURAL + CREATED_AT_ASC + CREATED_AT_DESC + UPDATED_AT_ASC + UPDATED_AT_DESC + CREATED_BY_ASC + CREATED_BY_DESC + DESCRIPTION_ASC + DESCRIPTION_DESC +} - """Reads a single `User` that is related to this `Item`.""" - owner: User +input CreateAssociationForAttributeInput { + subcategoryId: Int! +} - """Reads and enables pagination through a set of `Characteristic`.""" - characteristics( - """Only read the first `n` values of the set.""" - first: Int - - """Only read the last `n` values of the set.""" - last: Int - - """ - Skip the first `n` values from our `after` cursor, an alternative to cursor - based pagination. May not be used with `last`. - """ - offset: Int - - """Read all values in the set before (above) this cursor.""" - before: Cursor - - """Read all values in the set after (below) this cursor.""" - after: Cursor - - """The method to use when ordering `Characteristic`.""" - orderBy: [CharacteristicsOrderBy!] = [PRIMARY_KEY_ASC] +"""All input for the create `Association` mutation.""" +input CreateAssociationInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String - """ - A condition to be used in determining which values should be returned by the collection. - """ - condition: CharacteristicCondition - ): CharacteristicsConnection! + """The `Association` to be created by this mutation.""" + association: AssociationInput! } -""" -The `JSON` scalar type represents JSON values as specified by [ECMA-404](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf). -""" -scalar JSON - -type User implements Node { +"""The output of our create `Association` mutation.""" +type CreateAssociationPayload { """ - A globally unique identifier. Can be used in various places throughout the system to identify this single value. + The exact same `clientMutationId` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. """ - nodeId: ID! - createdAt: Datetime - updatedAt: Datetime - id: String! - - """Reads and enables pagination through a set of `Item`.""" - itemsByOwnerId( - """Only read the first `n` values of the set.""" - first: Int - - """Only read the last `n` values of the set.""" - last: Int + clientMutationId: String - """ - Skip the first `n` values from our `after` cursor, an alternative to cursor - based pagination. May not be used with `last`. - """ - offset: Int + """The `Association` that was created by this mutation.""" + association: Association - """Read all values in the set before (above) this cursor.""" - before: Cursor + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query - """Read all values in the set after (below) this cursor.""" - after: Cursor + """Reads a single `Subcategory` that is related to this `Association`.""" + subcategory: Subcategory - """The method to use when ordering `Item`.""" - orderBy: [ItemsOrderBy!] = [PRIMARY_KEY_ASC] + """Reads a single `Attribute` that is related to this `Association`.""" + attribute: Attribute - """ - A condition to be used in determining which values should be returned by the collection. - """ - condition: ItemCondition - ): ItemsConnection! + """An edge for our `Association`. May be used by Relay 1.""" + associationEdge( + """The method to use when ordering `Association`.""" + orderBy: [AssociationsOrderBy!] = [PRIMARY_KEY_ASC] + ): AssociationsEdge } -"""Methods to use when ordering `Item`.""" -enum ItemsOrderBy { - NATURAL - CREATED_AT_ASC - CREATED_AT_DESC - UPDATED_AT_ASC - UPDATED_AT_DESC - ID_ASC - ID_DESC - CATEGORY_ID_ASC - CATEGORY_ID_DESC - SUBCATEGORY_ID_ASC - SUBCATEGORY_ID_DESC - OWNER_ID_ASC - OWNER_ID_DESC - MEDIA_ASC - MEDIA_DESC - QUANTITY_ASC - QUANTITY_DESC - IS_REQUEST_ASC - IS_REQUEST_DESC - METADATA_ASC - METADATA_DESC - PRIMARY_KEY_ASC - PRIMARY_KEY_DESC +input CreateAttributeInput { + name: String! + type: String! + description: String + associations: [CreateAssociationForAttributeInput!]! + options: [CreateOptionInput!]! } -""" -A condition to be used against `Item` object types. All fields are tested for equality and combined with a logical ‘and.’ -""" -input ItemCondition { - """Checks for equality with the object’s `createdAt` field.""" - createdAt: Datetime - - """Checks for equality with the object’s `updatedAt` field.""" - updatedAt: Datetime +type CreateAttributePayload { + attribute: Attribute + query: Query +} - """Checks for equality with the object’s `id` field.""" - id: Int +"""All input for the create `Category` mutation.""" +input CreateCategoryInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String - """Checks for equality with the object’s `categoryId` field.""" - categoryId: Int + """The `Category` to be created by this mutation.""" + category: CategoryInput! +} - """Checks for equality with the object’s `subcategoryId` field.""" - subcategoryId: Int +"""The output of our create `Category` mutation.""" +type CreateCategoryPayload { + """ + The exact same `clientMutationId` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String - """Checks for equality with the object’s `ownerId` field.""" - ownerId: String + """The `Category` that was created by this mutation.""" + category: Category - """Checks for equality with the object’s `media` field.""" - media: [String] + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query - """Checks for equality with the object’s `quantity` field.""" - quantity: Int + """An edge for our `Category`. May be used by Relay 1.""" + categoryEdge( + """The method to use when ordering `Category`.""" + orderBy: [CategoriesOrderBy!] = [PRIMARY_KEY_ASC] + ): CategoriesEdge +} - """Checks for equality with the object’s `isRequest` field.""" - isRequest: Boolean +"""All input for the create `Characteristic` mutation.""" +input CreateCharacteristicInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String - """Checks for equality with the object’s `metadata` field.""" - metadata: JSON + """The `Characteristic` to be created by this mutation.""" + characteristic: CharacteristicInput! } -"""A connection to a list of `Characteristic` values.""" -type CharacteristicsConnection { - """A list of `Characteristic` objects.""" - nodes: [Characteristic!]! - +"""The output of our create `Characteristic` mutation.""" +type CreateCharacteristicPayload { """ - A list of edges which contains the `Characteristic` and cursor to aid in pagination. + The exact same `clientMutationId` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. """ - edges: [CharacteristicsEdge!]! - - """Information to aid in pagination.""" - pageInfo: PageInfo! + clientMutationId: String - """The count of *all* `Characteristic` you could get from the connection.""" - totalCount: Int! -} + """The `Characteristic` that was created by this mutation.""" + characteristic: Characteristic -type Characteristic implements Node { """ - A globally unique identifier. Can be used in various places throughout the system to identify this single value. + Our root query field type. Allows us to run any query from our mutation payload. """ - nodeId: ID! - createdAt: Datetime - updatedAt: Datetime - itemId: Int! - attributeId: Int! - optionId: Int! - numApprovals: Int! - isValidated: Boolean! + query: Query - """Reads a single `Item` that is related to this `Characteristic`.""" - item: Item + """Reads a single `Thing` that is related to this `Characteristic`.""" + thing: Thing """Reads a single `Attribute` that is related to this `Characteristic`.""" attribute: Attribute """Reads a single `Option` that is related to this `Characteristic`.""" option: Option + + """An edge for our `Characteristic`. May be used by Relay 1.""" + characteristicEdge( + """The method to use when ordering `Characteristic`.""" + orderBy: [CharacteristicsOrderBy!] = [PRIMARY_KEY_ASC] + ): CharacteristicsEdge } -type Attribute implements Node { +"""All input for the create `Concern` mutation.""" +input CreateConcernInput { """ - A globally unique identifier. Can be used in various places throughout the system to identify this single value. + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. """ - nodeId: ID! - createdAt: Datetime - updatedAt: Datetime - id: Int! - name: String! - description: String - type: OptionType - isProposal: Boolean + clientMutationId: String - """Reads and enables pagination through a set of `Association`.""" - associations( - """Only read the first `n` values of the set.""" - first: Int + """The `Concern` to be created by this mutation.""" + concern: ConcernInput! +} - """Only read the last `n` values of the set.""" - last: Int +"""The output of our create `Concern` mutation.""" +type CreateConcernPayload { + """ + The exact same `clientMutationId` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String - """ - Skip the first `n` values from our `after` cursor, an alternative to cursor - based pagination. May not be used with `last`. - """ - offset: Int + """The `Concern` that was created by this mutation.""" + concern: Concern - """Read all values in the set before (above) this cursor.""" - before: Cursor + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query - """Read all values in the set after (below) this cursor.""" - after: Cursor + """An edge for our `Concern`. May be used by Relay 1.""" + concernEdge( + """The method to use when ordering `Concern`.""" + orderBy: [ConcernsOrderBy!] = [NATURAL] + ): ConcernsEdge +} - """The method to use when ordering `Association`.""" - orderBy: [AssociationsOrderBy!] = [PRIMARY_KEY_ASC] +"""All input for the create `Help` mutation.""" +input CreateHelpInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String - """ - A condition to be used in determining which values should be returned by the collection. - """ - condition: AssociationCondition - ): AssociationsConnection! + """The `Help` to be created by this mutation.""" + help: HelpInput! +} - """Reads and enables pagination through a set of `Relationship`.""" - relationships( - """Only read the first `n` values of the set.""" - first: Int +"""The output of our create `Help` mutation.""" +type CreateHelpPayload { + """ + The exact same `clientMutationId` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String - """Only read the last `n` values of the set.""" - last: Int + """The `Help` that was created by this mutation.""" + help: Help - """ - Skip the first `n` values from our `after` cursor, an alternative to cursor - based pagination. May not be used with `last`. - """ - offset: Int + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query - """Read all values in the set before (above) this cursor.""" - before: Cursor + """An edge for our `Help`. May be used by Relay 1.""" + helpEdge( + """The method to use when ordering `Help`.""" + orderBy: [HelpsOrderBy!] = [NATURAL] + ): HelpsEdge +} - """Read all values in the set after (below) this cursor.""" - after: Cursor +"""All input for the create `Idea` mutation.""" +input CreateIdeaInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String - """The method to use when ordering `Relationship`.""" - orderBy: [RelationshipsOrderBy!] = [PRIMARY_KEY_ASC] + """The `Idea` to be created by this mutation.""" + idea: IdeaInput! +} - """ - A condition to be used in determining which values should be returned by the collection. - """ - condition: RelationshipCondition - ): RelationshipsConnection! +"""The output of our create `Idea` mutation.""" +type CreateIdeaPayload { + """ + The exact same `clientMutationId` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String - """Reads and enables pagination through a set of `Characteristic`.""" - characteristics( - """Only read the first `n` values of the set.""" - first: Int + """The `Idea` that was created by this mutation.""" + idea: Idea - """Only read the last `n` values of the set.""" - last: Int + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query - """ - Skip the first `n` values from our `after` cursor, an alternative to cursor - based pagination. May not be used with `last`. - """ - offset: Int + """An edge for our `Idea`. May be used by Relay 1.""" + ideaEdge( + """The method to use when ordering `Idea`.""" + orderBy: [IdeasOrderBy!] = [NATURAL] + ): IdeasEdge +} - """Read all values in the set before (above) this cursor.""" - before: Cursor +"""All input for the create `Invite` mutation.""" +input CreateInviteInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String - """Read all values in the set after (below) this cursor.""" - after: Cursor + """The `Invite` to be created by this mutation.""" + invite: InviteInput! +} - """The method to use when ordering `Characteristic`.""" - orderBy: [CharacteristicsOrderBy!] = [PRIMARY_KEY_ASC] +"""The output of our create `Invite` mutation.""" +type CreateInvitePayload { + """ + The exact same `clientMutationId` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String - """ - A condition to be used in determining which values should be returned by the collection. - """ - condition: CharacteristicCondition - ): CharacteristicsConnection! -} + """The `Invite` that was created by this mutation.""" + invite: Invite -enum OptionType { - TEXT - COMPANY - SIZE + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query + + """An edge for our `Invite`. May be used by Relay 1.""" + inviteEdge( + """The method to use when ordering `Invite`.""" + orderBy: [InvitesOrderBy!] = [PRIMARY_KEY_ASC] + ): InvitesEdge } -"""Methods to use when ordering `Association`.""" -enum AssociationsOrderBy { - NATURAL - CREATED_AT_ASC - CREATED_AT_DESC - UPDATED_AT_ASC - UPDATED_AT_DESC - SUBCATEGORY_ID_ASC - SUBCATEGORY_ID_DESC - ATTRIBUTE_ID_ASC - ATTRIBUTE_ID_DESC - PRIMARY_KEY_ASC - PRIMARY_KEY_DESC +"""All input for the create `Option` mutation.""" +input CreateOptionInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + + """The `Option` to be created by this mutation.""" + option: OptionInput! } -""" -A condition to be used against `Association` object types. All fields are tested -for equality and combined with a logical ‘and.’ -""" -input AssociationCondition { - """Checks for equality with the object’s `createdAt` field.""" - createdAt: Datetime +"""The output of our create `Option` mutation.""" +type CreateOptionPayload { + """ + The exact same `clientMutationId` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String - """Checks for equality with the object’s `updatedAt` field.""" - updatedAt: Datetime + """The `Option` that was created by this mutation.""" + option: Option - """Checks for equality with the object’s `subcategoryId` field.""" - subcategoryId: Int + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query - """Checks for equality with the object’s `attributeId` field.""" - attributeId: Int + """An edge for our `Option`. May be used by Relay 1.""" + optionEdge( + """The method to use when ordering `Option`.""" + orderBy: [OptionsOrderBy!] = [PRIMARY_KEY_ASC] + ): OptionsEdge } -"""A connection to a list of `Relationship` values.""" -type RelationshipsConnection { - """A list of `Relationship` objects.""" - nodes: [Relationship!]! - +"""All input for the create `Relationship` mutation.""" +input CreateRelationshipInput { """ - A list of edges which contains the `Relationship` and cursor to aid in pagination. + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. """ - edges: [RelationshipsEdge!]! - - """Information to aid in pagination.""" - pageInfo: PageInfo! + clientMutationId: String - """The count of *all* `Relationship` you could get from the connection.""" - totalCount: Int! + """The `Relationship` to be created by this mutation.""" + relationship: RelationshipInput! } -type Relationship implements Node { +"""The output of our create `Relationship` mutation.""" +type CreateRelationshipPayload { """ - A globally unique identifier. Can be used in various places throughout the system to identify this single value. + The exact same `clientMutationId` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. """ - nodeId: ID! - createdAt: Datetime - updatedAt: Datetime - attributeId: Int! - optionId: Int! + clientMutationId: String + + """The `Relationship` that was created by this mutation.""" + relationship: Relationship + + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query """Reads a single `Attribute` that is related to this `Relationship`.""" attribute: Attribute """Reads a single `Option` that is related to this `Relationship`.""" option: Option + + """An edge for our `Relationship`. May be used by Relay 1.""" + relationshipEdge( + """The method to use when ordering `Relationship`.""" + orderBy: [RelationshipsOrderBy!] = [PRIMARY_KEY_ASC] + ): RelationshipsEdge } -type Option implements Node { +"""All input for the create `Request` mutation.""" +input CreateRequestInput { """ - A globally unique identifier. Can be used in various places throughout the system to identify this single value. + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. """ - nodeId: ID! - createdAt: Datetime - updatedAt: Datetime - id: Int! - value: String! - type: OptionType - isProposal: Boolean - - """Reads and enables pagination through a set of `Relationship`.""" - relationships( - """Only read the first `n` values of the set.""" - first: Int - - """Only read the last `n` values of the set.""" - last: Int + clientMutationId: String - """ - Skip the first `n` values from our `after` cursor, an alternative to cursor - based pagination. May not be used with `last`. - """ - offset: Int + """The `Request` to be created by this mutation.""" + request: RequestInput! +} - """Read all values in the set before (above) this cursor.""" - before: Cursor +"""The output of our create `Request` mutation.""" +type CreateRequestPayload { + """ + The exact same `clientMutationId` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String - """Read all values in the set after (below) this cursor.""" - after: Cursor + """The `Request` that was created by this mutation.""" + request: Request - """The method to use when ordering `Relationship`.""" - orderBy: [RelationshipsOrderBy!] = [PRIMARY_KEY_ASC] + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query - """ - A condition to be used in determining which values should be returned by the collection. - """ - condition: RelationshipCondition - ): RelationshipsConnection! + """Reads a single `User` that is related to this `Request`.""" + requester: User - """Reads and enables pagination through a set of `Characteristic`.""" - characteristics( - """Only read the first `n` values of the set.""" - first: Int + """An edge for our `Request`. May be used by Relay 1.""" + requestEdge( + """The method to use when ordering `Request`.""" + orderBy: [RequestsOrderBy!] = [PRIMARY_KEY_ASC] + ): RequestsEdge +} - """Only read the last `n` values of the set.""" - last: Int +"""All input for the create `Subcategory` mutation.""" +input CreateSubcategoryInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String - """ - Skip the first `n` values from our `after` cursor, an alternative to cursor - based pagination. May not be used with `last`. - """ - offset: Int + """The `Subcategory` to be created by this mutation.""" + subcategory: SubcategoryInput! +} - """Read all values in the set before (above) this cursor.""" - before: Cursor +"""The output of our create `Subcategory` mutation.""" +type CreateSubcategoryPayload { + """ + The exact same `clientMutationId` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String - """Read all values in the set after (below) this cursor.""" - after: Cursor + """The `Subcategory` that was created by this mutation.""" + subcategory: Subcategory - """The method to use when ordering `Characteristic`.""" - orderBy: [CharacteristicsOrderBy!] = [PRIMARY_KEY_ASC] + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query - """ - A condition to be used in determining which values should be returned by the collection. - """ - condition: CharacteristicCondition - ): CharacteristicsConnection! -} + """Reads a single `Category` that is related to this `Subcategory`.""" + category: Category -"""Methods to use when ordering `Relationship`.""" -enum RelationshipsOrderBy { - NATURAL - CREATED_AT_ASC - CREATED_AT_DESC - UPDATED_AT_ASC - UPDATED_AT_DESC - ATTRIBUTE_ID_ASC - ATTRIBUTE_ID_DESC - OPTION_ID_ASC - OPTION_ID_DESC - PRIMARY_KEY_ASC - PRIMARY_KEY_DESC + """An edge for our `Subcategory`. May be used by Relay 1.""" + subcategoryEdge( + """The method to use when ordering `Subcategory`.""" + orderBy: [SubcategoriesOrderBy!] = [PRIMARY_KEY_ASC] + ): SubcategoriesEdge } -""" -A condition to be used against `Relationship` object types. All fields are -tested for equality and combined with a logical ‘and.’ -""" -input RelationshipCondition { - """Checks for equality with the object’s `createdAt` field.""" - createdAt: Datetime - - """Checks for equality with the object’s `updatedAt` field.""" - updatedAt: Datetime +input CreateThingInput { + categoryId: Int! + subcategoryId: Int! + attributes: [NewAttributeInput!]! + media: [String!]! + ownerId: String! + quantity: Int + geomPoint: GeoJSON +} - """Checks for equality with the object’s `attributeId` field.""" - attributeId: Int +type CreateThingPayload { + thing: Thing + query: Query +} - """Checks for equality with the object’s `optionId` field.""" - optionId: Int +input CreateUserInput { + uid: String! } -"""Methods to use when ordering `Characteristic`.""" -enum CharacteristicsOrderBy { - NATURAL - CREATED_AT_ASC - CREATED_AT_DESC - UPDATED_AT_ASC - UPDATED_AT_DESC - ITEM_ID_ASC - ITEM_ID_DESC - ATTRIBUTE_ID_ASC - ATTRIBUTE_ID_DESC - OPTION_ID_ASC - OPTION_ID_DESC - NUM_APPROVALS_ASC - NUM_APPROVALS_DESC - IS_VALIDATED_ASC - IS_VALIDATED_DESC - PRIMARY_KEY_ASC - PRIMARY_KEY_DESC +type CreateUserPayload { + user: User + query: Query } +"""A location in a connection that can be used for resuming pagination.""" +scalar Cursor + """ -A condition to be used against `Characteristic` object types. All fields are -tested for equality and combined with a logical ‘and.’ +A point in time as described by the [ISO +8601](https://en.wikipedia.org/wiki/ISO_8601) standard. May or may not include a timezone. """ -input CharacteristicCondition { - """Checks for equality with the object’s `createdAt` field.""" - createdAt: Datetime - - """Checks for equality with the object’s `updatedAt` field.""" - updatedAt: Datetime +scalar Datetime - """Checks for equality with the object’s `itemId` field.""" - itemId: Int +"""All input for the `deleteAssociationByNodeId` mutation.""" +input DeleteAssociationByNodeIdInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String - """Checks for equality with the object’s `attributeId` field.""" - attributeId: Int + """ + The globally unique `ID` which will identify a single `Association` to be deleted. + """ + nodeId: ID! +} - """Checks for equality with the object’s `optionId` field.""" - optionId: Int +"""All input for the `deleteAssociation` mutation.""" +input DeleteAssociationInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + subcategoryId: Int! + attributeId: Int! +} - """Checks for equality with the object’s `numApprovals` field.""" - numApprovals: Int +"""The output of our delete `Association` mutation.""" +type DeleteAssociationPayload { + """ + The exact same `clientMutationId` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String - """Checks for equality with the object’s `isValidated` field.""" - isValidated: Boolean -} + """The `Association` that was deleted by this mutation.""" + association: Association + deletedAssociationNodeId: ID -"""A `Relationship` edge in the connection.""" -type RelationshipsEdge { - """A cursor for use in pagination.""" - cursor: Cursor + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query - """The `Relationship` at the end of the edge.""" - node: Relationship! -} + """Reads a single `Subcategory` that is related to this `Association`.""" + subcategory: Subcategory -"""A `Characteristic` edge in the connection.""" -type CharacteristicsEdge { - """A cursor for use in pagination.""" - cursor: Cursor + """Reads a single `Attribute` that is related to this `Association`.""" + attribute: Attribute - """The `Characteristic` at the end of the edge.""" - node: Characteristic! + """An edge for our `Association`. May be used by Relay 1.""" + associationEdge( + """The method to use when ordering `Association`.""" + orderBy: [AssociationsOrderBy!] = [PRIMARY_KEY_ASC] + ): AssociationsEdge } -"""A `Item` edge in the connection.""" -type ItemsEdge { - """A cursor for use in pagination.""" - cursor: Cursor - - """The `Item` at the end of the edge.""" - node: Item! +"""All input for the `deleteAttributeByName` mutation.""" +input DeleteAttributeByNameInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + name: String! } -"""A `Association` edge in the connection.""" -type AssociationsEdge { - """A cursor for use in pagination.""" - cursor: Cursor +"""All input for the `deleteAttributeByNodeId` mutation.""" +input DeleteAttributeByNodeIdInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String - """The `Association` at the end of the edge.""" - node: Association! + """ + The globally unique `ID` which will identify a single `Attribute` to be deleted. + """ + nodeId: ID! } -"""A connection to a list of `Attribute` values.""" -type AttributesConnection { - """A list of `Attribute` objects.""" - nodes: [Attribute!]! - +"""All input for the `deleteAttribute` mutation.""" +input DeleteAttributeInput { """ - A list of edges which contains the `Attribute` and cursor to aid in pagination. + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. """ - edges: [AttributesEdge!]! + clientMutationId: String + id: Int! +} - """Information to aid in pagination.""" - pageInfo: PageInfo! +"""The output of our delete `Attribute` mutation.""" +type DeleteAttributePayload { + """ + The exact same `clientMutationId` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String - """The count of *all* `Attribute` you could get from the connection.""" - totalCount: Int! -} + """The `Attribute` that was deleted by this mutation.""" + attribute: Attribute + deletedAttributeNodeId: ID -"""A `Attribute` edge in the connection.""" -type AttributesEdge { - """A cursor for use in pagination.""" - cursor: Cursor + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query - """The `Attribute` at the end of the edge.""" - node: Attribute! + """An edge for our `Attribute`. May be used by Relay 1.""" + attributeEdge( + """The method to use when ordering `Attribute`.""" + orderBy: [AttributesOrderBy!] = [PRIMARY_KEY_ASC] + ): AttributesEdge } -"""Methods to use when ordering `Attribute`.""" -enum AttributesOrderBy { - NATURAL - CREATED_AT_ASC - CREATED_AT_DESC - UPDATED_AT_ASC - UPDATED_AT_DESC - ID_ASC - ID_DESC - NAME_ASC - NAME_DESC - DESCRIPTION_ASC - DESCRIPTION_DESC - TYPE_ASC - TYPE_DESC - IS_PROPOSAL_ASC - IS_PROPOSAL_DESC - PRIMARY_KEY_ASC - PRIMARY_KEY_DESC +"""All input for the `deleteCategoryByName` mutation.""" +input DeleteCategoryByNameInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + name: String! } -""" -A condition to be used against `Attribute` object types. All fields are tested -for equality and combined with a logical ‘and.’ -""" -input AttributeCondition { - """Checks for equality with the object’s `createdAt` field.""" - createdAt: Datetime - - """Checks for equality with the object’s `updatedAt` field.""" - updatedAt: Datetime - - """Checks for equality with the object’s `id` field.""" - id: Int - - """Checks for equality with the object’s `name` field.""" - name: String - - """Checks for equality with the object’s `description` field.""" - description: String - - """Checks for equality with the object’s `type` field.""" - type: OptionType +"""All input for the `deleteCategoryByNodeId` mutation.""" +input DeleteCategoryByNodeIdInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String - """Checks for equality with the object’s `isProposal` field.""" - isProposal: Boolean + """ + The globally unique `ID` which will identify a single `Category` to be deleted. + """ + nodeId: ID! } -"""A connection to a list of `Base` values.""" -type BasesConnection { - """A list of `Base` objects.""" - nodes: [Base!]! +"""All input for the `deleteCategory` mutation.""" +input DeleteCategoryInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + id: Int! +} +"""The output of our delete `Category` mutation.""" +type DeleteCategoryPayload { """ - A list of edges which contains the `Base` and cursor to aid in pagination. + The exact same `clientMutationId` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. """ - edges: [BasesEdge!]! + clientMutationId: String - """Information to aid in pagination.""" - pageInfo: PageInfo! + """The `Category` that was deleted by this mutation.""" + category: Category + deletedCategoryNodeId: ID - """The count of *all* `Base` you could get from the connection.""" - totalCount: Int! -} + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query -type Base { - createdAt: Datetime - updatedAt: Datetime + """An edge for our `Category`. May be used by Relay 1.""" + categoryEdge( + """The method to use when ordering `Category`.""" + orderBy: [CategoriesOrderBy!] = [PRIMARY_KEY_ASC] + ): CategoriesEdge } -"""A `Base` edge in the connection.""" -type BasesEdge { - """A cursor for use in pagination.""" - cursor: Cursor +"""All input for the `deleteCharacteristicByNodeId` mutation.""" +input DeleteCharacteristicByNodeIdInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String - """The `Base` at the end of the edge.""" - node: Base! + """ + The globally unique `ID` which will identify a single `Characteristic` to be deleted. + """ + nodeId: ID! } -"""Methods to use when ordering `Base`.""" -enum BasesOrderBy { - NATURAL - CREATED_AT_ASC - CREATED_AT_DESC - UPDATED_AT_ASC - UPDATED_AT_DESC +"""All input for the `deleteCharacteristic` mutation.""" +input DeleteCharacteristicInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + thingId: Int! + attributeId: Int! + optionId: Int! } -""" -A condition to be used against `Base` object types. All fields are tested for equality and combined with a logical ‘and.’ -""" -input BaseCondition { - """Checks for equality with the object’s `createdAt` field.""" - createdAt: Datetime - - """Checks for equality with the object’s `updatedAt` field.""" - updatedAt: Datetime -} +"""The output of our delete `Characteristic` mutation.""" +type DeleteCharacteristicPayload { + """ + The exact same `clientMutationId` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String -"""A connection to a list of `Category` values.""" -type CategoriesConnection { - """A list of `Category` objects.""" - nodes: [Category!]! + """The `Characteristic` that was deleted by this mutation.""" + characteristic: Characteristic + deletedCharacteristicNodeId: ID """ - A list of edges which contains the `Category` and cursor to aid in pagination. + Our root query field type. Allows us to run any query from our mutation payload. """ - edges: [CategoriesEdge!]! + query: Query - """Information to aid in pagination.""" - pageInfo: PageInfo! + """Reads a single `Thing` that is related to this `Characteristic`.""" + thing: Thing - """The count of *all* `Category` you could get from the connection.""" - totalCount: Int! -} + """Reads a single `Attribute` that is related to this `Characteristic`.""" + attribute: Attribute -"""A `Category` edge in the connection.""" -type CategoriesEdge { - """A cursor for use in pagination.""" - cursor: Cursor + """Reads a single `Option` that is related to this `Characteristic`.""" + option: Option - """The `Category` at the end of the edge.""" - node: Category! + """An edge for our `Characteristic`. May be used by Relay 1.""" + characteristicEdge( + """The method to use when ordering `Characteristic`.""" + orderBy: [CharacteristicsOrderBy!] = [PRIMARY_KEY_ASC] + ): CharacteristicsEdge } -"""Methods to use when ordering `Category`.""" -enum CategoriesOrderBy { - NATURAL - CREATED_AT_ASC - CREATED_AT_DESC - UPDATED_AT_ASC - UPDATED_AT_DESC - ID_ASC - ID_DESC - NAME_ASC - NAME_DESC - DESCRIPTION_ASC - DESCRIPTION_DESC - IS_PROPOSAL_ASC - IS_PROPOSAL_DESC - PRIMARY_KEY_ASC - PRIMARY_KEY_DESC -} +"""All input for the `deleteInviteByNodeId` mutation.""" +input DeleteInviteByNodeIdInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String -""" -A condition to be used against `Category` object types. All fields are tested -for equality and combined with a logical ‘and.’ -""" -input CategoryCondition { - """Checks for equality with the object’s `createdAt` field.""" - createdAt: Datetime + """ + The globally unique `ID` which will identify a single `Invite` to be deleted. + """ + nodeId: ID! +} - """Checks for equality with the object’s `updatedAt` field.""" - updatedAt: Datetime +"""All input for the `deleteInvite` mutation.""" +input DeleteInviteInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + phoneNumber: String! +} - """Checks for equality with the object’s `id` field.""" - id: Int +"""The output of our delete `Invite` mutation.""" +type DeleteInvitePayload { + """ + The exact same `clientMutationId` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String - """Checks for equality with the object’s `name` field.""" - name: String + """The `Invite` that was deleted by this mutation.""" + invite: Invite + deletedInviteNodeId: ID - """Checks for equality with the object’s `description` field.""" - description: String + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query - """Checks for equality with the object’s `isProposal` field.""" - isProposal: Boolean + """An edge for our `Invite`. May be used by Relay 1.""" + inviteEdge( + """The method to use when ordering `Invite`.""" + orderBy: [InvitesOrderBy!] = [PRIMARY_KEY_ASC] + ): InvitesEdge } -"""A connection to a list of `Invite` values.""" -type InvitesConnection { - """A list of `Invite` objects.""" - nodes: [Invite!]! - +"""All input for the `deleteOptionByNodeId` mutation.""" +input DeleteOptionByNodeIdInput { """ - A list of edges which contains the `Invite` and cursor to aid in pagination. + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. """ - edges: [InvitesEdge!]! - - """Information to aid in pagination.""" - pageInfo: PageInfo! - - """The count of *all* `Invite` you could get from the connection.""" - totalCount: Int! -} + clientMutationId: String -type Invite implements Node { """ - A globally unique identifier. Can be used in various places throughout the system to identify this single value. + The globally unique `ID` which will identify a single `Option` to be deleted. """ nodeId: ID! - createdAt: Datetime - updatedAt: Datetime - phoneNumber: String! - isApproved: Boolean } -"""A `Invite` edge in the connection.""" -type InvitesEdge { - """A cursor for use in pagination.""" - cursor: Cursor - - """The `Invite` at the end of the edge.""" - node: Invite! -} - -"""Methods to use when ordering `Invite`.""" -enum InvitesOrderBy { - NATURAL - CREATED_AT_ASC - CREATED_AT_DESC - UPDATED_AT_ASC - UPDATED_AT_DESC - PHONE_NUMBER_ASC - PHONE_NUMBER_DESC - IS_APPROVED_ASC - IS_APPROVED_DESC - PRIMARY_KEY_ASC - PRIMARY_KEY_DESC +"""All input for the `deleteOption` mutation.""" +input DeleteOptionInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + id: Int! } -""" -A condition to be used against `Invite` object types. All fields are tested for equality and combined with a logical ‘and.’ -""" -input InviteCondition { - """Checks for equality with the object’s `createdAt` field.""" - createdAt: Datetime +"""The output of our delete `Option` mutation.""" +type DeleteOptionPayload { + """ + The exact same `clientMutationId` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String - """Checks for equality with the object’s `updatedAt` field.""" - updatedAt: Datetime + """The `Option` that was deleted by this mutation.""" + option: Option + deletedOptionNodeId: ID - """Checks for equality with the object’s `phoneNumber` field.""" - phoneNumber: String + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query - """Checks for equality with the object’s `isApproved` field.""" - isApproved: Boolean + """An edge for our `Option`. May be used by Relay 1.""" + optionEdge( + """The method to use when ordering `Option`.""" + orderBy: [OptionsOrderBy!] = [PRIMARY_KEY_ASC] + ): OptionsEdge } -"""A connection to a list of `Option` values.""" -type OptionsConnection { - """A list of `Option` objects.""" - nodes: [Option!]! - +"""All input for the `deleteRelationshipByNodeId` mutation.""" +input DeleteRelationshipByNodeIdInput { """ - A list of edges which contains the `Option` and cursor to aid in pagination. + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. """ - edges: [OptionsEdge!]! - - """Information to aid in pagination.""" - pageInfo: PageInfo! + clientMutationId: String - """The count of *all* `Option` you could get from the connection.""" - totalCount: Int! + """ + The globally unique `ID` which will identify a single `Relationship` to be deleted. + """ + nodeId: ID! } -"""A `Option` edge in the connection.""" -type OptionsEdge { - """A cursor for use in pagination.""" - cursor: Cursor - - """The `Option` at the end of the edge.""" - node: Option! +"""All input for the `deleteRelationship` mutation.""" +input DeleteRelationshipInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + attributeId: Int! + optionId: Int! } -"""Methods to use when ordering `Option`.""" -enum OptionsOrderBy { - NATURAL - CREATED_AT_ASC - CREATED_AT_DESC - UPDATED_AT_ASC - UPDATED_AT_DESC - ID_ASC - ID_DESC - VALUE_ASC - VALUE_DESC - TYPE_ASC - TYPE_DESC - IS_PROPOSAL_ASC - IS_PROPOSAL_DESC - PRIMARY_KEY_ASC - PRIMARY_KEY_DESC -} +"""The output of our delete `Relationship` mutation.""" +type DeleteRelationshipPayload { + """ + The exact same `clientMutationId` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String -""" -A condition to be used against `Option` object types. All fields are tested for equality and combined with a logical ‘and.’ -""" -input OptionCondition { - """Checks for equality with the object’s `createdAt` field.""" - createdAt: Datetime + """The `Relationship` that was deleted by this mutation.""" + relationship: Relationship + deletedRelationshipNodeId: ID - """Checks for equality with the object’s `updatedAt` field.""" - updatedAt: Datetime + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query - """Checks for equality with the object’s `id` field.""" - id: Int + """Reads a single `Attribute` that is related to this `Relationship`.""" + attribute: Attribute - """Checks for equality with the object’s `value` field.""" - value: String + """Reads a single `Option` that is related to this `Relationship`.""" + option: Option - """Checks for equality with the object’s `type` field.""" - type: OptionType + """An edge for our `Relationship`. May be used by Relay 1.""" + relationshipEdge( + """The method to use when ordering `Relationship`.""" + orderBy: [RelationshipsOrderBy!] = [PRIMARY_KEY_ASC] + ): RelationshipsEdge +} - """Checks for equality with the object’s `isProposal` field.""" - isProposal: Boolean +"""All input for the `deleteRequestByNodeId` mutation.""" +input DeleteRequestByNodeIdInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + + """ + The globally unique `ID` which will identify a single `Request` to be deleted. + """ + nodeId: ID! } -"""A connection to a list of `User` values.""" -type UsersConnection { - """A list of `User` objects.""" - nodes: [User!]! +"""All input for the `deleteRequest` mutation.""" +input DeleteRequestInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + id: Int! +} +"""The output of our delete `Request` mutation.""" +type DeleteRequestPayload { """ - A list of edges which contains the `User` and cursor to aid in pagination. + The exact same `clientMutationId` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. """ - edges: [UsersEdge!]! + clientMutationId: String - """Information to aid in pagination.""" - pageInfo: PageInfo! + """The `Request` that was deleted by this mutation.""" + request: Request + deletedRequestNodeId: ID - """The count of *all* `User` you could get from the connection.""" - totalCount: Int! -} + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query -"""A `User` edge in the connection.""" -type UsersEdge { - """A cursor for use in pagination.""" - cursor: Cursor + """Reads a single `User` that is related to this `Request`.""" + requester: User - """The `User` at the end of the edge.""" - node: User! + """An edge for our `Request`. May be used by Relay 1.""" + requestEdge( + """The method to use when ordering `Request`.""" + orderBy: [RequestsOrderBy!] = [PRIMARY_KEY_ASC] + ): RequestsEdge } -"""Methods to use when ordering `User`.""" -enum UsersOrderBy { - NATURAL - CREATED_AT_ASC - CREATED_AT_DESC - UPDATED_AT_ASC - UPDATED_AT_DESC - ID_ASC - ID_DESC - PRIMARY_KEY_ASC - PRIMARY_KEY_DESC +"""All input for the `deleteSubcategoryByCategoryIdAndName` mutation.""" +input DeleteSubcategoryByCategoryIdAndNameInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + categoryId: Int! + name: String! } -""" -A condition to be used against `User` object types. All fields are tested for equality and combined with a logical ‘and.’ -""" -input UserCondition { - """Checks for equality with the object’s `createdAt` field.""" - createdAt: Datetime - - """Checks for equality with the object’s `updatedAt` field.""" - updatedAt: Datetime +"""All input for the `deleteSubcategoryByNodeId` mutation.""" +input DeleteSubcategoryByNodeIdInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String - """Checks for equality with the object’s `id` field.""" - id: String + """ + The globally unique `ID` which will identify a single `Subcategory` to be deleted. + """ + nodeId: ID! } -""" -The root mutation type which contains root level fields which mutate data. -""" -type Mutation { - """Creates a single `Association`.""" - createAssociation( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: CreateAssociationInput! - ): CreateAssociationPayload +"""All input for the `deleteSubcategory` mutation.""" +input DeleteSubcategoryInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + id: Int! +} - """Creates a single `Category`.""" - createCategory( +"""The output of our delete `Subcategory` mutation.""" +type DeleteSubcategoryPayload { + """ + The exact same `clientMutationId` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String + + """The `Subcategory` that was deleted by this mutation.""" + subcategory: Subcategory + deletedSubcategoryNodeId: ID + + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query + + """Reads a single `Category` that is related to this `Subcategory`.""" + category: Category + + """An edge for our `Subcategory`. May be used by Relay 1.""" + subcategoryEdge( + """The method to use when ordering `Subcategory`.""" + orderBy: [SubcategoriesOrderBy!] = [PRIMARY_KEY_ASC] + ): SubcategoriesEdge +} + +"""All input for the `deleteThingByNodeId` mutation.""" +input DeleteThingByNodeIdInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + + """ + The globally unique `ID` which will identify a single `Thing` to be deleted. + """ + nodeId: ID! +} + +"""All input for the `deleteThing` mutation.""" +input DeleteThingInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + id: Int! +} + +"""The output of our delete `Thing` mutation.""" +type DeleteThingPayload { + """ + The exact same `clientMutationId` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String + + """The `Thing` that was deleted by this mutation.""" + thing: Thing + deletedThingNodeId: ID + + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query + + """Reads a single `Category` that is related to this `Thing`.""" + category: Category + + """Reads a single `Subcategory` that is related to this `Thing`.""" + subcategory: Subcategory + + """Reads a single `User` that is related to this `Thing`.""" + owner: User + + """An edge for our `Thing`. May be used by Relay 1.""" + thingEdge( + """The method to use when ordering `Thing`.""" + orderBy: [ThingsOrderBy!] = [PRIMARY_KEY_ASC] + ): ThingsEdge +} + +"""All input for the `deleteUserByNodeId` mutation.""" +input DeleteUserByNodeIdInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + + """ + The globally unique `ID` which will identify a single `User` to be deleted. + """ + nodeId: ID! +} + +"""All input for the `deleteUser` mutation.""" +input DeleteUserInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + id: String! +} + +"""The output of our delete `User` mutation.""" +type DeleteUserPayload { + """ + The exact same `clientMutationId` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String + + """The `User` that was deleted by this mutation.""" + user: User + deletedUserNodeId: ID + + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query + + """An edge for our `User`. May be used by Relay 1.""" + userEdge( + """The method to use when ordering `User`.""" + orderBy: [UsersOrderBy!] = [PRIMARY_KEY_ASC] + ): UsersEdge +} + +""" +The `GeoJSON` scalar type represents GeoJSON values as specified by[RFC 7946](https://tools.ietf.org/html/rfc7946). +""" +scalar GeoJSON + +"""All geometry XY types implement this interface""" +interface GeometryGeometry { + """Converts the object to GeoJSON""" + geojson: GeoJSON + + """Spatial reference identifier (SRID)""" + srid: Int! +} + +type GeometryGeometryCollection implements GeometryInterface & GeometryGeometry { + geojson: GeoJSON + srid: Int! + geometries: [GeometryGeometry] +} + +type GeometryGeometryCollectionM implements GeometryInterface & GeometryGeometryM { + geojson: GeoJSON + srid: Int! + geometries: [GeometryGeometryM] +} + +type GeometryGeometryCollectionZ implements GeometryInterface & GeometryGeometryZ { + geojson: GeoJSON + srid: Int! + geometries: [GeometryGeometryZ] +} + +type GeometryGeometryCollectionZM implements GeometryInterface & GeometryGeometryZM { + geojson: GeoJSON + srid: Int! + geometries: [GeometryGeometryZM] +} + +"""All geometry XYM types implement this interface""" +interface GeometryGeometryM { + """Converts the object to GeoJSON""" + geojson: GeoJSON + + """Spatial reference identifier (SRID)""" + srid: Int! +} + +"""All geometry XYZ types implement this interface""" +interface GeometryGeometryZ { + """Converts the object to GeoJSON""" + geojson: GeoJSON + + """Spatial reference identifier (SRID)""" + srid: Int! +} + +"""All geometry XYZM types implement this interface""" +interface GeometryGeometryZM { + """Converts the object to GeoJSON""" + geojson: GeoJSON + + """Spatial reference identifier (SRID)""" + srid: Int! +} + +"""All geometry types implement this interface""" +interface GeometryInterface { + """Converts the object to GeoJSON""" + geojson: GeoJSON + + """Spatial reference identifier (SRID)""" + srid: Int! +} + +type GeometryLineString implements GeometryInterface & GeometryGeometry { + geojson: GeoJSON + srid: Int! + points: [GeometryPoint] +} + +type GeometryLineStringM implements GeometryInterface & GeometryGeometryM { + geojson: GeoJSON + srid: Int! + points: [GeometryPointM] +} + +type GeometryLineStringZ implements GeometryInterface & GeometryGeometryZ { + geojson: GeoJSON + srid: Int! + points: [GeometryPointZ] +} + +type GeometryLineStringZM implements GeometryInterface & GeometryGeometryZM { + geojson: GeoJSON + srid: Int! + points: [GeometryPointZM] +} + +type GeometryMultiLineString implements GeometryInterface & GeometryGeometry { + geojson: GeoJSON + srid: Int! + lines: [GeometryLineString] +} + +type GeometryMultiLineStringM implements GeometryInterface & GeometryGeometryM { + geojson: GeoJSON + srid: Int! + lines: [GeometryLineStringM] +} + +type GeometryMultiLineStringZ implements GeometryInterface & GeometryGeometryZ { + geojson: GeoJSON + srid: Int! + lines: [GeometryLineStringZ] +} + +type GeometryMultiLineStringZM implements GeometryInterface & GeometryGeometryZM { + geojson: GeoJSON + srid: Int! + lines: [GeometryLineStringZM] +} + +type GeometryMultiPoint implements GeometryInterface & GeometryGeometry { + geojson: GeoJSON + srid: Int! + points: [GeometryPoint] +} + +type GeometryMultiPointM implements GeometryInterface & GeometryGeometryM { + geojson: GeoJSON + srid: Int! + points: [GeometryPointM] +} + +type GeometryMultiPointZ implements GeometryInterface & GeometryGeometryZ { + geojson: GeoJSON + srid: Int! + points: [GeometryPointZ] +} + +type GeometryMultiPointZM implements GeometryInterface & GeometryGeometryZM { + geojson: GeoJSON + srid: Int! + points: [GeometryPointZM] +} + +type GeometryMultiPolygon implements GeometryInterface & GeometryGeometry { + geojson: GeoJSON + srid: Int! + polygons: [GeometryPolygon] +} + +type GeometryMultiPolygonM implements GeometryInterface & GeometryGeometryM { + geojson: GeoJSON + srid: Int! + polygons: [GeometryPolygonM] +} + +type GeometryMultiPolygonZ implements GeometryInterface & GeometryGeometryZ { + geojson: GeoJSON + srid: Int! + polygons: [GeometryPolygonZ] +} + +type GeometryMultiPolygonZM implements GeometryInterface & GeometryGeometryZM { + geojson: GeoJSON + srid: Int! + polygons: [GeometryPolygonZM] +} + +type GeometryPoint implements GeometryInterface & GeometryGeometry { + geojson: GeoJSON + srid: Int! + x: Float! + y: Float! +} + +type GeometryPointM implements GeometryInterface & GeometryGeometryM { + geojson: GeoJSON + srid: Int! + x: Float! + y: Float! +} + +type GeometryPointZ implements GeometryInterface & GeometryGeometryZ { + geojson: GeoJSON + srid: Int! + x: Float! + y: Float! +} + +type GeometryPointZM implements GeometryInterface & GeometryGeometryZM { + geojson: GeoJSON + srid: Int! + x: Float! + y: Float! +} + +type GeometryPolygon implements GeometryInterface & GeometryGeometry { + geojson: GeoJSON + srid: Int! + exterior: GeometryLineString + interiors: [GeometryLineString] +} + +type GeometryPolygonM implements GeometryInterface & GeometryGeometryM { + geojson: GeoJSON + srid: Int! + exterior: GeometryLineStringM + interiors: [GeometryLineStringM] +} + +type GeometryPolygonZ implements GeometryInterface & GeometryGeometryZ { + geojson: GeoJSON + srid: Int! + exterior: GeometryLineStringZ + interiors: [GeometryLineStringZ] +} + +type GeometryPolygonZM implements GeometryInterface & GeometryGeometryZM { + geojson: GeoJSON + srid: Int! + exterior: GeometryLineStringZM + interiors: [GeometryLineStringZM] +} + +type Help { + createdAt: Datetime + updatedAt: Datetime + createdBy: String + description: String! +} + +""" +A condition to be used against `Help` object types. All fields are tested for equality and combined with a logical ‘and.’ +""" +input HelpCondition { + """Checks for equality with the object’s `createdAt` field.""" + createdAt: Datetime + + """Checks for equality with the object’s `updatedAt` field.""" + updatedAt: Datetime + + """Checks for equality with the object’s `createdBy` field.""" + createdBy: String + + """Checks for equality with the object’s `description` field.""" + description: String +} + +"""An input for mutations affecting `Help`""" +input HelpInput { + createdAt: Datetime + updatedAt: Datetime + createdBy: String + description: String! +} + +"""A connection to a list of `Help` values.""" +type HelpsConnection { + """A list of `Help` objects.""" + nodes: [Help!]! + + """ + A list of edges which contains the `Help` and cursor to aid in pagination. + """ + edges: [HelpsEdge!]! + + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """The count of *all* `Help` you could get from the connection.""" + totalCount: Int! +} + +"""A `Help` edge in the connection.""" +type HelpsEdge { + """A cursor for use in pagination.""" + cursor: Cursor + + """The `Help` at the end of the edge.""" + node: Help! +} + +"""Methods to use when ordering `Help`.""" +enum HelpsOrderBy { + NATURAL + CREATED_AT_ASC + CREATED_AT_DESC + UPDATED_AT_ASC + UPDATED_AT_DESC + CREATED_BY_ASC + CREATED_BY_DESC + DESCRIPTION_ASC + DESCRIPTION_DESC +} + +type Idea { + createdAt: Datetime + updatedAt: Datetime + createdBy: String + description: String! +} + +""" +A condition to be used against `Idea` object types. All fields are tested for equality and combined with a logical ‘and.’ +""" +input IdeaCondition { + """Checks for equality with the object’s `createdAt` field.""" + createdAt: Datetime + + """Checks for equality with the object’s `updatedAt` field.""" + updatedAt: Datetime + + """Checks for equality with the object’s `createdBy` field.""" + createdBy: String + + """Checks for equality with the object’s `description` field.""" + description: String +} + +"""An input for mutations affecting `Idea`""" +input IdeaInput { + createdAt: Datetime + updatedAt: Datetime + createdBy: String + description: String! +} + +"""A connection to a list of `Idea` values.""" +type IdeasConnection { + """A list of `Idea` objects.""" + nodes: [Idea!]! + + """ + A list of edges which contains the `Idea` and cursor to aid in pagination. + """ + edges: [IdeasEdge!]! + + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """The count of *all* `Idea` you could get from the connection.""" + totalCount: Int! +} + +"""A `Idea` edge in the connection.""" +type IdeasEdge { + """A cursor for use in pagination.""" + cursor: Cursor + + """The `Idea` at the end of the edge.""" + node: Idea! +} + +"""Methods to use when ordering `Idea`.""" +enum IdeasOrderBy { + NATURAL + CREATED_AT_ASC + CREATED_AT_DESC + UPDATED_AT_ASC + UPDATED_AT_DESC + CREATED_BY_ASC + CREATED_BY_DESC + DESCRIPTION_ASC + DESCRIPTION_DESC +} + +type Invite implements Node { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + createdAt: Datetime + updatedAt: Datetime + createdBy: String + phoneNumber: String! + isApproved: Boolean +} + +""" +A condition to be used against `Invite` object types. All fields are tested for equality and combined with a logical ‘and.’ +""" +input InviteCondition { + """Checks for equality with the object’s `createdAt` field.""" + createdAt: Datetime + + """Checks for equality with the object’s `updatedAt` field.""" + updatedAt: Datetime + + """Checks for equality with the object’s `createdBy` field.""" + createdBy: String + + """Checks for equality with the object’s `phoneNumber` field.""" + phoneNumber: String + + """Checks for equality with the object’s `isApproved` field.""" + isApproved: Boolean +} + +"""An input for mutations affecting `Invite`""" +input InviteInput { + createdAt: Datetime + updatedAt: Datetime + createdBy: String + phoneNumber: String! + isApproved: Boolean +} + +"""A connection to a list of `Invite` values.""" +type InvitesConnection { + """A list of `Invite` objects.""" + nodes: [Invite!]! + + """ + A list of edges which contains the `Invite` and cursor to aid in pagination. + """ + edges: [InvitesEdge!]! + + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """The count of *all* `Invite` you could get from the connection.""" + totalCount: Int! +} + +"""A `Invite` edge in the connection.""" +type InvitesEdge { + """A cursor for use in pagination.""" + cursor: Cursor + + """The `Invite` at the end of the edge.""" + node: Invite! +} + +"""Methods to use when ordering `Invite`.""" +enum InvitesOrderBy { + NATURAL + CREATED_AT_ASC + CREATED_AT_DESC + UPDATED_AT_ASC + UPDATED_AT_DESC + CREATED_BY_ASC + CREATED_BY_DESC + PHONE_NUMBER_ASC + PHONE_NUMBER_DESC + IS_APPROVED_ASC + IS_APPROVED_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +""" +The `JSON` scalar type represents JSON values as specified by [ECMA-404](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf). +""" +scalar JSON + +""" +The root mutation type which contains root level fields which mutate data. +""" +type Mutation { + """Creates a single `Association`.""" + createAssociation( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: CreateAssociationInput! + ): CreateAssociationPayload + + """Creates a single `Category`.""" + createCategory( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: CreateCategoryInput! + ): CreateCategoryPayload + + """Creates a single `Characteristic`.""" + createCharacteristic( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: CreateCharacteristicInput! + ): CreateCharacteristicPayload + + """Creates a single `Concern`.""" + createConcern( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: CreateConcernInput! + ): CreateConcernPayload + + """Creates a single `Help`.""" + createHelp( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: CreateHelpInput! + ): CreateHelpPayload + + """Creates a single `Idea`.""" + createIdea( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: CreateIdeaInput! + ): CreateIdeaPayload + + """Creates a single `Invite`.""" + createInvite( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: CreateInviteInput! + ): CreateInvitePayload + + """Creates a single `Option`.""" + createOption( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: CreateOptionInput! + ): CreateOptionPayload + + """Creates a single `Relationship`.""" + createRelationship( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: CreateRelationshipInput! + ): CreateRelationshipPayload + + """Creates a single `Request`.""" + createRequest( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: CreateRequestInput! + ): CreateRequestPayload + + """Creates a single `Subcategory`.""" + createSubcategory( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: CreateSubcategoryInput! + ): CreateSubcategoryPayload + + """Updates a single `Attribute` using its globally unique id and a patch.""" + updateAttributeByNodeId( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: UpdateAttributeByNodeIdInput! + ): UpdateAttributePayload + + """Updates a single `Attribute` using a unique key and a patch.""" + updateAttribute( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: UpdateAttributeInput! + ): UpdateAttributePayload + + """Updates a single `Attribute` using a unique key and a patch.""" + updateAttributeByName( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: UpdateAttributeByNameInput! + ): UpdateAttributePayload + + """Updates a single `Category` using its globally unique id and a patch.""" + updateCategoryByNodeId( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: UpdateCategoryByNodeIdInput! + ): UpdateCategoryPayload + + """Updates a single `Category` using a unique key and a patch.""" + updateCategory( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: UpdateCategoryInput! + ): UpdateCategoryPayload + + """Updates a single `Category` using a unique key and a patch.""" + updateCategoryByName( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: UpdateCategoryByNameInput! + ): UpdateCategoryPayload + + """ + Updates a single `Characteristic` using its globally unique id and a patch. + """ + updateCharacteristicByNodeId( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: UpdateCharacteristicByNodeIdInput! + ): UpdateCharacteristicPayload + + """Updates a single `Characteristic` using a unique key and a patch.""" + updateCharacteristic( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: UpdateCharacteristicInput! + ): UpdateCharacteristicPayload + + """Updates a single `Option` using its globally unique id and a patch.""" + updateOptionByNodeId( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: UpdateOptionByNodeIdInput! + ): UpdateOptionPayload + + """Updates a single `Option` using a unique key and a patch.""" + updateOption( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: UpdateOptionInput! + ): UpdateOptionPayload + + """ + Updates a single `Subcategory` using its globally unique id and a patch. + """ + updateSubcategoryByNodeId( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: UpdateSubcategoryByNodeIdInput! + ): UpdateSubcategoryPayload + + """Updates a single `Subcategory` using a unique key and a patch.""" + updateSubcategory( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: UpdateSubcategoryInput! + ): UpdateSubcategoryPayload + + """Updates a single `Subcategory` using a unique key and a patch.""" + updateSubcategoryByCategoryIdAndName( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: UpdateSubcategoryByCategoryIdAndNameInput! + ): UpdateSubcategoryPayload + + """Deletes a single `Association` using its globally unique id.""" + deleteAssociationByNodeId( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: DeleteAssociationByNodeIdInput! + ): DeleteAssociationPayload + + """Deletes a single `Association` using a unique key.""" + deleteAssociation( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: DeleteAssociationInput! + ): DeleteAssociationPayload + + """Deletes a single `Attribute` using its globally unique id.""" + deleteAttributeByNodeId( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: DeleteAttributeByNodeIdInput! + ): DeleteAttributePayload + + """Deletes a single `Attribute` using a unique key.""" + deleteAttribute( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: DeleteAttributeInput! + ): DeleteAttributePayload + + """Deletes a single `Attribute` using a unique key.""" + deleteAttributeByName( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: DeleteAttributeByNameInput! + ): DeleteAttributePayload + + """Deletes a single `Category` using its globally unique id.""" + deleteCategoryByNodeId( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: DeleteCategoryByNodeIdInput! + ): DeleteCategoryPayload + + """Deletes a single `Category` using a unique key.""" + deleteCategory( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: DeleteCategoryInput! + ): DeleteCategoryPayload + + """Deletes a single `Category` using a unique key.""" + deleteCategoryByName( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: DeleteCategoryByNameInput! + ): DeleteCategoryPayload + + """Deletes a single `Characteristic` using its globally unique id.""" + deleteCharacteristicByNodeId( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: DeleteCharacteristicByNodeIdInput! + ): DeleteCharacteristicPayload + + """Deletes a single `Characteristic` using a unique key.""" + deleteCharacteristic( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: DeleteCharacteristicInput! + ): DeleteCharacteristicPayload + + """Deletes a single `Invite` using its globally unique id.""" + deleteInviteByNodeId( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: DeleteInviteByNodeIdInput! + ): DeleteInvitePayload + + """Deletes a single `Invite` using a unique key.""" + deleteInvite( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: DeleteInviteInput! + ): DeleteInvitePayload + + """Deletes a single `Option` using its globally unique id.""" + deleteOptionByNodeId( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: DeleteOptionByNodeIdInput! + ): DeleteOptionPayload + + """Deletes a single `Option` using a unique key.""" + deleteOption( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: DeleteOptionInput! + ): DeleteOptionPayload + + """Deletes a single `Relationship` using its globally unique id.""" + deleteRelationshipByNodeId( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: DeleteRelationshipByNodeIdInput! + ): DeleteRelationshipPayload + + """Deletes a single `Relationship` using a unique key.""" + deleteRelationship( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: DeleteRelationshipInput! + ): DeleteRelationshipPayload + + """Deletes a single `Request` using its globally unique id.""" + deleteRequestByNodeId( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: DeleteRequestByNodeIdInput! + ): DeleteRequestPayload + + """Deletes a single `Request` using a unique key.""" + deleteRequest( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: DeleteRequestInput! + ): DeleteRequestPayload + + """Deletes a single `Subcategory` using its globally unique id.""" + deleteSubcategoryByNodeId( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: DeleteSubcategoryByNodeIdInput! + ): DeleteSubcategoryPayload + + """Deletes a single `Subcategory` using a unique key.""" + deleteSubcategory( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: DeleteSubcategoryInput! + ): DeleteSubcategoryPayload + + """Deletes a single `Subcategory` using a unique key.""" + deleteSubcategoryByCategoryIdAndName( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: DeleteSubcategoryByCategoryIdAndNameInput! + ): DeleteSubcategoryPayload + + """Deletes a single `Thing` using its globally unique id.""" + deleteThingByNodeId( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: DeleteThingByNodeIdInput! + ): DeleteThingPayload + + """Deletes a single `Thing` using a unique key.""" + deleteThing( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: DeleteThingInput! + ): DeleteThingPayload + + """Deletes a single `User` using its globally unique id.""" + deleteUserByNodeId( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: DeleteUserByNodeIdInput! + ): DeleteUserPayload + + """Deletes a single `User` using a unique key.""" + deleteUser( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: DeleteUserInput! + ): DeleteUserPayload + createThing( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: CreateThingInput! + ): CreateThingPayload + approveInvite( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: ApproveInviteInput! + ): ApproveInvitePayload + createAttribute( """ The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. """ - input: CreateCategoryInput! - ): CreateCategoryPayload - - """Creates a single `Characteristic`.""" - createCharacteristic( + input: CreateAttributeInput! + ): CreateAttributePayload + proposeAttribute( """ The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. """ - input: CreateCharacteristicInput! - ): CreateCharacteristicPayload - - """Creates a single `Invite`.""" - createInvite( + input: ProposeAttributeInput! + ): ProposeAttributePayload + proposeOption( """ The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. """ - input: CreateInviteInput! - ): CreateInvitePayload - - """Creates a single `Option`.""" - createOption( + input: ProposeOptionInput! + ): ProposeOptionPayload + createUser( """ The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. """ - input: CreateOptionInput! - ): CreateOptionPayload + input: CreateUserInput! + ): CreateUserPayload +} + +input NewAttributeInput { + attributeId: Int! + optionId: Int! +} + +"""An object with a globally unique `ID`.""" +interface Node { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! +} + +type Option implements Node { + """ + A globally unique identifier. Can be used in various places throughout the system to identify this single value. + """ + nodeId: ID! + createdAt: Datetime + updatedAt: Datetime + createdBy: String + id: Int! + value: String! + type: OptionType + isApproved: Boolean + + """Reads and enables pagination through a set of `Relationship`.""" + relationships( + """Only read the first `n` values of the set.""" + first: Int + + """Only read the last `n` values of the set.""" + last: Int + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor + based pagination. May not be used with `last`. + """ + offset: Int + + """Read all values in the set before (above) this cursor.""" + before: Cursor + + """Read all values in the set after (below) this cursor.""" + after: Cursor + + """The method to use when ordering `Relationship`.""" + orderBy: [RelationshipsOrderBy!] = [PRIMARY_KEY_ASC] + + """ + A condition to be used in determining which values should be returned by the collection. + """ + condition: RelationshipCondition + ): RelationshipsConnection! + + """Reads and enables pagination through a set of `Characteristic`.""" + characteristics( + """Only read the first `n` values of the set.""" + first: Int + + """Only read the last `n` values of the set.""" + last: Int + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor + based pagination. May not be used with `last`. + """ + offset: Int + + """Read all values in the set before (above) this cursor.""" + before: Cursor + + """Read all values in the set after (below) this cursor.""" + after: Cursor + + """The method to use when ordering `Characteristic`.""" + orderBy: [CharacteristicsOrderBy!] = [PRIMARY_KEY_ASC] + + """ + A condition to be used in determining which values should be returned by the collection. + """ + condition: CharacteristicCondition + ): CharacteristicsConnection! +} + +""" +A condition to be used against `Option` object types. All fields are tested for equality and combined with a logical ‘and.’ +""" +input OptionCondition { + """Checks for equality with the object’s `createdAt` field.""" + createdAt: Datetime + + """Checks for equality with the object’s `updatedAt` field.""" + updatedAt: Datetime + + """Checks for equality with the object’s `createdBy` field.""" + createdBy: String + + """Checks for equality with the object’s `id` field.""" + id: Int + + """Checks for equality with the object’s `value` field.""" + value: String + + """Checks for equality with the object’s `type` field.""" + type: OptionType + + """Checks for equality with the object’s `isApproved` field.""" + isApproved: Boolean +} + +"""An input for mutations affecting `Option`""" +input OptionInput { + createdAt: Datetime + updatedAt: Datetime + createdBy: String + id: Int + value: String! + type: OptionType + isApproved: Boolean +} + +""" +Represents an update to a `Option`. Fields that are set will be updated. +""" +input OptionPatch { + createdAt: Datetime + updatedAt: Datetime + createdBy: String + id: Int + value: String + type: OptionType + isApproved: Boolean +} + +"""A connection to a list of `Option` values.""" +type OptionsConnection { + """A list of `Option` objects.""" + nodes: [Option!]! + + """ + A list of edges which contains the `Option` and cursor to aid in pagination. + """ + edges: [OptionsEdge!]! + + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """The count of *all* `Option` you could get from the connection.""" + totalCount: Int! +} + +"""A `Option` edge in the connection.""" +type OptionsEdge { + """A cursor for use in pagination.""" + cursor: Cursor + + """The `Option` at the end of the edge.""" + node: Option! +} + +"""Methods to use when ordering `Option`.""" +enum OptionsOrderBy { + NATURAL + CREATED_AT_ASC + CREATED_AT_DESC + UPDATED_AT_ASC + UPDATED_AT_DESC + CREATED_BY_ASC + CREATED_BY_DESC + ID_ASC + ID_DESC + VALUE_ASC + VALUE_DESC + TYPE_ASC + TYPE_DESC + IS_APPROVED_ASC + IS_APPROVED_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +enum OptionType { + TEXT + COMPANY + SIZE +} + +"""Information about pagination in a connection.""" +type PageInfo { + """When paginating forwards, are there more items?""" + hasNextPage: Boolean! + + """When paginating backwards, are there more items?""" + hasPreviousPage: Boolean! + + """When paginating backwards, the cursor to continue.""" + startCursor: Cursor + + """When paginating forwards, the cursor to continue.""" + endCursor: Cursor +} + +input ProposeAttributeInput { + name: String! +} + +type ProposeAttributePayload { + attribute: Attribute + query: Query +} + +input ProposeOptionInput { + value: String! + attributeId: Int! +} + +type ProposeOptionPayload { + option: Option + query: Query +} + +"""The root query type which gives access points into the data universe.""" +type Query implements Node { + """ + Exposes the root query type nested one level down. This is helpful for Relay 1 + which can only query top level fields if they are in a particular form. + """ + query: Query! - """Creates a single `Relationship`.""" - createRelationship( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: CreateRelationshipInput! - ): CreateRelationshipPayload + """ + The root query type must be a `Node` to work well with Relay 1 mutations. This just resolves to `query`. + """ + nodeId: ID! - """Creates a single `Subcategory`.""" - createSubcategory( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: CreateSubcategoryInput! - ): CreateSubcategoryPayload + """Fetches an object given its globally unique `ID`.""" + node( + """The globally unique `ID`.""" + nodeId: ID! + ): Node - """Updates a single `Attribute` using its globally unique id and a patch.""" - updateAttributeByNodeId( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: UpdateAttributeByNodeIdInput! - ): UpdateAttributePayload + """Reads and enables pagination through a set of `Association`.""" + associations( + """Only read the first `n` values of the set.""" + first: Int - """Updates a single `Attribute` using a unique key and a patch.""" - updateAttribute( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: UpdateAttributeInput! - ): UpdateAttributePayload + """Only read the last `n` values of the set.""" + last: Int - """Updates a single `Attribute` using a unique key and a patch.""" - updateAttributeByName( """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + Skip the first `n` values from our `after` cursor, an alternative to cursor + based pagination. May not be used with `last`. """ - input: UpdateAttributeByNameInput! - ): UpdateAttributePayload + offset: Int - """Updates a single `Category` using its globally unique id and a patch.""" - updateCategoryByNodeId( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: UpdateCategoryByNodeIdInput! - ): UpdateCategoryPayload + """Read all values in the set before (above) this cursor.""" + before: Cursor - """Updates a single `Category` using a unique key and a patch.""" - updateCategory( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: UpdateCategoryInput! - ): UpdateCategoryPayload + """Read all values in the set after (below) this cursor.""" + after: Cursor - """Updates a single `Category` using a unique key and a patch.""" - updateCategoryByName( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: UpdateCategoryByNameInput! - ): UpdateCategoryPayload + """The method to use when ordering `Association`.""" + orderBy: [AssociationsOrderBy!] = [PRIMARY_KEY_ASC] - """ - Updates a single `Characteristic` using its globally unique id and a patch. - """ - updateCharacteristicByNodeId( """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + A condition to be used in determining which values should be returned by the collection. """ - input: UpdateCharacteristicByNodeIdInput! - ): UpdateCharacteristicPayload + condition: AssociationCondition + ): AssociationsConnection - """Updates a single `Characteristic` using a unique key and a patch.""" - updateCharacteristic( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: UpdateCharacteristicInput! - ): UpdateCharacteristicPayload + """Reads and enables pagination through a set of `Attribute`.""" + attributes( + """Only read the first `n` values of the set.""" + first: Int - """Updates a single `Option` using its globally unique id and a patch.""" - updateOptionByNodeId( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: UpdateOptionByNodeIdInput! - ): UpdateOptionPayload + """Only read the last `n` values of the set.""" + last: Int - """Updates a single `Option` using a unique key and a patch.""" - updateOption( """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + Skip the first `n` values from our `after` cursor, an alternative to cursor + based pagination. May not be used with `last`. """ - input: UpdateOptionInput! - ): UpdateOptionPayload + offset: Int - """ - Updates a single `Subcategory` using its globally unique id and a patch. - """ - updateSubcategoryByNodeId( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: UpdateSubcategoryByNodeIdInput! - ): UpdateSubcategoryPayload + """Read all values in the set before (above) this cursor.""" + before: Cursor - """Updates a single `Subcategory` using a unique key and a patch.""" - updateSubcategory( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: UpdateSubcategoryInput! - ): UpdateSubcategoryPayload + """Read all values in the set after (below) this cursor.""" + after: Cursor - """Updates a single `Subcategory` using a unique key and a patch.""" - updateSubcategoryByCategoryIdAndName( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: UpdateSubcategoryByCategoryIdAndNameInput! - ): UpdateSubcategoryPayload + """The method to use when ordering `Attribute`.""" + orderBy: [AttributesOrderBy!] = [PRIMARY_KEY_ASC] - """Deletes a single `Association` using its globally unique id.""" - deleteAssociationByNodeId( """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + A condition to be used in determining which values should be returned by the collection. """ - input: DeleteAssociationByNodeIdInput! - ): DeleteAssociationPayload + condition: AttributeCondition + ): AttributesConnection - """Deletes a single `Association` using a unique key.""" - deleteAssociation( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: DeleteAssociationInput! - ): DeleteAssociationPayload + """Reads and enables pagination through a set of `Category`.""" + categories( + """Only read the first `n` values of the set.""" + first: Int - """Deletes a single `Attribute` using its globally unique id.""" - deleteAttributeByNodeId( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: DeleteAttributeByNodeIdInput! - ): DeleteAttributePayload + """Only read the last `n` values of the set.""" + last: Int - """Deletes a single `Attribute` using a unique key.""" - deleteAttribute( """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + Skip the first `n` values from our `after` cursor, an alternative to cursor + based pagination. May not be used with `last`. """ - input: DeleteAttributeInput! - ): DeleteAttributePayload + offset: Int - """Deletes a single `Attribute` using a unique key.""" - deleteAttributeByName( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: DeleteAttributeByNameInput! - ): DeleteAttributePayload + """Read all values in the set before (above) this cursor.""" + before: Cursor - """Deletes a single `Category` using its globally unique id.""" - deleteCategoryByNodeId( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: DeleteCategoryByNodeIdInput! - ): DeleteCategoryPayload + """Read all values in the set after (below) this cursor.""" + after: Cursor - """Deletes a single `Category` using a unique key.""" - deleteCategory( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: DeleteCategoryInput! - ): DeleteCategoryPayload + """The method to use when ordering `Category`.""" + orderBy: [CategoriesOrderBy!] = [PRIMARY_KEY_ASC] - """Deletes a single `Category` using a unique key.""" - deleteCategoryByName( """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + A condition to be used in determining which values should be returned by the collection. """ - input: DeleteCategoryByNameInput! - ): DeleteCategoryPayload + condition: CategoryCondition + ): CategoriesConnection - """Deletes a single `Characteristic` using its globally unique id.""" - deleteCharacteristicByNodeId( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: DeleteCharacteristicByNodeIdInput! - ): DeleteCharacteristicPayload + """Reads and enables pagination through a set of `Characteristic`.""" + characteristics( + """Only read the first `n` values of the set.""" + first: Int - """Deletes a single `Characteristic` using a unique key.""" - deleteCharacteristic( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: DeleteCharacteristicInput! - ): DeleteCharacteristicPayload + """Only read the last `n` values of the set.""" + last: Int - """Deletes a single `Invite` using its globally unique id.""" - deleteInviteByNodeId( """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + Skip the first `n` values from our `after` cursor, an alternative to cursor + based pagination. May not be used with `last`. """ - input: DeleteInviteByNodeIdInput! - ): DeleteInvitePayload + offset: Int - """Deletes a single `Invite` using a unique key.""" - deleteInvite( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: DeleteInviteInput! - ): DeleteInvitePayload + """Read all values in the set before (above) this cursor.""" + before: Cursor + + """Read all values in the set after (below) this cursor.""" + after: Cursor - """Deletes a single `Item` using its globally unique id.""" - deleteItemByNodeId( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: DeleteItemByNodeIdInput! - ): DeleteItemPayload + """The method to use when ordering `Characteristic`.""" + orderBy: [CharacteristicsOrderBy!] = [PRIMARY_KEY_ASC] - """Deletes a single `Item` using a unique key.""" - deleteItem( """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + A condition to be used in determining which values should be returned by the collection. """ - input: DeleteItemInput! - ): DeleteItemPayload + condition: CharacteristicCondition + ): CharacteristicsConnection - """Deletes a single `Option` using its globally unique id.""" - deleteOptionByNodeId( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: DeleteOptionByNodeIdInput! - ): DeleteOptionPayload + """Reads and enables pagination through a set of `Concern`.""" + concerns( + """Only read the first `n` values of the set.""" + first: Int - """Deletes a single `Option` using a unique key.""" - deleteOption( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: DeleteOptionInput! - ): DeleteOptionPayload + """Only read the last `n` values of the set.""" + last: Int - """Deletes a single `Relationship` using its globally unique id.""" - deleteRelationshipByNodeId( """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + Skip the first `n` values from our `after` cursor, an alternative to cursor + based pagination. May not be used with `last`. """ - input: DeleteRelationshipByNodeIdInput! - ): DeleteRelationshipPayload + offset: Int - """Deletes a single `Relationship` using a unique key.""" - deleteRelationship( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: DeleteRelationshipInput! - ): DeleteRelationshipPayload + """Read all values in the set before (above) this cursor.""" + before: Cursor - """Deletes a single `Subcategory` using its globally unique id.""" - deleteSubcategoryByNodeId( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: DeleteSubcategoryByNodeIdInput! - ): DeleteSubcategoryPayload + """Read all values in the set after (below) this cursor.""" + after: Cursor + + """The method to use when ordering `Concern`.""" + orderBy: [ConcernsOrderBy!] = [NATURAL] - """Deletes a single `Subcategory` using a unique key.""" - deleteSubcategory( """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + A condition to be used in determining which values should be returned by the collection. """ - input: DeleteSubcategoryInput! - ): DeleteSubcategoryPayload + condition: ConcernCondition + ): ConcernsConnection + + """Reads and enables pagination through a set of `Help`.""" + helps( + """Only read the first `n` values of the set.""" + first: Int + + """Only read the last `n` values of the set.""" + last: Int - """Deletes a single `Subcategory` using a unique key.""" - deleteSubcategoryByCategoryIdAndName( """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + Skip the first `n` values from our `after` cursor, an alternative to cursor + based pagination. May not be used with `last`. """ - input: DeleteSubcategoryByCategoryIdAndNameInput! - ): DeleteSubcategoryPayload + offset: Int + + """Read all values in the set before (above) this cursor.""" + before: Cursor + + """Read all values in the set after (below) this cursor.""" + after: Cursor + + """The method to use when ordering `Help`.""" + orderBy: [HelpsOrderBy!] = [NATURAL] - """Deletes a single `User` using its globally unique id.""" - deleteUserByNodeId( """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + A condition to be used in determining which values should be returned by the collection. """ - input: DeleteUserByNodeIdInput! - ): DeleteUserPayload + condition: HelpCondition + ): HelpsConnection + + """Reads and enables pagination through a set of `Idea`.""" + ideas( + """Only read the first `n` values of the set.""" + first: Int + + """Only read the last `n` values of the set.""" + last: Int - """Deletes a single `User` using a unique key.""" - deleteUser( """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + Skip the first `n` values from our `after` cursor, an alternative to cursor + based pagination. May not be used with `last`. """ - input: DeleteUserInput! - ): DeleteUserPayload - createItem( + offset: Int + + """Read all values in the set before (above) this cursor.""" + before: Cursor + + """Read all values in the set after (below) this cursor.""" + after: Cursor + + """The method to use when ordering `Idea`.""" + orderBy: [IdeasOrderBy!] = [NATURAL] + """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + A condition to be used in determining which values should be returned by the collection. """ - input: CreateItemInput! - ): CreateItemPayload - approveInvite( + condition: IdeaCondition + ): IdeasConnection + + """Reads and enables pagination through a set of `Invite`.""" + invites( + """Only read the first `n` values of the set.""" + first: Int + + """Only read the last `n` values of the set.""" + last: Int + """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + Skip the first `n` values from our `after` cursor, an alternative to cursor + based pagination. May not be used with `last`. """ - input: ApproveInviteInput! - ): ApproveInvitePayload - createAttribute( + offset: Int + + """Read all values in the set before (above) this cursor.""" + before: Cursor + + """Read all values in the set after (below) this cursor.""" + after: Cursor + + """The method to use when ordering `Invite`.""" + orderBy: [InvitesOrderBy!] = [PRIMARY_KEY_ASC] + """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + A condition to be used in determining which values should be returned by the collection. """ - input: CreateAttributeInput! - ): CreateAttributePayload - proposeAttribute( + condition: InviteCondition + ): InvitesConnection + + """Reads and enables pagination through a set of `Option`.""" + options( + """Only read the first `n` values of the set.""" + first: Int + + """Only read the last `n` values of the set.""" + last: Int + """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + Skip the first `n` values from our `after` cursor, an alternative to cursor + based pagination. May not be used with `last`. """ - input: ProposeAttributeInput! - ): ProposeAttributePayload - proposeOption( + offset: Int + + """Read all values in the set before (above) this cursor.""" + before: Cursor + + """Read all values in the set after (below) this cursor.""" + after: Cursor + + """The method to use when ordering `Option`.""" + orderBy: [OptionsOrderBy!] = [PRIMARY_KEY_ASC] + """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + A condition to be used in determining which values should be returned by the collection. """ - input: ProposeOptionInput! - ): ProposeOptionPayload - createUser( + condition: OptionCondition + ): OptionsConnection + + """Reads and enables pagination through a set of `Relationship`.""" + relationships( + """Only read the first `n` values of the set.""" + first: Int + + """Only read the last `n` values of the set.""" + last: Int + """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + Skip the first `n` values from our `after` cursor, an alternative to cursor + based pagination. May not be used with `last`. """ - input: CreateUserInput! - ): CreateUserPayload -} + offset: Int -"""The output of our create `Association` mutation.""" -type CreateAssociationPayload { - """ - The exact same `clientMutationId` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. - """ - clientMutationId: String + """Read all values in the set before (above) this cursor.""" + before: Cursor - """The `Association` that was created by this mutation.""" - association: Association + """Read all values in the set after (below) this cursor.""" + after: Cursor - """ - Our root query field type. Allows us to run any query from our mutation payload. - """ - query: Query + """The method to use when ordering `Relationship`.""" + orderBy: [RelationshipsOrderBy!] = [PRIMARY_KEY_ASC] - """Reads a single `Subcategory` that is related to this `Association`.""" - subcategory: Subcategory + """ + A condition to be used in determining which values should be returned by the collection. + """ + condition: RelationshipCondition + ): RelationshipsConnection - """Reads a single `Attribute` that is related to this `Association`.""" - attribute: Attribute + """Reads and enables pagination through a set of `Request`.""" + requests( + """Only read the first `n` values of the set.""" + first: Int - """An edge for our `Association`. May be used by Relay 1.""" - associationEdge( - """The method to use when ordering `Association`.""" - orderBy: [AssociationsOrderBy!] = [PRIMARY_KEY_ASC] - ): AssociationsEdge -} + """Only read the last `n` values of the set.""" + last: Int -"""All input for the create `Association` mutation.""" -input CreateAssociationInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor + based pagination. May not be used with `last`. + """ + offset: Int - """The `Association` to be created by this mutation.""" - association: AssociationInput! -} + """Read all values in the set before (above) this cursor.""" + before: Cursor -"""An input for mutations affecting `Association`""" -input AssociationInput { - createdAt: Datetime - updatedAt: Datetime - subcategoryId: Int! - attributeId: Int! -} + """Read all values in the set after (below) this cursor.""" + after: Cursor -"""The output of our create `Category` mutation.""" -type CreateCategoryPayload { - """ - The exact same `clientMutationId` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. - """ - clientMutationId: String + """The method to use when ordering `Request`.""" + orderBy: [RequestsOrderBy!] = [PRIMARY_KEY_ASC] - """The `Category` that was created by this mutation.""" - category: Category + """ + A condition to be used in determining which values should be returned by the collection. + """ + condition: RequestCondition + ): RequestsConnection - """ - Our root query field type. Allows us to run any query from our mutation payload. - """ - query: Query + """Reads and enables pagination through a set of `Subcategory`.""" + subcategories( + """Only read the first `n` values of the set.""" + first: Int - """An edge for our `Category`. May be used by Relay 1.""" - categoryEdge( - """The method to use when ordering `Category`.""" - orderBy: [CategoriesOrderBy!] = [PRIMARY_KEY_ASC] - ): CategoriesEdge -} + """Only read the last `n` values of the set.""" + last: Int -"""All input for the create `Category` mutation.""" -input CreateCategoryInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor + based pagination. May not be used with `last`. + """ + offset: Int - """The `Category` to be created by this mutation.""" - category: CategoryInput! -} + """Read all values in the set before (above) this cursor.""" + before: Cursor -"""An input for mutations affecting `Category`""" -input CategoryInput { - createdAt: Datetime - updatedAt: Datetime - id: Int - name: String! - description: String - isProposal: Boolean -} + """Read all values in the set after (below) this cursor.""" + after: Cursor -"""The output of our create `Characteristic` mutation.""" -type CreateCharacteristicPayload { - """ - The exact same `clientMutationId` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. - """ - clientMutationId: String + """The method to use when ordering `Subcategory`.""" + orderBy: [SubcategoriesOrderBy!] = [PRIMARY_KEY_ASC] - """The `Characteristic` that was created by this mutation.""" - characteristic: Characteristic + """ + A condition to be used in determining which values should be returned by the collection. + """ + condition: SubcategoryCondition + ): SubcategoriesConnection - """ - Our root query field type. Allows us to run any query from our mutation payload. - """ - query: Query + """Reads and enables pagination through a set of `Thing`.""" + things( + """Only read the first `n` values of the set.""" + first: Int - """Reads a single `Item` that is related to this `Characteristic`.""" - item: Item + """Only read the last `n` values of the set.""" + last: Int - """Reads a single `Attribute` that is related to this `Characteristic`.""" - attribute: Attribute + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor + based pagination. May not be used with `last`. + """ + offset: Int - """Reads a single `Option` that is related to this `Characteristic`.""" - option: Option + """Read all values in the set before (above) this cursor.""" + before: Cursor - """An edge for our `Characteristic`. May be used by Relay 1.""" - characteristicEdge( - """The method to use when ordering `Characteristic`.""" - orderBy: [CharacteristicsOrderBy!] = [PRIMARY_KEY_ASC] - ): CharacteristicsEdge -} + """Read all values in the set after (below) this cursor.""" + after: Cursor -"""All input for the create `Characteristic` mutation.""" -input CreateCharacteristicInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String + """The method to use when ordering `Thing`.""" + orderBy: [ThingsOrderBy!] = [PRIMARY_KEY_ASC] - """The `Characteristic` to be created by this mutation.""" - characteristic: CharacteristicInput! -} + """ + A condition to be used in determining which values should be returned by the collection. + """ + condition: ThingCondition + ): ThingsConnection -"""An input for mutations affecting `Characteristic`""" -input CharacteristicInput { - createdAt: Datetime - updatedAt: Datetime - itemId: Int! - attributeId: Int! - optionId: Int! - numApprovals: Int - isValidated: Boolean -} + """Reads and enables pagination through a set of `User`.""" + users( + """Only read the first `n` values of the set.""" + first: Int -"""The output of our create `Invite` mutation.""" -type CreateInvitePayload { - """ - The exact same `clientMutationId` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. - """ - clientMutationId: String + """Only read the last `n` values of the set.""" + last: Int - """The `Invite` that was created by this mutation.""" - invite: Invite + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor + based pagination. May not be used with `last`. + """ + offset: Int - """ - Our root query field type. Allows us to run any query from our mutation payload. - """ - query: Query + """Read all values in the set before (above) this cursor.""" + before: Cursor - """An edge for our `Invite`. May be used by Relay 1.""" - inviteEdge( - """The method to use when ordering `Invite`.""" - orderBy: [InvitesOrderBy!] = [PRIMARY_KEY_ASC] - ): InvitesEdge -} + """Read all values in the set after (below) this cursor.""" + after: Cursor -"""All input for the create `Invite` mutation.""" -input CreateInviteInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String + """The method to use when ordering `User`.""" + orderBy: [UsersOrderBy!] = [PRIMARY_KEY_ASC] - """The `Invite` to be created by this mutation.""" - invite: InviteInput! -} + """ + A condition to be used in determining which values should be returned by the collection. + """ + condition: UserCondition + ): UsersConnection + association(subcategoryId: Int!, attributeId: Int!): Association + attribute(id: Int!): Attribute + attributeByName(name: String!): Attribute + category(id: Int!): Category + categoryByName(name: String!): Category + characteristic(thingId: Int!, attributeId: Int!, optionId: Int!): Characteristic + invite(phoneNumber: String!): Invite + option(id: Int!): Option + relationship(attributeId: Int!, optionId: Int!): Relationship + request(id: Int!): Request + subcategory(id: Int!): Subcategory + subcategoryByCategoryIdAndName(categoryId: Int!, name: String!): Subcategory + thing(id: Int!): Thing + user(id: String!): User -"""An input for mutations affecting `Invite`""" -input InviteInput { - createdAt: Datetime - updatedAt: Datetime - phoneNumber: String! - isApproved: Boolean -} + """Reads a single `Association` using its globally unique `ID`.""" + associationByNodeId( + """ + The globally unique `ID` to be used in selecting a single `Association`. + """ + nodeId: ID! + ): Association -"""The output of our create `Option` mutation.""" -type CreateOptionPayload { - """ - The exact same `clientMutationId` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. - """ - clientMutationId: String + """Reads a single `Attribute` using its globally unique `ID`.""" + attributeByNodeId( + """The globally unique `ID` to be used in selecting a single `Attribute`.""" + nodeId: ID! + ): Attribute - """The `Option` that was created by this mutation.""" - option: Option + """Reads a single `Category` using its globally unique `ID`.""" + categoryByNodeId( + """The globally unique `ID` to be used in selecting a single `Category`.""" + nodeId: ID! + ): Category - """ - Our root query field type. Allows us to run any query from our mutation payload. - """ - query: Query + """Reads a single `Characteristic` using its globally unique `ID`.""" + characteristicByNodeId( + """ + The globally unique `ID` to be used in selecting a single `Characteristic`. + """ + nodeId: ID! + ): Characteristic - """An edge for our `Option`. May be used by Relay 1.""" - optionEdge( - """The method to use when ordering `Option`.""" - orderBy: [OptionsOrderBy!] = [PRIMARY_KEY_ASC] - ): OptionsEdge -} + """Reads a single `Invite` using its globally unique `ID`.""" + inviteByNodeId( + """The globally unique `ID` to be used in selecting a single `Invite`.""" + nodeId: ID! + ): Invite -"""All input for the create `Option` mutation.""" -input CreateOptionInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String + """Reads a single `Option` using its globally unique `ID`.""" + optionByNodeId( + """The globally unique `ID` to be used in selecting a single `Option`.""" + nodeId: ID! + ): Option + + """Reads a single `Relationship` using its globally unique `ID`.""" + relationshipByNodeId( + """ + The globally unique `ID` to be used in selecting a single `Relationship`. + """ + nodeId: ID! + ): Relationship - """The `Option` to be created by this mutation.""" - option: OptionInput! -} + """Reads a single `Request` using its globally unique `ID`.""" + requestByNodeId( + """The globally unique `ID` to be used in selecting a single `Request`.""" + nodeId: ID! + ): Request -"""An input for mutations affecting `Option`""" -input OptionInput { - createdAt: Datetime - updatedAt: Datetime - id: Int - value: String! - type: OptionType - isProposal: Boolean -} + """Reads a single `Subcategory` using its globally unique `ID`.""" + subcategoryByNodeId( + """ + The globally unique `ID` to be used in selecting a single `Subcategory`. + """ + nodeId: ID! + ): Subcategory -"""The output of our create `Relationship` mutation.""" -type CreateRelationshipPayload { - """ - The exact same `clientMutationId` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. - """ - clientMutationId: String + """Reads a single `Thing` using its globally unique `ID`.""" + thingByNodeId( + """The globally unique `ID` to be used in selecting a single `Thing`.""" + nodeId: ID! + ): Thing - """The `Relationship` that was created by this mutation.""" - relationship: Relationship + """Reads a single `User` using its globally unique `ID`.""" + userByNodeId( + """The globally unique `ID` to be used in selecting a single `User`.""" + nodeId: ID! + ): User +} +type Relationship implements Node { """ - Our root query field type. Allows us to run any query from our mutation payload. + A globally unique identifier. Can be used in various places throughout the system to identify this single value. """ - query: Query + nodeId: ID! + createdAt: Datetime + updatedAt: Datetime + createdBy: String + attributeId: Int! + optionId: Int! """Reads a single `Attribute` that is related to this `Relationship`.""" attribute: Attribute """Reads a single `Option` that is related to this `Relationship`.""" option: Option - - """An edge for our `Relationship`. May be used by Relay 1.""" - relationshipEdge( - """The method to use when ordering `Relationship`.""" - orderBy: [RelationshipsOrderBy!] = [PRIMARY_KEY_ASC] - ): RelationshipsEdge } -"""All input for the create `Relationship` mutation.""" -input CreateRelationshipInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String +""" +A condition to be used against `Relationship` object types. All fields are +tested for equality and combined with a logical ‘and.’ +""" +input RelationshipCondition { + """Checks for equality with the object’s `createdAt` field.""" + createdAt: Datetime - """The `Relationship` to be created by this mutation.""" - relationship: RelationshipInput! + """Checks for equality with the object’s `updatedAt` field.""" + updatedAt: Datetime + + """Checks for equality with the object’s `createdBy` field.""" + createdBy: String + + """Checks for equality with the object’s `attributeId` field.""" + attributeId: Int + + """Checks for equality with the object’s `optionId` field.""" + optionId: Int } """An input for mutations affecting `Relationship`""" input RelationshipInput { createdAt: Datetime updatedAt: Datetime + createdBy: String attributeId: Int! optionId: Int! } -"""The output of our create `Subcategory` mutation.""" -type CreateSubcategoryPayload { - """ - The exact same `clientMutationId` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. - """ - clientMutationId: String - - """The `Subcategory` that was created by this mutation.""" - subcategory: Subcategory +"""A connection to a list of `Relationship` values.""" +type RelationshipsConnection { + """A list of `Relationship` objects.""" + nodes: [Relationship!]! """ - Our root query field type. Allows us to run any query from our mutation payload. + A list of edges which contains the `Relationship` and cursor to aid in pagination. """ - query: Query + edges: [RelationshipsEdge!]! - """Reads a single `Category` that is related to this `Subcategory`.""" - category: Category + """Information to aid in pagination.""" + pageInfo: PageInfo! - """An edge for our `Subcategory`. May be used by Relay 1.""" - subcategoryEdge( - """The method to use when ordering `Subcategory`.""" - orderBy: [SubcategoriesOrderBy!] = [PRIMARY_KEY_ASC] - ): SubcategoriesEdge + """The count of *all* `Relationship` you could get from the connection.""" + totalCount: Int! } -"""All input for the create `Subcategory` mutation.""" -input CreateSubcategoryInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String - - """The `Subcategory` to be created by this mutation.""" - subcategory: SubcategoryInput! -} +"""A `Relationship` edge in the connection.""" +type RelationshipsEdge { + """A cursor for use in pagination.""" + cursor: Cursor -"""An input for mutations affecting `Subcategory`""" -input SubcategoryInput { - createdAt: Datetime - updatedAt: Datetime - id: Int - categoryId: Int! - name: String! - description: String - isProposal: Boolean + """The `Relationship` at the end of the edge.""" + node: Relationship! } -"""The output of our update `Attribute` mutation.""" -type UpdateAttributePayload { - """ - The exact same `clientMutationId` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. - """ - clientMutationId: String - - """The `Attribute` that was updated by this mutation.""" - attribute: Attribute - - """ - Our root query field type. Allows us to run any query from our mutation payload. - """ - query: Query - - """An edge for our `Attribute`. May be used by Relay 1.""" - attributeEdge( - """The method to use when ordering `Attribute`.""" - orderBy: [AttributesOrderBy!] = [PRIMARY_KEY_ASC] - ): AttributesEdge +"""Methods to use when ordering `Relationship`.""" +enum RelationshipsOrderBy { + NATURAL + CREATED_AT_ASC + CREATED_AT_DESC + UPDATED_AT_ASC + UPDATED_AT_DESC + CREATED_BY_ASC + CREATED_BY_DESC + ATTRIBUTE_ID_ASC + ATTRIBUTE_ID_DESC + OPTION_ID_ASC + OPTION_ID_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC } -"""All input for the `updateAttributeByNodeId` mutation.""" -input UpdateAttributeByNodeIdInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String - +type Request implements Node { """ - The globally unique `ID` which will identify a single `Attribute` to be updated. + A globally unique identifier. Can be used in various places throughout the system to identify this single value. """ nodeId: ID! - - """ - An object where the defined keys will be set on the `Attribute` being updated. - """ - patch: AttributePatch! -} - -""" -Represents an update to a `Attribute`. Fields that are set will be updated. -""" -input AttributePatch { createdAt: Datetime updatedAt: Datetime - id: Int - name: String + createdBy: String + id: Int! + requesterId: String! + media: [String] + referenceLink: String description: String - type: OptionType - isProposal: Boolean -} - -"""All input for the `updateAttribute` mutation.""" -input UpdateAttributeInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String + quantity: Int! + metadata: JSON - """ - An object where the defined keys will be set on the `Attribute` being updated. - """ - patch: AttributePatch! - id: Int! + """Reads a single `User` that is related to this `Request`.""" + requester: User } -"""All input for the `updateAttributeByName` mutation.""" -input UpdateAttributeByNameInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String - - """ - An object where the defined keys will be set on the `Attribute` being updated. - """ - patch: AttributePatch! - name: String! -} +""" +A condition to be used against `Request` object types. All fields are tested for equality and combined with a logical ‘and.’ +""" +input RequestCondition { + """Checks for equality with the object’s `createdAt` field.""" + createdAt: Datetime -"""The output of our update `Category` mutation.""" -type UpdateCategoryPayload { - """ - The exact same `clientMutationId` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. - """ - clientMutationId: String + """Checks for equality with the object’s `updatedAt` field.""" + updatedAt: Datetime - """The `Category` that was updated by this mutation.""" - category: Category + """Checks for equality with the object’s `createdBy` field.""" + createdBy: String - """ - Our root query field type. Allows us to run any query from our mutation payload. - """ - query: Query + """Checks for equality with the object’s `id` field.""" + id: Int - """An edge for our `Category`. May be used by Relay 1.""" - categoryEdge( - """The method to use when ordering `Category`.""" - orderBy: [CategoriesOrderBy!] = [PRIMARY_KEY_ASC] - ): CategoriesEdge -} + """Checks for equality with the object’s `requesterId` field.""" + requesterId: String -"""All input for the `updateCategoryByNodeId` mutation.""" -input UpdateCategoryByNodeIdInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String + """Checks for equality with the object’s `media` field.""" + media: [String] - """ - The globally unique `ID` which will identify a single `Category` to be updated. - """ - nodeId: ID! + """Checks for equality with the object’s `referenceLink` field.""" + referenceLink: String - """ - An object where the defined keys will be set on the `Category` being updated. - """ - patch: CategoryPatch! + """Checks for equality with the object’s `description` field.""" + description: String + + """Checks for equality with the object’s `quantity` field.""" + quantity: Int + + """Checks for equality with the object’s `metadata` field.""" + metadata: JSON } -""" -Represents an update to a `Category`. Fields that are set will be updated. -""" -input CategoryPatch { +"""An input for mutations affecting `Request`""" +input RequestInput { createdAt: Datetime updatedAt: Datetime + createdBy: String id: Int - name: String + requesterId: String! + media: [String] + referenceLink: String description: String - isProposal: Boolean + quantity: Int + metadata: JSON } -"""All input for the `updateCategory` mutation.""" -input UpdateCategoryInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String +"""A connection to a list of `Request` values.""" +type RequestsConnection { + """A list of `Request` objects.""" + nodes: [Request!]! """ - An object where the defined keys will be set on the `Category` being updated. + A list of edges which contains the `Request` and cursor to aid in pagination. """ - patch: CategoryPatch! - id: Int! + edges: [RequestsEdge!]! + + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """The count of *all* `Request` you could get from the connection.""" + totalCount: Int! } -"""All input for the `updateCategoryByName` mutation.""" -input UpdateCategoryByNameInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String +"""A `Request` edge in the connection.""" +type RequestsEdge { + """A cursor for use in pagination.""" + cursor: Cursor - """ - An object where the defined keys will be set on the `Category` being updated. - """ - patch: CategoryPatch! - name: String! + """The `Request` at the end of the edge.""" + node: Request! } -"""The output of our update `Characteristic` mutation.""" -type UpdateCharacteristicPayload { - """ - The exact same `clientMutationId` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. - """ - clientMutationId: String +"""Methods to use when ordering `Request`.""" +enum RequestsOrderBy { + NATURAL + CREATED_AT_ASC + CREATED_AT_DESC + UPDATED_AT_ASC + UPDATED_AT_DESC + CREATED_BY_ASC + CREATED_BY_DESC + ID_ASC + ID_DESC + REQUESTER_ID_ASC + REQUESTER_ID_DESC + MEDIA_ASC + MEDIA_DESC + REFERENCE_LINK_ASC + REFERENCE_LINK_DESC + DESCRIPTION_ASC + DESCRIPTION_DESC + QUANTITY_ASC + QUANTITY_DESC + METADATA_ASC + METADATA_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} - """The `Characteristic` that was updated by this mutation.""" - characteristic: Characteristic +"""A connection to a list of `Subcategory` values.""" +type SubcategoriesConnection { + """A list of `Subcategory` objects.""" + nodes: [Subcategory!]! """ - Our root query field type. Allows us to run any query from our mutation payload. + A list of edges which contains the `Subcategory` and cursor to aid in pagination. """ - query: Query + edges: [SubcategoriesEdge!]! - """Reads a single `Item` that is related to this `Characteristic`.""" - item: Item + """Information to aid in pagination.""" + pageInfo: PageInfo! - """Reads a single `Attribute` that is related to this `Characteristic`.""" - attribute: Attribute + """The count of *all* `Subcategory` you could get from the connection.""" + totalCount: Int! +} - """Reads a single `Option` that is related to this `Characteristic`.""" - option: Option +"""A `Subcategory` edge in the connection.""" +type SubcategoriesEdge { + """A cursor for use in pagination.""" + cursor: Cursor - """An edge for our `Characteristic`. May be used by Relay 1.""" - characteristicEdge( - """The method to use when ordering `Characteristic`.""" - orderBy: [CharacteristicsOrderBy!] = [PRIMARY_KEY_ASC] - ): CharacteristicsEdge + """The `Subcategory` at the end of the edge.""" + node: Subcategory! } -"""All input for the `updateCharacteristicByNodeId` mutation.""" -input UpdateCharacteristicByNodeIdInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String +"""Methods to use when ordering `Subcategory`.""" +enum SubcategoriesOrderBy { + NATURAL + CREATED_AT_ASC + CREATED_AT_DESC + UPDATED_AT_ASC + UPDATED_AT_DESC + CREATED_BY_ASC + CREATED_BY_DESC + ID_ASC + ID_DESC + CATEGORY_ID_ASC + CATEGORY_ID_DESC + NAME_ASC + NAME_DESC + DESCRIPTION_ASC + DESCRIPTION_DESC + IS_APPROVED_ASC + IS_APPROVED_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} +type Subcategory implements Node { """ - The globally unique `ID` which will identify a single `Characteristic` to be updated. + A globally unique identifier. Can be used in various places throughout the system to identify this single value. """ nodeId: ID! - - """ - An object where the defined keys will be set on the `Characteristic` being updated. - """ - patch: CharacteristicPatch! -} - -""" -Represents an update to a `Characteristic`. Fields that are set will be updated. -""" -input CharacteristicPatch { createdAt: Datetime updatedAt: Datetime - itemId: Int - attributeId: Int - optionId: Int - numApprovals: Int - isValidated: Boolean -} + createdBy: String + id: Int! + categoryId: Int! + name: String! + description: String + isApproved: Boolean -"""All input for the `updateCharacteristic` mutation.""" -input UpdateCharacteristicInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String + """Reads a single `Category` that is related to this `Subcategory`.""" + category: Category - """ - An object where the defined keys will be set on the `Characteristic` being updated. - """ - patch: CharacteristicPatch! - itemId: Int! - attributeId: Int! - optionId: Int! -} + """Reads and enables pagination through a set of `Association`.""" + associations( + """Only read the first `n` values of the set.""" + first: Int -"""The output of our update `Option` mutation.""" -type UpdateOptionPayload { - """ - The exact same `clientMutationId` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. - """ - clientMutationId: String + """Only read the last `n` values of the set.""" + last: Int - """The `Option` that was updated by this mutation.""" - option: Option + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor + based pagination. May not be used with `last`. + """ + offset: Int - """ - Our root query field type. Allows us to run any query from our mutation payload. - """ - query: Query + """Read all values in the set before (above) this cursor.""" + before: Cursor - """An edge for our `Option`. May be used by Relay 1.""" - optionEdge( - """The method to use when ordering `Option`.""" - orderBy: [OptionsOrderBy!] = [PRIMARY_KEY_ASC] - ): OptionsEdge -} + """Read all values in the set after (below) this cursor.""" + after: Cursor -"""All input for the `updateOptionByNodeId` mutation.""" -input UpdateOptionByNodeIdInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String + """The method to use when ordering `Association`.""" + orderBy: [AssociationsOrderBy!] = [PRIMARY_KEY_ASC] - """ - The globally unique `ID` which will identify a single `Option` to be updated. - """ - nodeId: ID! + """ + A condition to be used in determining which values should be returned by the collection. + """ + condition: AssociationCondition + ): AssociationsConnection! - """ - An object where the defined keys will be set on the `Option` being updated. - """ - patch: OptionPatch! -} + """Reads and enables pagination through a set of `Thing`.""" + things( + """Only read the first `n` values of the set.""" + first: Int -""" -Represents an update to a `Option`. Fields that are set will be updated. -""" -input OptionPatch { - createdAt: Datetime - updatedAt: Datetime - id: Int - value: String - type: OptionType - isProposal: Boolean -} + """Only read the last `n` values of the set.""" + last: Int + + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor + based pagination. May not be used with `last`. + """ + offset: Int + + """Read all values in the set before (above) this cursor.""" + before: Cursor + + """Read all values in the set after (below) this cursor.""" + after: Cursor -"""All input for the `updateOption` mutation.""" -input UpdateOptionInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String + """The method to use when ordering `Thing`.""" + orderBy: [ThingsOrderBy!] = [PRIMARY_KEY_ASC] - """ - An object where the defined keys will be set on the `Option` being updated. - """ - patch: OptionPatch! - id: Int! + """ + A condition to be used in determining which values should be returned by the collection. + """ + condition: ThingCondition + ): ThingsConnection! } -"""The output of our update `Subcategory` mutation.""" -type UpdateSubcategoryPayload { - """ - The exact same `clientMutationId` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. - """ - clientMutationId: String +""" +A condition to be used against `Subcategory` object types. All fields are tested +for equality and combined with a logical ‘and.’ +""" +input SubcategoryCondition { + """Checks for equality with the object’s `createdAt` field.""" + createdAt: Datetime - """The `Subcategory` that was updated by this mutation.""" - subcategory: Subcategory + """Checks for equality with the object’s `updatedAt` field.""" + updatedAt: Datetime - """ - Our root query field type. Allows us to run any query from our mutation payload. - """ - query: Query + """Checks for equality with the object’s `createdBy` field.""" + createdBy: String - """Reads a single `Category` that is related to this `Subcategory`.""" - category: Category + """Checks for equality with the object’s `id` field.""" + id: Int - """An edge for our `Subcategory`. May be used by Relay 1.""" - subcategoryEdge( - """The method to use when ordering `Subcategory`.""" - orderBy: [SubcategoriesOrderBy!] = [PRIMARY_KEY_ASC] - ): SubcategoriesEdge -} + """Checks for equality with the object’s `categoryId` field.""" + categoryId: Int -"""All input for the `updateSubcategoryByNodeId` mutation.""" -input UpdateSubcategoryByNodeIdInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String + """Checks for equality with the object’s `name` field.""" + name: String - """ - The globally unique `ID` which will identify a single `Subcategory` to be updated. - """ - nodeId: ID! + """Checks for equality with the object’s `description` field.""" + description: String - """ - An object where the defined keys will be set on the `Subcategory` being updated. - """ - patch: SubcategoryPatch! + """Checks for equality with the object’s `isApproved` field.""" + isApproved: Boolean +} + +"""An input for mutations affecting `Subcategory`""" +input SubcategoryInput { + createdAt: Datetime + updatedAt: Datetime + createdBy: String + id: Int + categoryId: Int! + name: String! + description: String + isApproved: Boolean } """ @@ -2762,183 +3724,165 @@ Represents an update to a `Subcategory`. Fields that are set will be updated. input SubcategoryPatch { createdAt: Datetime updatedAt: Datetime + createdBy: String id: Int categoryId: Int name: String description: String - isProposal: Boolean + isApproved: Boolean } -"""All input for the `updateSubcategory` mutation.""" -input UpdateSubcategoryInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String - +type Thing implements Node { """ - An object where the defined keys will be set on the `Subcategory` being updated. + A globally unique identifier. Can be used in various places throughout the system to identify this single value. """ - patch: SubcategoryPatch! + nodeId: ID! + createdAt: Datetime + updatedAt: Datetime + createdBy: String id: Int! -} + categoryId: Int! + subcategoryId: Int! + ownerId: String! + media: [String] + quantity: Int! + metadata: JSON + geomPoint: GeometryPoint -"""All input for the `updateSubcategoryByCategoryIdAndName` mutation.""" -input UpdateSubcategoryByCategoryIdAndNameInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String + """Reads a single `Category` that is related to this `Thing`.""" + category: Category - """ - An object where the defined keys will be set on the `Subcategory` being updated. - """ - patch: SubcategoryPatch! - categoryId: Int! - name: String! -} + """Reads a single `Subcategory` that is related to this `Thing`.""" + subcategory: Subcategory -"""The output of our delete `Association` mutation.""" -type DeleteAssociationPayload { - """ - The exact same `clientMutationId` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. - """ - clientMutationId: String + """Reads a single `User` that is related to this `Thing`.""" + owner: User - """The `Association` that was deleted by this mutation.""" - association: Association - deletedAssociationNodeId: ID + """Reads and enables pagination through a set of `Characteristic`.""" + characteristics( + """Only read the first `n` values of the set.""" + first: Int - """ - Our root query field type. Allows us to run any query from our mutation payload. - """ - query: Query + """Only read the last `n` values of the set.""" + last: Int - """Reads a single `Subcategory` that is related to this `Association`.""" - subcategory: Subcategory + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor + based pagination. May not be used with `last`. + """ + offset: Int - """Reads a single `Attribute` that is related to this `Association`.""" - attribute: Attribute + """Read all values in the set before (above) this cursor.""" + before: Cursor - """An edge for our `Association`. May be used by Relay 1.""" - associationEdge( - """The method to use when ordering `Association`.""" - orderBy: [AssociationsOrderBy!] = [PRIMARY_KEY_ASC] - ): AssociationsEdge -} + """Read all values in the set after (below) this cursor.""" + after: Cursor -"""All input for the `deleteAssociationByNodeId` mutation.""" -input DeleteAssociationByNodeIdInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String + """The method to use when ordering `Characteristic`.""" + orderBy: [CharacteristicsOrderBy!] = [PRIMARY_KEY_ASC] - """ - The globally unique `ID` which will identify a single `Association` to be deleted. - """ - nodeId: ID! + """ + A condition to be used in determining which values should be returned by the collection. + """ + condition: CharacteristicCondition + ): CharacteristicsConnection! } -"""All input for the `deleteAssociation` mutation.""" -input DeleteAssociationInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String - subcategoryId: Int! - attributeId: Int! -} +""" +A condition to be used against `Thing` object types. All fields are tested for equality and combined with a logical ‘and.’ +""" +input ThingCondition { + """Checks for equality with the object’s `createdAt` field.""" + createdAt: Datetime -"""The output of our delete `Attribute` mutation.""" -type DeleteAttributePayload { - """ - The exact same `clientMutationId` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. - """ - clientMutationId: String + """Checks for equality with the object’s `updatedAt` field.""" + updatedAt: Datetime - """The `Attribute` that was deleted by this mutation.""" - attribute: Attribute - deletedAttributeNodeId: ID + """Checks for equality with the object’s `createdBy` field.""" + createdBy: String - """ - Our root query field type. Allows us to run any query from our mutation payload. - """ - query: Query + """Checks for equality with the object’s `id` field.""" + id: Int - """An edge for our `Attribute`. May be used by Relay 1.""" - attributeEdge( - """The method to use when ordering `Attribute`.""" - orderBy: [AttributesOrderBy!] = [PRIMARY_KEY_ASC] - ): AttributesEdge -} + """Checks for equality with the object’s `categoryId` field.""" + categoryId: Int -"""All input for the `deleteAttributeByNodeId` mutation.""" -input DeleteAttributeByNodeIdInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String + """Checks for equality with the object’s `subcategoryId` field.""" + subcategoryId: Int - """ - The globally unique `ID` which will identify a single `Attribute` to be deleted. - """ - nodeId: ID! -} + """Checks for equality with the object’s `ownerId` field.""" + ownerId: String -"""All input for the `deleteAttribute` mutation.""" -input DeleteAttributeInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String - id: Int! -} + """Checks for equality with the object’s `media` field.""" + media: [String] -"""All input for the `deleteAttributeByName` mutation.""" -input DeleteAttributeByNameInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String - name: String! + """Checks for equality with the object’s `quantity` field.""" + quantity: Int + + """Checks for equality with the object’s `metadata` field.""" + metadata: JSON + + """Checks for equality with the object’s `geomPoint` field.""" + geomPoint: GeoJSON } -"""The output of our delete `Category` mutation.""" -type DeleteCategoryPayload { +"""A connection to a list of `Thing` values.""" +type ThingsConnection { + """A list of `Thing` objects.""" + nodes: [Thing!]! + """ - The exact same `clientMutationId` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. + A list of edges which contains the `Thing` and cursor to aid in pagination. """ - clientMutationId: String + edges: [ThingsEdge!]! - """The `Category` that was deleted by this mutation.""" - category: Category - deletedCategoryNodeId: ID + """Information to aid in pagination.""" + pageInfo: PageInfo! - """ - Our root query field type. Allows us to run any query from our mutation payload. - """ - query: Query + """The count of *all* `Thing` you could get from the connection.""" + totalCount: Int! +} - """An edge for our `Category`. May be used by Relay 1.""" - categoryEdge( - """The method to use when ordering `Category`.""" - orderBy: [CategoriesOrderBy!] = [PRIMARY_KEY_ASC] - ): CategoriesEdge +"""A `Thing` edge in the connection.""" +type ThingsEdge { + """A cursor for use in pagination.""" + cursor: Cursor + + """The `Thing` at the end of the edge.""" + node: Thing! } -"""All input for the `deleteCategoryByNodeId` mutation.""" -input DeleteCategoryByNodeIdInput { +"""Methods to use when ordering `Thing`.""" +enum ThingsOrderBy { + NATURAL + CREATED_AT_ASC + CREATED_AT_DESC + UPDATED_AT_ASC + UPDATED_AT_DESC + CREATED_BY_ASC + CREATED_BY_DESC + ID_ASC + ID_DESC + CATEGORY_ID_ASC + CATEGORY_ID_DESC + SUBCATEGORY_ID_ASC + SUBCATEGORY_ID_DESC + OWNER_ID_ASC + OWNER_ID_DESC + MEDIA_ASC + MEDIA_DESC + QUANTITY_ASC + QUANTITY_DESC + METADATA_ASC + METADATA_DESC + GEOM_POINT_ASC + GEOM_POINT_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC +} + +"""All input for the `updateAttributeByName` mutation.""" +input UpdateAttributeByNameInput { """ An arbitrary string value with no semantic meaning. Will be included in the payload verbatim. May be used to track mutations by the client. @@ -2946,66 +3890,33 @@ input DeleteCategoryByNodeIdInput { clientMutationId: String """ - The globally unique `ID` which will identify a single `Category` to be deleted. - """ - nodeId: ID! -} - -"""All input for the `deleteCategory` mutation.""" -input DeleteCategoryInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. + An object where the defined keys will be set on the `Attribute` being updated. """ - clientMutationId: String - id: Int! + patch: AttributePatch! + name: String! } -"""All input for the `deleteCategoryByName` mutation.""" -input DeleteCategoryByNameInput { +"""All input for the `updateAttributeByNodeId` mutation.""" +input UpdateAttributeByNodeIdInput { """ An arbitrary string value with no semantic meaning. Will be included in the payload verbatim. May be used to track mutations by the client. """ clientMutationId: String - name: String! -} -"""The output of our delete `Characteristic` mutation.""" -type DeleteCharacteristicPayload { """ - The exact same `clientMutationId` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. + The globally unique `ID` which will identify a single `Attribute` to be updated. """ - clientMutationId: String - - """The `Characteristic` that was deleted by this mutation.""" - characteristic: Characteristic - deletedCharacteristicNodeId: ID + nodeId: ID! """ - Our root query field type. Allows us to run any query from our mutation payload. + An object where the defined keys will be set on the `Attribute` being updated. """ - query: Query - - """Reads a single `Item` that is related to this `Characteristic`.""" - item: Item - - """Reads a single `Attribute` that is related to this `Characteristic`.""" - attribute: Attribute - - """Reads a single `Option` that is related to this `Characteristic`.""" - option: Option - - """An edge for our `Characteristic`. May be used by Relay 1.""" - characteristicEdge( - """The method to use when ordering `Characteristic`.""" - orderBy: [CharacteristicsOrderBy!] = [PRIMARY_KEY_ASC] - ): CharacteristicsEdge + patch: AttributePatch! } -"""All input for the `deleteCharacteristicByNodeId` mutation.""" -input DeleteCharacteristicByNodeIdInput { +"""All input for the `updateAttribute` mutation.""" +input UpdateAttributeInput { """ An arbitrary string value with no semantic meaning. Will be included in the payload verbatim. May be used to track mutations by the client. @@ -3013,49 +3924,37 @@ input DeleteCharacteristicByNodeIdInput { clientMutationId: String """ - The globally unique `ID` which will identify a single `Characteristic` to be deleted. - """ - nodeId: ID! -} - -"""All input for the `deleteCharacteristic` mutation.""" -input DeleteCharacteristicInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. + An object where the defined keys will be set on the `Attribute` being updated. """ - clientMutationId: String - itemId: Int! - attributeId: Int! - optionId: Int! + patch: AttributePatch! + id: Int! } -"""The output of our delete `Invite` mutation.""" -type DeleteInvitePayload { +"""The output of our update `Attribute` mutation.""" +type UpdateAttributePayload { """ The exact same `clientMutationId` that was provided in the mutation input, unchanged and unused. May be used by a client to track mutations. """ clientMutationId: String - """The `Invite` that was deleted by this mutation.""" - invite: Invite - deletedInviteNodeId: ID + """The `Attribute` that was updated by this mutation.""" + attribute: Attribute """ Our root query field type. Allows us to run any query from our mutation payload. """ query: Query - """An edge for our `Invite`. May be used by Relay 1.""" - inviteEdge( - """The method to use when ordering `Invite`.""" - orderBy: [InvitesOrderBy!] = [PRIMARY_KEY_ASC] - ): InvitesEdge + """An edge for our `Attribute`. May be used by Relay 1.""" + attributeEdge( + """The method to use when ordering `Attribute`.""" + orderBy: [AttributesOrderBy!] = [PRIMARY_KEY_ASC] + ): AttributesEdge } -"""All input for the `deleteInviteByNodeId` mutation.""" -input DeleteInviteByNodeIdInput { +"""All input for the `updateCategoryByName` mutation.""" +input UpdateCategoryByNameInput { """ An arbitrary string value with no semantic meaning. Will be included in the payload verbatim. May be used to track mutations by the client. @@ -3063,56 +3962,33 @@ input DeleteInviteByNodeIdInput { clientMutationId: String """ - The globally unique `ID` which will identify a single `Invite` to be deleted. + An object where the defined keys will be set on the `Category` being updated. """ - nodeId: ID! + patch: CategoryPatch! + name: String! } -"""All input for the `deleteInvite` mutation.""" -input DeleteInviteInput { +"""All input for the `updateCategoryByNodeId` mutation.""" +input UpdateCategoryByNodeIdInput { """ An arbitrary string value with no semantic meaning. Will be included in the payload verbatim. May be used to track mutations by the client. """ clientMutationId: String - phoneNumber: String! -} -"""The output of our delete `Item` mutation.""" -type DeleteItemPayload { """ - The exact same `clientMutationId` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. + The globally unique `ID` which will identify a single `Category` to be updated. """ - clientMutationId: String - - """The `Item` that was deleted by this mutation.""" - item: Item - deletedItemNodeId: ID + nodeId: ID! """ - Our root query field type. Allows us to run any query from our mutation payload. + An object where the defined keys will be set on the `Category` being updated. """ - query: Query - - """Reads a single `Category` that is related to this `Item`.""" - category: Category - - """Reads a single `Subcategory` that is related to this `Item`.""" - subcategory: Subcategory - - """Reads a single `User` that is related to this `Item`.""" - owner: User - - """An edge for our `Item`. May be used by Relay 1.""" - itemEdge( - """The method to use when ordering `Item`.""" - orderBy: [ItemsOrderBy!] = [PRIMARY_KEY_ASC] - ): ItemsEdge + patch: CategoryPatch! } -"""All input for the `deleteItemByNodeId` mutation.""" -input DeleteItemByNodeIdInput { +"""All input for the `updateCategory` mutation.""" +input UpdateCategoryInput { """ An arbitrary string value with no semantic meaning. Will be included in the payload verbatim. May be used to track mutations by the client. @@ -3120,47 +3996,37 @@ input DeleteItemByNodeIdInput { clientMutationId: String """ - The globally unique `ID` which will identify a single `Item` to be deleted. - """ - nodeId: ID! -} - -"""All input for the `deleteItem` mutation.""" -input DeleteItemInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. + An object where the defined keys will be set on the `Category` being updated. """ - clientMutationId: String + patch: CategoryPatch! id: Int! } -"""The output of our delete `Option` mutation.""" -type DeleteOptionPayload { +"""The output of our update `Category` mutation.""" +type UpdateCategoryPayload { """ The exact same `clientMutationId` that was provided in the mutation input, unchanged and unused. May be used by a client to track mutations. """ clientMutationId: String - """The `Option` that was deleted by this mutation.""" - option: Option - deletedOptionNodeId: ID + """The `Category` that was updated by this mutation.""" + category: Category """ Our root query field type. Allows us to run any query from our mutation payload. """ query: Query - """An edge for our `Option`. May be used by Relay 1.""" - optionEdge( - """The method to use when ordering `Option`.""" - orderBy: [OptionsOrderBy!] = [PRIMARY_KEY_ASC] - ): OptionsEdge + """An edge for our `Category`. May be used by Relay 1.""" + categoryEdge( + """The method to use when ordering `Category`.""" + orderBy: [CategoriesOrderBy!] = [PRIMARY_KEY_ASC] + ): CategoriesEdge } -"""All input for the `deleteOptionByNodeId` mutation.""" -input DeleteOptionByNodeIdInput { +"""All input for the `updateCharacteristicByNodeId` mutation.""" +input UpdateCharacteristicByNodeIdInput { """ An arbitrary string value with no semantic meaning. Will be included in the payload verbatim. May be used to track mutations by the client. @@ -3168,53 +4034,67 @@ input DeleteOptionByNodeIdInput { clientMutationId: String """ - The globally unique `ID` which will identify a single `Option` to be deleted. + The globally unique `ID` which will identify a single `Characteristic` to be updated. """ nodeId: ID! + + """ + An object where the defined keys will be set on the `Characteristic` being updated. + """ + patch: CharacteristicPatch! } -"""All input for the `deleteOption` mutation.""" -input DeleteOptionInput { +"""All input for the `updateCharacteristic` mutation.""" +input UpdateCharacteristicInput { """ An arbitrary string value with no semantic meaning. Will be included in the payload verbatim. May be used to track mutations by the client. """ clientMutationId: String - id: Int! + + """ + An object where the defined keys will be set on the `Characteristic` being updated. + """ + patch: CharacteristicPatch! + thingId: Int! + attributeId: Int! + optionId: Int! } -"""The output of our delete `Relationship` mutation.""" -type DeleteRelationshipPayload { +"""The output of our update `Characteristic` mutation.""" +type UpdateCharacteristicPayload { """ The exact same `clientMutationId` that was provided in the mutation input, unchanged and unused. May be used by a client to track mutations. """ clientMutationId: String - """The `Relationship` that was deleted by this mutation.""" - relationship: Relationship - deletedRelationshipNodeId: ID + """The `Characteristic` that was updated by this mutation.""" + characteristic: Characteristic """ Our root query field type. Allows us to run any query from our mutation payload. """ query: Query - """Reads a single `Attribute` that is related to this `Relationship`.""" + """Reads a single `Thing` that is related to this `Characteristic`.""" + thing: Thing + + """Reads a single `Attribute` that is related to this `Characteristic`.""" attribute: Attribute - """Reads a single `Option` that is related to this `Relationship`.""" + """Reads a single `Option` that is related to this `Characteristic`.""" option: Option - """An edge for our `Relationship`. May be used by Relay 1.""" - relationshipEdge( - """The method to use when ordering `Relationship`.""" - orderBy: [RelationshipsOrderBy!] = [PRIMARY_KEY_ASC] - ): RelationshipsEdge + """An edge for our `Characteristic`. May be used by Relay 1.""" + characteristicEdge( + """The method to use when ordering `Characteristic`.""" + orderBy: [CharacteristicsOrderBy!] = [PRIMARY_KEY_ASC] + ): CharacteristicsEdge } -"""All input for the `deleteRelationshipByNodeId` mutation.""" -input DeleteRelationshipByNodeIdInput { +"""All input for the `updateOptionByNodeId` mutation.""" +input UpdateOptionByNodeIdInput { """ An arbitrary string value with no semantic meaning. Will be included in the payload verbatim. May be used to track mutations by the client. @@ -3222,51 +4102,56 @@ input DeleteRelationshipByNodeIdInput { clientMutationId: String """ - The globally unique `ID` which will identify a single `Relationship` to be deleted. + The globally unique `ID` which will identify a single `Option` to be updated. """ nodeId: ID! + + """ + An object where the defined keys will be set on the `Option` being updated. + """ + patch: OptionPatch! } -"""All input for the `deleteRelationship` mutation.""" -input DeleteRelationshipInput { +"""All input for the `updateOption` mutation.""" +input UpdateOptionInput { """ An arbitrary string value with no semantic meaning. Will be included in the payload verbatim. May be used to track mutations by the client. """ clientMutationId: String - attributeId: Int! - optionId: Int! + + """ + An object where the defined keys will be set on the `Option` being updated. + """ + patch: OptionPatch! + id: Int! } -"""The output of our delete `Subcategory` mutation.""" -type DeleteSubcategoryPayload { +"""The output of our update `Option` mutation.""" +type UpdateOptionPayload { """ The exact same `clientMutationId` that was provided in the mutation input, unchanged and unused. May be used by a client to track mutations. """ clientMutationId: String - """The `Subcategory` that was deleted by this mutation.""" - subcategory: Subcategory - deletedSubcategoryNodeId: ID + """The `Option` that was updated by this mutation.""" + option: Option """ Our root query field type. Allows us to run any query from our mutation payload. """ query: Query - """Reads a single `Category` that is related to this `Subcategory`.""" - category: Category - - """An edge for our `Subcategory`. May be used by Relay 1.""" - subcategoryEdge( - """The method to use when ordering `Subcategory`.""" - orderBy: [SubcategoriesOrderBy!] = [PRIMARY_KEY_ASC] - ): SubcategoriesEdge + """An edge for our `Option`. May be used by Relay 1.""" + optionEdge( + """The method to use when ordering `Option`.""" + orderBy: [OptionsOrderBy!] = [PRIMARY_KEY_ASC] + ): OptionsEdge } -"""All input for the `deleteSubcategoryByNodeId` mutation.""" -input DeleteSubcategoryByNodeIdInput { +"""All input for the `updateSubcategoryByCategoryIdAndName` mutation.""" +input UpdateSubcategoryByCategoryIdAndNameInput { """ An arbitrary string value with no semantic meaning. Will be included in the payload verbatim. May be used to track mutations by the client. @@ -3274,150 +4159,196 @@ input DeleteSubcategoryByNodeIdInput { clientMutationId: String """ - The globally unique `ID` which will identify a single `Subcategory` to be deleted. + An object where the defined keys will be set on the `Subcategory` being updated. """ - nodeId: ID! + patch: SubcategoryPatch! + categoryId: Int! + name: String! } -"""All input for the `deleteSubcategory` mutation.""" -input DeleteSubcategoryInput { +"""All input for the `updateSubcategoryByNodeId` mutation.""" +input UpdateSubcategoryByNodeIdInput { """ An arbitrary string value with no semantic meaning. Will be included in the payload verbatim. May be used to track mutations by the client. """ clientMutationId: String - id: Int! + + """ + The globally unique `ID` which will identify a single `Subcategory` to be updated. + """ + nodeId: ID! + + """ + An object where the defined keys will be set on the `Subcategory` being updated. + """ + patch: SubcategoryPatch! } -"""All input for the `deleteSubcategoryByCategoryIdAndName` mutation.""" -input DeleteSubcategoryByCategoryIdAndNameInput { +"""All input for the `updateSubcategory` mutation.""" +input UpdateSubcategoryInput { """ An arbitrary string value with no semantic meaning. Will be included in the payload verbatim. May be used to track mutations by the client. """ clientMutationId: String - categoryId: Int! - name: String! + + """ + An object where the defined keys will be set on the `Subcategory` being updated. + """ + patch: SubcategoryPatch! + id: Int! } -"""The output of our delete `User` mutation.""" -type DeleteUserPayload { +"""The output of our update `Subcategory` mutation.""" +type UpdateSubcategoryPayload { """ The exact same `clientMutationId` that was provided in the mutation input, unchanged and unused. May be used by a client to track mutations. """ clientMutationId: String - """The `User` that was deleted by this mutation.""" - user: User - deletedUserNodeId: ID + """The `Subcategory` that was updated by this mutation.""" + subcategory: Subcategory """ Our root query field type. Allows us to run any query from our mutation payload. """ query: Query - """An edge for our `User`. May be used by Relay 1.""" - userEdge( - """The method to use when ordering `User`.""" - orderBy: [UsersOrderBy!] = [PRIMARY_KEY_ASC] - ): UsersEdge -} - -"""All input for the `deleteUserByNodeId` mutation.""" -input DeleteUserByNodeIdInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String + """Reads a single `Category` that is related to this `Subcategory`.""" + category: Category - """ - The globally unique `ID` which will identify a single `User` to be deleted. - """ - nodeId: ID! + """An edge for our `Subcategory`. May be used by Relay 1.""" + subcategoryEdge( + """The method to use when ordering `Subcategory`.""" + orderBy: [SubcategoriesOrderBy!] = [PRIMARY_KEY_ASC] + ): SubcategoriesEdge } -"""All input for the `deleteUser` mutation.""" -input DeleteUserInput { +type User implements Node { """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. + A globally unique identifier. Can be used in various places throughout the system to identify this single value. """ - clientMutationId: String + nodeId: ID! + createdAt: Datetime + updatedAt: Datetime id: String! -} + createdBy: String -type CreateItemPayload { - item: Item - query: Query -} + """Reads and enables pagination through a set of `Thing`.""" + thingsByOwnerId( + """Only read the first `n` values of the set.""" + first: Int -input CreateItemInput { - categoryId: Int! - subcategoryId: Int! - attributes: [NewAttributeInput!]! - media: [String!]! - ownerId: String! - quantity: Int - isRequest: Boolean -} + """Only read the last `n` values of the set.""" + last: Int -input NewAttributeInput { - attributeId: Int! - optionId: Int! -} + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor + based pagination. May not be used with `last`. + """ + offset: Int -type ApproveInvitePayload { - invite: Invite - query: Query -} + """Read all values in the set before (above) this cursor.""" + before: Cursor -input ApproveInviteInput { - phoneNumber: String! -} + """Read all values in the set after (below) this cursor.""" + after: Cursor -type CreateAttributePayload { - attribute: Attribute - query: Query -} + """The method to use when ordering `Thing`.""" + orderBy: [ThingsOrderBy!] = [PRIMARY_KEY_ASC] -input CreateAttributeInput { - name: String! - type: String! - description: String - associations: [CreateAssociationForAttributeInput!]! - options: [CreateOptionInput!]! -} + """ + A condition to be used in determining which values should be returned by the collection. + """ + condition: ThingCondition + ): ThingsConnection! -input CreateAssociationForAttributeInput { - subcategoryId: Int! -} + """Reads and enables pagination through a set of `Request`.""" + requestsByRequesterId( + """Only read the first `n` values of the set.""" + first: Int -type ProposeAttributePayload { - attribute: Attribute - query: Query -} + """Only read the last `n` values of the set.""" + last: Int -input ProposeAttributeInput { - name: String! + """ + Skip the first `n` values from our `after` cursor, an alternative to cursor + based pagination. May not be used with `last`. + """ + offset: Int + + """Read all values in the set before (above) this cursor.""" + before: Cursor + + """Read all values in the set after (below) this cursor.""" + after: Cursor + + """The method to use when ordering `Request`.""" + orderBy: [RequestsOrderBy!] = [PRIMARY_KEY_ASC] + + """ + A condition to be used in determining which values should be returned by the collection. + """ + condition: RequestCondition + ): RequestsConnection! } -type ProposeOptionPayload { - option: Option - query: Query +""" +A condition to be used against `User` object types. All fields are tested for equality and combined with a logical ‘and.’ +""" +input UserCondition { + """Checks for equality with the object’s `createdAt` field.""" + createdAt: Datetime + + """Checks for equality with the object’s `updatedAt` field.""" + updatedAt: Datetime + + """Checks for equality with the object’s `id` field.""" + id: String + + """Checks for equality with the object’s `createdBy` field.""" + createdBy: String } -input ProposeOptionInput { - value: String! - attributeId: Int! +"""A connection to a list of `User` values.""" +type UsersConnection { + """A list of `User` objects.""" + nodes: [User!]! + + """ + A list of edges which contains the `User` and cursor to aid in pagination. + """ + edges: [UsersEdge!]! + + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """The count of *all* `User` you could get from the connection.""" + totalCount: Int! } -type CreateUserPayload { - user: User - query: Query +"""A `User` edge in the connection.""" +type UsersEdge { + """A cursor for use in pagination.""" + cursor: Cursor + + """The `User` at the end of the edge.""" + node: User! } -input CreateUserInput { - uid: String! +"""Methods to use when ordering `User`.""" +enum UsersOrderBy { + NATURAL + CREATED_AT_ASC + CREATED_AT_DESC + UPDATED_AT_ASC + UPDATED_AT_DESC + ID_ASC + ID_DESC + CREATED_BY_ASC + CREATED_BY_DESC + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC } diff --git a/schema.sql b/schema.sql index 7d7f94f..5ff9ee6 100644 --- a/schema.sql +++ b/schema.sql @@ -2,6 +2,9 @@ create schema everything; create schema everything_private; +-- create extensions +create extension if not exists postgis with schema everything; + -- create types create type everything.option_type as enum ('text', 'company', 'size'); @@ -9,9 +12,9 @@ create type everything.option_type as enum ('text', 'company', 'size'); create table everything.base ( created_at timestamp default now(), updated_at timestamp default now(), - created_by text references everything.user(id) + created_by text ); -comment on table everything.base is E'@omit read'; +comment on table everything.base is E'@omit'; -- create user + auth types create table everything.user ( @@ -20,6 +23,9 @@ create table everything.user ( ) inherits (everything.base); comment on table everything.user is E'@omit create,update'; +alter table everything.base add column created_by text references everything.user(id); +create index on everything.base (created_by); + create table everything.invite ( phone_number text not null, is_approved boolean default false, @@ -33,7 +39,7 @@ create table everything.category ( id serial primary key, name text not null check (char_length(name) < 80) unique, description text, - is_proposal boolean default false + is_approved boolean default false ) inherits (everything.base); -- create subcategory, attribute, and option @@ -42,7 +48,7 @@ create table everything.subcategory ( category_id int not null references everything.category(id) on delete cascade, name text not null check (char_length(name) < 80), description text, - is_proposal boolean default false, + is_approved boolean default false, unique(category_id, name) ) inherits (everything.base); create index on everything.subcategory (category_id); @@ -52,7 +58,7 @@ create table everything.attribute ( name text not null check (char_length(name) < 80) unique, description text, type everything.option_type, - is_proposal boolean default false, + is_approved boolean default false ) inherits (everything.base); comment on table everything.attribute is E'@omit create'; @@ -60,7 +66,7 @@ create table everything.option ( id serial primary key, value text not null check (char_length(value) < 80), type everything.option_type, - is_proposal boolean default false, + is_approved boolean default false ) inherits (everything.base); -- create associations and relationships @@ -82,39 +88,66 @@ comment on table everything.relationship is E'@omit update'; create index on everything.relationship (attribute_id); create index on everything.relationship (option_id); --- create item -create table everything.item ( +-- create thing +create table everything.thing ( id serial primary key, category_id int not null references everything.category(id), subcategory_id int not null references everything.subcategory(id), owner_id text not null references everything.user(id), media text [], quantity int not null default 1, - is_request boolean not null default false, + metadata json, + geom_point everything.geometry(Point, 4326) default null +) inherits (everything.base); +comment on table everything.thing is E'@omit create,update'; +create index on everything.thing (category_id); +create index on everything.thing (subcategory_id); +create index on everything.thing (owner_id); + +-- create request +create table everything.request ( + id serial primary key, + requester_id text not null references everything.user(id), + media text [], + reference_link text, + description text, + quantity int not null default 1, metadata json ) inherits (everything.base); -comment on table everything.item is E'@omit create,update'; -create index on everything.item (category_id); -create index on everything.item (subcategory_id); -create index on everything.item (owner_id); +comment on table everything.request is E'@omit update'; +create index on everything.request (requester_id); -- create characteristic create table everything.characteristic ( - item_id int references everything.item(id) on delete cascade, + thing_id int references everything.thing(id) on delete cascade, attribute_id int references everything.attribute(id) on delete cascade, option_id int references everything.option(id) on delete cascade, - num_approvals int not null default 0, - is_validated bool not null default false, - primary key (item_id, attribute_id, option_id) + primary key (thing_id, attribute_id, option_id) ) inherits (everything.base); -create index on everything.characteristic (item_id); +create index on everything.characteristic (thing_id); create index on everything.characteristic (attribute_id); create index on everything.characteristic (option_id); +-- create help, idea, concern +create table everything.help ( + description text not null +) inherits (everything.base); +comment on table everything.help is E'@omit delete'; + +create table everything.idea ( + description text not null +) inherits (everything.base); +comment on table everything.idea is E'@omit update'; + +create table everything.concern ( + description text not null +) inherits (everything.base); +comment on table everything.concern is E'@omit update'; + -- create roles -create role everything_postgraphile login password 'anything-postgraphile'; -create role everything_anon; -create role everything_user; +create role everything_postgraphile login password 'anything-postgraphile'; -- change this in Production +create role everything_anon; -- not logged in +create role everything_user; -- logged in create role everything_admin; -- grant relationships @@ -122,46 +155,62 @@ grant everything_anon to everything_user; grant everything_user to everything_admin; grant everything_admin to everything_postgraphile; --- grant privileges +-- revoke execute permission for public user group on new functions alter default privileges revoke execute on functions from public; +-- grant privileges -- to schema grant usage on schema everything to everything_anon; +-- to create sequence ids +grant usage, select on all sequences in schema everything to everything_anon; -- to users & auth types -grant select on table everything.user to everything_user; -grant select on table everything.invite to everything_anon; -grant insert on table everything.invite to everything_anon; +grant insert on table everything.user to everything_anon; +grant select,update,delete on table everything.user to everything_user; +grant select,insert on table everything.invite to everything_anon; grant delete on table everything.invite to everything_admin; -- to labels -grant select on table everything.category to everything_user; -grant insert,update,delete on table everything.category to everything_admin; -grant select on table everything.subcategory to everything_user; -grant insert,update,delete on table everything.subcategory to everything_admin; -grant select on table everything.attribute to everything_user; -grant insert,update,delete on table everything.attribute to everything_admin; +grant select,insert on table everything.category to everything_user; +grant update,delete on table everything.category to everything_admin; +grant select,insert on table everything.subcategory to everything_user; +grant update,delete on table everything.subcategory to everything_admin; +grant select,insert on table everything.attribute to everything_user; +grant update,delete on table everything.attribute to everything_admin; grant select,insert on table everything.option to everything_user; grant update,delete on table everything.option to everything_admin; -grant select on table everything.association to everything_user; -grant insert,update,delete on table everything.association to everything_admin; -grant select on table everything.relationship to everything_user; -grant insert,update,delete on table everything.relationship to everything_admin; --- to items -grant select on table everything.item to everything_user; -grant insert,update on table everything.item to everything_user; -grant delete on table everything.item to everything_admin; +grant select,insert on table everything.association to everything_user; +grant update,delete on table everything.association to everything_admin; +grant select,insert on table everything.relationship to everything_user; +grant update,delete on table everything.relationship to everything_admin; +-- to things +grant select,insert,update on table everything.thing to everything_user; +grant delete on table everything.thing to everything_admin; grant select,insert,update on table everything.characteristic to everything_user; +-- to requests +grant select,insert,update on table everything.request to everything_user; +grant delete on table everything.request to everything_admin; +-- to help, idea, concern +grant select,insert on table everything.help to everything_user; +grant delete on table everything.help to everything_admin; +grant select,insert on table everything.idea to everything_user; +grant delete on table everything.idea to everything_admin; +grant select,insert on table everything.concern to everything_user; +grant delete on table everything.concern to everything_admin; -- RLS -- users & auth types alter table everything.user enable row level security; -create policy select_user on everything.user for select +-- any user can see other users +create policy select_user on everything.user for select to everything_user using (true); - +create policy insert_user on everything.user for insert to everything_anon + with check (true); + using (id = nullif(current_setting('jwt.claims.firebase', true), '')::text); +-- only the user themself can update their own record create policy update_user on everything.user for update to everything_user - using (id = nullif(current_setting('jwt.claims.firebase.id', true), '')::text); - + using (id = nullif(current_setting('jwt.claims.firebase', true), '')::text); +-- only the user themself can delete their own record create policy delete_user on everything.user for delete to everything_user - using (id = nullif(current_setting('jwt.claims.firebase.id', true), '')::text); + using (id = nullif(current_setting('jwt.claims.firebase', true), '')::text); --- create functions +-- create functions (functions are private) -- updated_at create function everything_private.set_updated_at() returns trigger as $$ begin @@ -173,7 +222,7 @@ $$ language plpgsql; -- created_by create function everything_private.set_created_by() returns trigger as $$ begin - new.created_by := current_setting('jwt.claims.firebase.id', true); + new.created_by := current_setting('jwt.claims.firebase'); return new; end; $$ language plpgsql; @@ -184,7 +233,7 @@ create trigger base_updated_at before update for each row execute procedure everything_private.set_updated_at(); -create trigger base_created_by before update - on everything.base +create trigger category_created_by before insert + on everything.category for each row execute procedure everything_private.set_created_by(); \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index c431c20..599928c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,20 +3,25 @@ const express = require('express'); const { postgraphile } = require('postgraphile'); const cors = require('cors'); -const pg = require('pg'); const fs = require('fs'); const config = require('./config.ts'); const admin = require('firebase-admin'); const path = require('path'); +const postgis = require("@graphile/postgis"); // Load .env variables require('dotenv').config() -const serviceAccount = - process.env.NODE_ENV === 'production' ? JSON.parse(process.env.FIREBASE_ADMIN_SDK_CONFIG || "") : require("../everything-dev-pk.json") || ""; -admin.initializeApp({ - credential: admin.credential.cert(serviceAccount) -}); +// set up firebase admin for token verification +if (process.env.NODE_ENV === 'production') { + const serviceAccount = JSON.parse(process.env.FIREBASE_ADMIN_SDK_CONFIG || ""); + admin.initializeApp({ + credential: admin.credential.cert(serviceAccount) + }); +} else { + process.env['FIREBASE_AUTH_EMULATOR_HOST'] = "localhost:9099"; + admin.initializeApp(); +} // Describe postgraphile connection and configurations const middleware = postgraphile( @@ -36,7 +41,8 @@ const middleware = postgraphile( ...(process.env.NODE_ENV === 'production' ? config.postgraphileOptionsProd : config.postgraphileOptionsDev), appendPlugins: [ require("@graphile-contrib/pg-simplify-inflector"), - require('./plugins/mutations/CreateItemMutationPlugin'), + postgis.default || postgis, + require('./plugins/mutations/CreateThingMutationPlugin'), require('./plugins/mutations/ApproveInviteMutationPlugin'), // require('./plugins/mutations/CreateCategoryMutationPlugin'), require('./plugins/mutations/CreateAttributeMutationPlugin'), @@ -56,7 +62,7 @@ const middleware = postgraphile( // can check role, configure this role with database return { role: 'everything_user', - 'jwt.claims.firebase.id': decodedToken.uid + 'jwt.claims.firebase': decodedToken.uid }; } } diff --git a/src/plugins/mutations/CreateItemMutationPlugin.js b/src/plugins/mutations/CreateThingMutationPlugin.js similarity index 69% rename from src/plugins/mutations/CreateItemMutationPlugin.js rename to src/plugins/mutations/CreateThingMutationPlugin.js index b15bed4..fd9f73a 100644 --- a/src/plugins/mutations/CreateItemMutationPlugin.js +++ b/src/plugins/mutations/CreateThingMutationPlugin.js @@ -1,6 +1,6 @@ const { makeExtendSchemaPlugin, gql } = require("graphile-utils"); -const CreateItemMutationPlugin = makeExtendSchemaPlugin((build) => { +const CreateThingMutationPlugin = makeExtendSchemaPlugin((build) => { const { pgSql: sql } = build; return { typeDefs: gql` @@ -9,67 +9,67 @@ const CreateItemMutationPlugin = makeExtendSchemaPlugin((build) => { optionId: Int! } - input CreateItemInput { + input CreateThingInput { categoryId: Int! subcategoryId: Int! attributes: [NewAttributeInput!]! media: [String!]! ownerId: String!, quantity: Int, - isRequest: Boolean + geomPoint: GeoJSON } - type CreateItemPayload { - item: Item @pgField + type CreateThingPayload { + thing: Thing @pgField query: Query } extend type Mutation { - createItem(input: CreateItemInput!): CreateItemPayload + createThing(input: CreateThingInput!): CreateThingPayload } `, resolvers: { Mutation: { - createItem: async (_query, args, context, resolveInfo) => { + createThing: async (_query, args, context, resolveInfo) => { const { pgClient } = context; // Start a sub-transaction await pgClient.query("SAVEPOINT graphql_mutation"); try { - // create the item + // create the thing const { - rows: [item], + rows: [thing], } = await pgClient.query( - `INSERT INTO everything.item( category_id, subcategory_id, owner_id, media, quantity, is_request ) VALUES ($1, $2, $3, $4, $5, $6) RETURNING *`, + `INSERT INTO everything.thing( category_id, subcategory_id, owner_id, media, quantity, geom_point ) VALUES ($1, $2, $3, $4, $5, $6) RETURNING *`, [ args.input.categoryId, args.input.subcategoryId, args.input.ownerId, args.input.media, args.input.quantity || 1, - args.input.isRequest || false, + args.input.geomPoint ] ); - // create all the characteristics using the item id + // create all the characteristics using the thing id await Promise.all( args.input.attributes.map(async (attribute) => { // create the option (regular text) await pgClient.query( - `INSERT INTO everything.characteristic( item_id, attribute_id, option_id ) VALUES ($1, $2, $3) RETURNING *`, + `INSERT INTO everything.characteristic( thing_id, attribute_id, option_id ) VALUES ($1, $2, $3) RETURNING *`, [ - item.id, + thing.id, attribute.attributeId, attribute.optionId, ] ); }) ); - // get the item + // get the thing const [row] = await resolveInfo.graphile.selectGraphQLResultFromTable( - sql.fragment`everything.item`, + sql.fragment`everything.thing`, (tableAlias, queryBuilder) => { queryBuilder.where( - sql.fragment`${tableAlias}.id = ${sql.value(item.id)}` + sql.fragment`${tableAlias}.id = ${sql.value(thing.id)}` ); } ); @@ -91,4 +91,4 @@ const CreateItemMutationPlugin = makeExtendSchemaPlugin((build) => { }; }); -module.exports = CreateItemMutationPlugin; +module.exports = CreateThingMutationPlugin; diff --git a/src/plugins/mutations/ProposeAttributeMutationPlugin.js b/src/plugins/mutations/ProposeAttributeMutationPlugin.js index 5e831a6..7d2a617 100644 --- a/src/plugins/mutations/ProposeAttributeMutationPlugin.js +++ b/src/plugins/mutations/ProposeAttributeMutationPlugin.js @@ -28,11 +28,10 @@ const ProposeAttributeMutationPlugin = makeExtendSchemaPlugin((build) => { const { rows: [attribute], } = await pgClient.query( - `INSERT INTO everything.attribute( name, type, is_proposal ) VALUES ($1, $2, $3) RETURNING *`, + `INSERT INTO everything.attribute( name, type ) VALUES ($1, $2) RETURNING *`, [ args.input.name, - 'text', - true, + 'text' ] ); // get the attribute diff --git a/src/plugins/mutations/ProposeOptionMutationPlugin.js b/src/plugins/mutations/ProposeOptionMutationPlugin.js index dcd6961..26cc3f9 100644 --- a/src/plugins/mutations/ProposeOptionMutationPlugin.js +++ b/src/plugins/mutations/ProposeOptionMutationPlugin.js @@ -29,8 +29,8 @@ const ProposeOptionMutationPlugin = makeExtendSchemaPlugin((build) => { const { rows: [option], } = await pgClient.query( - `INSERT INTO everything.option( value, type, is_proposal ) VALUES ($1, $2, $3) RETURNING *`, - [args.input.value, "text", true] + `INSERT INTO everything.option( value, type ) VALUES ($1, $2) RETURNING *`, + [args.input.value, "text"] ); // create the relationship const { diff --git a/storage.rules b/storage.rules new file mode 100644 index 0000000..2e3da95 --- /dev/null +++ b/storage.rules @@ -0,0 +1,9 @@ +rules_version = '2'; +service firebase.storage { + match /b/{bucket}/o { + match /images/{userId}/{imageId} { + allow read; + allow write: if request.auth.uid == userId; + } + } +} \ No newline at end of file