From c252b2af48eafa9be67665f9f61c1eb9c9ab6778 Mon Sep 17 00:00:00 2001 From: Tycho Bokdam Date: Tue, 26 Mar 2024 18:11:13 +0100 Subject: [PATCH] fix(query-graphql): Fixed relations update/aggregate not respecting the given name Fixes #239 --- examples/basic/schema.gql | 34 +++++++++++++++++++ .../basic/src/todo-item/dto/todo-item.dto.ts | 7 +++- examples/dataloader-configuration/schema.gql | 8 ++--- .../relations/aggregate-relations.resolver.ts | 12 +++---- .../relations/update-relations.resolver.ts | 16 ++++----- 5 files changed, 58 insertions(+), 19 deletions(-) diff --git a/examples/basic/schema.gql b/examples/basic/schema.gql index 9980785da..a42a6c27c 100644 --- a/examples/basic/schema.gql +++ b/examples/basic/schema.gql @@ -163,6 +163,13 @@ type TodoItem { """Specify to sort results.""" sorting: [TagSort!]! = [] ): TodoItemTagsConnection! + allSubTasks( + """Specify to filter the records returned.""" + filter: SubTaskFilter! = {} + + """Specify to sort results.""" + sorting: [SubTaskSort!]! = [] + ): [SubTask!]! } input SubTaskFilter { @@ -403,7 +410,10 @@ type Mutation { setSubTasksOnTodoItem(input: SetSubTasksOnTodoItemInput!): TodoItem! addTagsToTodoItem(input: AddTagsToTodoItemInput!): TodoItem! setTagsOnTodoItem(input: SetTagsOnTodoItemInput!): TodoItem! + addAllSubTasksToTodoItem(input: AddAllSubTasksToTodoItemInput!): TodoItem! + setAllSubTasksOnTodoItem(input: SetAllSubTasksOnTodoItemInput!): TodoItem! removeTagsFromTodoItem(input: RemoveTagsFromTodoItemInput!): TodoItem! + removeAllSubTasksFromTodoItem(input: RemoveAllSubTasksFromTodoItemInput!): TodoItem! createOneTodoItem(input: CreateOneTodoItemInput!): TodoItem! createManyTodoItems(input: CreateManyTodoItemsInput!): [TodoItem!]! updateOneTodoItem(input: UpdateOneTodoItemInput!): TodoItem! @@ -535,6 +545,22 @@ input SetTagsOnTodoItemInput { relationIds: [ID!]! } +input AddAllSubTasksToTodoItemInput { + """The id of the record.""" + id: ID! + + """The ids of the relations.""" + relationIds: [ID!]! +} + +input SetAllSubTasksOnTodoItemInput { + """The id of the record.""" + id: ID! + + """The ids of the relations.""" + relationIds: [ID!]! +} + input RemoveTagsFromTodoItemInput { """The id of the record.""" id: ID! @@ -543,6 +569,14 @@ input RemoveTagsFromTodoItemInput { relationIds: [ID!]! } +input RemoveAllSubTasksFromTodoItemInput { + """The id of the record.""" + id: ID! + + """The ids of the relations.""" + relationIds: [ID!]! +} + input CreateOneTodoItemInput { """The record to create""" todoItem: TodoItemInput! diff --git a/examples/basic/src/todo-item/dto/todo-item.dto.ts b/examples/basic/src/todo-item/dto/todo-item.dto.ts index 37147ac19..140f3ae20 100644 --- a/examples/basic/src/todo-item/dto/todo-item.dto.ts +++ b/examples/basic/src/todo-item/dto/todo-item.dto.ts @@ -1,5 +1,5 @@ import { GraphQLISODateTime, ID, ObjectType } from '@nestjs/graphql' -import { CursorConnection, FilterableField } from '@ptc-org/nestjs-query-graphql' +import { CursorConnection, FilterableField, UnPagedRelation } from '@ptc-org/nestjs-query-graphql' import { SubTaskDTO } from '../../sub-task/dto/sub-task.dto' import { TagDTO } from '../../tag/dto/tag.dto' @@ -12,6 +12,11 @@ import { TagDTO } from '../../tag/dto/tag.dto' update: { enabled: true }, remove: { enabled: true } }) +@UnPagedRelation('allSubTasks', () => SubTaskDTO, { + relationName: 'subTasks', + update: { enabled: true }, + remove: { enabled: true } +}) export class TodoItemDTO { @FilterableField(() => ID) id!: number diff --git a/examples/dataloader-configuration/schema.gql b/examples/dataloader-configuration/schema.gql index 8f800632c..adc9e3b88 100644 --- a/examples/dataloader-configuration/schema.gql +++ b/examples/dataloader-configuration/schema.gql @@ -365,8 +365,8 @@ input CursorPaging { } type Mutation { - addTodoItemsToSubTask(input: AddTodoItemsToSubTaskInput!): SubTask! - setTodoItemsOnSubTask(input: SetTodoItemsOnSubTaskInput!): SubTask! + addTodoItemToSubTask(input: AddTodoItemToSubTaskInput!): SubTask! + setTodoItemOnSubTask(input: SetTodoItemOnSubTaskInput!): SubTask! createOneSubTask(input: CreateOneSubTaskInput!): SubTask! createManySubTasks(input: CreateManySubTasksInput!): [SubTask!]! updateOneSubTask(input: UpdateOneSubTaskInput!): SubTask! @@ -395,7 +395,7 @@ type Mutation { deleteManyTags(input: DeleteManyTagsInput!): DeleteManyResponse! } -input AddTodoItemsToSubTaskInput { +input AddTodoItemToSubTaskInput { """The id of the record.""" id: ID! @@ -403,7 +403,7 @@ input AddTodoItemsToSubTaskInput { relationIds: [ID!]! } -input SetTodoItemsOnSubTaskInput { +input SetTodoItemOnSubTaskInput { """The id of the record.""" id: ID! diff --git a/packages/query-graphql/src/resolvers/relations/aggregate-relations.resolver.ts b/packages/query-graphql/src/resolvers/relations/aggregate-relations.resolver.ts index 25c0f77ed..15243bab6 100644 --- a/packages/query-graphql/src/resolvers/relations/aggregate-relations.resolver.ts +++ b/packages/query-graphql/src/resolvers/relations/aggregate-relations.resolver.ts @@ -33,22 +33,22 @@ const AggregateRelationMixin = const commonResolverOpts = relation.aggregate || removeRelationOpts(relation) const relationDTO = relation.DTO const dtoName = getDTONames(DTOClass).baseName - const { baseNameLower, pluralBaseNameLower, pluralBaseName } = getDTONames(relationDTO, { + const { baseName, baseNameLower } = getDTONames(relationDTO, { dtoName: relation.dtoName }) - const relationName = relation.relationName ?? pluralBaseNameLower - const aggregateRelationLoaderName = `aggregate${pluralBaseName}For${dtoName}` + const relationName = relation.relationName ?? baseNameLower + const aggregateRelationLoaderName = `aggregate${baseName}For${dtoName}` const aggregateLoader = new AggregateRelationsLoader(relationDTO, relationName) @ArgsType() class RelationQA extends AggregateArgsType(relationDTO) {} - const [AR] = AggregateResponseType(relationDTO, { prefix: `${dtoName}${pluralBaseName}` }) + const [AR] = AggregateResponseType(relationDTO, { prefix: `${dtoName}${baseName}` }) @Resolver(() => DTOClass, { isAbstract: true }) class AggregateMixin extends Base { @ResolverField( - `${pluralBaseNameLower}Aggregate`, + `${baseNameLower}Aggregate`, () => [AR], { description: relation.aggregate?.description @@ -58,7 +58,7 @@ const AggregateRelationMixin = interceptors: [AuthorizerInterceptor(DTOClass)] } ) - async [`aggregate${pluralBaseName}`]( + async [`aggregate${baseName}`]( @Parent() dto: DTO, @Args() q: RelationQA, @AggregateQueryParam() aggregateQuery: AggregateQuery, diff --git a/packages/query-graphql/src/resolvers/relations/update-relations.resolver.ts b/packages/query-graphql/src/resolvers/relations/update-relations.resolver.ts index a1a45cbff..e9ae1760f 100644 --- a/packages/query-graphql/src/resolvers/relations/update-relations.resolver.ts +++ b/packages/query-graphql/src/resolvers/relations/update-relations.resolver.ts @@ -71,16 +71,16 @@ const UpdateManyRelationMixin = const commonResolverOpts = removeRelationOpts(relation) const relationDTO = relation.DTO const dtoNames = getDTONames(DTOClass) - const { pluralBaseNameLower, pluralBaseName } = getDTONames(relationDTO, { dtoName: relation.dtoName }) - const relationName = relation.relationName ?? pluralBaseNameLower + const { baseNameLower, baseName } = getDTONames(relationDTO, { dtoName: relation.dtoName }) + const relationName = relation.relationName ?? baseNameLower - @InputType(`Add${pluralBaseName}To${dtoNames.baseName}Input`) + @InputType(`Add${baseName}To${dtoNames.baseName}Input`) class AddRelationInput extends RelationsInputType(DTOClass, relationDTO) {} @ArgsType() class AddArgs extends MutationArgsType(AddRelationInput) {} - @InputType(`Set${pluralBaseName}On${dtoNames.baseName}Input`) + @InputType(`Set${baseName}On${dtoNames.baseName}Input`) class SetRelationInput extends RelationsInputType(DTOClass, relationDTO) {} @ArgsType() @@ -99,9 +99,9 @@ const UpdateManyRelationMixin = interceptors: [AuthorizerInterceptor(DTOClass)] } ) - async [`add${pluralBaseName}To${dtoNames.baseName}`]( + async [`add${baseName}To${dtoNames.baseName}`]( @Args() addArgs: AddArgs, - @ModifyRelationAuthorizerFilter(pluralBaseNameLower, { + @ModifyRelationAuthorizerFilter(baseNameLower, { operationGroup: OperationGroup.UPDATE, many: true }) @@ -121,9 +121,9 @@ const UpdateManyRelationMixin = interceptors: [AuthorizerInterceptor(DTOClass)] } ) - async [`set${pluralBaseName}On${dtoNames.baseName}`]( + async [`set${baseName}On${dtoNames.baseName}`]( @Args() addArgs: SetArgs, - @ModifyRelationAuthorizerFilter(pluralBaseNameLower, { + @ModifyRelationAuthorizerFilter(baseNameLower, { operationGroup: OperationGroup.UPDATE, many: true })