diff --git a/api/migrations/39-search-tasks-n-ctfs.sql b/api/migrations/39-search-tasks-n-ctfs.sql new file mode 100644 index 000000000..c8e739eac --- /dev/null +++ b/api/migrations/39-search-tasks-n-ctfs.sql @@ -0,0 +1,2 @@ +CREATE INDEX ON ctfnote.ctf (title); +CREATE INDEX ON ctfnote.task (title); diff --git a/api/package.json b/api/package.json index 45da6a043..e3d28227d 100644 --- a/api/package.json +++ b/api/package.json @@ -8,7 +8,7 @@ "start": "NODE_ENV=production node dist/index.js", "build": "tsc", "lint": "eslint --fix 'src/**/*.ts'", - "format": "prettier --write 'src/*.ts'", + "format": "prettier --write 'src/**/*.ts'", "dev": "NODE_ENV=development nodemon src/index.ts", "dev:migrate": "DATABASE_URL= yarn run db-migrate -e dev up" }, @@ -27,8 +27,8 @@ "graphile-utils": "^4.11.2", "graphql": "^15.6.1", "graphql-upload": "^12.0.0", - "postgraphile": "^4.11.0", - "postgraphile-plugin-connection-filter": "^2.1.1", + "postgraphile": "^4.12.8", + "postgraphile-plugin-connection-filter": "^2.2.2", "postgres-migrations": "^5.3.0" }, "devDependencies": { diff --git a/api/src/index.ts b/api/src/index.ts index 100d30619..2b01cf73a 100644 --- a/api/src/index.ts +++ b/api/src/index.ts @@ -14,6 +14,7 @@ import createTasKPlugin from "./plugins/createTask"; import importCtfPlugin from "./plugins/importCtf"; import uploadLogoPlugin from "./plugins/uploadLogo"; import uploadScalar from "./plugins/uploadScalar"; +import ConnectionFilterPlugin from "postgraphile-plugin-connection-filter"; function getDbUrl(role: "user" | "admin") { const login = config.db[role].login; @@ -43,6 +44,7 @@ function createOptions() { importCtfPlugin, uploadLogoPlugin, createTasKPlugin, + ConnectionFilterPlugin, ], ownerConnectionString: getDbUrl("admin"), enableQueryBatching: true, @@ -60,6 +62,14 @@ function createOptions() { postgraphileOptions.jwtSecret = "DEV"; postgraphileOptions.showErrorStack = "json" as const; postgraphileOptions.extendedErrors = ["hint", "detail", "errcode"]; + + postgraphileOptions.graphileBuildOptions = { + connectionFilterAllowedOperators: ["includesInsensitive"], + connectionFilterAllowedFieldTypes: ["String"], + connectionFilterComputedColumns: false, + connectionFilterSetofFunctions: false, + connectionFilterArrays: false, + }; } return postgraphileOptions; } @@ -70,7 +80,7 @@ function createApp(postgraphileOptions: PostGraphileOptions) { app.use( "/uploads", express.static("uploads", { - setHeaders: function (res, path, stat) { + setHeaders: function (res) { res.set("Content-Disposition", "attachment"); }, }) diff --git a/api/src/plugins/importCtf.ts b/api/src/plugins/importCtf.ts index 55486059a..ed66ec5ca 100644 --- a/api/src/plugins/importCtf.ts +++ b/api/src/plugins/importCtf.ts @@ -1,54 +1,57 @@ - import { makeExtendSchemaPlugin, gql } from "graphile-utils"; -import axios from "axios" -import savepointWrapper from "./savepointWrapper" +import axios from "axios"; +import savepointWrapper from "./savepointWrapper"; interface CTFTimeResponse { - title: string; - weight: number; - url: string, - logo: string, - ctftime_url: string, - description: string, - start: string, - finish: string + title: string; + weight: number; + url: string; + logo: string; + ctftime_url: string; + description: string; + start: string; + finish: string; } - async function fetchFromCtftime(id: number): Promise { - const url = `https://ctftime.org/api/v1/events/${id}/`; - const response = await axios.get(url, { - headers: { "User-Agent": "CTFNote" }, // The default axios user-agent is blacklisted by ctftime :/ - }); - return response.data + const url = `https://ctftime.org/api/v1/events/${id}/`; + const response = await axios.get(url, { + headers: { "User-Agent": "CTFNote" }, // The default axios user-agent is blacklisted by ctftime :/ + }); + return response.data; } +export default makeExtendSchemaPlugin((build) => { + const { pgSql: sql } = build; + return { + typeDefs: gql` + input ImportCtfInput { + ctftimeId: Int! + } -export default makeExtendSchemaPlugin(build => { - const { pgSql: sql } = build; - return { - typeDefs: gql` - - input ImportCtfInput { - ctftimeId: Int! - } - - type ImportCtfPayload { - ctf: Ctf @pgField - query: Query - } + type ImportCtfPayload { + ctf: Ctf @pgField + query: Query + } - extend type Mutation { - importCtf(input: ImportCtfInput) : ImportCtfPayload - } - `, - resolvers: { - Mutation: { - importCtf: async (_query, { input: { ctftimeId } }, { pgClient }, resolveInfo) => { - const ctf = await fetchFromCtftime(ctftimeId) - await savepointWrapper(pgClient, async () => { - const { rows: [newCtf] } = await pgClient.query( - `INSERT INTO ctfnote.ctf( + extend type Mutation { + importCtf(input: ImportCtfInput): ImportCtfPayload + } + `, + resolvers: { + Mutation: { + importCtf: async ( + _query, + { input: { ctftimeId } }, + { pgClient }, + resolveInfo + ) => { + const ctf = await fetchFromCtftime(ctftimeId); + await savepointWrapper(pgClient, async () => { + const { + rows: [newCtf], + } = await pgClient.query( + `INSERT INTO ctfnote.ctf( title, weight, ctf_url, @@ -60,32 +63,33 @@ export default makeExtendSchemaPlugin(build => { ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8) RETURNING *; `, - [ - ctf.title, - ctf.weight, - ctf.url, - ctf.logo, - ctf.ctftime_url, - ctf.description, - ctf.start, - ctf.finish, - ] - ) - const [row] = await resolveInfo.graphile.selectGraphQLResultFromTable( - sql.fragment`ctfnote.ctf`, - (tableAlias, queryBuilder) => { - queryBuilder.where( - sql.fragment`${tableAlias}.id = ${sql.value(newCtf.id)}` - ); - } - ) - return { - data: row, - query: build.$$isQuery, - }; - }) - }, - }, + [ + ctf.title, + ctf.weight, + ctf.url, + ctf.logo, + ctf.ctftime_url, + ctf.description, + ctf.start, + ctf.finish, + ] + ); + const [row] = + await resolveInfo.graphile.selectGraphQLResultFromTable( + sql.fragment`ctfnote.ctf`, + (tableAlias, queryBuilder) => { + queryBuilder.where( + sql.fragment`${tableAlias}.id = ${sql.value(newCtf.id)}` + ); + } + ); + return { + data: row, + query: build.$$isQuery, + }; + }); }, - }; + }, + }, + }; }); diff --git a/api/src/plugins/savepointWrapper.ts b/api/src/plugins/savepointWrapper.ts index fbf5e1927..9eeb696bb 100644 --- a/api/src/plugins/savepointWrapper.ts +++ b/api/src/plugins/savepointWrapper.ts @@ -1,16 +1,19 @@ -import { Client } from "pg" +import { Client } from "pg"; -async function savepointWrapper(pgClient: Client, f: () => void): Promise { - const name = `"CHECKPOINT-${Math.floor(Math.random() * 0xffff)}"` - await pgClient.query(`SAVEPOINT ${name}`); - try { - await f() - } catch (e) { - await pgClient.query(`ROLLBACK TO SAVEPOINT ${name}`); - throw e; - } finally { - await pgClient.query(`RELEASE SAVEPOINT ${name}`); - } +async function savepointWrapper( + pgClient: Client, + f: () => void +): Promise { + const name = `"CHECKPOINT-${Math.floor(Math.random() * 0xffff)}"`; + await pgClient.query(`SAVEPOINT ${name}`); + try { + await f(); + } catch (e) { + await pgClient.query(`ROLLBACK TO SAVEPOINT ${name}`); + throw e; + } finally { + await pgClient.query(`RELEASE SAVEPOINT ${name}`); + } } -export default savepointWrapper; \ No newline at end of file +export default savepointWrapper; diff --git a/api/yarn.lock b/api/yarn.lock index f32f6f155..d257c8acf 100644 --- a/api/yarn.lock +++ b/api/yarn.lock @@ -1345,24 +1345,24 @@ graceful-fs@^4.1.2: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== -graphile-build-pg@4.12.1: - version "4.12.1" - resolved "https://registry.yarnpkg.com/graphile-build-pg/-/graphile-build-pg-4.12.1.tgz#f6102a60968076beedfefeb102e8558255e65921" - integrity sha512-Rd9QBtbyLJ425VUeHggFCvh3s3oKR58mUU6JYK0sQTRjYbxrE/eWDNAQZQLuWeemfSHvgS5W0EzppkHjkoiWiQ== +graphile-build-pg@4.12.2: + version "4.12.2" + resolved "https://registry.yarnpkg.com/graphile-build-pg/-/graphile-build-pg-4.12.2.tgz#b816824488ba97f797f61c7d129e10e21fe64638" + integrity sha512-4zWS7yb2L3afNpzADX9iBc2do4UOd3abiHd/WG0ao8lharU4YxEDS5qKlE2/2s+gSNqW2okKXEuI1/ci9DXVbw== dependencies: "@graphile/lru" "4.11.0" chalk "^2.4.2" debug "^4.1.1" - graphile-build "4.12.0" + graphile-build "4.12.2" jsonwebtoken "^8.5.1" lodash ">=4 <5" lru-cache ">=4 <5" pg-sql2 "4.12.1" -graphile-build@4.12.0: - version "4.12.0" - resolved "https://registry.yarnpkg.com/graphile-build/-/graphile-build-4.12.0.tgz#726bdb1338f13b30cdec35ee3b0c9af8aa7f7dab" - integrity sha512-P4urOvOf4C8uzuuCq8BjFb+qffQvWUnZamrEyRC/0BfKKPkZhQ/HYqe9M7JkwiH8uFekHaTXDBrdR+OPoZEdhw== +graphile-build@4.12.2: + version "4.12.2" + resolved "https://registry.yarnpkg.com/graphile-build/-/graphile-build-4.12.2.tgz#156b0af43ebd2f60622bda573f0aa34b01735e2a" + integrity sha512-UqomiSnWPj4pjO6Q6PzT1YeH96k7e0JzCBI3X8kkELG+PP2BOQCNE5e+xLJvohJmUr0YBTgflPQo7P1ZESPwww== dependencies: "@graphile/lru" "4.11.0" chalk "^2.4.2" @@ -1374,7 +1374,7 @@ graphile-build@4.12.0: pluralize "^7.0.0" semver "^6.0.0" -graphile-utils@^4.11.2, graphile-utils@^4.12.1: +graphile-utils@^4.11.2: version "4.12.1" resolved "https://registry.yarnpkg.com/graphile-utils/-/graphile-utils-4.12.1.tgz#52039718d1f8a30bf73c60a6d14c619c58006b91" integrity sha512-+yfKs2W59lVgl/KcZrcGIZ3CQ/eyitZ+HHkbgAVRonA4PaWTSvaqLH4xNvvJu4X7sIGFxb4GWzCxTLnyjHRrmg== @@ -1383,6 +1383,15 @@ graphile-utils@^4.11.2, graphile-utils@^4.12.1: graphql ">=0.9 <0.14 || ^14.0.2 || ^15.4.0" tslib "^2.0.1" +graphile-utils@^4.12.2: + version "4.12.2" + resolved "https://registry.yarnpkg.com/graphile-utils/-/graphile-utils-4.12.2.tgz#2858462672eecdb53c5327ffc22abb61f4e30e06" + integrity sha512-2UcTWWMFLFkKwbDLqlN0mF5sxLqz9y0p7I3zNOJpXtHVjrHyp7oQZsWComPsit/PWIrIgtDUagP+HPkypBRrqA== + dependencies: + debug "^4.1.1" + graphql ">=0.9 <0.14 || ^14.0.2 || ^15.4.0" + tslib "^2.0.1" + graphql-parse-resolve-info@4.12.0: version "4.12.0" resolved "https://registry.yarnpkg.com/graphql-parse-resolve-info/-/graphql-parse-resolve-info-4.12.0.tgz#b5e83c1f56236660dee2cee9541ba70463e859a9" @@ -1409,10 +1418,10 @@ graphql-upload@^12.0.0: isobject "^4.0.0" object-path "^0.11.5" -graphql-ws@^5.1.2: - version "5.5.0" - resolved "https://registry.yarnpkg.com/graphql-ws/-/graphql-ws-5.5.0.tgz#79f10248d23d104369eaef93acb9f887276a2c42" - integrity sha512-WQepPMGQQoqS2VsrI2I3RMLCVz3CW4/6ZqGV6ABDOwH4R62DzjxwMlwZbj6vhSI/7IM3/C911yITwgs77iO/hw== +graphql-ws@^5.5.5: + version "5.5.5" + resolved "https://registry.yarnpkg.com/graphql-ws/-/graphql-ws-5.5.5.tgz#f375486d3f196e2a2527b503644693ae3a8670a9" + integrity sha512-hvyIS71vs4Tu/yUYHPvGXsTgo0t3arU820+lT5VjZS2go0ewp2LqyCgxEN56CzOG7Iys52eRhHBiD1gGRdiQtw== "graphql@>=0.9 <0.14 || ^14.0.2 || ^15.4.0", "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@^15.3.0, graphql@^15.6.1: version "15.6.1" @@ -2259,26 +2268,26 @@ pluralize@^7.0.0: resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== -postgraphile-core@4.12.1: - version "4.12.1" - resolved "https://registry.yarnpkg.com/postgraphile-core/-/postgraphile-core-4.12.1.tgz#fcee9d54b02a56666a8026df56e0b0540e712cf4" - integrity sha512-BukrJ3j+H4dtEaCCZOPjLZ6+DJnAYHPOvFpDC85w9T4xlpLFCx7/E8ZlZFm7z/P6f/s8SS8EpL7lazms6uB8FQ== +postgraphile-core@4.12.2: + version "4.12.2" + resolved "https://registry.yarnpkg.com/postgraphile-core/-/postgraphile-core-4.12.2.tgz#a15107cf297ed8091004621e73ba4a53d31e1d2a" + integrity sha512-+2OWlPVsMAVjYRMBSI/CT4GUB0mkSmPKGopKapfvhW40SCUBiPB/kqTylX2viRRnN8FuZtS3cRaTPiWr1K+DIg== dependencies: - graphile-build "4.12.0" - graphile-build-pg "4.12.1" + graphile-build "4.12.2" + graphile-build-pg "4.12.2" tslib "^2.0.1" -postgraphile-plugin-connection-filter@^2.1.1: +postgraphile-plugin-connection-filter@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/postgraphile-plugin-connection-filter/-/postgraphile-plugin-connection-filter-2.2.2.tgz#c2444a01a4a6506f9e8a485f18b6cf5bcd17e43b" integrity sha512-/PkdMwaIfGM++C8G5QUAF1iosAVEyIbPaaYteCMgfNWjW215SP9+8L+ewfi6Dm9Weaf+qKnNERWx7xlY8kuWOw== dependencies: tslib "^2.3.0" -postgraphile@^4.11.0: - version "4.12.4" - resolved "https://registry.yarnpkg.com/postgraphile/-/postgraphile-4.12.4.tgz#c07395618e12f3e35f401ec7c75d7e34e48de69b" - integrity sha512-ylx3w9MQ9tSOXCIPIzqseyTX57R6PJOQrQYdNn3SMrj6Glrt7mpzNNLW5BDwQvuViLnIIOaUEkDdHG1IaHHMmA== +postgraphile@^4.12.8: + version "4.12.8" + resolved "https://registry.yarnpkg.com/postgraphile/-/postgraphile-4.12.8.tgz#f42f2114e69e074c3ab11bad4431f8f893edd403" + integrity sha512-n8QqLkTtLmVItXeXAdEby4Qv8d6l7/AcDDqHy0BsMojVZgpwfmAIlF8lMOF4xOqqeUydnO0HCiVZjqaBhxjVJw== dependencies: "@graphile/lru" "4.11.0" "@types/json5" "^0.0.30" @@ -2290,11 +2299,11 @@ postgraphile@^4.11.0: commander "^2.19.0" debug "^4.1.1" finalhandler "^1.0.6" - graphile-build "4.12.0" - graphile-build-pg "4.12.1" - graphile-utils "^4.12.1" + graphile-build "4.12.2" + graphile-build-pg "4.12.2" + graphile-utils "^4.12.2" 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.1.2" + graphql-ws "^5.5.5" http-errors "^1.5.1" iterall "^1.0.2" json5 "^2.1.1" @@ -2303,7 +2312,7 @@ postgraphile@^4.11.0: pg ">=6.1.0 <9" pg-connection-string "^2.0.0" pg-sql2 "4.12.1" - postgraphile-core "4.12.1" + postgraphile-core "4.12.2" subscriptions-transport-ws "^0.9.18" tslib "^2.1.0" ws "^7.4.2" diff --git a/front/graphql.schema.json b/front/graphql.schema.json index a37fcd22d..b8c1bd557 100644 --- a/front/graphql.schema.json +++ b/front/graphql.schema.json @@ -20,6 +20,165 @@ "enumValues": null, "possibleTypes": null }, + { + "kind": "INPUT_OBJECT", + "name": "BooleanFilter", + "description": "A filter to be used against Boolean fields. All fields are combined with a logical ‘and.’", + "fields": null, + "inputFields": [ + { + "name": "distinctFrom", + "description": "Not equal to the specified value, treating null like an ordinary value.", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "equalTo", + "description": "Equal to the specified value.", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "greaterThan", + "description": "Greater than the specified value.", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "greaterThanOrEqualTo", + "description": "Greater than or equal to the specified value.", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "in", + "description": "Included in the specified list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "isNull", + "description": "Is null (if `true` is specified) or is not null (if `false` is specified).", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "lessThan", + "description": "Less than the specified value.", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "lessThanOrEqualTo", + "description": "Less than or equal to the specified value.", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "notDistinctFrom", + "description": "Equal to the specified value, treating null like an ordinary value.", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "notEqualTo", + "description": "Not equal to the specified value.", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "notIn", + "description": "Not included in the specified list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, { "kind": "INPUT_OBJECT", "name": "ChangePasswordInput", @@ -826,6 +985,18 @@ "isDeprecated": false, "deprecationReason": null }, + { + "name": "filter", + "description": "A filter to be used in determining which values should be returned by the collection.", + "type": { + "kind": "INPUT_OBJECT", + "name": "InvitationFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, { "name": "first", "description": "Only read the first `n` values of the set.", @@ -1007,6 +1178,18 @@ "isDeprecated": false, "deprecationReason": null }, + { + "name": "filter", + "description": "A filter to be used in determining which values should be returned by the collection.", + "type": { + "kind": "INPUT_OBJECT", + "name": "TaskFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, { "name": "first", "description": "Only read the first `n` values of the set.", @@ -1173,6 +1356,18 @@ "defaultValue": null, "isDeprecated": false, "deprecationReason": null + }, + { + "name": "title", + "description": "Checks for equality with the object’s `title` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null } ], "interfaces": null, @@ -1181,28 +1376,36 @@ }, { "kind": "INPUT_OBJECT", - "name": "CtfInput", - "description": "An input for mutations affecting `Ctf`", + "name": "CtfFilter", + "description": "A filter to be used against `Ctf` object types. All fields are combined with a logical ‘and.’", "fields": null, "inputFields": [ { - "name": "ctfUrl", - "description": null, + "name": "and", + "description": "Checks for all expressions in this list.", "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "CtfFilter", + "ofType": null + } + } }, "defaultValue": null, "isDeprecated": false, "deprecationReason": null }, { - "name": "ctftimeUrl", - "description": null, + "name": "endTime", + "description": "Filter by the object’s `endTime` field.", "type": { - "kind": "SCALAR", - "name": "String", + "kind": "INPUT_OBJECT", + "name": "DatetimeFilter", "ofType": null }, "defaultValue": null, @@ -1210,11 +1413,11 @@ "deprecationReason": null }, { - "name": "description", - "description": null, + "name": "granted", + "description": "Filter by the object’s `granted` field.", "type": { - "kind": "SCALAR", - "name": "String", + "kind": "INPUT_OBJECT", + "name": "BooleanFilter", "ofType": null }, "defaultValue": null, @@ -1222,27 +1425,23 @@ "deprecationReason": null }, { - "name": "endTime", - "description": null, + "name": "id", + "description": "Filter by the object’s `id` field.", "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Datetime", - "ofType": null - } + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null }, "defaultValue": null, "isDeprecated": false, "deprecationReason": null }, { - "name": "logoUrl", - "description": null, + "name": "not", + "description": "Negates the expression.", "type": { - "kind": "SCALAR", - "name": "String", + "kind": "INPUT_OBJECT", + "name": "CtfFilter", "ofType": null }, "defaultValue": null, @@ -1250,15 +1449,19 @@ "deprecationReason": null }, { - "name": "startTime", - "description": null, + "name": "or", + "description": "Checks for any expressions in this list.", "type": { - "kind": "NON_NULL", + "kind": "LIST", "name": null, "ofType": { - "kind": "SCALAR", - "name": "Datetime", - "ofType": null + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "CtfFilter", + "ofType": null + } } }, "defaultValue": null, @@ -1266,27 +1469,35 @@ "deprecationReason": null }, { - "name": "title", - "description": null, + "name": "secretsId", + "description": "Filter by the object’s `secretsId` field.", "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null - } + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null }, "defaultValue": null, "isDeprecated": false, "deprecationReason": null }, { - "name": "weight", - "description": null, + "name": "startTime", + "description": "Filter by the object’s `startTime` field.", "type": { - "kind": "SCALAR", - "name": "Float", + "kind": "INPUT_OBJECT", + "name": "DatetimeFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "title", + "description": "Filter by the object’s `title` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", "ofType": null }, "defaultValue": null, @@ -1300,8 +1511,8 @@ }, { "kind": "INPUT_OBJECT", - "name": "CtfPatch", - "description": "Represents an update to a `Ctf`. Fields that are set will be updated.", + "name": "CtfInput", + "description": "An input for mutations affecting `Ctf`", "fields": null, "inputFields": [ { @@ -1344,14 +1555,133 @@ "name": "endTime", "description": null, "type": { - "kind": "SCALAR", - "name": "Datetime", - "ofType": null - }, - "defaultValue": null, - "isDeprecated": false, - "deprecationReason": null - }, + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "logoUrl", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "startTime", + "description": null, + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "title", + "description": null, + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "weight", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", + "name": "CtfPatch", + "description": "Represents an update to a `Ctf`. Fields that are set will be updated.", + "fields": null, + "inputFields": [ + { + "name": "ctfUrl", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ctftimeUrl", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "description", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "endTime", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, { "name": "logoUrl", "description": null, @@ -1462,6 +1792,18 @@ "isDeprecated": false, "deprecationReason": null }, + { + "name": "filter", + "description": "A filter to be used in determining which values should be returned by the collection.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CtfFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, { "name": "first", "description": "Only read the first `n` values of the set.", @@ -1598,6 +1940,81 @@ "enumValues": null, "possibleTypes": null }, + { + "kind": "INPUT_OBJECT", + "name": "CtfSecretFilter", + "description": "A filter to be used against `CtfSecret` object types. All fields are combined with a logical ‘and.’", + "fields": null, + "inputFields": [ + { + "name": "and", + "description": "Checks for all expressions in this list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "CtfSecretFilter", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "id", + "description": "Filter by the object’s `id` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "not", + "description": "Negates the expression.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CtfSecretFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "or", + "description": "Checks for any expressions in this list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "CtfSecretFilter", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, { "kind": "INPUT_OBJECT", "name": "CtfSecretPatch", @@ -1995,6 +2412,18 @@ "description": null, "isDeprecated": false, "deprecationReason": null + }, + { + "name": "TITLE_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TITLE_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null } ], "possibleTypes": null @@ -2021,16 +2450,16 @@ }, { "kind": "INPUT_OBJECT", - "name": "DeleteCtfByNodeIdInput", - "description": "All input for the `deleteCtfByNodeId` mutation.", + "name": "DatetimeFilter", + "description": "A filter to be used against Datetime fields. All fields are combined with a logical ‘and.’", "fields": null, "inputFields": [ { - "name": "clientMutationId", - "description": "An arbitrary string value with no semantic meaning. Will be included in the\npayload verbatim. May be used to track mutations by the client.", + "name": "distinctFrom", + "description": "Not equal to the specified value, treating null like an ordinary value.", "type": { "kind": "SCALAR", - "name": "String", + "name": "Datetime", "ofType": null }, "defaultValue": null, @@ -2038,38 +2467,23 @@ "deprecationReason": null }, { - "name": "nodeId", - "description": "The globally unique `ID` which will identify a single `Ctf` to be deleted.", + "name": "equalTo", + "description": "Equal to the specified value.", "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "ID", - "ofType": null - } + "kind": "SCALAR", + "name": "Datetime", + "ofType": null }, "defaultValue": null, "isDeprecated": false, "deprecationReason": null - } - ], - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "INPUT_OBJECT", - "name": "DeleteCtfInput", - "description": "All input for the `deleteCtf` mutation.", - "fields": null, - "inputFields": [ + }, { - "name": "clientMutationId", - "description": "An arbitrary string value with no semantic meaning. Will be included in the\npayload verbatim. May be used to track mutations by the client.", + "name": "greaterThan", + "description": "Greater than the specified value.", "type": { "kind": "SCALAR", - "name": "String", + "name": "Datetime", "ofType": null }, "defaultValue": null, @@ -2077,23 +2491,197 @@ "deprecationReason": null }, { - "name": "id", - "description": null, + "name": "greaterThanOrEqualTo", + "description": "Greater than or equal to the specified value.", "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - } + "kind": "SCALAR", + "name": "Datetime", + "ofType": null }, "defaultValue": null, "isDeprecated": false, "deprecationReason": null - } - ], - "interfaces": null, + }, + { + "name": "in", + "description": "Included in the specified list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "isNull", + "description": "Is null (if `true` is specified) or is not null (if `false` is specified).", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "lessThan", + "description": "Less than the specified value.", + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "lessThanOrEqualTo", + "description": "Less than or equal to the specified value.", + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "notDistinctFrom", + "description": "Equal to the specified value, treating null like an ordinary value.", + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "notEqualTo", + "description": "Not equal to the specified value.", + "type": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "notIn", + "description": "Not included in the specified list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Datetime", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", + "name": "DeleteCtfByNodeIdInput", + "description": "All input for the `deleteCtfByNodeId` mutation.", + "fields": null, + "inputFields": [ + { + "name": "clientMutationId", + "description": "An arbitrary string value with no semantic meaning. Will be included in the\npayload verbatim. May be used to track mutations by the client.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "nodeId", + "description": "The globally unique `ID` which will identify a single `Ctf` to be deleted.", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", + "name": "DeleteCtfInput", + "description": "All input for the `deleteCtf` mutation.", + "fields": null, + "inputFields": [ + { + "name": "clientMutationId", + "description": "An arbitrary string value with no semantic meaning. Will be included in the\npayload verbatim. May be used to track mutations by the client.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "id", + "description": null, + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, "enumValues": null, "possibleTypes": null }, @@ -2768,106 +3356,265 @@ "possibleTypes": null }, { - "kind": "OBJECT", - "name": "Invitation", - "description": null, - "fields": [ + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "description": "A filter to be used against Int fields. All fields are combined with a logical ‘and.’", + "fields": null, + "inputFields": [ { - "name": "ctf", - "description": "Reads a single `Ctf` that is related to this `Invitation`.", - "args": [], + "name": "distinctFrom", + "description": "Not equal to the specified value, treating null like an ordinary value.", "type": { - "kind": "OBJECT", - "name": "Ctf", + "kind": "SCALAR", + "name": "Int", "ofType": null }, + "defaultValue": null, "isDeprecated": false, "deprecationReason": null }, { - "name": "ctfId", - "description": null, - "args": [], + "name": "equalTo", + "description": "Equal to the specified value.", "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - } + "kind": "SCALAR", + "name": "Int", + "ofType": null }, + "defaultValue": null, "isDeprecated": false, "deprecationReason": null }, { - "name": "nodeId", - "description": "A globally unique identifier. Can be used in various places throughout the system to identify this single value.", - "args": [], + "name": "greaterThan", + "description": "Greater than the specified value.", "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "ID", - "ofType": null - } + "kind": "SCALAR", + "name": "Int", + "ofType": null }, + "defaultValue": null, "isDeprecated": false, "deprecationReason": null }, { - "name": "profile", - "description": "Reads a single `Profile` that is related to this `Invitation`.", - "args": [], + "name": "greaterThanOrEqualTo", + "description": "Greater than or equal to the specified value.", "type": { - "kind": "OBJECT", - "name": "Profile", + "kind": "SCALAR", + "name": "Int", "ofType": null }, + "defaultValue": null, "isDeprecated": false, "deprecationReason": null }, { - "name": "profileId", - "description": null, - "args": [], + "name": "in", + "description": "Included in the specified list.", "type": { - "kind": "NON_NULL", + "kind": "LIST", "name": null, "ofType": { - "kind": "SCALAR", - "name": "Int", - "ofType": null + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } } }, + "defaultValue": null, "isDeprecated": false, "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [ - { - "kind": "INTERFACE", - "name": "Node", - "ofType": null - } - ], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "INPUT_OBJECT", - "name": "InvitationCondition", - "description": "A condition to be used against `Invitation` object types. All fields are tested\nfor equality and combined with a logical ‘and.’", - "fields": null, - "inputFields": [ + }, { - "name": "ctfId", - "description": "Checks for equality with the object’s `ctfId` field.", + "name": "isNull", + "description": "Is null (if `true` is specified) or is not null (if `false` is specified).", "type": { "kind": "SCALAR", - "name": "Int", + "name": "Boolean", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "lessThan", + "description": "Less than the specified value.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "lessThanOrEqualTo", + "description": "Less than or equal to the specified value.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "notDistinctFrom", + "description": "Equal to the specified value, treating null like an ordinary value.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "notEqualTo", + "description": "Not equal to the specified value.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "notIn", + "description": "Not included in the specified list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "Invitation", + "description": null, + "fields": [ + { + "name": "ctf", + "description": "Reads a single `Ctf` that is related to this `Invitation`.", + "args": [], + "type": { + "kind": "OBJECT", + "name": "Ctf", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ctfId", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "nodeId", + "description": "A globally unique identifier. Can be used in various places throughout the system to identify this single value.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "profile", + "description": "Reads a single `Profile` that is related to this `Invitation`.", + "args": [], + "type": { + "kind": "OBJECT", + "name": "Profile", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "profileId", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [ + { + "kind": "INTERFACE", + "name": "Node", + "ofType": null + } + ], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", + "name": "InvitationCondition", + "description": "A condition to be used against `Invitation` object types. All fields are tested\nfor equality and combined with a logical ‘and.’", + "fields": null, + "inputFields": [ + { + "name": "ctfId", + "description": "Checks for equality with the object’s `ctfId` field.", + "type": { + "kind": "SCALAR", + "name": "Int", "ofType": null }, "defaultValue": null, @@ -2891,6 +3638,93 @@ "enumValues": null, "possibleTypes": null }, + { + "kind": "INPUT_OBJECT", + "name": "InvitationFilter", + "description": "A filter to be used against `Invitation` object types. All fields are combined with a logical ‘and.’", + "fields": null, + "inputFields": [ + { + "name": "and", + "description": "Checks for all expressions in this list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "InvitationFilter", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ctfId", + "description": "Filter by the object’s `ctfId` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "not", + "description": "Negates the expression.", + "type": { + "kind": "INPUT_OBJECT", + "name": "InvitationFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "or", + "description": "Checks for any expressions in this list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "InvitationFilter", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "profileId", + "description": "Filter by the object’s `profileId` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, { "kind": "INPUT_OBJECT", "name": "InvitationInput", @@ -4497,6 +5331,18 @@ "isDeprecated": false, "deprecationReason": null }, + { + "name": "filter", + "description": "A filter to be used in determining which values should be returned by the collection.", + "type": { + "kind": "INPUT_OBJECT", + "name": "InvitationFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, { "name": "first", "description": "Only read the first `n` values of the set.", @@ -4651,11 +5497,11 @@ "deprecationReason": null }, { - "name": "first", - "description": "Only read the first `n` values of the set.", + "name": "filter", + "description": "A filter to be used in determining which values should be returned by the collection.", "type": { - "kind": "SCALAR", - "name": "Int", + "kind": "INPUT_OBJECT", + "name": "WorkOnTaskFilter", "ofType": null }, "defaultValue": null, @@ -4663,9 +5509,21 @@ "deprecationReason": null }, { - "name": "last", - "description": "Only read the last `n` values of the set.", - "type": { + "name": "first", + "description": "Only read the first `n` values of the set.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "last", + "description": "Only read the last `n` values of the set.", + "type": { "kind": "SCALAR", "name": "Int", "ofType": null @@ -4766,6 +5624,105 @@ "enumValues": null, "possibleTypes": null }, + { + "kind": "INPUT_OBJECT", + "name": "ProfileFilter", + "description": "A filter to be used against `Profile` object types. All fields are combined with a logical ‘and.’", + "fields": null, + "inputFields": [ + { + "name": "and", + "description": "Checks for all expressions in this list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "ProfileFilter", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "id", + "description": "Filter by the object’s `id` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "not", + "description": "Negates the expression.", + "type": { + "kind": "INPUT_OBJECT", + "name": "ProfileFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "or", + "description": "Checks for any expressions in this list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "ProfileFilter", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "role", + "description": "Filter by the object’s `role` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "RoleFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "username", + "description": "Filter by the object’s `username` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, { "kind": "INPUT_OBJECT", "name": "ProfilePatch", @@ -5157,6 +6114,18 @@ "isDeprecated": false, "deprecationReason": null }, + { + "name": "filter", + "description": "A filter to be used in determining which values should be returned by the collection.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CtfSecretFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, { "name": "first", "description": "Only read the first `n` values of the set.", @@ -5262,6 +6231,18 @@ "isDeprecated": false, "deprecationReason": null }, + { + "name": "filter", + "description": "A filter to be used in determining which values should be returned by the collection.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CtfFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, { "name": "first", "description": "Only read the first `n` values of the set.", @@ -5355,6 +6336,18 @@ "isDeprecated": false, "deprecationReason": null }, + { + "name": "filter", + "description": "A filter to be used in determining which values should be returned by the collection.", + "type": { + "kind": "INPUT_OBJECT", + "name": "ProfileFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, { "name": "first", "description": "Only read the first `n` values of the set.", @@ -5428,6 +6421,18 @@ "isDeprecated": false, "deprecationReason": null }, + { + "name": "filter", + "description": "A filter to be used in determining which values should be returned by the collection.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CtfFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, { "name": "first", "description": "Only read the first `n` values of the set.", @@ -5587,6 +6592,18 @@ "isDeprecated": false, "deprecationReason": null }, + { + "name": "filter", + "description": "A filter to be used in determining which values should be returned by the collection.", + "type": { + "kind": "INPUT_OBJECT", + "name": "InvitationFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, { "name": "first", "description": "Only read the first `n` values of the set.", @@ -5749,6 +6766,18 @@ "isDeprecated": false, "deprecationReason": null }, + { + "name": "filter", + "description": "A filter to be used in determining which values should be returned by the collection.", + "type": { + "kind": "INPUT_OBJECT", + "name": "CtfFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, { "name": "first", "description": "Only read the first `n` values of the set.", @@ -5921,6 +6950,18 @@ "isDeprecated": false, "deprecationReason": null }, + { + "name": "filter", + "description": "A filter to be used in determining which values should be returned by the collection.", + "type": { + "kind": "INPUT_OBJECT", + "name": "ProfileFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, { "name": "first", "description": "Only read the first `n` values of the set.", @@ -6222,6 +7263,18 @@ "isDeprecated": false, "deprecationReason": null }, + { + "name": "filter", + "description": "A filter to be used in determining which values should be returned by the collection.", + "type": { + "kind": "INPUT_OBJECT", + "name": "TaskFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, { "name": "first", "description": "Only read the first `n` values of the set.", @@ -6494,6 +7547,18 @@ "isDeprecated": false, "deprecationReason": null }, + { + "name": "filter", + "description": "A filter to be used in determining which values should be returned by the collection.", + "type": { + "kind": "INPUT_OBJECT", + "name": "WorkOnTaskFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, { "name": "first", "description": "Only read the first `n` values of the set.", @@ -7028,6 +8093,12 @@ "isDeprecated": false, "deprecationReason": null }, + { + "name": "USER_FRIEND", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, { "name": "USER_GUEST", "description": null, @@ -7050,85 +8121,244 @@ "possibleTypes": null }, { - "kind": "OBJECT", - "name": "Setting", - "description": null, - "fields": [ + "kind": "INPUT_OBJECT", + "name": "RoleFilter", + "description": "A filter to be used against Role fields. All fields are combined with a logical ‘and.’", + "fields": null, + "inputFields": [ { - "name": "nodeId", - "description": "A globally unique identifier. Can be used in various places throughout the system to identify this single value.", - "args": [], + "name": "distinctFrom", + "description": "Not equal to the specified value, treating null like an ordinary value.", "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "ID", - "ofType": null - } + "kind": "ENUM", + "name": "Role", + "ofType": null }, + "defaultValue": null, "isDeprecated": false, "deprecationReason": null }, { - "name": "registrationAllowed", - "description": null, - "args": [], + "name": "equalTo", + "description": "Equal to the specified value.", "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null - } + "kind": "ENUM", + "name": "Role", + "ofType": null }, + "defaultValue": null, "isDeprecated": false, "deprecationReason": null }, { - "name": "registrationDefaultRole", - "description": null, - "args": [], + "name": "greaterThan", + "description": "Greater than the specified value.", "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "ENUM", - "name": "Role", - "ofType": null - } + "kind": "ENUM", + "name": "Role", + "ofType": null }, + "defaultValue": null, "isDeprecated": false, "deprecationReason": null }, { - "name": "registrationPassword", - "description": null, - "args": [], + "name": "greaterThanOrEqualTo", + "description": "Greater than or equal to the specified value.", "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null - } + "kind": "ENUM", + "name": "Role", + "ofType": null }, + "defaultValue": null, "isDeprecated": false, "deprecationReason": null }, { - "name": "registrationPasswordAllowed", - "description": null, - "args": [], + "name": "in", + "description": "Included in the specified list.", "type": { - "kind": "NON_NULL", + "kind": "LIST", "name": null, "ofType": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "Role", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "isNull", + "description": "Is null (if `true` is specified) or is not null (if `false` is specified).", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "lessThan", + "description": "Less than the specified value.", + "type": { + "kind": "ENUM", + "name": "Role", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "lessThanOrEqualTo", + "description": "Less than or equal to the specified value.", + "type": { + "kind": "ENUM", + "name": "Role", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "notDistinctFrom", + "description": "Equal to the specified value, treating null like an ordinary value.", + "type": { + "kind": "ENUM", + "name": "Role", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "notEqualTo", + "description": "Not equal to the specified value.", + "type": { + "kind": "ENUM", + "name": "Role", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "notIn", + "description": "Not included in the specified list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "Role", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "Setting", + "description": null, + "fields": [ + { + "name": "nodeId", + "description": "A globally unique identifier. Can be used in various places throughout the system to identify this single value.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "registrationAllowed", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "registrationDefaultRole", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "Role", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "registrationPassword", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "registrationPasswordAllowed", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null } }, "isDeprecated": false, @@ -7588,94 +8818,581 @@ "description": "Reads a single `Profile` that is related to this `WorkOnTask`.", "args": [], "type": { - "kind": "OBJECT", - "name": "Profile", + "kind": "OBJECT", + "name": "Profile", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "query", + "description": "Our root query field type. Allows us to run any query from our mutation payload.", + "args": [], + "type": { + "kind": "OBJECT", + "name": "Query", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "task", + "description": "Reads a single `Task` that is related to this `WorkOnTask`.", + "args": [], + "type": { + "kind": "OBJECT", + "name": "Task", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "workOnTask", + "description": null, + "args": [], + "type": { + "kind": "OBJECT", + "name": "WorkOnTask", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "workOnTaskEdge", + "description": "An edge for our `WorkOnTask`. May be used by Relay 1.", + "args": [ + { + "name": "orderBy", + "description": "The method to use when ordering `WorkOnTask`.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "WorkOnTasksOrderBy", + "ofType": null + } + } + }, + "defaultValue": "[PRIMARY_KEY_ASC]", + "isDeprecated": false, + "deprecationReason": null + } + ], + "type": { + "kind": "OBJECT", + "name": "WorkOnTasksEdge", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "SCALAR", + "name": "String", + "description": "The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text.", + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "description": "A filter to be used against String fields. All fields are combined with a logical ‘and.’", + "fields": null, + "inputFields": [ + { + "name": "distinctFrom", + "description": "Not equal to the specified value, treating null like an ordinary value.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "distinctFromInsensitive", + "description": "Not equal to the specified value, treating null like an ordinary value (case-insensitive).", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "endsWith", + "description": "Ends with the specified string (case-sensitive).", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "endsWithInsensitive", + "description": "Ends with the specified string (case-insensitive).", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "equalTo", + "description": "Equal to the specified value.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "equalToInsensitive", + "description": "Equal to the specified value (case-insensitive).", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "greaterThan", + "description": "Greater than the specified value.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "greaterThanInsensitive", + "description": "Greater than the specified value (case-insensitive).", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "greaterThanOrEqualTo", + "description": "Greater than or equal to the specified value.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "greaterThanOrEqualToInsensitive", + "description": "Greater than or equal to the specified value (case-insensitive).", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "in", + "description": "Included in the specified list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "inInsensitive", + "description": "Included in the specified list (case-insensitive).", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "includes", + "description": "Contains the specified string (case-sensitive).", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "includesInsensitive", + "description": "Contains the specified string (case-insensitive).", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "isNull", + "description": "Is null (if `true` is specified) or is not null (if `false` is specified).", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "lessThan", + "description": "Less than the specified value.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "lessThanInsensitive", + "description": "Less than the specified value (case-insensitive).", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "lessThanOrEqualTo", + "description": "Less than or equal to the specified value.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "lessThanOrEqualToInsensitive", + "description": "Less than or equal to the specified value (case-insensitive).", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "like", + "description": "Matches the specified pattern (case-sensitive). An underscore (_) matches any single character; a percent sign (%) matches any sequence of zero or more characters.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "likeInsensitive", + "description": "Matches the specified pattern (case-insensitive). An underscore (_) matches any single character; a percent sign (%) matches any sequence of zero or more characters.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "notDistinctFrom", + "description": "Equal to the specified value, treating null like an ordinary value.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "notDistinctFromInsensitive", + "description": "Equal to the specified value, treating null like an ordinary value (case-insensitive).", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "notEndsWith", + "description": "Does not end with the specified string (case-sensitive).", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "notEndsWithInsensitive", + "description": "Does not end with the specified string (case-insensitive).", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "notEqualTo", + "description": "Not equal to the specified value.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "notEqualToInsensitive", + "description": "Not equal to the specified value (case-insensitive).", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "notIn", + "description": "Not included in the specified list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "notInInsensitive", + "description": "Not included in the specified list (case-insensitive).", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "notIncludes", + "description": "Does not contain the specified string (case-sensitive).", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "notIncludesInsensitive", + "description": "Does not contain the specified string (case-insensitive).", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "notLike", + "description": "Does not match the specified pattern (case-sensitive). An underscore (_) matches any single character; a percent sign (%) matches any sequence of zero or more characters.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "notLikeInsensitive", + "description": "Does not match the specified pattern (case-insensitive). An underscore (_) matches any single character; a percent sign (%) matches any sequence of zero or more characters.", + "type": { + "kind": "SCALAR", + "name": "String", "ofType": null }, + "defaultValue": null, "isDeprecated": false, "deprecationReason": null }, { - "name": "query", - "description": "Our root query field type. Allows us to run any query from our mutation payload.", - "args": [], + "name": "notStartsWith", + "description": "Does not start with the specified string (case-sensitive).", "type": { - "kind": "OBJECT", - "name": "Query", + "kind": "SCALAR", + "name": "String", "ofType": null }, + "defaultValue": null, "isDeprecated": false, "deprecationReason": null }, { - "name": "task", - "description": "Reads a single `Task` that is related to this `WorkOnTask`.", - "args": [], + "name": "notStartsWithInsensitive", + "description": "Does not start with the specified string (case-insensitive).", "type": { - "kind": "OBJECT", - "name": "Task", + "kind": "SCALAR", + "name": "String", "ofType": null }, + "defaultValue": null, "isDeprecated": false, "deprecationReason": null }, { - "name": "workOnTask", - "description": null, - "args": [], + "name": "startsWith", + "description": "Starts with the specified string (case-sensitive).", "type": { - "kind": "OBJECT", - "name": "WorkOnTask", + "kind": "SCALAR", + "name": "String", "ofType": null }, + "defaultValue": null, "isDeprecated": false, "deprecationReason": null }, { - "name": "workOnTaskEdge", - "description": "An edge for our `WorkOnTask`. May be used by Relay 1.", - "args": [ - { - "name": "orderBy", - "description": "The method to use when ordering `WorkOnTask`.", - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "ENUM", - "name": "WorkOnTasksOrderBy", - "ofType": null - } - } - }, - "defaultValue": "[PRIMARY_KEY_ASC]", - "isDeprecated": false, - "deprecationReason": null - } - ], + "name": "startsWithInsensitive", + "description": "Starts with the specified string (case-insensitive).", "type": { - "kind": "OBJECT", - "name": "WorkOnTasksEdge", + "kind": "SCALAR", + "name": "String", "ofType": null }, + "defaultValue": null, "isDeprecated": false, "deprecationReason": null } ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "SCALAR", - "name": "String", - "description": "The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text.", - "fields": null, - "inputFields": null, "interfaces": null, "enumValues": null, "possibleTypes": null @@ -7921,6 +9638,18 @@ "isDeprecated": false, "deprecationReason": null }, + { + "name": "filter", + "description": "A filter to be used in determining which values should be returned by the collection.", + "type": { + "kind": "INPUT_OBJECT", + "name": "WorkOnTaskFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, { "name": "first", "description": "Only read the first `n` values of the set.", @@ -8031,6 +9760,129 @@ "defaultValue": null, "isDeprecated": false, "deprecationReason": null + }, + { + "name": "title", + "description": "Checks for equality with the object’s `title` field.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", + "name": "TaskFilter", + "description": "A filter to be used against `Task` object types. All fields are combined with a logical ‘and.’", + "fields": null, + "inputFields": [ + { + "name": "and", + "description": "Checks for all expressions in this list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "TaskFilter", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ctfId", + "description": "Filter by the object’s `ctfId` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "id", + "description": "Filter by the object’s `id` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "not", + "description": "Negates the expression.", + "type": { + "kind": "INPUT_OBJECT", + "name": "TaskFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "or", + "description": "Checks for any expressions in this list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "TaskFilter", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "solved", + "description": "Filter by the object’s `solved` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "BooleanFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "title", + "description": "Filter by the object’s `title` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null } ], "interfaces": null, @@ -8275,6 +10127,18 @@ "description": null, "isDeprecated": false, "deprecationReason": null + }, + { + "name": "TITLE_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "TITLE_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null } ], "possibleTypes": null @@ -9746,6 +11610,93 @@ "enumValues": null, "possibleTypes": null }, + { + "kind": "INPUT_OBJECT", + "name": "WorkOnTaskFilter", + "description": "A filter to be used against `WorkOnTask` object types. All fields are combined with a logical ‘and.’", + "fields": null, + "inputFields": [ + { + "name": "and", + "description": "Checks for all expressions in this list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "WorkOnTaskFilter", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "not", + "description": "Negates the expression.", + "type": { + "kind": "INPUT_OBJECT", + "name": "WorkOnTaskFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "or", + "description": "Checks for any expressions in this list.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "WorkOnTaskFilter", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "profileId", + "description": "Filter by the object’s `profileId` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "taskId", + "description": "Filter by the object’s `taskId` field.", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, { "kind": "OBJECT", "name": "WorkOnTasksConnection", diff --git a/front/package.json b/front/package.json index fa71e8cce..545ba8dd3 100644 --- a/front/package.json +++ b/front/package.json @@ -22,6 +22,7 @@ "apollo-upload-client": "^16.0.0", "color-hash": "^2.0.1", "core-js": "^3.6.5", + "hotkeys-js": "^3.8.7", "quasar": "^2.0.0", "slugify": "^1.6.1", "ts-essentials": "^9.0.0" diff --git a/front/src/App.vue b/front/src/App.vue index ae455124a..6b34cf7f6 100644 --- a/front/src/App.vue +++ b/front/src/App.vue @@ -1,14 +1,17 @@ + + + diff --git a/front/src/components/Menu/BaseMenuBar.vue b/front/src/components/Menu/BaseMenuBar.vue index f401c6a65..098d7bc76 100644 --- a/front/src/components/Menu/BaseMenuBar.vue +++ b/front/src/components/Menu/BaseMenuBar.vue @@ -7,6 +7,15 @@ CTFNote + + @@ -63,6 +73,7 @@ import CtfNoteLink from 'src/components/Utils/CtfNoteLink.vue'; import ctfnote from 'src/ctfnote'; import { useStoredSettings } from 'src/extensions/storedSettings'; import { defineComponent, ref, watch } from 'vue'; +import SearchDialogVue from '../Dialogs/SearchDialog.vue'; export default defineComponent({ components: { CtfNoteLink }, @@ -70,6 +81,7 @@ export default defineComponent({ dropDownLabel: { type: String, required: true }, dropDownLink: { type: String, required: true }, showLogout: { type: Boolean, default: false }, + showSearch: { type: Boolean, default: false }, }, setup() { @@ -95,6 +107,13 @@ export default defineComponent({ logout, }; }, + methods: { + openSearchDialog() { + this.$q.dialog({ + component: SearchDialogVue, + }); + }, + }, }); diff --git a/front/src/components/Menu/MainMenu.vue b/front/src/components/Menu/MainMenu.vue index 4f9957ff7..0a1dff6b4 100644 --- a/front/src/components/Menu/MainMenu.vue +++ b/front/src/components/Menu/MainMenu.vue @@ -3,6 +3,7 @@ :drop-down-label="me.profile.username" drop-down-link="settings" :show-logout="true" + :show-search="true" >