From f978299868bf352e147070afdf556bf1153bac56 Mon Sep 17 00:00:00 2001 From: Jarrod Flesch <30633324+JarrodMFlesch@users.noreply.github.com> Date: Fri, 2 Jun 2023 13:50:19 -0400 Subject: [PATCH] fix: graphql where types on rows and collapsible's (#2758) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Kári Yngvason Co-authored-by: NikolaGanchev <62907292+NikolaGanchev@users.noreply.github.com> Co-authored-by: James --- src/auth/operations/access.ts | 18 +- src/collections/operations/docAccess.ts | 6 +- src/globals/operations/docAccess.ts | 6 +- .../schema/fieldToWhereInputSchemaMap.ts | 95 +- .../schema/recursivelyBuildNestedPaths.ts | 31 +- src/graphql/schema/withOperators.ts | 4 +- src/mongoose/buildQuery.ts | 6 +- src/utilities/getEntityPolicies.ts | 59 +- test/collections-graphql/config.ts | 131 +- test/collections-graphql/int.spec.ts | 22 + test/collections-graphql/payload-types.ts | 56 +- test/collections-graphql/schema.graphql | 3020 +++++++++++++++++ test/collections-rest/config.ts | 59 + test/collections-rest/int.spec.ts | 15 + test/collections-rest/payload-types.ts | 25 +- .../generated-schema.graphql | 624 ++-- 16 files changed, 3719 insertions(+), 458 deletions(-) create mode 100644 test/collections-graphql/schema.graphql diff --git a/src/auth/operations/access.ts b/src/auth/operations/access.ts index 6adc51694d..dc44a4b1b4 100644 --- a/src/auth/operations/access.ts +++ b/src/auth/operations/access.ts @@ -24,19 +24,17 @@ async function accessOperation(args: Arguments): Promise { adminInitTelemetry(req); const results = {} as Permissions; - const promises = []; const isLoggedIn = !!(user); const userCollectionConfig = (user && user.collection) ? config.collections.find((collection) => collection.slug === user.collection) : null; - if (userCollectionConfig) { results.canAccessAdmin = userCollectionConfig.access.admin ? await userCollectionConfig.access.admin(args) : isLoggedIn; } else { results.canAccessAdmin = false; } - config.collections.forEach((collection) => { + await Promise.all(config.collections.map(async (collection) => { const collectionOperations = [...allOperations]; if (collection.auth && (typeof collection.auth.maxLoginAttempts !== 'undefined' && collection.auth.maxLoginAttempts !== 0)) { @@ -47,7 +45,7 @@ async function accessOperation(args: Arguments): Promise { collectionOperations.push('readVersions'); } - const [collectionPolicy, collectionPromises] = getEntityPolicies({ + const collectionPolicy = await getEntityPolicies({ type: 'collection', req, entity: collection, @@ -57,17 +55,16 @@ async function accessOperation(args: Arguments): Promise { ...results.collections, [collection.slug]: collectionPolicy, }; - promises.push(...collectionPromises); - }); + })); - config.globals.forEach((global) => { + await Promise.all(config.globals.map(async (global) => { const globalOperations: AllOperations[] = ['read', 'update']; if (global.versions) { globalOperations.push('readVersions'); } - const [globalPolicy, globalPromises] = getEntityPolicies({ + const globalPolicy = await getEntityPolicies({ type: 'global', req, entity: global, @@ -77,10 +74,7 @@ async function accessOperation(args: Arguments): Promise { ...results.globals, [global.slug]: globalPolicy, }; - promises.push(...globalPromises); - }); - - await Promise.all(promises); + })); return results; } diff --git a/src/collections/operations/docAccess.ts b/src/collections/operations/docAccess.ts index ad9b1d4c88..d49e810611 100644 --- a/src/collections/operations/docAccess.ts +++ b/src/collections/operations/docAccess.ts @@ -31,15 +31,11 @@ export async function docAccess(args: Arguments): Promise collectionOperations.push('readVersions'); } - const [policy, promises] = getEntityPolicies({ + return getEntityPolicies({ type: 'collection', req, entity: config, operations: collectionOperations, id, }); - - await Promise.all(promises); - - return policy; } diff --git a/src/globals/operations/docAccess.ts b/src/globals/operations/docAccess.ts index d06397a77a..6926e7ea10 100644 --- a/src/globals/operations/docAccess.ts +++ b/src/globals/operations/docAccess.ts @@ -21,14 +21,10 @@ export async function docAccess(args: Arguments): Promise { globalOperations.push('readVersions'); } - const [policy, promises] = getEntityPolicies({ + return getEntityPolicies({ type: 'global', req, entity: globalConfig, operations: globalOperations, }); - - await Promise.all(promises); - - return policy; } diff --git a/src/graphql/schema/fieldToWhereInputSchemaMap.ts b/src/graphql/schema/fieldToWhereInputSchemaMap.ts index 6143537bef..b96f15fba5 100644 --- a/src/graphql/schema/fieldToWhereInputSchemaMap.ts +++ b/src/graphql/schema/fieldToWhereInputSchemaMap.ts @@ -21,7 +21,7 @@ import combineParentName from '../utilities/combineParentName'; import formatName from '../utilities/formatName'; import recursivelyBuildNestedPaths from './recursivelyBuildNestedPaths'; -const fieldToSchemaMap = (parentName: string): any => ({ +const fieldToSchemaMap = (parentName: string, nestedFieldName?: string): any => ({ number: (field: NumberField) => ({ type: withOperators( field, @@ -130,94 +130,11 @@ const fieldToSchemaMap = (parentName: string): any => ({ parentName, ), }), - array: (field: ArrayField) => recursivelyBuildNestedPaths(parentName, field), - group: (field: GroupField) => recursivelyBuildNestedPaths(parentName, field), - row: (field: RowField) => field.fields.reduce((rowSchema, subField) => { - const getFieldSchema = fieldToSchemaMap(parentName)[subField.type]; - - if (getFieldSchema) { - const rowFieldSchema = getFieldSchema(subField); - - if (fieldHasSubFields(subField)) { - return [ - ...rowSchema, - ...rowFieldSchema, - ]; - } - - if (fieldAffectsData(subField)) { - return [ - ...rowSchema, - { - key: subField.name, - type: rowFieldSchema, - }, - ]; - } - } - - - return rowSchema; - }, []), - collapsible: (field: CollapsibleField) => field.fields.reduce((rowSchema, subField) => { - const getFieldSchema = fieldToSchemaMap(parentName)[subField.type]; - - if (getFieldSchema) { - const rowFieldSchema = getFieldSchema(subField); - - if (fieldHasSubFields(subField)) { - return [ - ...rowSchema, - ...rowFieldSchema, - ]; - } - - if (fieldAffectsData(subField)) { - return [ - ...rowSchema, - { - key: subField.name, - type: rowFieldSchema, - }, - ]; - } - } - - - return rowSchema; - }, []), - tabs: (field: TabsField) => field.tabs.reduce((tabSchema, tab) => { - return [ - ...tabSchema, - ...tab.fields.reduce((rowSchema, subField) => { - const getFieldSchema = fieldToSchemaMap(parentName)[subField.type]; - - if (getFieldSchema) { - const rowFieldSchema = getFieldSchema(subField); - - if (fieldHasSubFields(subField)) { - return [ - ...rowSchema, - ...rowFieldSchema, - ]; - } - - if (fieldAffectsData(subField)) { - return [ - ...rowSchema, - { - key: subField.name, - type: rowFieldSchema, - }, - ]; - } - } - - - return rowSchema; - }, []), - ]; - }, []), + array: (field: ArrayField) => recursivelyBuildNestedPaths(parentName, nestedFieldName, field), + group: (field: GroupField) => recursivelyBuildNestedPaths(parentName, nestedFieldName, field), + row: (field: RowField) => recursivelyBuildNestedPaths(parentName, nestedFieldName, field), + collapsible: (field: CollapsibleField) => recursivelyBuildNestedPaths(parentName, nestedFieldName, field), + tabs: (field: TabsField) => recursivelyBuildNestedPaths(parentName, nestedFieldName, field), }); export default fieldToSchemaMap; diff --git a/src/graphql/schema/recursivelyBuildNestedPaths.ts b/src/graphql/schema/recursivelyBuildNestedPaths.ts index 68a00c0410..f8058cfdd4 100644 --- a/src/graphql/schema/recursivelyBuildNestedPaths.ts +++ b/src/graphql/schema/recursivelyBuildNestedPaths.ts @@ -1,21 +1,40 @@ import { - FieldAffectingData, fieldAffectsData, fieldIsPresentationalOnly, FieldWithSubFields, + TabsField, } from '../../fields/config/types'; import fieldToSchemaMap from './fieldToWhereInputSchemaMap'; -const recursivelyBuildNestedPaths = (parentName: string, field: FieldWithSubFields & FieldAffectingData) => { +const recursivelyBuildNestedPaths = (parentName: string, nestedFieldName2: string, field: FieldWithSubFields | TabsField) => { + const fieldName = fieldAffectsData(field) ? field.name : undefined; + const nestedFieldName = fieldName || nestedFieldName2; + + if (field.type === 'tabs') { + // if the tab has a name, treat it as a group + // otherwise, treat it as a row + return field.tabs.reduce((tabSchema, tab: any) => { + tabSchema.push(...recursivelyBuildNestedPaths(parentName, nestedFieldName, { + ...tab, + type: 'name' in tab ? 'group' : 'row', + })); + return tabSchema; + }, []); + } + const nestedPaths = field.fields.reduce((nestedFields, nestedField) => { if (!fieldIsPresentationalOnly(nestedField)) { - const getFieldSchema = fieldToSchemaMap(parentName)[nestedField.type]; - const nestedFieldName = fieldAffectsData(nestedField) ? `${field.name}__${nestedField.name}` : undefined; + if (!fieldAffectsData(nestedField)) { + return recursivelyBuildNestedPaths(parentName, nestedFieldName, nestedField); + } + + const nestedPathName = fieldAffectsData(nestedField) ? `${nestedFieldName ? `${nestedFieldName}__` : ''}${nestedField.name}` : undefined; + const getFieldSchema = fieldToSchemaMap(parentName, nestedFieldName)[nestedField.type]; if (getFieldSchema) { const fieldSchema = getFieldSchema({ ...nestedField, - name: nestedFieldName, + name: nestedPathName, }); if (Array.isArray(fieldSchema)) { @@ -28,7 +47,7 @@ const recursivelyBuildNestedPaths = (parentName: string, field: FieldWithSubFiel return [ ...nestedFields, { - key: nestedFieldName, + key: nestedPathName, type: fieldSchema, }, ]; diff --git a/src/graphql/schema/withOperators.ts b/src/graphql/schema/withOperators.ts index ecbe84d927..9ae2c5c781 100644 --- a/src/graphql/schema/withOperators.ts +++ b/src/graphql/schema/withOperators.ts @@ -141,13 +141,15 @@ export const withOperators = (field: FieldAffectingData, parentName: string): Gr const fieldOperators = [...defaults[field.type].operators]; if (!('required' in field) || !field.required) fieldOperators.push('exists'); - let gqlType: GraphQLType = typeof defaults[field.type].type === 'function' + const initialGqlType: GraphQLType = typeof defaults[field.type].type === 'function' ? defaults[field.type].type(field, parentName) : defaults?.[field.type].type; return new GraphQLInputObjectType({ name, fields: fieldOperators.reduce((objectTypeFields, operator) => { + let gqlType = initialGqlType; + if (listOperators.includes(operator)) { gqlType = new GraphQLList(gqlType); } else if (operator === 'exists') { diff --git a/src/mongoose/buildQuery.ts b/src/mongoose/buildQuery.ts index 49b4a4bccc..450cb34207 100644 --- a/src/mongoose/buildQuery.ts +++ b/src/mongoose/buildQuery.ts @@ -381,14 +381,13 @@ export class ParamParser { collection.fields = fields; if (!this.policies.collections[collectionSlug]) { - const [policy, promises] = getEntityPolicies({ + const policy = await getEntityPolicies({ req: this.req, entity: collection, operations: ['read'], type: 'collection', }); - await Promise.all(promises); this.policies.collections[collectionSlug] = policy; } @@ -405,14 +404,13 @@ export class ParamParser { const global = { ...this.req.payload.globals.config.find(({ slug }) => slug === globalSlug) }; global.fields = fields; - const [policy, promises] = getEntityPolicies({ + const policy = await getEntityPolicies({ req: this.req, entity: global, operations: ['read'], type: 'global', }); - await Promise.all(promises); this.policies.globals[globalSlug] = policy; } diff --git a/src/utilities/getEntityPolicies.ts b/src/utilities/getEntityPolicies.ts index ae1bf6f10d..3a0ed6525e 100644 --- a/src/utilities/getEntityPolicies.ts +++ b/src/utilities/getEntityPolicies.ts @@ -15,7 +15,7 @@ type Args = { entity: SanitizedCollectionConfig | SanitizedGlobalConfig } -type ReturnType = T['type'] extends 'global' ? [GlobalPermission, Promise[]] : [CollectionPermission, Promise[]] +type ReturnType = T['type'] extends 'global' ? GlobalPermission : CollectionPermission type CreateAccessPromise = (args: { accessLevel: 'entity' | 'field', @@ -27,7 +27,7 @@ type CreateAccessPromise = (args: { disableWhere?: boolean, }) => Promise -export function getEntityPolicies(args: T): ReturnType { +export async function getEntityPolicies(args: T): Promise> { const { req, entity, operations, id, type } = args; const isLoggedIn = !!(req.user); // ---- ---- ---- ---- ---- ---- ---- ---- ---- @@ -36,8 +36,8 @@ export function getEntityPolicies(args: T): ReturnType { // ---- ---- ---- ---- ---- ---- ---- ---- ---- const policies = { fields: {}, - } as ReturnType[0]; - const promises = [] as ReturnType[1]; + } as ReturnType; + let docBeingAccessed; async function getEntityDoc({ where }: { where?: Where } = {}): Promise { @@ -112,24 +112,23 @@ export function getEntityPolicies(args: T): ReturnType { policiesObj, fields, operation, - entityAccessPromise, + entityPermission, }) => { const mutablePolicies = policiesObj.fields; - fields.forEach(async (field) => { + await Promise.all(fields.map(async (field) => { if (field.name) { if (!mutablePolicies[field.name]) mutablePolicies[field.name] = {}; if (field.access && typeof field.access[operation] === 'function') { - promises.push(createAccessPromise({ + await createAccessPromise({ policiesObj: mutablePolicies[field.name], access: field.access[operation], operation, disableWhere: true, accessLevel: 'field', - })); + }); } else { - if (entityAccessPromise) await entityAccessPromise; mutablePolicies[field.name][operation] = { permission: policiesObj[operation]?.permission, }; @@ -137,44 +136,49 @@ export function getEntityPolicies(args: T): ReturnType { if (field.fields) { if (!mutablePolicies[field.name].fields) mutablePolicies[field.name].fields = {}; - executeFieldPolicies({ + await executeFieldPolicies({ policiesObj: mutablePolicies[field.name], fields: field.fields, operation, - entityAccessPromise, + entityPermission, }); } } else if (field.fields) { - executeFieldPolicies({ + await executeFieldPolicies({ policiesObj, fields: field.fields, operation, - entityAccessPromise, + entityPermission, }); } else if (field.type === 'tabs') { - field.tabs.forEach((tab) => { + await Promise.all(field.tabs.map(async (tab) => { if (tabHasName(tab)) { - if (!mutablePolicies[tab.name]) mutablePolicies[tab.name] = { fields: {} }; - executeFieldPolicies({ + if (!mutablePolicies[tab.name]) { + mutablePolicies[tab.name] = { + fields: {}, + [operation]: { permission: entityPermission }, + }; + } + await executeFieldPolicies({ policiesObj: mutablePolicies[tab.name], fields: tab.fields, operation, - entityAccessPromise, + entityPermission, }); } else { - executeFieldPolicies({ + await executeFieldPolicies({ policiesObj, fields: tab.fields, operation, - entityAccessPromise, + entityPermission, }); } - }); + })); } - }); + })); }; - operations.forEach((operation) => { + await Promise.all(operations.map(async (operation) => { let entityAccessPromise: Promise; if (typeof entity.access[operation] === 'function') { @@ -184,20 +188,21 @@ export function getEntityPolicies(args: T): ReturnType { operation, accessLevel: 'entity', }); - promises.push(entityAccessPromise); } else { policies[operation] = { permission: isLoggedIn, }; } - executeFieldPolicies({ + await entityAccessPromise; + + await executeFieldPolicies({ policiesObj: policies, fields: entity.fields, operation, - entityAccessPromise, + entityPermission: policies[operation].permission, }); - }); + })); - return [policies, promises] as ReturnType; + return policies; } diff --git a/test/collections-graphql/config.ts b/test/collections-graphql/config.ts index 842fccc334..5ac35e1713 100644 --- a/test/collections-graphql/config.ts +++ b/test/collections-graphql/config.ts @@ -1,3 +1,4 @@ +import path from 'path'; import type { CollectionConfig } from '../../src/collections/config/types'; import { devUser } from '../credentials'; import { buildConfig } from '../buildConfig'; @@ -30,6 +31,9 @@ const collectionWithName = (collectionSlug: string): CollectionConfig => { export const slug = 'posts'; export const relationSlug = 'relation'; export default buildConfig({ + graphQL: { + schemaOutputFile: path.resolve(__dirname, 'schema.graphql'), + }, collections: [ { slug: 'users', @@ -89,6 +93,131 @@ export default buildConfig({ relationTo: [relationSlug, 'dummy'], hasMany: true, }, + { + name: 'A1', + type: 'group', + fields: [ + { + type: 'text', + name: 'A2', + defaultValue: 'textInRowInGroup', + }, + ], + }, + { + name: 'B1', + type: 'group', + fields: [ + { + type: 'collapsible', + label: 'Collapsible', + fields: [ + { + type: 'text', + name: 'B2', + defaultValue: 'textInRowInGroup', + }, + ], + }, + ], + }, + { + name: 'C1', + type: 'group', + fields: [ + { + type: 'row', + fields: [ + { + type: 'collapsible', + label: 'Collapsible2', + fields: [ + { + name: 'C2', + type: 'group', + fields: [ + { + type: 'row', + fields: [ + { + type: 'collapsible', + label: 'Collapsible2', + fields: [ + { + type: 'text', + name: 'C3', + }, + ], + }, + ], + }, + ], + }, + ], + }, + ], + }, + ], + }, + { + type: 'tabs', + tabs: [ + { + label: 'Tab1', + name: 'D1', + fields: [ + { + name: 'D2', + type: 'group', + fields: [ + { + type: 'row', + fields: [ + { + type: 'collapsible', + label: 'Collapsible2', + fields: [ + { + type: 'tabs', + tabs: [ + { + label: 'Tab1', + fields: [ + { + name: 'D3', + type: 'group', + fields: [ + { + type: 'row', + fields: [ + { + type: 'collapsible', + label: 'Collapsible2', + fields: [ + { + type: 'text', + name: 'D4', + }, + ], + }, + ], + }, + ], + }, + ], + }, + ], + }, + ], + }, + ], + }, + ], + }, + ], + }, + ], + }, ], }, { @@ -110,7 +239,7 @@ export default buildConfig({ collectionWithName(relationSlug), collectionWithName('dummy'), ], - onInit: async payload => { + onInit: async (payload) => { await payload.create({ collection: 'users', data: { diff --git a/test/collections-graphql/int.spec.ts b/test/collections-graphql/int.spec.ts index f57028ddf8..c7c94b4c98 100644 --- a/test/collections-graphql/int.spec.ts +++ b/test/collections-graphql/int.spec.ts @@ -363,6 +363,28 @@ describe('collections-graphql', () => { expect(docs).toContainEqual(expect.objectContaining({ id: specialPost.id })); }); + + it('can query deeply nested fields within rows, tabs, collapsibles', async () => { + const withNestedField = await createPost({ D1: { D2: { D3: { D4: 'nested message' } } } }); + const query = `{ + Posts(where: { D1__D2__D3__D4: { equals: "nested message" } }) { + docs { + id + D1 { + D2 { + D3 { + D4 + } + } + } + } + } + }`; + const response = await client.request(query); + const { docs } = response.Posts; + + expect(docs).toContainEqual(expect.objectContaining({ id: withNestedField.id, D1: { D2: { D3: { D4: 'nested message' } } } })); + }); }); describe('relationships', () => { diff --git a/test/collections-graphql/payload-types.ts b/test/collections-graphql/payload-types.ts index e4f3c7d5c3..433926f087 100644 --- a/test/collections-graphql/payload-types.ts +++ b/test/collections-graphql/payload-types.ts @@ -7,20 +7,33 @@ export interface Config { collections: { + users: User; posts: Post; + 'custom-ids': CustomId; relation: Relation; dummy: Dummy; - users: User; }; globals: {}; } +export interface User { + id: string; + updatedAt: string; + createdAt: string; + email?: string; + resetPasswordToken?: string; + resetPasswordExpiration?: string; + loginAttempts?: number; + lockUntil?: string; + password?: string; +} export interface Post { id: string; title?: string; description?: string; + number?: number; min?: number; - max?: number; relationField?: string | Relation; + relationToCustomID?: number | CustomId; relationHasManyField?: string[] | Relation[]; relationMultiRelationTo?: | { @@ -52,29 +65,42 @@ export interface Post { relationTo: 'dummy'; } )[]; - createdAt: string; + A1?: { + A2?: string; + }; + B1?: { + B2?: string; + }; + C1?: { + C2?: { + C3?: string; + }; + }; + D1: { + D2?: { + D3?: { + D4?: string; + }; + }; + }; updatedAt: string; + createdAt: string; } export interface Relation { id: string; name?: string; - createdAt: string; updatedAt: string; + createdAt: string; +} +export interface CustomId { + id: number; + title?: string; + updatedAt: string; + createdAt: string; } export interface Dummy { id: string; name?: string; - createdAt: string; updatedAt: string; -} -export interface User { - id: string; - email?: string; - resetPasswordToken?: string; - resetPasswordExpiration?: string; - loginAttempts?: number; - lockUntil?: string; createdAt: string; - updatedAt: string; - password?: string; } diff --git a/test/collections-graphql/schema.graphql b/test/collections-graphql/schema.graphql new file mode 100644 index 0000000000..38c60f5eed --- /dev/null +++ b/test/collections-graphql/schema.graphql @@ -0,0 +1,3020 @@ +type Query { + User(id: String!, draft: Boolean): User + Users(where: User_where, draft: Boolean, page: Int, limit: Int, sort: String): Users + docAccessUser(id: String!): usersDocAccess + meUser: usersMe + initializedUser: Boolean + Post(id: String!, draft: Boolean): Post + Posts(where: Post_where, draft: Boolean, page: Int, limit: Int, sort: String): Posts + docAccessPost(id: String!): postsDocAccess + CustomId(id: Int!, draft: Boolean): CustomId + CustomIds(where: CustomId_where, draft: Boolean, page: Int, limit: Int, sort: String): CustomIds + docAccessCustomId(id: Int!): custom_idsDocAccess + Relation(id: String!, draft: Boolean): Relation + Relations(where: Relation_where, draft: Boolean, page: Int, limit: Int, sort: String): Relations + docAccessRelation(id: String!): relationDocAccess + Dummy(id: String!, draft: Boolean): Dummy + Dummies(where: Dummy_where, draft: Boolean, page: Int, limit: Int, sort: String): Dummies + docAccessDummy(id: String!): dummyDocAccess + Preference(key: String): Preference + Access: Access +} + +type User { + id: String + updatedAt: DateTime + createdAt: DateTime + email: EmailAddress + resetPasswordToken: String + resetPasswordExpiration: DateTime + loginAttempts: Float + lockUntil: DateTime + password: String! +} + +""" +A date-time string at UTC, such as 2007-12-03T10:15:30Z, compliant with the `date-time` format outlined in section 5.6 of the RFC 3339 profile of the ISO 8601 standard for representation of dates and times using the Gregorian calendar. +""" +scalar DateTime + +""" +A field whose value conforms to the standard internet email address format as specified in HTML Spec: https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address. +""" +scalar EmailAddress @specifiedBy(url: "https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address") + +type Users { + docs: [User] + totalDocs: Int + offset: Int + limit: Int + totalPages: Int + page: Int + pagingCounter: Int + hasPrevPage: Boolean + hasNextPage: Boolean + prevPage: Int + nextPage: Int +} + +input User_where { + updatedAt: User_updatedAt_operator + createdAt: User_createdAt_operator + email: User_email_operator + id: User_id_operator + OR: [User_where_or] + AND: [User_where_and] +} + +input User_updatedAt_operator { + equals: DateTime + not_equals: DateTime + greater_than_equal: DateTime + greater_than: DateTime + less_than_equal: DateTime + less_than: DateTime + like: DateTime + exists: Boolean +} + +input User_createdAt_operator { + equals: DateTime + not_equals: DateTime + greater_than_equal: DateTime + greater_than: DateTime + less_than_equal: DateTime + less_than: DateTime + like: DateTime + exists: Boolean +} + +input User_email_operator { + equals: EmailAddress + not_equals: EmailAddress + like: EmailAddress + contains: EmailAddress + in: [EmailAddress] + not_in: [EmailAddress] + all: [EmailAddress] + exists: Boolean +} + +input User_id_operator { + equals: String + not_equals: String + like: String + contains: String + in: [String] + not_in: [String] + all: [String] + exists: Boolean +} + +input User_where_or { + updatedAt: User_updatedAt_operator + createdAt: User_createdAt_operator + email: User_email_operator + id: User_id_operator +} + +input User_where_and { + updatedAt: User_updatedAt_operator + createdAt: User_createdAt_operator + email: User_email_operator + id: User_id_operator +} + +type usersDocAccess { + fields: UsersDocAccessFields + create: UsersCreateDocAccess + read: UsersReadDocAccess + update: UsersUpdateDocAccess + delete: UsersDeleteDocAccess + unlock: UsersUnlockDocAccess +} + +type UsersDocAccessFields { + updatedAt: UsersDocAccessFields_updatedAt + createdAt: UsersDocAccessFields_createdAt + email: UsersDocAccessFields_email + password: UsersDocAccessFields_password +} + +type UsersDocAccessFields_updatedAt { + create: UsersDocAccessFields_updatedAt_Create + read: UsersDocAccessFields_updatedAt_Read + update: UsersDocAccessFields_updatedAt_Update + delete: UsersDocAccessFields_updatedAt_Delete +} + +type UsersDocAccessFields_updatedAt_Create { + permission: Boolean! +} + +type UsersDocAccessFields_updatedAt_Read { + permission: Boolean! +} + +type UsersDocAccessFields_updatedAt_Update { + permission: Boolean! +} + +type UsersDocAccessFields_updatedAt_Delete { + permission: Boolean! +} + +type UsersDocAccessFields_createdAt { + create: UsersDocAccessFields_createdAt_Create + read: UsersDocAccessFields_createdAt_Read + update: UsersDocAccessFields_createdAt_Update + delete: UsersDocAccessFields_createdAt_Delete +} + +type UsersDocAccessFields_createdAt_Create { + permission: Boolean! +} + +type UsersDocAccessFields_createdAt_Read { + permission: Boolean! +} + +type UsersDocAccessFields_createdAt_Update { + permission: Boolean! +} + +type UsersDocAccessFields_createdAt_Delete { + permission: Boolean! +} + +type UsersDocAccessFields_email { + create: UsersDocAccessFields_email_Create + read: UsersDocAccessFields_email_Read + update: UsersDocAccessFields_email_Update + delete: UsersDocAccessFields_email_Delete +} + +type UsersDocAccessFields_email_Create { + permission: Boolean! +} + +type UsersDocAccessFields_email_Read { + permission: Boolean! +} + +type UsersDocAccessFields_email_Update { + permission: Boolean! +} + +type UsersDocAccessFields_email_Delete { + permission: Boolean! +} + +type UsersDocAccessFields_password { + create: UsersDocAccessFields_password_Create + read: UsersDocAccessFields_password_Read + update: UsersDocAccessFields_password_Update + delete: UsersDocAccessFields_password_Delete +} + +type UsersDocAccessFields_password_Create { + permission: Boolean! +} + +type UsersDocAccessFields_password_Read { + permission: Boolean! +} + +type UsersDocAccessFields_password_Update { + permission: Boolean! +} + +type UsersDocAccessFields_password_Delete { + permission: Boolean! +} + +type UsersCreateDocAccess { + permission: Boolean! + where: JSONObject +} + +""" +The `JSONObject` scalar type represents JSON objects as specified by [ECMA-404](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf). +""" +scalar JSONObject + +type UsersReadDocAccess { + permission: Boolean! + where: JSONObject +} + +type UsersUpdateDocAccess { + permission: Boolean! + where: JSONObject +} + +type UsersDeleteDocAccess { + permission: Boolean! + where: JSONObject +} + +type UsersUnlockDocAccess { + permission: Boolean! + where: JSONObject +} + +type usersMe { + token: String + user: User + exp: Int + collection: String +} + +type Post { + id: String + title: String + description: String + number: Float + min: Float + relationField: Relation + relationToCustomID: CustomId + relationHasManyField: [Relation!] + relationMultiRelationTo: Post_RelationMultiRelationTo_Relationship + relationMultiRelationToHasMany: [Post_RelationMultiRelationToHasMany_Relationship!] + A1: Post_A1 + B1: Post_B1 + C1: Post_C1 + D1: Post_D1 + updatedAt: DateTime + createdAt: DateTime +} + +type Relation { + id: String + name: String + updatedAt: DateTime + createdAt: DateTime +} + +type CustomId { + id: Float + title: String + updatedAt: DateTime + createdAt: DateTime +} + +type Post_RelationMultiRelationTo_Relationship { + relationTo: Post_RelationMultiRelationTo_RelationTo + value: Post_RelationMultiRelationTo +} + +enum Post_RelationMultiRelationTo_RelationTo { + relation + dummy +} + +union Post_RelationMultiRelationTo = Relation | Dummy + +type Dummy { + id: String + name: String + updatedAt: DateTime + createdAt: DateTime +} + +type Post_RelationMultiRelationToHasMany_Relationship { + relationTo: Post_RelationMultiRelationToHasMany_RelationTo + value: Post_RelationMultiRelationToHasMany +} + +enum Post_RelationMultiRelationToHasMany_RelationTo { + relation + dummy +} + +union Post_RelationMultiRelationToHasMany = Relation | Dummy + +type Post_A1 { + A2: String +} + +type Post_B1 { + B2: String +} + +type Post_C1 { + C2: Post_C1_C2 +} + +type Post_C1_C2 { + C3: String +} + +type Post_D1 { + D2: Post_D1_D2 +} + +type Post_D1_D2 { + D3: Post_D1_D2_D3 +} + +type Post_D1_D2_D3 { + D4: String +} + +type Posts { + docs: [Post] + totalDocs: Int + offset: Int + limit: Int + totalPages: Int + page: Int + pagingCounter: Int + hasPrevPage: Boolean + hasNextPage: Boolean + prevPage: Int + nextPage: Int +} + +input Post_where { + title: Post_title_operator + description: Post_description_operator + number: Post_number_operator + min: Post_min_operator + relationField: Post_relationField_operator + relationToCustomID: Post_relationToCustomID_operator + relationHasManyField: Post_relationHasManyField_operator + relationMultiRelationTo: Post_relationMultiRelationTo_Relation + relationMultiRelationToHasMany: Post_relationMultiRelationToHasMany_Relation + A1__A2: Post_A1__A2_operator + B1__B2: Post_B1__B2_operator + C1__C2__C3: Post_C1__C2__C3_operator + D1__D2__D3__D4: Post_D1__D2__D3__D4_operator + updatedAt: Post_updatedAt_operator + createdAt: Post_createdAt_operator + id: Post_id_operator + OR: [Post_where_or] + AND: [Post_where_and] +} + +input Post_title_operator { + equals: String + not_equals: String + like: String + contains: String + in: [String] + not_in: [String] + all: [String] + exists: Boolean +} + +input Post_description_operator { + equals: String + not_equals: String + like: String + contains: String + in: [String] + not_in: [String] + all: [String] + exists: Boolean +} + +input Post_number_operator { + equals: Float + not_equals: Float + greater_than_equal: Float + greater_than: Float + less_than_equal: Float + less_than: Float + exists: Boolean +} + +input Post_min_operator { + equals: Float + not_equals: Float + greater_than_equal: Float + greater_than: Float + less_than_equal: Float + less_than: Float + exists: Boolean +} + +input Post_relationField_operator { + equals: String + not_equals: String + in: [String] + not_in: [String] + all: [String] + exists: Boolean +} + +input Post_relationToCustomID_operator { + equals: String + not_equals: String + in: [String] + not_in: [String] + all: [String] + exists: Boolean +} + +input Post_relationHasManyField_operator { + equals: String + not_equals: String + in: [String] + not_in: [String] + all: [String] + exists: Boolean +} + +input Post_relationMultiRelationTo_Relation { + relationTo: Post_relationMultiRelationTo_Relation_RelationTo + value: String +} + +enum Post_relationMultiRelationTo_Relation_RelationTo { + relation + dummy +} + +input Post_relationMultiRelationToHasMany_Relation { + relationTo: Post_relationMultiRelationToHasMany_Relation_RelationTo + value: String +} + +enum Post_relationMultiRelationToHasMany_Relation_RelationTo { + relation + dummy +} + +input Post_A1__A2_operator { + equals: String + not_equals: String + like: String + contains: String + in: [String] + not_in: [String] + all: [String] + exists: Boolean +} + +input Post_B1__B2_operator { + equals: String + not_equals: String + like: String + contains: String + in: [String] + not_in: [String] + all: [String] + exists: Boolean +} + +input Post_C1__C2__C3_operator { + equals: String + not_equals: String + like: String + contains: String + in: [String] + not_in: [String] + all: [String] + exists: Boolean +} + +input Post_D1__D2__D3__D4_operator { + equals: String + not_equals: String + like: String + contains: String + in: [String] + not_in: [String] + all: [String] + exists: Boolean +} + +input Post_updatedAt_operator { + equals: DateTime + not_equals: DateTime + greater_than_equal: DateTime + greater_than: DateTime + less_than_equal: DateTime + less_than: DateTime + like: DateTime + exists: Boolean +} + +input Post_createdAt_operator { + equals: DateTime + not_equals: DateTime + greater_than_equal: DateTime + greater_than: DateTime + less_than_equal: DateTime + less_than: DateTime + like: DateTime + exists: Boolean +} + +input Post_id_operator { + equals: String + not_equals: String + like: String + contains: String + in: [String] + not_in: [String] + all: [String] + exists: Boolean +} + +input Post_where_or { + title: Post_title_operator + description: Post_description_operator + number: Post_number_operator + min: Post_min_operator + relationField: Post_relationField_operator + relationToCustomID: Post_relationToCustomID_operator + relationHasManyField: Post_relationHasManyField_operator + relationMultiRelationTo: Post_relationMultiRelationTo_Relation + relationMultiRelationToHasMany: Post_relationMultiRelationToHasMany_Relation + A1__A2: Post_A1__A2_operator + B1__B2: Post_B1__B2_operator + C1__C2__C3: Post_C1__C2__C3_operator + D1__D2__D3__D4: Post_D1__D2__D3__D4_operator + updatedAt: Post_updatedAt_operator + createdAt: Post_createdAt_operator + id: Post_id_operator +} + +input Post_where_and { + title: Post_title_operator + description: Post_description_operator + number: Post_number_operator + min: Post_min_operator + relationField: Post_relationField_operator + relationToCustomID: Post_relationToCustomID_operator + relationHasManyField: Post_relationHasManyField_operator + relationMultiRelationTo: Post_relationMultiRelationTo_Relation + relationMultiRelationToHasMany: Post_relationMultiRelationToHasMany_Relation + A1__A2: Post_A1__A2_operator + B1__B2: Post_B1__B2_operator + C1__C2__C3: Post_C1__C2__C3_operator + D1__D2__D3__D4: Post_D1__D2__D3__D4_operator + updatedAt: Post_updatedAt_operator + createdAt: Post_createdAt_operator + id: Post_id_operator +} + +type postsDocAccess { + fields: PostsDocAccessFields + create: PostsCreateDocAccess + read: PostsReadDocAccess + update: PostsUpdateDocAccess + delete: PostsDeleteDocAccess +} + +type PostsDocAccessFields { + title: PostsDocAccessFields_title + description: PostsDocAccessFields_description + number: PostsDocAccessFields_number + min: PostsDocAccessFields_min + relationField: PostsDocAccessFields_relationField + relationToCustomID: PostsDocAccessFields_relationToCustomID + relationHasManyField: PostsDocAccessFields_relationHasManyField + relationMultiRelationTo: PostsDocAccessFields_relationMultiRelationTo + relationMultiRelationToHasMany: PostsDocAccessFields_relationMultiRelationToHasMany + A1: PostsDocAccessFields_A1 + B1: PostsDocAccessFields_B1 + C1: PostsDocAccessFields_C1 + D2: PostsDocAccessFields_D2 + updatedAt: PostsDocAccessFields_updatedAt + createdAt: PostsDocAccessFields_createdAt +} + +type PostsDocAccessFields_title { + create: PostsDocAccessFields_title_Create + read: PostsDocAccessFields_title_Read + update: PostsDocAccessFields_title_Update + delete: PostsDocAccessFields_title_Delete +} + +type PostsDocAccessFields_title_Create { + permission: Boolean! +} + +type PostsDocAccessFields_title_Read { + permission: Boolean! +} + +type PostsDocAccessFields_title_Update { + permission: Boolean! +} + +type PostsDocAccessFields_title_Delete { + permission: Boolean! +} + +type PostsDocAccessFields_description { + create: PostsDocAccessFields_description_Create + read: PostsDocAccessFields_description_Read + update: PostsDocAccessFields_description_Update + delete: PostsDocAccessFields_description_Delete +} + +type PostsDocAccessFields_description_Create { + permission: Boolean! +} + +type PostsDocAccessFields_description_Read { + permission: Boolean! +} + +type PostsDocAccessFields_description_Update { + permission: Boolean! +} + +type PostsDocAccessFields_description_Delete { + permission: Boolean! +} + +type PostsDocAccessFields_number { + create: PostsDocAccessFields_number_Create + read: PostsDocAccessFields_number_Read + update: PostsDocAccessFields_number_Update + delete: PostsDocAccessFields_number_Delete +} + +type PostsDocAccessFields_number_Create { + permission: Boolean! +} + +type PostsDocAccessFields_number_Read { + permission: Boolean! +} + +type PostsDocAccessFields_number_Update { + permission: Boolean! +} + +type PostsDocAccessFields_number_Delete { + permission: Boolean! +} + +type PostsDocAccessFields_min { + create: PostsDocAccessFields_min_Create + read: PostsDocAccessFields_min_Read + update: PostsDocAccessFields_min_Update + delete: PostsDocAccessFields_min_Delete +} + +type PostsDocAccessFields_min_Create { + permission: Boolean! +} + +type PostsDocAccessFields_min_Read { + permission: Boolean! +} + +type PostsDocAccessFields_min_Update { + permission: Boolean! +} + +type PostsDocAccessFields_min_Delete { + permission: Boolean! +} + +type PostsDocAccessFields_relationField { + create: PostsDocAccessFields_relationField_Create + read: PostsDocAccessFields_relationField_Read + update: PostsDocAccessFields_relationField_Update + delete: PostsDocAccessFields_relationField_Delete +} + +type PostsDocAccessFields_relationField_Create { + permission: Boolean! +} + +type PostsDocAccessFields_relationField_Read { + permission: Boolean! +} + +type PostsDocAccessFields_relationField_Update { + permission: Boolean! +} + +type PostsDocAccessFields_relationField_Delete { + permission: Boolean! +} + +type PostsDocAccessFields_relationToCustomID { + create: PostsDocAccessFields_relationToCustomID_Create + read: PostsDocAccessFields_relationToCustomID_Read + update: PostsDocAccessFields_relationToCustomID_Update + delete: PostsDocAccessFields_relationToCustomID_Delete +} + +type PostsDocAccessFields_relationToCustomID_Create { + permission: Boolean! +} + +type PostsDocAccessFields_relationToCustomID_Read { + permission: Boolean! +} + +type PostsDocAccessFields_relationToCustomID_Update { + permission: Boolean! +} + +type PostsDocAccessFields_relationToCustomID_Delete { + permission: Boolean! +} + +type PostsDocAccessFields_relationHasManyField { + create: PostsDocAccessFields_relationHasManyField_Create + read: PostsDocAccessFields_relationHasManyField_Read + update: PostsDocAccessFields_relationHasManyField_Update + delete: PostsDocAccessFields_relationHasManyField_Delete +} + +type PostsDocAccessFields_relationHasManyField_Create { + permission: Boolean! +} + +type PostsDocAccessFields_relationHasManyField_Read { + permission: Boolean! +} + +type PostsDocAccessFields_relationHasManyField_Update { + permission: Boolean! +} + +type PostsDocAccessFields_relationHasManyField_Delete { + permission: Boolean! +} + +type PostsDocAccessFields_relationMultiRelationTo { + create: PostsDocAccessFields_relationMultiRelationTo_Create + read: PostsDocAccessFields_relationMultiRelationTo_Read + update: PostsDocAccessFields_relationMultiRelationTo_Update + delete: PostsDocAccessFields_relationMultiRelationTo_Delete +} + +type PostsDocAccessFields_relationMultiRelationTo_Create { + permission: Boolean! +} + +type PostsDocAccessFields_relationMultiRelationTo_Read { + permission: Boolean! +} + +type PostsDocAccessFields_relationMultiRelationTo_Update { + permission: Boolean! +} + +type PostsDocAccessFields_relationMultiRelationTo_Delete { + permission: Boolean! +} + +type PostsDocAccessFields_relationMultiRelationToHasMany { + create: PostsDocAccessFields_relationMultiRelationToHasMany_Create + read: PostsDocAccessFields_relationMultiRelationToHasMany_Read + update: PostsDocAccessFields_relationMultiRelationToHasMany_Update + delete: PostsDocAccessFields_relationMultiRelationToHasMany_Delete +} + +type PostsDocAccessFields_relationMultiRelationToHasMany_Create { + permission: Boolean! +} + +type PostsDocAccessFields_relationMultiRelationToHasMany_Read { + permission: Boolean! +} + +type PostsDocAccessFields_relationMultiRelationToHasMany_Update { + permission: Boolean! +} + +type PostsDocAccessFields_relationMultiRelationToHasMany_Delete { + permission: Boolean! +} + +type PostsDocAccessFields_A1 { + create: PostsDocAccessFields_A1_Create + read: PostsDocAccessFields_A1_Read + update: PostsDocAccessFields_A1_Update + delete: PostsDocAccessFields_A1_Delete + fields: PostsDocAccessFields_A1_Fields +} + +type PostsDocAccessFields_A1_Create { + permission: Boolean! +} + +type PostsDocAccessFields_A1_Read { + permission: Boolean! +} + +type PostsDocAccessFields_A1_Update { + permission: Boolean! +} + +type PostsDocAccessFields_A1_Delete { + permission: Boolean! +} + +type PostsDocAccessFields_A1_Fields { + A2: PostsDocAccessFields_A1_A2 +} + +type PostsDocAccessFields_A1_A2 { + create: PostsDocAccessFields_A1_A2_Create + read: PostsDocAccessFields_A1_A2_Read + update: PostsDocAccessFields_A1_A2_Update + delete: PostsDocAccessFields_A1_A2_Delete +} + +type PostsDocAccessFields_A1_A2_Create { + permission: Boolean! +} + +type PostsDocAccessFields_A1_A2_Read { + permission: Boolean! +} + +type PostsDocAccessFields_A1_A2_Update { + permission: Boolean! +} + +type PostsDocAccessFields_A1_A2_Delete { + permission: Boolean! +} + +type PostsDocAccessFields_B1 { + create: PostsDocAccessFields_B1_Create + read: PostsDocAccessFields_B1_Read + update: PostsDocAccessFields_B1_Update + delete: PostsDocAccessFields_B1_Delete + fields: PostsDocAccessFields_B1_Fields +} + +type PostsDocAccessFields_B1_Create { + permission: Boolean! +} + +type PostsDocAccessFields_B1_Read { + permission: Boolean! +} + +type PostsDocAccessFields_B1_Update { + permission: Boolean! +} + +type PostsDocAccessFields_B1_Delete { + permission: Boolean! +} + +type PostsDocAccessFields_B1_Fields { + B2: PostsDocAccessFields_B1_B2 +} + +type PostsDocAccessFields_B1_B2 { + create: PostsDocAccessFields_B1_B2_Create + read: PostsDocAccessFields_B1_B2_Read + update: PostsDocAccessFields_B1_B2_Update + delete: PostsDocAccessFields_B1_B2_Delete +} + +type PostsDocAccessFields_B1_B2_Create { + permission: Boolean! +} + +type PostsDocAccessFields_B1_B2_Read { + permission: Boolean! +} + +type PostsDocAccessFields_B1_B2_Update { + permission: Boolean! +} + +type PostsDocAccessFields_B1_B2_Delete { + permission: Boolean! +} + +type PostsDocAccessFields_C1 { + create: PostsDocAccessFields_C1_Create + read: PostsDocAccessFields_C1_Read + update: PostsDocAccessFields_C1_Update + delete: PostsDocAccessFields_C1_Delete + fields: PostsDocAccessFields_C1_Fields +} + +type PostsDocAccessFields_C1_Create { + permission: Boolean! +} + +type PostsDocAccessFields_C1_Read { + permission: Boolean! +} + +type PostsDocAccessFields_C1_Update { + permission: Boolean! +} + +type PostsDocAccessFields_C1_Delete { + permission: Boolean! +} + +type PostsDocAccessFields_C1_Fields { + C2: PostsDocAccessFields_C1_C2 +} + +type PostsDocAccessFields_C1_C2 { + create: PostsDocAccessFields_C1_C2_Create + read: PostsDocAccessFields_C1_C2_Read + update: PostsDocAccessFields_C1_C2_Update + delete: PostsDocAccessFields_C1_C2_Delete + fields: PostsDocAccessFields_C1_C2_Fields +} + +type PostsDocAccessFields_C1_C2_Create { + permission: Boolean! +} + +type PostsDocAccessFields_C1_C2_Read { + permission: Boolean! +} + +type PostsDocAccessFields_C1_C2_Update { + permission: Boolean! +} + +type PostsDocAccessFields_C1_C2_Delete { + permission: Boolean! +} + +type PostsDocAccessFields_C1_C2_Fields { + C3: PostsDocAccessFields_C1_C2_C3 +} + +type PostsDocAccessFields_C1_C2_C3 { + create: PostsDocAccessFields_C1_C2_C3_Create + read: PostsDocAccessFields_C1_C2_C3_Read + update: PostsDocAccessFields_C1_C2_C3_Update + delete: PostsDocAccessFields_C1_C2_C3_Delete +} + +type PostsDocAccessFields_C1_C2_C3_Create { + permission: Boolean! +} + +type PostsDocAccessFields_C1_C2_C3_Read { + permission: Boolean! +} + +type PostsDocAccessFields_C1_C2_C3_Update { + permission: Boolean! +} + +type PostsDocAccessFields_C1_C2_C3_Delete { + permission: Boolean! +} + +type PostsDocAccessFields_D2 { + create: PostsDocAccessFields_D2_Create + read: PostsDocAccessFields_D2_Read + update: PostsDocAccessFields_D2_Update + delete: PostsDocAccessFields_D2_Delete + fields: PostsDocAccessFields_D2_Fields +} + +type PostsDocAccessFields_D2_Create { + permission: Boolean! +} + +type PostsDocAccessFields_D2_Read { + permission: Boolean! +} + +type PostsDocAccessFields_D2_Update { + permission: Boolean! +} + +type PostsDocAccessFields_D2_Delete { + permission: Boolean! +} + +type PostsDocAccessFields_D2_Fields { + D3: PostsDocAccessFields_D2_D3 +} + +type PostsDocAccessFields_D2_D3 { + create: PostsDocAccessFields_D2_D3_Create + read: PostsDocAccessFields_D2_D3_Read + update: PostsDocAccessFields_D2_D3_Update + delete: PostsDocAccessFields_D2_D3_Delete + fields: PostsDocAccessFields_D2_D3_Fields +} + +type PostsDocAccessFields_D2_D3_Create { + permission: Boolean! +} + +type PostsDocAccessFields_D2_D3_Read { + permission: Boolean! +} + +type PostsDocAccessFields_D2_D3_Update { + permission: Boolean! +} + +type PostsDocAccessFields_D2_D3_Delete { + permission: Boolean! +} + +type PostsDocAccessFields_D2_D3_Fields { + D4: PostsDocAccessFields_D2_D3_D4 +} + +type PostsDocAccessFields_D2_D3_D4 { + create: PostsDocAccessFields_D2_D3_D4_Create + read: PostsDocAccessFields_D2_D3_D4_Read + update: PostsDocAccessFields_D2_D3_D4_Update + delete: PostsDocAccessFields_D2_D3_D4_Delete +} + +type PostsDocAccessFields_D2_D3_D4_Create { + permission: Boolean! +} + +type PostsDocAccessFields_D2_D3_D4_Read { + permission: Boolean! +} + +type PostsDocAccessFields_D2_D3_D4_Update { + permission: Boolean! +} + +type PostsDocAccessFields_D2_D3_D4_Delete { + permission: Boolean! +} + +type PostsDocAccessFields_updatedAt { + create: PostsDocAccessFields_updatedAt_Create + read: PostsDocAccessFields_updatedAt_Read + update: PostsDocAccessFields_updatedAt_Update + delete: PostsDocAccessFields_updatedAt_Delete +} + +type PostsDocAccessFields_updatedAt_Create { + permission: Boolean! +} + +type PostsDocAccessFields_updatedAt_Read { + permission: Boolean! +} + +type PostsDocAccessFields_updatedAt_Update { + permission: Boolean! +} + +type PostsDocAccessFields_updatedAt_Delete { + permission: Boolean! +} + +type PostsDocAccessFields_createdAt { + create: PostsDocAccessFields_createdAt_Create + read: PostsDocAccessFields_createdAt_Read + update: PostsDocAccessFields_createdAt_Update + delete: PostsDocAccessFields_createdAt_Delete +} + +type PostsDocAccessFields_createdAt_Create { + permission: Boolean! +} + +type PostsDocAccessFields_createdAt_Read { + permission: Boolean! +} + +type PostsDocAccessFields_createdAt_Update { + permission: Boolean! +} + +type PostsDocAccessFields_createdAt_Delete { + permission: Boolean! +} + +type PostsCreateDocAccess { + permission: Boolean! + where: JSONObject +} + +type PostsReadDocAccess { + permission: Boolean! + where: JSONObject +} + +type PostsUpdateDocAccess { + permission: Boolean! + where: JSONObject +} + +type PostsDeleteDocAccess { + permission: Boolean! + where: JSONObject +} + +type CustomIds { + docs: [CustomId] + totalDocs: Int + offset: Int + limit: Int + totalPages: Int + page: Int + pagingCounter: Int + hasPrevPage: Boolean + hasNextPage: Boolean + prevPage: Int + nextPage: Int +} + +input CustomId_where { + id: CustomId_id_operator + title: CustomId_title_operator + updatedAt: CustomId_updatedAt_operator + createdAt: CustomId_createdAt_operator + OR: [CustomId_where_or] + AND: [CustomId_where_and] +} + +input CustomId_id_operator { + equals: Float + not_equals: Float + greater_than_equal: Float + greater_than: Float + less_than_equal: Float + less_than: Float + exists: Boolean +} + +input CustomId_title_operator { + equals: String + not_equals: String + like: String + contains: String + in: [String] + not_in: [String] + all: [String] + exists: Boolean +} + +input CustomId_updatedAt_operator { + equals: DateTime + not_equals: DateTime + greater_than_equal: DateTime + greater_than: DateTime + less_than_equal: DateTime + less_than: DateTime + like: DateTime + exists: Boolean +} + +input CustomId_createdAt_operator { + equals: DateTime + not_equals: DateTime + greater_than_equal: DateTime + greater_than: DateTime + less_than_equal: DateTime + less_than: DateTime + like: DateTime + exists: Boolean +} + +input CustomId_where_or { + id: CustomId_id_operator + title: CustomId_title_operator + updatedAt: CustomId_updatedAt_operator + createdAt: CustomId_createdAt_operator +} + +input CustomId_where_and { + id: CustomId_id_operator + title: CustomId_title_operator + updatedAt: CustomId_updatedAt_operator + createdAt: CustomId_createdAt_operator +} + +type custom_idsDocAccess { + fields: CustomIdsDocAccessFields + create: CustomIdsCreateDocAccess + read: CustomIdsReadDocAccess + update: CustomIdsUpdateDocAccess + delete: CustomIdsDeleteDocAccess +} + +type CustomIdsDocAccessFields { + id: CustomIdsDocAccessFields_id + title: CustomIdsDocAccessFields_title + updatedAt: CustomIdsDocAccessFields_updatedAt + createdAt: CustomIdsDocAccessFields_createdAt +} + +type CustomIdsDocAccessFields_id { + create: CustomIdsDocAccessFields_id_Create + read: CustomIdsDocAccessFields_id_Read + update: CustomIdsDocAccessFields_id_Update + delete: CustomIdsDocAccessFields_id_Delete +} + +type CustomIdsDocAccessFields_id_Create { + permission: Boolean! +} + +type CustomIdsDocAccessFields_id_Read { + permission: Boolean! +} + +type CustomIdsDocAccessFields_id_Update { + permission: Boolean! +} + +type CustomIdsDocAccessFields_id_Delete { + permission: Boolean! +} + +type CustomIdsDocAccessFields_title { + create: CustomIdsDocAccessFields_title_Create + read: CustomIdsDocAccessFields_title_Read + update: CustomIdsDocAccessFields_title_Update + delete: CustomIdsDocAccessFields_title_Delete +} + +type CustomIdsDocAccessFields_title_Create { + permission: Boolean! +} + +type CustomIdsDocAccessFields_title_Read { + permission: Boolean! +} + +type CustomIdsDocAccessFields_title_Update { + permission: Boolean! +} + +type CustomIdsDocAccessFields_title_Delete { + permission: Boolean! +} + +type CustomIdsDocAccessFields_updatedAt { + create: CustomIdsDocAccessFields_updatedAt_Create + read: CustomIdsDocAccessFields_updatedAt_Read + update: CustomIdsDocAccessFields_updatedAt_Update + delete: CustomIdsDocAccessFields_updatedAt_Delete +} + +type CustomIdsDocAccessFields_updatedAt_Create { + permission: Boolean! +} + +type CustomIdsDocAccessFields_updatedAt_Read { + permission: Boolean! +} + +type CustomIdsDocAccessFields_updatedAt_Update { + permission: Boolean! +} + +type CustomIdsDocAccessFields_updatedAt_Delete { + permission: Boolean! +} + +type CustomIdsDocAccessFields_createdAt { + create: CustomIdsDocAccessFields_createdAt_Create + read: CustomIdsDocAccessFields_createdAt_Read + update: CustomIdsDocAccessFields_createdAt_Update + delete: CustomIdsDocAccessFields_createdAt_Delete +} + +type CustomIdsDocAccessFields_createdAt_Create { + permission: Boolean! +} + +type CustomIdsDocAccessFields_createdAt_Read { + permission: Boolean! +} + +type CustomIdsDocAccessFields_createdAt_Update { + permission: Boolean! +} + +type CustomIdsDocAccessFields_createdAt_Delete { + permission: Boolean! +} + +type CustomIdsCreateDocAccess { + permission: Boolean! + where: JSONObject +} + +type CustomIdsReadDocAccess { + permission: Boolean! + where: JSONObject +} + +type CustomIdsUpdateDocAccess { + permission: Boolean! + where: JSONObject +} + +type CustomIdsDeleteDocAccess { + permission: Boolean! + where: JSONObject +} + +type Relations { + docs: [Relation] + totalDocs: Int + offset: Int + limit: Int + totalPages: Int + page: Int + pagingCounter: Int + hasPrevPage: Boolean + hasNextPage: Boolean + prevPage: Int + nextPage: Int +} + +input Relation_where { + name: Relation_name_operator + updatedAt: Relation_updatedAt_operator + createdAt: Relation_createdAt_operator + id: Relation_id_operator + OR: [Relation_where_or] + AND: [Relation_where_and] +} + +input Relation_name_operator { + equals: String + not_equals: String + like: String + contains: String + in: [String] + not_in: [String] + all: [String] + exists: Boolean +} + +input Relation_updatedAt_operator { + equals: DateTime + not_equals: DateTime + greater_than_equal: DateTime + greater_than: DateTime + less_than_equal: DateTime + less_than: DateTime + like: DateTime + exists: Boolean +} + +input Relation_createdAt_operator { + equals: DateTime + not_equals: DateTime + greater_than_equal: DateTime + greater_than: DateTime + less_than_equal: DateTime + less_than: DateTime + like: DateTime + exists: Boolean +} + +input Relation_id_operator { + equals: String + not_equals: String + like: String + contains: String + in: [String] + not_in: [String] + all: [String] + exists: Boolean +} + +input Relation_where_or { + name: Relation_name_operator + updatedAt: Relation_updatedAt_operator + createdAt: Relation_createdAt_operator + id: Relation_id_operator +} + +input Relation_where_and { + name: Relation_name_operator + updatedAt: Relation_updatedAt_operator + createdAt: Relation_createdAt_operator + id: Relation_id_operator +} + +type relationDocAccess { + fields: RelationDocAccessFields + create: RelationCreateDocAccess + read: RelationReadDocAccess + update: RelationUpdateDocAccess + delete: RelationDeleteDocAccess +} + +type RelationDocAccessFields { + name: RelationDocAccessFields_name + updatedAt: RelationDocAccessFields_updatedAt + createdAt: RelationDocAccessFields_createdAt +} + +type RelationDocAccessFields_name { + create: RelationDocAccessFields_name_Create + read: RelationDocAccessFields_name_Read + update: RelationDocAccessFields_name_Update + delete: RelationDocAccessFields_name_Delete +} + +type RelationDocAccessFields_name_Create { + permission: Boolean! +} + +type RelationDocAccessFields_name_Read { + permission: Boolean! +} + +type RelationDocAccessFields_name_Update { + permission: Boolean! +} + +type RelationDocAccessFields_name_Delete { + permission: Boolean! +} + +type RelationDocAccessFields_updatedAt { + create: RelationDocAccessFields_updatedAt_Create + read: RelationDocAccessFields_updatedAt_Read + update: RelationDocAccessFields_updatedAt_Update + delete: RelationDocAccessFields_updatedAt_Delete +} + +type RelationDocAccessFields_updatedAt_Create { + permission: Boolean! +} + +type RelationDocAccessFields_updatedAt_Read { + permission: Boolean! +} + +type RelationDocAccessFields_updatedAt_Update { + permission: Boolean! +} + +type RelationDocAccessFields_updatedAt_Delete { + permission: Boolean! +} + +type RelationDocAccessFields_createdAt { + create: RelationDocAccessFields_createdAt_Create + read: RelationDocAccessFields_createdAt_Read + update: RelationDocAccessFields_createdAt_Update + delete: RelationDocAccessFields_createdAt_Delete +} + +type RelationDocAccessFields_createdAt_Create { + permission: Boolean! +} + +type RelationDocAccessFields_createdAt_Read { + permission: Boolean! +} + +type RelationDocAccessFields_createdAt_Update { + permission: Boolean! +} + +type RelationDocAccessFields_createdAt_Delete { + permission: Boolean! +} + +type RelationCreateDocAccess { + permission: Boolean! + where: JSONObject +} + +type RelationReadDocAccess { + permission: Boolean! + where: JSONObject +} + +type RelationUpdateDocAccess { + permission: Boolean! + where: JSONObject +} + +type RelationDeleteDocAccess { + permission: Boolean! + where: JSONObject +} + +type Dummies { + docs: [Dummy] + totalDocs: Int + offset: Int + limit: Int + totalPages: Int + page: Int + pagingCounter: Int + hasPrevPage: Boolean + hasNextPage: Boolean + prevPage: Int + nextPage: Int +} + +input Dummy_where { + name: Dummy_name_operator + updatedAt: Dummy_updatedAt_operator + createdAt: Dummy_createdAt_operator + id: Dummy_id_operator + OR: [Dummy_where_or] + AND: [Dummy_where_and] +} + +input Dummy_name_operator { + equals: String + not_equals: String + like: String + contains: String + in: [String] + not_in: [String] + all: [String] + exists: Boolean +} + +input Dummy_updatedAt_operator { + equals: DateTime + not_equals: DateTime + greater_than_equal: DateTime + greater_than: DateTime + less_than_equal: DateTime + less_than: DateTime + like: DateTime + exists: Boolean +} + +input Dummy_createdAt_operator { + equals: DateTime + not_equals: DateTime + greater_than_equal: DateTime + greater_than: DateTime + less_than_equal: DateTime + less_than: DateTime + like: DateTime + exists: Boolean +} + +input Dummy_id_operator { + equals: String + not_equals: String + like: String + contains: String + in: [String] + not_in: [String] + all: [String] + exists: Boolean +} + +input Dummy_where_or { + name: Dummy_name_operator + updatedAt: Dummy_updatedAt_operator + createdAt: Dummy_createdAt_operator + id: Dummy_id_operator +} + +input Dummy_where_and { + name: Dummy_name_operator + updatedAt: Dummy_updatedAt_operator + createdAt: Dummy_createdAt_operator + id: Dummy_id_operator +} + +type dummyDocAccess { + fields: DummyDocAccessFields + create: DummyCreateDocAccess + read: DummyReadDocAccess + update: DummyUpdateDocAccess + delete: DummyDeleteDocAccess +} + +type DummyDocAccessFields { + name: DummyDocAccessFields_name + updatedAt: DummyDocAccessFields_updatedAt + createdAt: DummyDocAccessFields_createdAt +} + +type DummyDocAccessFields_name { + create: DummyDocAccessFields_name_Create + read: DummyDocAccessFields_name_Read + update: DummyDocAccessFields_name_Update + delete: DummyDocAccessFields_name_Delete +} + +type DummyDocAccessFields_name_Create { + permission: Boolean! +} + +type DummyDocAccessFields_name_Read { + permission: Boolean! +} + +type DummyDocAccessFields_name_Update { + permission: Boolean! +} + +type DummyDocAccessFields_name_Delete { + permission: Boolean! +} + +type DummyDocAccessFields_updatedAt { + create: DummyDocAccessFields_updatedAt_Create + read: DummyDocAccessFields_updatedAt_Read + update: DummyDocAccessFields_updatedAt_Update + delete: DummyDocAccessFields_updatedAt_Delete +} + +type DummyDocAccessFields_updatedAt_Create { + permission: Boolean! +} + +type DummyDocAccessFields_updatedAt_Read { + permission: Boolean! +} + +type DummyDocAccessFields_updatedAt_Update { + permission: Boolean! +} + +type DummyDocAccessFields_updatedAt_Delete { + permission: Boolean! +} + +type DummyDocAccessFields_createdAt { + create: DummyDocAccessFields_createdAt_Create + read: DummyDocAccessFields_createdAt_Read + update: DummyDocAccessFields_createdAt_Update + delete: DummyDocAccessFields_createdAt_Delete +} + +type DummyDocAccessFields_createdAt_Create { + permission: Boolean! +} + +type DummyDocAccessFields_createdAt_Read { + permission: Boolean! +} + +type DummyDocAccessFields_createdAt_Update { + permission: Boolean! +} + +type DummyDocAccessFields_createdAt_Delete { + permission: Boolean! +} + +type DummyCreateDocAccess { + permission: Boolean! + where: JSONObject +} + +type DummyReadDocAccess { + permission: Boolean! + where: JSONObject +} + +type DummyUpdateDocAccess { + permission: Boolean! + where: JSONObject +} + +type DummyDeleteDocAccess { + permission: Boolean! + where: JSONObject +} + +type Preference { + key: String! + value: JSON + createdAt: DateTime! + updatedAt: DateTime! +} + +""" +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 Access { + canAccessAdmin: Boolean! + users: usersAccess + posts: postsAccess + custom_ids: custom_idsAccess + relation: relationAccess + dummy: dummyAccess +} + +type usersAccess { + fields: UsersFields + create: UsersCreateAccess + read: UsersReadAccess + update: UsersUpdateAccess + delete: UsersDeleteAccess + unlock: UsersUnlockAccess +} + +type UsersFields { + updatedAt: UsersFields_updatedAt + createdAt: UsersFields_createdAt + email: UsersFields_email + password: UsersFields_password +} + +type UsersFields_updatedAt { + create: UsersFields_updatedAt_Create + read: UsersFields_updatedAt_Read + update: UsersFields_updatedAt_Update + delete: UsersFields_updatedAt_Delete +} + +type UsersFields_updatedAt_Create { + permission: Boolean! +} + +type UsersFields_updatedAt_Read { + permission: Boolean! +} + +type UsersFields_updatedAt_Update { + permission: Boolean! +} + +type UsersFields_updatedAt_Delete { + permission: Boolean! +} + +type UsersFields_createdAt { + create: UsersFields_createdAt_Create + read: UsersFields_createdAt_Read + update: UsersFields_createdAt_Update + delete: UsersFields_createdAt_Delete +} + +type UsersFields_createdAt_Create { + permission: Boolean! +} + +type UsersFields_createdAt_Read { + permission: Boolean! +} + +type UsersFields_createdAt_Update { + permission: Boolean! +} + +type UsersFields_createdAt_Delete { + permission: Boolean! +} + +type UsersFields_email { + create: UsersFields_email_Create + read: UsersFields_email_Read + update: UsersFields_email_Update + delete: UsersFields_email_Delete +} + +type UsersFields_email_Create { + permission: Boolean! +} + +type UsersFields_email_Read { + permission: Boolean! +} + +type UsersFields_email_Update { + permission: Boolean! +} + +type UsersFields_email_Delete { + permission: Boolean! +} + +type UsersFields_password { + create: UsersFields_password_Create + read: UsersFields_password_Read + update: UsersFields_password_Update + delete: UsersFields_password_Delete +} + +type UsersFields_password_Create { + permission: Boolean! +} + +type UsersFields_password_Read { + permission: Boolean! +} + +type UsersFields_password_Update { + permission: Boolean! +} + +type UsersFields_password_Delete { + permission: Boolean! +} + +type UsersCreateAccess { + permission: Boolean! + where: JSONObject +} + +type UsersReadAccess { + permission: Boolean! + where: JSONObject +} + +type UsersUpdateAccess { + permission: Boolean! + where: JSONObject +} + +type UsersDeleteAccess { + permission: Boolean! + where: JSONObject +} + +type UsersUnlockAccess { + permission: Boolean! + where: JSONObject +} + +type postsAccess { + fields: PostsFields + create: PostsCreateAccess + read: PostsReadAccess + update: PostsUpdateAccess + delete: PostsDeleteAccess +} + +type PostsFields { + title: PostsFields_title + description: PostsFields_description + number: PostsFields_number + min: PostsFields_min + relationField: PostsFields_relationField + relationToCustomID: PostsFields_relationToCustomID + relationHasManyField: PostsFields_relationHasManyField + relationMultiRelationTo: PostsFields_relationMultiRelationTo + relationMultiRelationToHasMany: PostsFields_relationMultiRelationToHasMany + A1: PostsFields_A1 + B1: PostsFields_B1 + C1: PostsFields_C1 + D2: PostsFields_D2 + updatedAt: PostsFields_updatedAt + createdAt: PostsFields_createdAt +} + +type PostsFields_title { + create: PostsFields_title_Create + read: PostsFields_title_Read + update: PostsFields_title_Update + delete: PostsFields_title_Delete +} + +type PostsFields_title_Create { + permission: Boolean! +} + +type PostsFields_title_Read { + permission: Boolean! +} + +type PostsFields_title_Update { + permission: Boolean! +} + +type PostsFields_title_Delete { + permission: Boolean! +} + +type PostsFields_description { + create: PostsFields_description_Create + read: PostsFields_description_Read + update: PostsFields_description_Update + delete: PostsFields_description_Delete +} + +type PostsFields_description_Create { + permission: Boolean! +} + +type PostsFields_description_Read { + permission: Boolean! +} + +type PostsFields_description_Update { + permission: Boolean! +} + +type PostsFields_description_Delete { + permission: Boolean! +} + +type PostsFields_number { + create: PostsFields_number_Create + read: PostsFields_number_Read + update: PostsFields_number_Update + delete: PostsFields_number_Delete +} + +type PostsFields_number_Create { + permission: Boolean! +} + +type PostsFields_number_Read { + permission: Boolean! +} + +type PostsFields_number_Update { + permission: Boolean! +} + +type PostsFields_number_Delete { + permission: Boolean! +} + +type PostsFields_min { + create: PostsFields_min_Create + read: PostsFields_min_Read + update: PostsFields_min_Update + delete: PostsFields_min_Delete +} + +type PostsFields_min_Create { + permission: Boolean! +} + +type PostsFields_min_Read { + permission: Boolean! +} + +type PostsFields_min_Update { + permission: Boolean! +} + +type PostsFields_min_Delete { + permission: Boolean! +} + +type PostsFields_relationField { + create: PostsFields_relationField_Create + read: PostsFields_relationField_Read + update: PostsFields_relationField_Update + delete: PostsFields_relationField_Delete +} + +type PostsFields_relationField_Create { + permission: Boolean! +} + +type PostsFields_relationField_Read { + permission: Boolean! +} + +type PostsFields_relationField_Update { + permission: Boolean! +} + +type PostsFields_relationField_Delete { + permission: Boolean! +} + +type PostsFields_relationToCustomID { + create: PostsFields_relationToCustomID_Create + read: PostsFields_relationToCustomID_Read + update: PostsFields_relationToCustomID_Update + delete: PostsFields_relationToCustomID_Delete +} + +type PostsFields_relationToCustomID_Create { + permission: Boolean! +} + +type PostsFields_relationToCustomID_Read { + permission: Boolean! +} + +type PostsFields_relationToCustomID_Update { + permission: Boolean! +} + +type PostsFields_relationToCustomID_Delete { + permission: Boolean! +} + +type PostsFields_relationHasManyField { + create: PostsFields_relationHasManyField_Create + read: PostsFields_relationHasManyField_Read + update: PostsFields_relationHasManyField_Update + delete: PostsFields_relationHasManyField_Delete +} + +type PostsFields_relationHasManyField_Create { + permission: Boolean! +} + +type PostsFields_relationHasManyField_Read { + permission: Boolean! +} + +type PostsFields_relationHasManyField_Update { + permission: Boolean! +} + +type PostsFields_relationHasManyField_Delete { + permission: Boolean! +} + +type PostsFields_relationMultiRelationTo { + create: PostsFields_relationMultiRelationTo_Create + read: PostsFields_relationMultiRelationTo_Read + update: PostsFields_relationMultiRelationTo_Update + delete: PostsFields_relationMultiRelationTo_Delete +} + +type PostsFields_relationMultiRelationTo_Create { + permission: Boolean! +} + +type PostsFields_relationMultiRelationTo_Read { + permission: Boolean! +} + +type PostsFields_relationMultiRelationTo_Update { + permission: Boolean! +} + +type PostsFields_relationMultiRelationTo_Delete { + permission: Boolean! +} + +type PostsFields_relationMultiRelationToHasMany { + create: PostsFields_relationMultiRelationToHasMany_Create + read: PostsFields_relationMultiRelationToHasMany_Read + update: PostsFields_relationMultiRelationToHasMany_Update + delete: PostsFields_relationMultiRelationToHasMany_Delete +} + +type PostsFields_relationMultiRelationToHasMany_Create { + permission: Boolean! +} + +type PostsFields_relationMultiRelationToHasMany_Read { + permission: Boolean! +} + +type PostsFields_relationMultiRelationToHasMany_Update { + permission: Boolean! +} + +type PostsFields_relationMultiRelationToHasMany_Delete { + permission: Boolean! +} + +type PostsFields_A1 { + create: PostsFields_A1_Create + read: PostsFields_A1_Read + update: PostsFields_A1_Update + delete: PostsFields_A1_Delete + fields: PostsFields_A1_Fields +} + +type PostsFields_A1_Create { + permission: Boolean! +} + +type PostsFields_A1_Read { + permission: Boolean! +} + +type PostsFields_A1_Update { + permission: Boolean! +} + +type PostsFields_A1_Delete { + permission: Boolean! +} + +type PostsFields_A1_Fields { + A2: PostsFields_A1_A2 +} + +type PostsFields_A1_A2 { + create: PostsFields_A1_A2_Create + read: PostsFields_A1_A2_Read + update: PostsFields_A1_A2_Update + delete: PostsFields_A1_A2_Delete +} + +type PostsFields_A1_A2_Create { + permission: Boolean! +} + +type PostsFields_A1_A2_Read { + permission: Boolean! +} + +type PostsFields_A1_A2_Update { + permission: Boolean! +} + +type PostsFields_A1_A2_Delete { + permission: Boolean! +} + +type PostsFields_B1 { + create: PostsFields_B1_Create + read: PostsFields_B1_Read + update: PostsFields_B1_Update + delete: PostsFields_B1_Delete + fields: PostsFields_B1_Fields +} + +type PostsFields_B1_Create { + permission: Boolean! +} + +type PostsFields_B1_Read { + permission: Boolean! +} + +type PostsFields_B1_Update { + permission: Boolean! +} + +type PostsFields_B1_Delete { + permission: Boolean! +} + +type PostsFields_B1_Fields { + B2: PostsFields_B1_B2 +} + +type PostsFields_B1_B2 { + create: PostsFields_B1_B2_Create + read: PostsFields_B1_B2_Read + update: PostsFields_B1_B2_Update + delete: PostsFields_B1_B2_Delete +} + +type PostsFields_B1_B2_Create { + permission: Boolean! +} + +type PostsFields_B1_B2_Read { + permission: Boolean! +} + +type PostsFields_B1_B2_Update { + permission: Boolean! +} + +type PostsFields_B1_B2_Delete { + permission: Boolean! +} + +type PostsFields_C1 { + create: PostsFields_C1_Create + read: PostsFields_C1_Read + update: PostsFields_C1_Update + delete: PostsFields_C1_Delete + fields: PostsFields_C1_Fields +} + +type PostsFields_C1_Create { + permission: Boolean! +} + +type PostsFields_C1_Read { + permission: Boolean! +} + +type PostsFields_C1_Update { + permission: Boolean! +} + +type PostsFields_C1_Delete { + permission: Boolean! +} + +type PostsFields_C1_Fields { + C2: PostsFields_C1_C2 +} + +type PostsFields_C1_C2 { + create: PostsFields_C1_C2_Create + read: PostsFields_C1_C2_Read + update: PostsFields_C1_C2_Update + delete: PostsFields_C1_C2_Delete + fields: PostsFields_C1_C2_Fields +} + +type PostsFields_C1_C2_Create { + permission: Boolean! +} + +type PostsFields_C1_C2_Read { + permission: Boolean! +} + +type PostsFields_C1_C2_Update { + permission: Boolean! +} + +type PostsFields_C1_C2_Delete { + permission: Boolean! +} + +type PostsFields_C1_C2_Fields { + C3: PostsFields_C1_C2_C3 +} + +type PostsFields_C1_C2_C3 { + create: PostsFields_C1_C2_C3_Create + read: PostsFields_C1_C2_C3_Read + update: PostsFields_C1_C2_C3_Update + delete: PostsFields_C1_C2_C3_Delete +} + +type PostsFields_C1_C2_C3_Create { + permission: Boolean! +} + +type PostsFields_C1_C2_C3_Read { + permission: Boolean! +} + +type PostsFields_C1_C2_C3_Update { + permission: Boolean! +} + +type PostsFields_C1_C2_C3_Delete { + permission: Boolean! +} + +type PostsFields_D2 { + create: PostsFields_D2_Create + read: PostsFields_D2_Read + update: PostsFields_D2_Update + delete: PostsFields_D2_Delete + fields: PostsFields_D2_Fields +} + +type PostsFields_D2_Create { + permission: Boolean! +} + +type PostsFields_D2_Read { + permission: Boolean! +} + +type PostsFields_D2_Update { + permission: Boolean! +} + +type PostsFields_D2_Delete { + permission: Boolean! +} + +type PostsFields_D2_Fields { + D3: PostsFields_D2_D3 +} + +type PostsFields_D2_D3 { + create: PostsFields_D2_D3_Create + read: PostsFields_D2_D3_Read + update: PostsFields_D2_D3_Update + delete: PostsFields_D2_D3_Delete + fields: PostsFields_D2_D3_Fields +} + +type PostsFields_D2_D3_Create { + permission: Boolean! +} + +type PostsFields_D2_D3_Read { + permission: Boolean! +} + +type PostsFields_D2_D3_Update { + permission: Boolean! +} + +type PostsFields_D2_D3_Delete { + permission: Boolean! +} + +type PostsFields_D2_D3_Fields { + D4: PostsFields_D2_D3_D4 +} + +type PostsFields_D2_D3_D4 { + create: PostsFields_D2_D3_D4_Create + read: PostsFields_D2_D3_D4_Read + update: PostsFields_D2_D3_D4_Update + delete: PostsFields_D2_D3_D4_Delete +} + +type PostsFields_D2_D3_D4_Create { + permission: Boolean! +} + +type PostsFields_D2_D3_D4_Read { + permission: Boolean! +} + +type PostsFields_D2_D3_D4_Update { + permission: Boolean! +} + +type PostsFields_D2_D3_D4_Delete { + permission: Boolean! +} + +type PostsFields_updatedAt { + create: PostsFields_updatedAt_Create + read: PostsFields_updatedAt_Read + update: PostsFields_updatedAt_Update + delete: PostsFields_updatedAt_Delete +} + +type PostsFields_updatedAt_Create { + permission: Boolean! +} + +type PostsFields_updatedAt_Read { + permission: Boolean! +} + +type PostsFields_updatedAt_Update { + permission: Boolean! +} + +type PostsFields_updatedAt_Delete { + permission: Boolean! +} + +type PostsFields_createdAt { + create: PostsFields_createdAt_Create + read: PostsFields_createdAt_Read + update: PostsFields_createdAt_Update + delete: PostsFields_createdAt_Delete +} + +type PostsFields_createdAt_Create { + permission: Boolean! +} + +type PostsFields_createdAt_Read { + permission: Boolean! +} + +type PostsFields_createdAt_Update { + permission: Boolean! +} + +type PostsFields_createdAt_Delete { + permission: Boolean! +} + +type PostsCreateAccess { + permission: Boolean! + where: JSONObject +} + +type PostsReadAccess { + permission: Boolean! + where: JSONObject +} + +type PostsUpdateAccess { + permission: Boolean! + where: JSONObject +} + +type PostsDeleteAccess { + permission: Boolean! + where: JSONObject +} + +type custom_idsAccess { + fields: CustomIdsFields + create: CustomIdsCreateAccess + read: CustomIdsReadAccess + update: CustomIdsUpdateAccess + delete: CustomIdsDeleteAccess +} + +type CustomIdsFields { + id: CustomIdsFields_id + title: CustomIdsFields_title + updatedAt: CustomIdsFields_updatedAt + createdAt: CustomIdsFields_createdAt +} + +type CustomIdsFields_id { + create: CustomIdsFields_id_Create + read: CustomIdsFields_id_Read + update: CustomIdsFields_id_Update + delete: CustomIdsFields_id_Delete +} + +type CustomIdsFields_id_Create { + permission: Boolean! +} + +type CustomIdsFields_id_Read { + permission: Boolean! +} + +type CustomIdsFields_id_Update { + permission: Boolean! +} + +type CustomIdsFields_id_Delete { + permission: Boolean! +} + +type CustomIdsFields_title { + create: CustomIdsFields_title_Create + read: CustomIdsFields_title_Read + update: CustomIdsFields_title_Update + delete: CustomIdsFields_title_Delete +} + +type CustomIdsFields_title_Create { + permission: Boolean! +} + +type CustomIdsFields_title_Read { + permission: Boolean! +} + +type CustomIdsFields_title_Update { + permission: Boolean! +} + +type CustomIdsFields_title_Delete { + permission: Boolean! +} + +type CustomIdsFields_updatedAt { + create: CustomIdsFields_updatedAt_Create + read: CustomIdsFields_updatedAt_Read + update: CustomIdsFields_updatedAt_Update + delete: CustomIdsFields_updatedAt_Delete +} + +type CustomIdsFields_updatedAt_Create { + permission: Boolean! +} + +type CustomIdsFields_updatedAt_Read { + permission: Boolean! +} + +type CustomIdsFields_updatedAt_Update { + permission: Boolean! +} + +type CustomIdsFields_updatedAt_Delete { + permission: Boolean! +} + +type CustomIdsFields_createdAt { + create: CustomIdsFields_createdAt_Create + read: CustomIdsFields_createdAt_Read + update: CustomIdsFields_createdAt_Update + delete: CustomIdsFields_createdAt_Delete +} + +type CustomIdsFields_createdAt_Create { + permission: Boolean! +} + +type CustomIdsFields_createdAt_Read { + permission: Boolean! +} + +type CustomIdsFields_createdAt_Update { + permission: Boolean! +} + +type CustomIdsFields_createdAt_Delete { + permission: Boolean! +} + +type CustomIdsCreateAccess { + permission: Boolean! + where: JSONObject +} + +type CustomIdsReadAccess { + permission: Boolean! + where: JSONObject +} + +type CustomIdsUpdateAccess { + permission: Boolean! + where: JSONObject +} + +type CustomIdsDeleteAccess { + permission: Boolean! + where: JSONObject +} + +type relationAccess { + fields: RelationFields + create: RelationCreateAccess + read: RelationReadAccess + update: RelationUpdateAccess + delete: RelationDeleteAccess +} + +type RelationFields { + name: RelationFields_name + updatedAt: RelationFields_updatedAt + createdAt: RelationFields_createdAt +} + +type RelationFields_name { + create: RelationFields_name_Create + read: RelationFields_name_Read + update: RelationFields_name_Update + delete: RelationFields_name_Delete +} + +type RelationFields_name_Create { + permission: Boolean! +} + +type RelationFields_name_Read { + permission: Boolean! +} + +type RelationFields_name_Update { + permission: Boolean! +} + +type RelationFields_name_Delete { + permission: Boolean! +} + +type RelationFields_updatedAt { + create: RelationFields_updatedAt_Create + read: RelationFields_updatedAt_Read + update: RelationFields_updatedAt_Update + delete: RelationFields_updatedAt_Delete +} + +type RelationFields_updatedAt_Create { + permission: Boolean! +} + +type RelationFields_updatedAt_Read { + permission: Boolean! +} + +type RelationFields_updatedAt_Update { + permission: Boolean! +} + +type RelationFields_updatedAt_Delete { + permission: Boolean! +} + +type RelationFields_createdAt { + create: RelationFields_createdAt_Create + read: RelationFields_createdAt_Read + update: RelationFields_createdAt_Update + delete: RelationFields_createdAt_Delete +} + +type RelationFields_createdAt_Create { + permission: Boolean! +} + +type RelationFields_createdAt_Read { + permission: Boolean! +} + +type RelationFields_createdAt_Update { + permission: Boolean! +} + +type RelationFields_createdAt_Delete { + permission: Boolean! +} + +type RelationCreateAccess { + permission: Boolean! + where: JSONObject +} + +type RelationReadAccess { + permission: Boolean! + where: JSONObject +} + +type RelationUpdateAccess { + permission: Boolean! + where: JSONObject +} + +type RelationDeleteAccess { + permission: Boolean! + where: JSONObject +} + +type dummyAccess { + fields: DummyFields + create: DummyCreateAccess + read: DummyReadAccess + update: DummyUpdateAccess + delete: DummyDeleteAccess +} + +type DummyFields { + name: DummyFields_name + updatedAt: DummyFields_updatedAt + createdAt: DummyFields_createdAt +} + +type DummyFields_name { + create: DummyFields_name_Create + read: DummyFields_name_Read + update: DummyFields_name_Update + delete: DummyFields_name_Delete +} + +type DummyFields_name_Create { + permission: Boolean! +} + +type DummyFields_name_Read { + permission: Boolean! +} + +type DummyFields_name_Update { + permission: Boolean! +} + +type DummyFields_name_Delete { + permission: Boolean! +} + +type DummyFields_updatedAt { + create: DummyFields_updatedAt_Create + read: DummyFields_updatedAt_Read + update: DummyFields_updatedAt_Update + delete: DummyFields_updatedAt_Delete +} + +type DummyFields_updatedAt_Create { + permission: Boolean! +} + +type DummyFields_updatedAt_Read { + permission: Boolean! +} + +type DummyFields_updatedAt_Update { + permission: Boolean! +} + +type DummyFields_updatedAt_Delete { + permission: Boolean! +} + +type DummyFields_createdAt { + create: DummyFields_createdAt_Create + read: DummyFields_createdAt_Read + update: DummyFields_createdAt_Update + delete: DummyFields_createdAt_Delete +} + +type DummyFields_createdAt_Create { + permission: Boolean! +} + +type DummyFields_createdAt_Read { + permission: Boolean! +} + +type DummyFields_createdAt_Update { + permission: Boolean! +} + +type DummyFields_createdAt_Delete { + permission: Boolean! +} + +type DummyCreateAccess { + permission: Boolean! + where: JSONObject +} + +type DummyReadAccess { + permission: Boolean! + where: JSONObject +} + +type DummyUpdateAccess { + permission: Boolean! + where: JSONObject +} + +type DummyDeleteAccess { + permission: Boolean! + where: JSONObject +} + +type Mutation { + createUser(data: mutationUserInput!, draft: Boolean): User + updateUser(id: String!, data: mutationUserUpdateInput!, draft: Boolean, autosave: Boolean): User + deleteUser(id: String!): User + refreshTokenUser(token: String): usersRefreshedUser + logoutUser: String + unlockUser(email: String!): Boolean! + loginUser(email: String, password: String): usersLoginResult + forgotPasswordUser(email: String!, disableEmail: Boolean, expiration: Int): Boolean! + resetPasswordUser(token: String, password: String): usersResetPassword + verifyEmailUser(token: String): Boolean + createPost(data: mutationPostInput!, draft: Boolean): Post + updatePost(id: String!, data: mutationPostUpdateInput!, draft: Boolean, autosave: Boolean): Post + deletePost(id: String!): Post + createCustomId(data: mutationCustomIdInput!, draft: Boolean): CustomId + updateCustomId(id: Int!, data: mutationCustomIdUpdateInput!, draft: Boolean, autosave: Boolean): CustomId + deleteCustomId(id: Int!): CustomId + createRelation(data: mutationRelationInput!, draft: Boolean): Relation + updateRelation(id: String!, data: mutationRelationUpdateInput!, draft: Boolean, autosave: Boolean): Relation + deleteRelation(id: String!): Relation + createDummy(data: mutationDummyInput!, draft: Boolean): Dummy + updateDummy(id: String!, data: mutationDummyUpdateInput!, draft: Boolean, autosave: Boolean): Dummy + deleteDummy(id: String!): Dummy + updatePreference(key: String!, value: JSON): Preference + deletePreference(key: String!): Preference +} + +input mutationUserInput { + updatedAt: String + createdAt: String + email: String + resetPasswordToken: String + resetPasswordExpiration: String + loginAttempts: Float + lockUntil: String + password: String! +} + +input mutationUserUpdateInput { + updatedAt: String + createdAt: String + email: String + resetPasswordToken: String + resetPasswordExpiration: String + loginAttempts: Float + lockUntil: String + password: String +} + +type usersRefreshedUser { + user: usersJWT + refreshedToken: String + exp: Int +} + +type usersJWT { + email: EmailAddress! + collection: String! +} + +type usersLoginResult { + token: String + user: User + exp: Int +} + +type usersResetPassword { + token: String + user: User +} + +input mutationPostInput { + title: String + description: String + number: Float + min: Float + relationField: String + relationToCustomID: Int + relationHasManyField: [String] + relationMultiRelationTo: Post_RelationMultiRelationToRelationshipInput + relationMultiRelationToHasMany: [Post_RelationMultiRelationToHasManyRelationshipInput] + A1: mutationPost_A1Input + B1: mutationPost_B1Input + C1: mutationPost_C1Input + D1: mutationPost_D1Input + updatedAt: String + createdAt: String +} + +input Post_RelationMultiRelationToRelationshipInput { + relationTo: Post_RelationMultiRelationToRelationshipInputRelationTo + value: JSON +} + +enum Post_RelationMultiRelationToRelationshipInputRelationTo { + relation + dummy +} + +input Post_RelationMultiRelationToHasManyRelationshipInput { + relationTo: Post_RelationMultiRelationToHasManyRelationshipInputRelationTo + value: JSON +} + +enum Post_RelationMultiRelationToHasManyRelationshipInputRelationTo { + relation + dummy +} + +input mutationPost_A1Input { + A2: String +} + +input mutationPost_B1Input { + B2: String +} + +input mutationPost_C1Input { + C2: mutationPost_C1_C2Input +} + +input mutationPost_C1_C2Input { + C3: String +} + +input mutationPost_D1Input { + D2: mutationPost_D1_D2Input +} + +input mutationPost_D1_D2Input { + D3: mutationPost_D1_D2_D3Input +} + +input mutationPost_D1_D2_D3Input { + D4: String +} + +input mutationPostUpdateInput { + title: String + description: String + number: Float + min: Float + relationField: String + relationToCustomID: Int + relationHasManyField: [String] + relationMultiRelationTo: PostUpdate_RelationMultiRelationToRelationshipInput + relationMultiRelationToHasMany: [PostUpdate_RelationMultiRelationToHasManyRelationshipInput] + A1: mutationPostUpdate_A1Input + B1: mutationPostUpdate_B1Input + C1: mutationPostUpdate_C1Input + D1: mutationPostUpdate_D1Input + updatedAt: String + createdAt: String +} + +input PostUpdate_RelationMultiRelationToRelationshipInput { + relationTo: PostUpdate_RelationMultiRelationToRelationshipInputRelationTo + value: JSON +} + +enum PostUpdate_RelationMultiRelationToRelationshipInputRelationTo { + relation + dummy +} + +input PostUpdate_RelationMultiRelationToHasManyRelationshipInput { + relationTo: PostUpdate_RelationMultiRelationToHasManyRelationshipInputRelationTo + value: JSON +} + +enum PostUpdate_RelationMultiRelationToHasManyRelationshipInputRelationTo { + relation + dummy +} + +input mutationPostUpdate_A1Input { + A2: String +} + +input mutationPostUpdate_B1Input { + B2: String +} + +input mutationPostUpdate_C1Input { + C2: mutationPostUpdate_C1_C2Input +} + +input mutationPostUpdate_C1_C2Input { + C3: String +} + +input mutationPostUpdate_D1Input { + D2: mutationPostUpdate_D1_D2Input +} + +input mutationPostUpdate_D1_D2Input { + D3: mutationPostUpdate_D1_D2_D3Input +} + +input mutationPostUpdate_D1_D2_D3Input { + D4: String +} + +input mutationCustomIdInput { + id: Int + title: String + updatedAt: String + createdAt: String +} + +input mutationCustomIdUpdateInput { + title: String + updatedAt: String + createdAt: String +} + +input mutationRelationInput { + name: String + updatedAt: String + createdAt: String +} + +input mutationRelationUpdateInput { + name: String + updatedAt: String + createdAt: String +} + +input mutationDummyInput { + name: String + updatedAt: String + createdAt: String +} + +input mutationDummyUpdateInput { + name: String + updatedAt: String + createdAt: String +} \ No newline at end of file diff --git a/test/collections-rest/config.ts b/test/collections-rest/config.ts index ff4e8579ef..75dd78bcf6 100644 --- a/test/collections-rest/config.ts +++ b/test/collections-rest/config.ts @@ -114,6 +114,65 @@ export default buildConfig({ read: () => false, }, }, + { + type: 'tabs', + tabs: [ + { + label: 'Tab1', + name: 'D1', + fields: [ + { + name: 'D2', + type: 'group', + fields: [ + { + type: 'row', + fields: [ + { + type: 'collapsible', + label: 'Collapsible2', + fields: [ + { + type: 'tabs', + tabs: [ + { + label: 'Tab1', + fields: [ + { + name: 'D3', + type: 'group', + fields: [ + { + type: 'row', + fields: [ + { + type: 'collapsible', + label: 'Collapsible2', + fields: [ + { + type: 'text', + name: 'D4', + }, + ], + }, + ], + }, + ], + }, + ], + }, + ], + }, + ], + }, + ], + }, + ], + }, + ], + }, + ], + }, ], }, { diff --git a/test/collections-rest/int.spec.ts b/test/collections-rest/int.spec.ts index 57210ce1fb..0715c105fc 100644 --- a/test/collections-rest/int.spec.ts +++ b/test/collections-rest/int.spec.ts @@ -899,6 +899,21 @@ describe('collections-rest', () => { expect(result.totalDocs).toEqual(50); }); }); + + it('can query deeply nested fields within rows, tabs, collapsibles', async () => { + const withDeeplyNestedField = await createPost({ D1: { D2: { D3: { D4: 'nested message' } } } }); + + const { result } = await client.find({ + query: { + 'D1.D2.D3.D4': { + equals: 'nested message', + }, + }, + }); + + expect(result.totalDocs).toEqual(1); + expect(result.docs).toEqual([withDeeplyNestedField]); + }); }); }); }); diff --git a/test/collections-rest/payload-types.ts b/test/collections-rest/payload-types.ts index b769fe51ed..05006dc269 100644 --- a/test/collections-rest/payload-types.ts +++ b/test/collections-rest/payload-types.ts @@ -57,21 +57,28 @@ export interface Post { } )[]; restrictedField?: string; - createdAt: string; + D1: { + D2?: { + D3?: { + D4?: string; + }; + }; + }; updatedAt: string; + createdAt: string; } export interface Relation { id: string; name?: string; - createdAt: string; updatedAt: string; + createdAt: string; } export interface Dummy { id: string; title?: string; name?: string; - createdAt: string; updatedAt: string; + createdAt: string; } export interface Point { id: string; @@ -80,37 +87,37 @@ export interface Point { * @maxItems 2 */ point?: [number, number]; - createdAt: string; updatedAt: string; + createdAt: string; } export interface CustomId { id: string; name?: string; - createdAt: string; updatedAt: string; + createdAt: string; } export interface CustomIdNumber { id: number; name?: string; - createdAt: string; updatedAt: string; + createdAt: string; } export interface ErrorOnHook { id: string; text?: string; errorBeforeChange?: boolean; errorAfterDelete?: boolean; - createdAt: string; updatedAt: string; + createdAt: string; } export interface User { id: string; + updatedAt: string; + createdAt: string; email?: string; resetPasswordToken?: string; resetPasswordExpiration?: string; loginAttempts?: number; lockUntil?: string; - createdAt: string; - updatedAt: string; password?: string; } diff --git a/test/graphql-schema-gen/generated-schema.graphql b/test/graphql-schema-gen/generated-schema.graphql index 04c152e2d5..75267a107d 100644 --- a/test/graphql-schema-gen/generated-schema.graphql +++ b/test/graphql-schema-gen/generated-schema.graphql @@ -26,15 +26,15 @@ type Post { relationHasManyField: [Relation!] relationMultiRelationTo: Post_RelationMultiRelationTo_Relationship relationMultiRelationToHasMany: [Post_RelationMultiRelationToHasMany_Relationship!] - createdAt: DateTime! - updatedAt: DateTime! + updatedAt: DateTime + createdAt: DateTime } type Relation { id: String name: String - createdAt: DateTime! - updatedAt: DateTime! + updatedAt: DateTime + createdAt: DateTime } """ @@ -57,8 +57,8 @@ union Post_RelationMultiRelationTo = Relation | Dummy type Dummy { id: String name: String - createdAt: DateTime! - updatedAt: DateTime! + updatedAt: DateTime + createdAt: DateTime } type Post_RelationMultiRelationToHasMany_Relationship { @@ -95,8 +95,8 @@ input Post_where { relationHasManyField: Post_relationHasManyField_operator relationMultiRelationTo: Post_relationMultiRelationTo_Relation relationMultiRelationToHasMany: Post_relationMultiRelationToHasMany_Relation - createdAt: Post_createdAt_operator updatedAt: Post_updatedAt_operator + createdAt: Post_createdAt_operator id: Post_id_operator OR: [Post_where_or] AND: [Post_where_and] @@ -172,17 +172,6 @@ enum Post_relationMultiRelationToHasMany_Relation_RelationTo { dummy } -input Post_createdAt_operator { - equals: DateTime - not_equals: DateTime - greater_than_equal: DateTime - greater_than: DateTime - less_than_equal: DateTime - less_than: DateTime - like: DateTime - exists: Boolean -} - input Post_updatedAt_operator { equals: DateTime not_equals: DateTime @@ -194,19 +183,27 @@ input Post_updatedAt_operator { exists: Boolean } -input Post_id_operator { - equals: JSON - not_equals: JSON - in: [JSON] - not_in: [JSON] - all: [JSON] +input Post_createdAt_operator { + equals: DateTime + not_equals: DateTime + greater_than_equal: DateTime + greater_than: DateTime + less_than_equal: DateTime + less_than: DateTime + like: DateTime exists: Boolean } -""" -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 +input Post_id_operator { + equals: String + not_equals: String + like: String + contains: String + in: [String] + not_in: [String] + all: [String] + exists: Boolean +} input Post_where_or { title: Post_title_operator @@ -216,8 +213,8 @@ input Post_where_or { relationHasManyField: Post_relationHasManyField_operator relationMultiRelationTo: Post_relationMultiRelationTo_Relation relationMultiRelationToHasMany: Post_relationMultiRelationToHasMany_Relation - createdAt: Post_createdAt_operator updatedAt: Post_updatedAt_operator + createdAt: Post_createdAt_operator id: Post_id_operator } @@ -229,8 +226,8 @@ input Post_where_and { relationHasManyField: Post_relationHasManyField_operator relationMultiRelationTo: Post_relationMultiRelationTo_Relation relationMultiRelationToHasMany: Post_relationMultiRelationToHasMany_Relation - createdAt: Post_createdAt_operator updatedAt: Post_updatedAt_operator + createdAt: Post_createdAt_operator id: Post_id_operator } @@ -250,8 +247,8 @@ type PostsDocAccessFields { relationHasManyField: PostsDocAccessFields_relationHasManyField relationMultiRelationTo: PostsDocAccessFields_relationMultiRelationTo relationMultiRelationToHasMany: PostsDocAccessFields_relationMultiRelationToHasMany - createdAt: PostsDocAccessFields_createdAt updatedAt: PostsDocAccessFields_updatedAt + createdAt: PostsDocAccessFields_createdAt } type PostsDocAccessFields_title { @@ -415,29 +412,6 @@ type PostsDocAccessFields_relationMultiRelationToHasMany_Delete { permission: Boolean! } -type PostsDocAccessFields_createdAt { - create: PostsDocAccessFields_createdAt_Create - read: PostsDocAccessFields_createdAt_Read - update: PostsDocAccessFields_createdAt_Update - delete: PostsDocAccessFields_createdAt_Delete -} - -type PostsDocAccessFields_createdAt_Create { - permission: Boolean! -} - -type PostsDocAccessFields_createdAt_Read { - permission: Boolean! -} - -type PostsDocAccessFields_createdAt_Update { - permission: Boolean! -} - -type PostsDocAccessFields_createdAt_Delete { - permission: Boolean! -} - type PostsDocAccessFields_updatedAt { create: PostsDocAccessFields_updatedAt_Create read: PostsDocAccessFields_updatedAt_Read @@ -461,6 +435,29 @@ type PostsDocAccessFields_updatedAt_Delete { permission: Boolean! } +type PostsDocAccessFields_createdAt { + create: PostsDocAccessFields_createdAt_Create + read: PostsDocAccessFields_createdAt_Read + update: PostsDocAccessFields_createdAt_Update + delete: PostsDocAccessFields_createdAt_Delete +} + +type PostsDocAccessFields_createdAt_Create { + permission: Boolean! +} + +type PostsDocAccessFields_createdAt_Read { + permission: Boolean! +} + +type PostsDocAccessFields_createdAt_Update { + permission: Boolean! +} + +type PostsDocAccessFields_createdAt_Delete { + permission: Boolean! +} + type PostsCreateDocAccess { permission: Boolean! where: JSONObject @@ -502,8 +499,8 @@ type Relations { input Relation_where { name: Relation_name_operator - createdAt: Relation_createdAt_operator updatedAt: Relation_updatedAt_operator + createdAt: Relation_createdAt_operator id: Relation_id_operator OR: [Relation_where_or] AND: [Relation_where_and] @@ -520,17 +517,6 @@ input Relation_name_operator { exists: Boolean } -input Relation_createdAt_operator { - equals: DateTime - not_equals: DateTime - greater_than_equal: DateTime - greater_than: DateTime - less_than_equal: DateTime - less_than: DateTime - like: DateTime - exists: Boolean -} - input Relation_updatedAt_operator { equals: DateTime not_equals: DateTime @@ -542,26 +528,39 @@ input Relation_updatedAt_operator { exists: Boolean } +input Relation_createdAt_operator { + equals: DateTime + not_equals: DateTime + greater_than_equal: DateTime + greater_than: DateTime + less_than_equal: DateTime + less_than: DateTime + like: DateTime + exists: Boolean +} + input Relation_id_operator { - equals: JSON - not_equals: JSON - in: [JSON] - not_in: [JSON] - all: [JSON] + equals: String + not_equals: String + like: String + contains: String + in: [String] + not_in: [String] + all: [String] exists: Boolean } input Relation_where_or { name: Relation_name_operator - createdAt: Relation_createdAt_operator updatedAt: Relation_updatedAt_operator + createdAt: Relation_createdAt_operator id: Relation_id_operator } input Relation_where_and { name: Relation_name_operator - createdAt: Relation_createdAt_operator updatedAt: Relation_updatedAt_operator + createdAt: Relation_createdAt_operator id: Relation_id_operator } @@ -575,8 +574,8 @@ type relationDocAccess { type RelationDocAccessFields { name: RelationDocAccessFields_name - createdAt: RelationDocAccessFields_createdAt updatedAt: RelationDocAccessFields_updatedAt + createdAt: RelationDocAccessFields_createdAt } type RelationDocAccessFields_name { @@ -602,29 +601,6 @@ type RelationDocAccessFields_name_Delete { permission: Boolean! } -type RelationDocAccessFields_createdAt { - create: RelationDocAccessFields_createdAt_Create - read: RelationDocAccessFields_createdAt_Read - update: RelationDocAccessFields_createdAt_Update - delete: RelationDocAccessFields_createdAt_Delete -} - -type RelationDocAccessFields_createdAt_Create { - permission: Boolean! -} - -type RelationDocAccessFields_createdAt_Read { - permission: Boolean! -} - -type RelationDocAccessFields_createdAt_Update { - permission: Boolean! -} - -type RelationDocAccessFields_createdAt_Delete { - permission: Boolean! -} - type RelationDocAccessFields_updatedAt { create: RelationDocAccessFields_updatedAt_Create read: RelationDocAccessFields_updatedAt_Read @@ -648,6 +624,29 @@ type RelationDocAccessFields_updatedAt_Delete { permission: Boolean! } +type RelationDocAccessFields_createdAt { + create: RelationDocAccessFields_createdAt_Create + read: RelationDocAccessFields_createdAt_Read + update: RelationDocAccessFields_createdAt_Update + delete: RelationDocAccessFields_createdAt_Delete +} + +type RelationDocAccessFields_createdAt_Create { + permission: Boolean! +} + +type RelationDocAccessFields_createdAt_Read { + permission: Boolean! +} + +type RelationDocAccessFields_createdAt_Update { + permission: Boolean! +} + +type RelationDocAccessFields_createdAt_Delete { + permission: Boolean! +} + type RelationCreateDocAccess { permission: Boolean! where: JSONObject @@ -684,8 +683,8 @@ type Dummies { input Dummy_where { name: Dummy_name_operator - createdAt: Dummy_createdAt_operator updatedAt: Dummy_updatedAt_operator + createdAt: Dummy_createdAt_operator id: Dummy_id_operator OR: [Dummy_where_or] AND: [Dummy_where_and] @@ -702,17 +701,6 @@ input Dummy_name_operator { exists: Boolean } -input Dummy_createdAt_operator { - equals: DateTime - not_equals: DateTime - greater_than_equal: DateTime - greater_than: DateTime - less_than_equal: DateTime - less_than: DateTime - like: DateTime - exists: Boolean -} - input Dummy_updatedAt_operator { equals: DateTime not_equals: DateTime @@ -724,26 +712,39 @@ input Dummy_updatedAt_operator { exists: Boolean } +input Dummy_createdAt_operator { + equals: DateTime + not_equals: DateTime + greater_than_equal: DateTime + greater_than: DateTime + less_than_equal: DateTime + less_than: DateTime + like: DateTime + exists: Boolean +} + input Dummy_id_operator { - equals: JSON - not_equals: JSON - in: [JSON] - not_in: [JSON] - all: [JSON] + equals: String + not_equals: String + like: String + contains: String + in: [String] + not_in: [String] + all: [String] exists: Boolean } input Dummy_where_or { name: Dummy_name_operator - createdAt: Dummy_createdAt_operator updatedAt: Dummy_updatedAt_operator + createdAt: Dummy_createdAt_operator id: Dummy_id_operator } input Dummy_where_and { name: Dummy_name_operator - createdAt: Dummy_createdAt_operator updatedAt: Dummy_updatedAt_operator + createdAt: Dummy_createdAt_operator id: Dummy_id_operator } @@ -757,8 +758,8 @@ type dummyDocAccess { type DummyDocAccessFields { name: DummyDocAccessFields_name - createdAt: DummyDocAccessFields_createdAt updatedAt: DummyDocAccessFields_updatedAt + createdAt: DummyDocAccessFields_createdAt } type DummyDocAccessFields_name { @@ -784,29 +785,6 @@ type DummyDocAccessFields_name_Delete { permission: Boolean! } -type DummyDocAccessFields_createdAt { - create: DummyDocAccessFields_createdAt_Create - read: DummyDocAccessFields_createdAt_Read - update: DummyDocAccessFields_createdAt_Update - delete: DummyDocAccessFields_createdAt_Delete -} - -type DummyDocAccessFields_createdAt_Create { - permission: Boolean! -} - -type DummyDocAccessFields_createdAt_Read { - permission: Boolean! -} - -type DummyDocAccessFields_createdAt_Update { - permission: Boolean! -} - -type DummyDocAccessFields_createdAt_Delete { - permission: Boolean! -} - type DummyDocAccessFields_updatedAt { create: DummyDocAccessFields_updatedAt_Create read: DummyDocAccessFields_updatedAt_Read @@ -830,6 +808,29 @@ type DummyDocAccessFields_updatedAt_Delete { permission: Boolean! } +type DummyDocAccessFields_createdAt { + create: DummyDocAccessFields_createdAt_Create + read: DummyDocAccessFields_createdAt_Read + update: DummyDocAccessFields_createdAt_Update + delete: DummyDocAccessFields_createdAt_Delete +} + +type DummyDocAccessFields_createdAt_Create { + permission: Boolean! +} + +type DummyDocAccessFields_createdAt_Read { + permission: Boolean! +} + +type DummyDocAccessFields_createdAt_Update { + permission: Boolean! +} + +type DummyDocAccessFields_createdAt_Delete { + permission: Boolean! +} + type DummyCreateDocAccess { permission: Boolean! where: JSONObject @@ -852,8 +853,8 @@ type DummyDeleteDocAccess { type User { id: String - createdAt: DateTime! - updatedAt: DateTime! + updatedAt: DateTime + createdAt: DateTime email: EmailAddress resetPasswordToken: String resetPasswordExpiration: DateTime @@ -882,15 +883,15 @@ type Users { } input User_where { - createdAt: User_createdAt_operator updatedAt: User_updatedAt_operator + createdAt: User_createdAt_operator email: User_email_operator id: User_id_operator OR: [User_where_or] AND: [User_where_and] } -input User_createdAt_operator { +input User_updatedAt_operator { equals: DateTime not_equals: DateTime greater_than_equal: DateTime @@ -901,7 +902,7 @@ input User_createdAt_operator { exists: Boolean } -input User_updatedAt_operator { +input User_createdAt_operator { equals: DateTime not_equals: DateTime greater_than_equal: DateTime @@ -924,24 +925,26 @@ input User_email_operator { } input User_id_operator { - equals: JSON - not_equals: JSON - in: [JSON] - not_in: [JSON] - all: [JSON] + equals: String + not_equals: String + like: String + contains: String + in: [String] + not_in: [String] + all: [String] exists: Boolean } input User_where_or { - createdAt: User_createdAt_operator updatedAt: User_updatedAt_operator + createdAt: User_createdAt_operator email: User_email_operator id: User_id_operator } input User_where_and { - createdAt: User_createdAt_operator updatedAt: User_updatedAt_operator + createdAt: User_createdAt_operator email: User_email_operator id: User_id_operator } @@ -956,32 +959,10 @@ type usersDocAccess { } type UsersDocAccessFields { - createdAt: UsersDocAccessFields_createdAt updatedAt: UsersDocAccessFields_updatedAt + createdAt: UsersDocAccessFields_createdAt email: UsersDocAccessFields_email -} - -type UsersDocAccessFields_createdAt { - create: UsersDocAccessFields_createdAt_Create - read: UsersDocAccessFields_createdAt_Read - update: UsersDocAccessFields_createdAt_Update - delete: UsersDocAccessFields_createdAt_Delete -} - -type UsersDocAccessFields_createdAt_Create { - permission: Boolean! -} - -type UsersDocAccessFields_createdAt_Read { - permission: Boolean! -} - -type UsersDocAccessFields_createdAt_Update { - permission: Boolean! -} - -type UsersDocAccessFields_createdAt_Delete { - permission: Boolean! + password: UsersDocAccessFields_password } type UsersDocAccessFields_updatedAt { @@ -1007,6 +988,29 @@ type UsersDocAccessFields_updatedAt_Delete { permission: Boolean! } +type UsersDocAccessFields_createdAt { + create: UsersDocAccessFields_createdAt_Create + read: UsersDocAccessFields_createdAt_Read + update: UsersDocAccessFields_createdAt_Update + delete: UsersDocAccessFields_createdAt_Delete +} + +type UsersDocAccessFields_createdAt_Create { + permission: Boolean! +} + +type UsersDocAccessFields_createdAt_Read { + permission: Boolean! +} + +type UsersDocAccessFields_createdAt_Update { + permission: Boolean! +} + +type UsersDocAccessFields_createdAt_Delete { + permission: Boolean! +} + type UsersDocAccessFields_email { create: UsersDocAccessFields_email_Create read: UsersDocAccessFields_email_Read @@ -1030,6 +1034,29 @@ type UsersDocAccessFields_email_Delete { permission: Boolean! } +type UsersDocAccessFields_password { + create: UsersDocAccessFields_password_Create + read: UsersDocAccessFields_password_Read + update: UsersDocAccessFields_password_Update + delete: UsersDocAccessFields_password_Delete +} + +type UsersDocAccessFields_password_Create { + permission: Boolean! +} + +type UsersDocAccessFields_password_Read { + permission: Boolean! +} + +type UsersDocAccessFields_password_Update { + permission: Boolean! +} + +type UsersDocAccessFields_password_Delete { + permission: Boolean! +} + type UsersCreateDocAccess { permission: Boolean! where: JSONObject @@ -1069,6 +1096,11 @@ type Preference { updatedAt: DateTime! } +""" +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 Access { canAccessAdmin: Boolean! posts: postsAccess @@ -1093,8 +1125,8 @@ type PostsFields { relationHasManyField: PostsFields_relationHasManyField relationMultiRelationTo: PostsFields_relationMultiRelationTo relationMultiRelationToHasMany: PostsFields_relationMultiRelationToHasMany - createdAt: PostsFields_createdAt updatedAt: PostsFields_updatedAt + createdAt: PostsFields_createdAt } type PostsFields_title { @@ -1258,29 +1290,6 @@ type PostsFields_relationMultiRelationToHasMany_Delete { permission: Boolean! } -type PostsFields_createdAt { - create: PostsFields_createdAt_Create - read: PostsFields_createdAt_Read - update: PostsFields_createdAt_Update - delete: PostsFields_createdAt_Delete -} - -type PostsFields_createdAt_Create { - permission: Boolean! -} - -type PostsFields_createdAt_Read { - permission: Boolean! -} - -type PostsFields_createdAt_Update { - permission: Boolean! -} - -type PostsFields_createdAt_Delete { - permission: Boolean! -} - type PostsFields_updatedAt { create: PostsFields_updatedAt_Create read: PostsFields_updatedAt_Read @@ -1304,6 +1313,29 @@ type PostsFields_updatedAt_Delete { permission: Boolean! } +type PostsFields_createdAt { + create: PostsFields_createdAt_Create + read: PostsFields_createdAt_Read + update: PostsFields_createdAt_Update + delete: PostsFields_createdAt_Delete +} + +type PostsFields_createdAt_Create { + permission: Boolean! +} + +type PostsFields_createdAt_Read { + permission: Boolean! +} + +type PostsFields_createdAt_Update { + permission: Boolean! +} + +type PostsFields_createdAt_Delete { + permission: Boolean! +} + type PostsCreateAccess { permission: Boolean! where: JSONObject @@ -1334,8 +1366,8 @@ type relationAccess { type RelationFields { name: RelationFields_name - createdAt: RelationFields_createdAt updatedAt: RelationFields_updatedAt + createdAt: RelationFields_createdAt } type RelationFields_name { @@ -1361,29 +1393,6 @@ type RelationFields_name_Delete { permission: Boolean! } -type RelationFields_createdAt { - create: RelationFields_createdAt_Create - read: RelationFields_createdAt_Read - update: RelationFields_createdAt_Update - delete: RelationFields_createdAt_Delete -} - -type RelationFields_createdAt_Create { - permission: Boolean! -} - -type RelationFields_createdAt_Read { - permission: Boolean! -} - -type RelationFields_createdAt_Update { - permission: Boolean! -} - -type RelationFields_createdAt_Delete { - permission: Boolean! -} - type RelationFields_updatedAt { create: RelationFields_updatedAt_Create read: RelationFields_updatedAt_Read @@ -1407,6 +1416,29 @@ type RelationFields_updatedAt_Delete { permission: Boolean! } +type RelationFields_createdAt { + create: RelationFields_createdAt_Create + read: RelationFields_createdAt_Read + update: RelationFields_createdAt_Update + delete: RelationFields_createdAt_Delete +} + +type RelationFields_createdAt_Create { + permission: Boolean! +} + +type RelationFields_createdAt_Read { + permission: Boolean! +} + +type RelationFields_createdAt_Update { + permission: Boolean! +} + +type RelationFields_createdAt_Delete { + permission: Boolean! +} + type RelationCreateAccess { permission: Boolean! where: JSONObject @@ -1437,8 +1469,8 @@ type dummyAccess { type DummyFields { name: DummyFields_name - createdAt: DummyFields_createdAt updatedAt: DummyFields_updatedAt + createdAt: DummyFields_createdAt } type DummyFields_name { @@ -1464,29 +1496,6 @@ type DummyFields_name_Delete { permission: Boolean! } -type DummyFields_createdAt { - create: DummyFields_createdAt_Create - read: DummyFields_createdAt_Read - update: DummyFields_createdAt_Update - delete: DummyFields_createdAt_Delete -} - -type DummyFields_createdAt_Create { - permission: Boolean! -} - -type DummyFields_createdAt_Read { - permission: Boolean! -} - -type DummyFields_createdAt_Update { - permission: Boolean! -} - -type DummyFields_createdAt_Delete { - permission: Boolean! -} - type DummyFields_updatedAt { create: DummyFields_updatedAt_Create read: DummyFields_updatedAt_Read @@ -1510,6 +1519,29 @@ type DummyFields_updatedAt_Delete { permission: Boolean! } +type DummyFields_createdAt { + create: DummyFields_createdAt_Create + read: DummyFields_createdAt_Read + update: DummyFields_createdAt_Update + delete: DummyFields_createdAt_Delete +} + +type DummyFields_createdAt_Create { + permission: Boolean! +} + +type DummyFields_createdAt_Read { + permission: Boolean! +} + +type DummyFields_createdAt_Update { + permission: Boolean! +} + +type DummyFields_createdAt_Delete { + permission: Boolean! +} + type DummyCreateAccess { permission: Boolean! where: JSONObject @@ -1540,32 +1572,10 @@ type usersAccess { } type UsersFields { - createdAt: UsersFields_createdAt updatedAt: UsersFields_updatedAt + createdAt: UsersFields_createdAt email: UsersFields_email -} - -type UsersFields_createdAt { - create: UsersFields_createdAt_Create - read: UsersFields_createdAt_Read - update: UsersFields_createdAt_Update - delete: UsersFields_createdAt_Delete -} - -type UsersFields_createdAt_Create { - permission: Boolean! -} - -type UsersFields_createdAt_Read { - permission: Boolean! -} - -type UsersFields_createdAt_Update { - permission: Boolean! -} - -type UsersFields_createdAt_Delete { - permission: Boolean! + password: UsersFields_password } type UsersFields_updatedAt { @@ -1591,6 +1601,29 @@ type UsersFields_updatedAt_Delete { permission: Boolean! } +type UsersFields_createdAt { + create: UsersFields_createdAt_Create + read: UsersFields_createdAt_Read + update: UsersFields_createdAt_Update + delete: UsersFields_createdAt_Delete +} + +type UsersFields_createdAt_Create { + permission: Boolean! +} + +type UsersFields_createdAt_Read { + permission: Boolean! +} + +type UsersFields_createdAt_Update { + permission: Boolean! +} + +type UsersFields_createdAt_Delete { + permission: Boolean! +} + type UsersFields_email { create: UsersFields_email_Create read: UsersFields_email_Read @@ -1614,6 +1647,29 @@ type UsersFields_email_Delete { permission: Boolean! } +type UsersFields_password { + create: UsersFields_password_Create + read: UsersFields_password_Read + update: UsersFields_password_Update + delete: UsersFields_password_Delete +} + +type UsersFields_password_Create { + permission: Boolean! +} + +type UsersFields_password_Read { + permission: Boolean! +} + +type UsersFields_password_Update { + permission: Boolean! +} + +type UsersFields_password_Delete { + permission: Boolean! +} + type UsersCreateAccess { permission: Boolean! where: JSONObject @@ -1671,8 +1727,8 @@ input mutationPostInput { relationHasManyField: [String] relationMultiRelationTo: Post_RelationMultiRelationToRelationshipInput relationMultiRelationToHasMany: [Post_RelationMultiRelationToHasManyRelationshipInput] - createdAt: String! - updatedAt: String! + updatedAt: String + createdAt: String } input Post_RelationMultiRelationToRelationshipInput { @@ -1703,8 +1759,8 @@ input mutationPostUpdateInput { relationHasManyField: [String] relationMultiRelationTo: PostUpdate_RelationMultiRelationToRelationshipInput relationMultiRelationToHasMany: [PostUpdate_RelationMultiRelationToHasManyRelationshipInput] - createdAt: String updatedAt: String + createdAt: String } input PostUpdate_RelationMultiRelationToRelationshipInput { @@ -1729,31 +1785,31 @@ enum PostUpdate_RelationMultiRelationToHasManyRelationshipInputRelationTo { input mutationRelationInput { name: String - createdAt: String! - updatedAt: String! + updatedAt: String + createdAt: String } input mutationRelationUpdateInput { name: String - createdAt: String updatedAt: String + createdAt: String } input mutationDummyInput { name: String - createdAt: String! - updatedAt: String! + updatedAt: String + createdAt: String } input mutationDummyUpdateInput { name: String - createdAt: String updatedAt: String + createdAt: String } input mutationUserInput { - createdAt: String! - updatedAt: String! + updatedAt: String + createdAt: String email: String resetPasswordToken: String resetPasswordExpiration: String @@ -1763,8 +1819,8 @@ input mutationUserInput { } input mutationUserUpdateInput { - createdAt: String updatedAt: String + createdAt: String email: String resetPasswordToken: String resetPasswordExpiration: String