From 39e1f2afbc52c6fc1fa5eb98eb739195e025b999 Mon Sep 17 00:00:00 2001 From: Samuel Andert Date: Wed, 23 Aug 2023 12:23:50 +0200 Subject: [PATCH] abstracting generic type resolving --- resolvers/projects.js | 29 +++++++----- schemas/directus.graphql | 95 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 113 insertions(+), 11 deletions(-) diff --git a/resolvers/projects.js b/resolvers/projects.js index af0249b..a0cfab5 100644 --- a/resolvers/projects.js +++ b/resolvers/projects.js @@ -48,23 +48,30 @@ const client = createClient({ }, }); -const finalQuery = ` - subscription { - projects_mutated { - key - event - data { - ${projectsFields} +const generateSubscriptionQuery = (typeName) => { + const typeDefinition = findTypeDefinition(typeName); + const fields = extractFields(typeDefinition); + + return ` + subscription { + ${typeName}_mutated { + key + event + data { + ${fields} + } } } - } -`; + `; +}; -console.log(finalQuery); +// Generate subscription query for 'projects' +const projectsQuery = generateSubscriptionQuery('projects'); +// const todosQuery = generateSubscriptionQuery('todos'); client.subscribe( { - query: finalQuery, + query: projectsQuery, }, { next: data => { diff --git a/schemas/directus.graphql b/schemas/directus.graphql index 23c0d42..adf4f8c 100644 --- a/schemas/directus.graphql +++ b/schemas/directus.graphql @@ -2,20 +2,31 @@ type Query { projects(filter: projects_filter, sort: [String], limit: Int, offset: Int, page: Int, search: String): [projects!]! projects_by_id(id: ID!): projects projects_aggregated(groupBy: [String], filter: projects_filter, limit: Int, offset: Int, page: Int, search: String, sort: [String]): [projects_aggregated!]! + todos(filter: todos_filter, sort: [String], limit: Int, offset: Int, page: Int, search: String): [todos!]! + todos_by_id(id: ID!): todos + todos_aggregated(groupBy: [String], filter: todos_filter, limit: Int, offset: Int, page: Int, search: String, sort: [String]): [todos_aggregated!]! } type Mutation { create_projects_items(filter: projects_filter, sort: [String], limit: Int, offset: Int, page: Int, search: String, data: [create_projects_input!]): [projects!]! create_projects_item(data: create_projects_input!): projects + create_todos_items(filter: todos_filter, sort: [String], limit: Int, offset: Int, page: Int, search: String, data: [create_todos_input!]): [todos!]! + create_todos_item(data: create_todos_input!): todos update_projects_items(filter: projects_filter, sort: [String], limit: Int, offset: Int, page: Int, search: String, ids: [ID]!, data: update_projects_input!): [projects!]! update_projects_batch(filter: projects_filter, sort: [String], limit: Int, offset: Int, page: Int, search: String, data: [update_projects_input!]): [projects!]! update_projects_item(id: ID!, data: update_projects_input!): projects + update_todos_items(filter: todos_filter, sort: [String], limit: Int, offset: Int, page: Int, search: String, ids: [ID]!, data: update_todos_input!): [todos!]! + update_todos_batch(filter: todos_filter, sort: [String], limit: Int, offset: Int, page: Int, search: String, data: [update_todos_input!]): [todos!]! + update_todos_item(id: ID!, data: update_todos_input!): todos delete_projects_items(ids: [ID]!): delete_many delete_projects_item(id: ID!): delete_one + delete_todos_items(ids: [ID]!): delete_many + delete_todos_item(id: ID!): delete_one } type Subscription { projects_mutated(event: EventEnum): projects_mutated + todos_mutated(event: EventEnum): todos_mutated directus_dashboards_mutated(event: EventEnum): directus_dashboards_mutated directus_activity_mutated(event: EventEnum): directus_activity_mutated directus_notifications_mutated(event: EventEnum): directus_notifications_mutated @@ -544,6 +555,53 @@ type projects_mutated { data: projects } +type todos { + id: ID! + status: String + sort: Int + user_created(filter: directus_users_filter, sort: [String], limit: Int, offset: Int, page: Int, search: String): directus_users + date_created: Date + date_created_func: datetime_functions + user_updated(filter: directus_users_filter, sort: [String], limit: Int, offset: Int, page: Int, search: String): directus_users + date_updated: Date + date_updated_func: datetime_functions + task: String +} + +type todos_aggregated { + group: JSON + countAll: Int + count: todos_aggregated_count + countDistinct: todos_aggregated_count + avg: todos_aggregated_fields + sum: todos_aggregated_fields + avgDistinct: todos_aggregated_fields + sumDistinct: todos_aggregated_fields + min: todos_aggregated_fields + max: todos_aggregated_fields +} + +type todos_aggregated_count { + id: Int + status: Int + sort: Int + user_created: Int + date_created: Int + user_updated: Int + date_updated: Int + task: Int +} + +type todos_aggregated_fields { + sort: Float +} + +type todos_mutated { + key: ID! + event: EventEnum + data: todos +} + input boolean_filter_operators { _eq: Boolean _neq: Boolean @@ -632,6 +690,17 @@ input create_projects_input { text: String } +input create_todos_input { + id: ID + status: String + sort: Int + user_created: create_directus_users_input + date_created: Date + user_updated: create_directus_users_input + date_updated: Date + task: String +} + input date_filter_operators { _eq: String _neq: String @@ -908,6 +977,21 @@ input string_filter_operators { _nempty: Boolean } +input todos_filter { + id: string_filter_operators + status: string_filter_operators + sort: number_filter_operators + user_created: directus_users_filter + date_created: date_filter_operators + date_created_func: datetime_function_filter_operators + user_updated: directus_users_filter + date_updated: date_filter_operators + date_updated_func: datetime_function_filter_operators + task: string_filter_operators + _and: [todos_filter] + _or: [todos_filter] +} + input update_directus_files_input { id: ID storage: String @@ -983,4 +1067,15 @@ input update_projects_input { user_updated: update_directus_users_input date_updated: Date text: String +} + +input update_todos_input { + id: ID + status: String + sort: Int + user_created: update_directus_users_input + date_created: Date + user_updated: update_directus_users_input + date_updated: Date + task: String } \ No newline at end of file