diff --git a/packages/query-graphql/__tests__/resolvers/__fixtures__/create/create-custom-many-mutation.resolver.graphql b/packages/query-graphql/__tests__/resolvers/__fixtures__/create/create-custom-many-mutation.resolver.graphql new file mode 100644 index 000000000..4136d16b6 --- /dev/null +++ b/packages/query-graphql/__tests__/resolvers/__fixtures__/create/create-custom-many-mutation.resolver.graphql @@ -0,0 +1,28 @@ +type TestResolverDTO { + id: ID! + stringField: String! +} + +type Query { + test: TestResolverDTO! +} + +type Mutation { + createOneTestResolverDTO(input: CreateOneTestResolverDTOInput!): TestResolverDTO! + create_many_test(input: CreateManyTestResolverDTOSInput!): [TestResolverDTO!]! +} + +input CreateOneTestResolverDTOInput { + """The record to create""" + testResolverDTO: CreateTestResolverDTO! +} + +input CreateTestResolverDTO { + id: ID + stringField: String +} + +input CreateManyTestResolverDTOSInput { + """Array of records to create""" + testResolverDTOS: [CreateTestResolverDTO!]! +} diff --git a/packages/query-graphql/__tests__/resolvers/__fixtures__/create/create-custom-one-mutation.resolver.graphql b/packages/query-graphql/__tests__/resolvers/__fixtures__/create/create-custom-one-mutation.resolver.graphql new file mode 100644 index 000000000..865a5b285 --- /dev/null +++ b/packages/query-graphql/__tests__/resolvers/__fixtures__/create/create-custom-one-mutation.resolver.graphql @@ -0,0 +1,28 @@ +type TestResolverDTO { + id: ID! + stringField: String! +} + +type Query { + test: TestResolverDTO! +} + +type Mutation { + create_one_test(input: CreateOneTestResolverDTOInput!): TestResolverDTO! + createManyTestResolverDTOS(input: CreateManyTestResolverDTOSInput!): [TestResolverDTO!]! +} + +input CreateOneTestResolverDTOInput { + """The record to create""" + testResolverDTO: CreateTestResolverDTO! +} + +input CreateTestResolverDTO { + id: ID + stringField: String +} + +input CreateManyTestResolverDTOSInput { + """Array of records to create""" + testResolverDTOS: [CreateTestResolverDTO!]! +} diff --git a/packages/query-graphql/__tests__/resolvers/__fixtures__/delete/delete-custom-many-mutation.resolver.graphql b/packages/query-graphql/__tests__/resolvers/__fixtures__/delete/delete-custom-many-mutation.resolver.graphql new file mode 100644 index 000000000..b70c242b4 --- /dev/null +++ b/packages/query-graphql/__tests__/resolvers/__fixtures__/delete/delete-custom-many-mutation.resolver.graphql @@ -0,0 +1,74 @@ +type TestResolverDTO { + id: ID! + stringField: String! +} + +type DeleteManyResponse { + """The number of records deleted.""" + deletedCount: Int! +} + +type TestResolverDTODeleteResponse { + id: ID + stringField: String +} + +type Query { + test: TestResolverDTO! +} + +type Mutation { + deleteOneTestResolverDTO(input: DeleteOneInput!): TestResolverDTODeleteResponse! + delete_many_test(input: DeleteManyTestResolverDTOSInput!): DeleteManyResponse! +} + +input DeleteOneInput { + """The id of the record to delete.""" + id: ID! +} + +input DeleteManyTestResolverDTOSInput { + """Filter to find records to delete""" + filter: TestResolverDTODeleteFilter! +} + +input TestResolverDTODeleteFilter { + and: [TestResolverDTODeleteFilter!] + or: [TestResolverDTODeleteFilter!] + id: IDFilterComparison + stringField: StringFieldComparison +} + +input IDFilterComparison { + is: Boolean + isNot: Boolean + eq: ID + neq: ID + gt: ID + gte: ID + lt: ID + lte: ID + like: ID + notLike: ID + iLike: ID + notILike: ID + in: [ID!] + notIn: [ID!] +} + +input StringFieldComparison { + is: Boolean + isNot: Boolean + eq: String + neq: String + gt: String + gte: String + lt: String + lte: String + like: String + notLike: String + iLike: String + notILike: String + in: [String!] + notIn: [String!] +} diff --git a/packages/query-graphql/__tests__/resolvers/__fixtures__/delete/delete-custom-one-mutation.resolver.graphql b/packages/query-graphql/__tests__/resolvers/__fixtures__/delete/delete-custom-one-mutation.resolver.graphql new file mode 100644 index 000000000..7eb7002cb --- /dev/null +++ b/packages/query-graphql/__tests__/resolvers/__fixtures__/delete/delete-custom-one-mutation.resolver.graphql @@ -0,0 +1,74 @@ +type TestResolverDTO { + id: ID! + stringField: String! +} + +type DeleteManyResponse { + """The number of records deleted.""" + deletedCount: Int! +} + +type TestResolverDTODeleteResponse { + id: ID + stringField: String +} + +type Query { + test: TestResolverDTO! +} + +type Mutation { + delete_one_test(input: DeleteOneInput!): TestResolverDTODeleteResponse! + deleteManyTestResolverDTOS(input: DeleteManyTestResolverDTOSInput!): DeleteManyResponse! +} + +input DeleteOneInput { + """The id of the record to delete.""" + id: ID! +} + +input DeleteManyTestResolverDTOSInput { + """Filter to find records to delete""" + filter: TestResolverDTODeleteFilter! +} + +input TestResolverDTODeleteFilter { + and: [TestResolverDTODeleteFilter!] + or: [TestResolverDTODeleteFilter!] + id: IDFilterComparison + stringField: StringFieldComparison +} + +input IDFilterComparison { + is: Boolean + isNot: Boolean + eq: ID + neq: ID + gt: ID + gte: ID + lt: ID + lte: ID + like: ID + notLike: ID + iLike: ID + notILike: ID + in: [ID!] + notIn: [ID!] +} + +input StringFieldComparison { + is: Boolean + isNot: Boolean + eq: String + neq: String + gt: String + gte: String + lt: String + lte: String + like: String + notLike: String + iLike: String + notILike: String + in: [String!] + notIn: [String!] +} diff --git a/packages/query-graphql/__tests__/resolvers/__fixtures__/index.ts b/packages/query-graphql/__tests__/resolvers/__fixtures__/index.ts index 5d4af5558..e1e1d41c2 100644 --- a/packages/query-graphql/__tests__/resolvers/__fixtures__/index.ts +++ b/packages/query-graphql/__tests__/resolvers/__fixtures__/index.ts @@ -67,6 +67,12 @@ export const deleteOneSubscriptionResolverSDL = readGraphql( export const deleteManySubscriptionResolverSDL = readGraphql( resolve(__dirname, 'delete', 'delete-many-subscription.resolver.graphql'), ); +export const deleteCustomOneMutationResolverSDL = readGraphql( + resolve(__dirname, 'delete', 'delete-custom-one-mutation.resolver.graphql'), +); +export const deleteCustomManyMutationResolverSDL = readGraphql( + resolve(__dirname, 'delete', 'delete-custom-many-mutation.resolver.graphql'), +); export const createBasicResolverSDL = readGraphql(resolve(__dirname, 'create', 'create-basic.resolver.graphql')); export const createDisabledResolverSDL = readGraphql(resolve(__dirname, 'create', 'create-disabled.resolver.graphql')); @@ -91,6 +97,12 @@ export const createCustomManyInputResolverSDL = readGraphql( export const createSubscriptionResolverSDL = readGraphql( resolve(__dirname, 'create', 'create-subscription.resolver.graphql'), ); +export const createCustomOneMutationResolverSDL = readGraphql( + resolve(__dirname, 'create', 'create-custom-one-mutation.resolver.graphql'), +); +export const createCustomManyMutationResolverSDL = readGraphql( + resolve(__dirname, 'create', 'create-custom-many-mutation.resolver.graphql'), +); export const readBasicResolverSDL = readGraphql(resolve(__dirname, 'read', 'read-basic.resolver.graphql')); export const readDisabledResolverSDL = readGraphql(resolve(__dirname, 'read', 'read-disabled.resolver.graphql')); @@ -107,6 +119,12 @@ export const readOffsetQueryResolverSDL = readGraphql(resolve(__dirname, 'read', export const readConnectionWithTotalCountSDL = readGraphql( resolve(__dirname, 'read', 'read-connection-with-total-count.resolver.graphql'), ); +export const readCustomOneQueryResolverSDL = readGraphql( + resolve(__dirname, 'read', 'read-custom-one-query.resolver.graphql'), +); +export const readCustomManyQueryResolverSDL = readGraphql( + resolve(__dirname, 'read', 'read-custom-many-query.resolver.graphql'), +); export const updateBasicResolverSDL = readGraphql(resolve(__dirname, 'update', 'update-basic.resolver.graphql')); export const updateDisabledResolverSDL = readGraphql(resolve(__dirname, 'update', 'update-disabled.resolver.graphql')); @@ -137,6 +155,12 @@ export const updateOneSubscriptionResolverSDL = readGraphql( export const updateManySubscriptionResolverSDL = readGraphql( resolve(__dirname, 'update', 'update-many-subscription.resolver.graphql'), ); +export const updateCustomOneMutationResolverSDL = readGraphql( + resolve(__dirname, 'update', 'update-custom-one-mutation.resolver.graphql'), +); +export const updateCustomManyMutationResolverSDL = readGraphql( + resolve(__dirname, 'update', 'update-custom-many-mutation.resolver.graphql'), +); export const referenceBasicResolverSDL = readGraphql( resolve(__dirname, 'reference', 'reference-basic.resolver.graphql'), diff --git a/packages/query-graphql/__tests__/resolvers/__fixtures__/read/read-custom-many-query.resolver.graphql b/packages/query-graphql/__tests__/resolvers/__fixtures__/read/read-custom-many-query.resolver.graphql new file mode 100644 index 000000000..07a9317ad --- /dev/null +++ b/packages/query-graphql/__tests__/resolvers/__fixtures__/read/read-custom-many-query.resolver.graphql @@ -0,0 +1,133 @@ +type TestResolverDTO { + id: ID! + stringField: String! +} + +type TestResolverDTOEdge { + """The node containing the TestResolverDTO""" + node: TestResolverDTO! + + """Cursor for this node.""" + cursor: ConnectionCursor! +} + +"""Cursor for paging through collections""" +scalar ConnectionCursor + +type PageInfo { + """true if paging forward and there are more records.""" + hasNextPage: Boolean + + """true if paging backwards and there are more records.""" + hasPreviousPage: Boolean + + """The cursor of the first returned record.""" + startCursor: ConnectionCursor + + """The cursor of the last returned record.""" + endCursor: ConnectionCursor +} + +type TestResolverDTOConnection { + """Paging information""" + pageInfo: PageInfo! + + """Array of edges.""" + edges: [TestResolverDTOEdge!]! +} + +type Query { + testResolverDTO( + """The id of the record to find.""" + id: ID! + ): TestResolverDTO + read_many_test( + """Limit or page results.""" + paging: CursorPaging = {first: 10} + + """Specify to filter the records returned.""" + filter: TestResolverDTOFilter = {} + + """Specify to sort results.""" + sorting: [TestResolverDTOSort!] = [] + ): TestResolverDTOConnection! + test: TestResolverDTO! +} + +input CursorPaging { + """Paginate before opaque cursor""" + before: ConnectionCursor + + """Paginate after opaque cursor""" + after: ConnectionCursor + + """Paginate first""" + first: Int + + """Paginate last""" + last: Int +} + +input TestResolverDTOFilter { + and: [TestResolverDTOFilter!] + or: [TestResolverDTOFilter!] + id: IDFilterComparison + stringField: StringFieldComparison +} + +input IDFilterComparison { + is: Boolean + isNot: Boolean + eq: ID + neq: ID + gt: ID + gte: ID + lt: ID + lte: ID + like: ID + notLike: ID + iLike: ID + notILike: ID + in: [ID!] + notIn: [ID!] +} + +input StringFieldComparison { + is: Boolean + isNot: Boolean + eq: String + neq: String + gt: String + gte: String + lt: String + lte: String + like: String + notLike: String + iLike: String + notILike: String + in: [String!] + notIn: [String!] +} + +input TestResolverDTOSort { + field: TestResolverDTOSortFields! + direction: SortDirection! + nulls: SortNulls +} + +enum TestResolverDTOSortFields { + id + stringField +} + +"""Sort Directions""" +enum SortDirection { + ASC + DESC +} + +"""Sort Nulls Options""" +enum SortNulls { + NULLS_FIRST + NULLS_LAST +} diff --git a/packages/query-graphql/__tests__/resolvers/__fixtures__/read/read-custom-one-query.resolver.graphql b/packages/query-graphql/__tests__/resolvers/__fixtures__/read/read-custom-one-query.resolver.graphql new file mode 100644 index 000000000..3992064ea --- /dev/null +++ b/packages/query-graphql/__tests__/resolvers/__fixtures__/read/read-custom-one-query.resolver.graphql @@ -0,0 +1,133 @@ +type TestResolverDTO { + id: ID! + stringField: String! +} + +type TestResolverDTOEdge { + """The node containing the TestResolverDTO""" + node: TestResolverDTO! + + """Cursor for this node.""" + cursor: ConnectionCursor! +} + +"""Cursor for paging through collections""" +scalar ConnectionCursor + +type PageInfo { + """true if paging forward and there are more records.""" + hasNextPage: Boolean + + """true if paging backwards and there are more records.""" + hasPreviousPage: Boolean + + """The cursor of the first returned record.""" + startCursor: ConnectionCursor + + """The cursor of the last returned record.""" + endCursor: ConnectionCursor +} + +type TestResolverDTOConnection { + """Paging information""" + pageInfo: PageInfo! + + """Array of edges.""" + edges: [TestResolverDTOEdge!]! +} + +type Query { + read_one_test( + """The id of the record to find.""" + id: ID! + ): TestResolverDTO + testResolverDTOS( + """Limit or page results.""" + paging: CursorPaging = {first: 10} + + """Specify to filter the records returned.""" + filter: TestResolverDTOFilter = {} + + """Specify to sort results.""" + sorting: [TestResolverDTOSort!] = [] + ): TestResolverDTOConnection! + test: TestResolverDTO! +} + +input CursorPaging { + """Paginate before opaque cursor""" + before: ConnectionCursor + + """Paginate after opaque cursor""" + after: ConnectionCursor + + """Paginate first""" + first: Int + + """Paginate last""" + last: Int +} + +input TestResolverDTOFilter { + and: [TestResolverDTOFilter!] + or: [TestResolverDTOFilter!] + id: IDFilterComparison + stringField: StringFieldComparison +} + +input IDFilterComparison { + is: Boolean + isNot: Boolean + eq: ID + neq: ID + gt: ID + gte: ID + lt: ID + lte: ID + like: ID + notLike: ID + iLike: ID + notILike: ID + in: [ID!] + notIn: [ID!] +} + +input StringFieldComparison { + is: Boolean + isNot: Boolean + eq: String + neq: String + gt: String + gte: String + lt: String + lte: String + like: String + notLike: String + iLike: String + notILike: String + in: [String!] + notIn: [String!] +} + +input TestResolverDTOSort { + field: TestResolverDTOSortFields! + direction: SortDirection! + nulls: SortNulls +} + +enum TestResolverDTOSortFields { + id + stringField +} + +"""Sort Directions""" +enum SortDirection { + ASC + DESC +} + +"""Sort Nulls Options""" +enum SortNulls { + NULLS_FIRST + NULLS_LAST +} diff --git a/packages/query-graphql/__tests__/resolvers/__fixtures__/update/update-custom-many-mutation.resolver.graphql b/packages/query-graphql/__tests__/resolvers/__fixtures__/update/update-custom-many-mutation.resolver.graphql new file mode 100644 index 000000000..cd1bb7501 --- /dev/null +++ b/packages/query-graphql/__tests__/resolvers/__fixtures__/update/update-custom-many-mutation.resolver.graphql @@ -0,0 +1,80 @@ +type TestResolverDTO { + id: ID! + stringField: String! +} + +type UpdateManyResponse { + """The number of records updated.""" + updatedCount: Int! +} + +type Query { + test: TestResolverDTO! +} + +type Mutation { + updateOneTestResolverDTO(input: UpdateOneTestResolverDTOInput!): TestResolverDTO! + update_many_test(input: UpdateManyTestResolverDTOSInput!): UpdateManyResponse! +} + +input UpdateOneTestResolverDTOInput { + """The id of the record to update""" + id: ID! + + """The update to apply.""" + update: UpdateTestResolverDTO! +} + +input UpdateTestResolverDTO { + id: ID + stringField: String +} + +input UpdateManyTestResolverDTOSInput { + """Filter used to find fields to update""" + filter: TestResolverDTOUpdateFilter! + + """The update to apply to all records found using the filter""" + update: UpdateTestResolverDTO! +} + +input TestResolverDTOUpdateFilter { + and: [TestResolverDTOUpdateFilter!] + or: [TestResolverDTOUpdateFilter!] + id: IDFilterComparison + stringField: StringFieldComparison +} + +input IDFilterComparison { + is: Boolean + isNot: Boolean + eq: ID + neq: ID + gt: ID + gte: ID + lt: ID + lte: ID + like: ID + notLike: ID + iLike: ID + notILike: ID + in: [ID!] + notIn: [ID!] +} + +input StringFieldComparison { + is: Boolean + isNot: Boolean + eq: String + neq: String + gt: String + gte: String + lt: String + lte: String + like: String + notLike: String + iLike: String + notILike: String + in: [String!] + notIn: [String!] +} diff --git a/packages/query-graphql/__tests__/resolvers/__fixtures__/update/update-custom-one-mutation.resolver.graphql b/packages/query-graphql/__tests__/resolvers/__fixtures__/update/update-custom-one-mutation.resolver.graphql new file mode 100644 index 000000000..138fc75fb --- /dev/null +++ b/packages/query-graphql/__tests__/resolvers/__fixtures__/update/update-custom-one-mutation.resolver.graphql @@ -0,0 +1,80 @@ +type TestResolverDTO { + id: ID! + stringField: String! +} + +type UpdateManyResponse { + """The number of records updated.""" + updatedCount: Int! +} + +type Query { + test: TestResolverDTO! +} + +type Mutation { + update_one_test(input: UpdateOneTestResolverDTOInput!): TestResolverDTO! + updateManyTestResolverDTOS(input: UpdateManyTestResolverDTOSInput!): UpdateManyResponse! +} + +input UpdateOneTestResolverDTOInput { + """The id of the record to update""" + id: ID! + + """The update to apply.""" + update: UpdateTestResolverDTO! +} + +input UpdateTestResolverDTO { + id: ID + stringField: String +} + +input UpdateManyTestResolverDTOSInput { + """Filter used to find fields to update""" + filter: TestResolverDTOUpdateFilter! + + """The update to apply to all records found using the filter""" + update: UpdateTestResolverDTO! +} + +input TestResolverDTOUpdateFilter { + and: [TestResolverDTOUpdateFilter!] + or: [TestResolverDTOUpdateFilter!] + id: IDFilterComparison + stringField: StringFieldComparison +} + +input IDFilterComparison { + is: Boolean + isNot: Boolean + eq: ID + neq: ID + gt: ID + gte: ID + lt: ID + lte: ID + like: ID + notLike: ID + iLike: ID + notILike: ID + in: [ID!] + notIn: [ID!] +} + +input StringFieldComparison { + is: Boolean + isNot: Boolean + eq: String + neq: String + gt: String + gte: String + lt: String + lte: String + like: String + notLike: String + iLike: String + notILike: String + in: [String!] + notIn: [String!] +} diff --git a/packages/query-graphql/__tests__/resolvers/create.resolver.spec.ts b/packages/query-graphql/__tests__/resolvers/create.resolver.spec.ts index d8fec8b48..48870cc86 100644 --- a/packages/query-graphql/__tests__/resolvers/create.resolver.spec.ts +++ b/packages/query-graphql/__tests__/resolvers/create.resolver.spec.ts @@ -11,8 +11,10 @@ import { createBasicResolverSDL, createCustomDTOResolverSDL, createCustomManyInputResolverSDL, + createCustomManyMutationResolverSDL, createCustomNameResolverSDL, createCustomOneInputResolverSDL, + createCustomOneMutationResolverSDL, createDisabledResolverSDL, createManyDisabledResolverSDL, createOneDisabledResolverSDL, @@ -55,6 +57,14 @@ describe('CreateResolver', () => { return expectResolverSDL(createCustomNameResolverSDL, { dtoName: 'Test' }); }); + it('should use the one.name option for the createOne if provided', () => { + return expectResolverSDL(createCustomOneMutationResolverSDL, { one: { name: 'create_one_test' } }); + }); + + it('should use the many.name option for the createMany if provided', () => { + return expectResolverSDL(createCustomManyMutationResolverSDL, { many: { name: 'create_many_test' } }); + }); + it('should use the CreateDTOClass if provided', () => { return expectResolverSDL(createCustomDTOResolverSDL, { CreateDTOClass: TestResolverInputDTO }); }); diff --git a/packages/query-graphql/__tests__/resolvers/delete.resolver.spec.ts b/packages/query-graphql/__tests__/resolvers/delete.resolver.spec.ts index 6ef240599..39229224e 100644 --- a/packages/query-graphql/__tests__/resolvers/delete.resolver.spec.ts +++ b/packages/query-graphql/__tests__/resolvers/delete.resolver.spec.ts @@ -18,8 +18,10 @@ import { createResolverFromNest, deleteBasicResolverSDL, deleteCustomManyInputResolverSDL, + deleteCustomManyMutationResolverSDL, deleteCustomNameResolverSDL, deleteCustomOneInputResolverSDL, + deleteCustomOneMutationResolverSDL, deleteDisabledResolverSDL, deleteManyDisabledResolverSDL, deleteManySubscriptionResolverSDL, @@ -65,6 +67,14 @@ describe('DeleteResolver', () => { return expectResolverSDL(deleteCustomNameResolverSDL, { dtoName: 'Test' }); }); + it('should use the one.name option for the deleteOne if provided', () => { + return expectResolverSDL(deleteCustomOneMutationResolverSDL, { one: { name: 'delete_one_test' } }); + }); + + it('should use the many.name option for the deleteMany if provided', () => { + return expectResolverSDL(deleteCustomManyMutationResolverSDL, { many: { name: 'delete_many_test' } }); + }); + it('should not expose delete methods if disabled', () => { return expectResolverSDL(deleteDisabledResolverSDL, { disabled: true }); }); diff --git a/packages/query-graphql/__tests__/resolvers/read.resolver.spec.ts b/packages/query-graphql/__tests__/resolvers/read.resolver.spec.ts index 3a3102228..57ffd56be 100644 --- a/packages/query-graphql/__tests__/resolvers/read.resolver.spec.ts +++ b/packages/query-graphql/__tests__/resolvers/read.resolver.spec.ts @@ -20,7 +20,9 @@ import { readBasicResolverSDL, readConnectionWithTotalCountSDL, readCustomConnectionResolverSDL, + readCustomManyQueryResolverSDL, readCustomNameResolverSDL, + readCustomOneQueryResolverSDL, readCustomQueryResolverSDL, readDisabledResolverSDL, readManyDisabledResolverSDL, @@ -51,6 +53,14 @@ describe('ReadResolver', () => { return expectResolverSDL(readCustomNameResolverSDL, { dtoName: 'Test' }); }); + it('should use the one.name option for the findById if provided', () => { + return expectResolverSDL(readCustomOneQueryResolverSDL, { one: { name: 'read_one_test' } }); + }); + + it('should use the many.name option for the queryMany if provided', () => { + return expectResolverSDL(readCustomManyQueryResolverSDL, { many: { name: 'read_many_test' } }); + }); + it('should not expose read methods if disabled', () => { return expectResolverSDL(readDisabledResolverSDL, { disabled: true }); }); diff --git a/packages/query-graphql/__tests__/resolvers/update.resolver.spec.ts b/packages/query-graphql/__tests__/resolvers/update.resolver.spec.ts index 91d383c89..4f6134312 100644 --- a/packages/query-graphql/__tests__/resolvers/update.resolver.spec.ts +++ b/packages/query-graphql/__tests__/resolvers/update.resolver.spec.ts @@ -31,6 +31,8 @@ import { updateManySubscriptionResolverSDL, updateOneSubscriptionResolverSDL, updateSubscriptionResolverSDL, + updateCustomOneMutationResolverSDL, + updateCustomManyMutationResolverSDL, } from './__fixtures__'; describe('UpdateResolver', () => { @@ -68,6 +70,14 @@ describe('UpdateResolver', () => { return expectResolverSDL(updateCustomNameResolverSDL, { dtoName: 'Test' }); }); + it('should use the one.name option for the updateOne if provided', () => { + return expectResolverSDL(updateCustomOneMutationResolverSDL, { one: { name: 'update_one_test' } }); + }); + + it('should use the many.name option for the updateMany if provided', () => { + return expectResolverSDL(updateCustomManyMutationResolverSDL, { many: { name: 'update_many_test' } }); + }); + it('should use the UpdateDTOClass if provided', () => { return expectResolverSDL(updateCustomDTOResolverSDL, { UpdateDTOClass: TestResolverInputDTO }); }); diff --git a/packages/query-graphql/src/resolvers/create.resolver.ts b/packages/query-graphql/src/resolvers/create.resolver.ts index 8a3aafbf4..ddf576ca2 100644 --- a/packages/query-graphql/src/resolvers/create.resolver.ts +++ b/packages/query-graphql/src/resolvers/create.resolver.ts @@ -42,6 +42,9 @@ export interface CreateResolverOpts> extends Subscript * The class to be used for `createMany` input. */ CreateManyInput?: Class>; + + createOneMutationName?: string; + createManyMutationName?: string; } export interface CreateResolver> extends ServiceResolver { @@ -110,6 +113,8 @@ export const Creatable = >( } = opts; const createOneHook = lookupCreateOneHook(DTOClass, CreateDTOClass); const createManyHook = lookupCreateManyHook(DTOClass, CreateDTOClass); + const createOneMutationName = opts.one?.name ?? `createOne${baseName}`; + const createManyMutationName = opts.many?.name ?? `createMany${pluralBaseName}`; const commonResolverOpts = omit( opts, 'dtoName', @@ -137,7 +142,7 @@ export const Creatable = >( @Resolver(() => DTOClass, { isAbstract: true }) class CreateResolverBase extends BaseClass { - @ResolverMutation(() => DTOClass, { name: `createOne${baseName}` }, commonResolverOpts, opts.one ?? {}) + @ResolverMutation(() => DTOClass, { name: createOneMutationName }, commonResolverOpts, opts.one ?? {}) async createOne(@MutationArgs(CO, createOneHook) input: CO): Promise { const created = await this.service.createOne(input.input.input); if (enableOneSubscriptions) { @@ -146,7 +151,7 @@ export const Creatable = >( return created; } - @ResolverMutation(() => [DTOClass], { name: `createMany${pluralBaseName}` }, commonResolverOpts, opts.many ?? {}) + @ResolverMutation(() => [DTOClass], { name: createManyMutationName }, commonResolverOpts, opts.many ?? {}) async createMany(@MutationArgs(CM, createManyHook) input: CM): Promise { const created = await this.service.createMany(input.input.input); if (enableManySubscriptions) { diff --git a/packages/query-graphql/src/resolvers/delete.resolver.ts b/packages/query-graphql/src/resolvers/delete.resolver.ts index 34f539992..197b64b42 100644 --- a/packages/query-graphql/src/resolvers/delete.resolver.ts +++ b/packages/query-graphql/src/resolvers/delete.resolver.ts @@ -70,6 +70,8 @@ export const Deletable = >( const { DeleteOneInput = DeleteOneInputType(), DeleteManyInput = defaultDeleteManyInput(dtoNames, DTOClass) } = opts; const deleteOneHook = getDeleteOneHook(DTOClass); const deleteManyHook = getDeleteManyHook(DTOClass); + const deleteOneMutationName = opts.one?.name ?? `deleteOne${baseName}`; + const deleteManyMutationName = opts.many?.name ?? `deleteMany${pluralBaseName}`; const DMR = DeleteManyResponseType(); const commonResolverOpts = omit(opts, 'dtoName', 'one', 'many', 'DeleteOneInput', 'DeleteManyInput'); @@ -96,7 +98,7 @@ export const Deletable = >( @Resolver(() => DTOClass, { isAbstract: true }) class DeleteResolverBase extends BaseClass { - @ResolverMutation(() => DeleteOneResponse, { name: `deleteOne${baseName}` }, commonResolverOpts, opts.one ?? {}) + @ResolverMutation(() => DeleteOneResponse, { name: deleteOneMutationName }, commonResolverOpts, opts.one ?? {}) async deleteOne(@MutationArgs(DO, deleteOneHook) input: DO, @Context() context?: unknown): Promise> { const deleteOne = await transformAndValidate(DO, input); const authorizeFilter = await getAuthFilter(this.authorizer, context); @@ -107,7 +109,7 @@ export const Deletable = >( return deletedResponse; } - @ResolverMutation(() => DMR, { name: `deleteMany${pluralBaseName}` }, commonResolverOpts, opts.many ?? {}) + @ResolverMutation(() => DMR, { name: deleteManyMutationName }, commonResolverOpts, opts.many ?? {}) async deleteMany( @MutationArgs(DM, deleteManyHook) input: DM, @Context() context?: unknown, diff --git a/packages/query-graphql/src/resolvers/read.resolver.ts b/packages/query-graphql/src/resolvers/read.resolver.ts index cb30709e6..a1e0395cf 100644 --- a/packages/query-graphql/src/resolvers/read.resolver.ts +++ b/packages/query-graphql/src/resolvers/read.resolver.ts @@ -55,6 +55,8 @@ export const Readable = , QS extends opts: ReadOpts, ) => >>(BaseClass: B): Class> & B => { const { baseNameLower, pluralBaseNameLower, baseName } = getDTONames(DTOClass, opts); + const readOneQueryName = opts.one?.name ?? baseNameLower; + const readManyQueryName = opts.many?.name ?? pluralBaseNameLower; const { QueryArgs = QueryArgsType(DTOClass, opts) } = opts; const { Connection = ConnectionType(DTOClass, QueryArgs, { ...opts, connectionName: `${baseName}Connection` }), @@ -72,13 +74,13 @@ export const Readable = , QS extends @Resolver(() => DTOClass, { isAbstract: true }) class ReadResolverBase extends BaseClass { - @ResolverQuery(() => DTOClass, { nullable: true, name: baseNameLower }, commonResolverOpts, opts.one ?? {}) + @ResolverQuery(() => DTOClass, { nullable: true, name: readOneQueryName }, commonResolverOpts, opts.one ?? {}) async findById(@HookArgs(FO, findOneHook) input: FO, @Context() context?: unknown): Promise { const authorizeFilter = await getAuthFilter(this.authorizer, context); return this.service.findById(input.id, { filter: authorizeFilter }); } - @ResolverQuery(() => Connection.resolveType, { name: pluralBaseNameLower }, commonResolverOpts, opts.many ?? {}) + @ResolverQuery(() => Connection.resolveType, { name: readManyQueryName }, commonResolverOpts, opts.many ?? {}) async queryMany( @HookArgs(QA, queryManyHook) query: QA, @Context() context?: unknown, diff --git a/packages/query-graphql/src/resolvers/resolver.interface.ts b/packages/query-graphql/src/resolvers/resolver.interface.ts index e6a77cdee..1962c21c3 100644 --- a/packages/query-graphql/src/resolvers/resolver.interface.ts +++ b/packages/query-graphql/src/resolvers/resolver.interface.ts @@ -13,20 +13,25 @@ import { } from '../types/query/query-args'; import { Authorizer } from '../auth'; +type NameedEndpoint = { + /** Specify to override the name of the graphql query or mutation * */ + name?: string; +}; + export interface ResolverOpts extends ResolverMethodOpts, DTONamesOpts { /** * Options for single record graphql endpoints */ - one?: ResolverMethodOpts; + one?: ResolverMethodOpts & NameedEndpoint; /** * Options for multiple record graphql endpoints */ - many?: ResolverMethodOpts; + many?: ResolverMethodOpts & NameedEndpoint; } export interface SubscriptionResolverOpts extends SubscriptionResolverMethodOpts, DTONamesOpts { - one?: SubscriptionResolverMethodOpts; - many?: SubscriptionResolverMethodOpts; + one?: SubscriptionResolverMethodOpts & NameedEndpoint; + many?: SubscriptionResolverMethodOpts & NameedEndpoint; } /** @internal */ diff --git a/packages/query-graphql/src/resolvers/update.resolver.ts b/packages/query-graphql/src/resolvers/update.resolver.ts index 8da89271d..b0eac4b63 100644 --- a/packages/query-graphql/src/resolvers/update.resolver.ts +++ b/packages/query-graphql/src/resolvers/update.resolver.ts @@ -116,6 +116,8 @@ export const Updateable = >( } = opts; const updateOneHook = lookupUpdateOneHook(DTOClass, UpdateDTOClass); const updateManyHook = lookupUpdateManyHook(DTOClass, UpdateDTOClass); + const updateOneMutationName = opts.one?.name ?? `updateOne${baseName}`; + const updateManyMutationName = opts.many?.name ?? `updateMany${pluralBaseName}`; const commonResolverOpts = omit( opts, @@ -143,7 +145,7 @@ export const Updateable = >( @Resolver(() => DTOClass, { isAbstract: true }) class UpdateResolverBase extends BaseClass { - @ResolverMutation(() => DTOClass, { name: `updateOne${baseName}` }, commonResolverOpts, opts.one ?? {}) + @ResolverMutation(() => DTOClass, { name: updateOneMutationName }, commonResolverOpts, opts.one ?? {}) async updateOne(@MutationArgs(UO, updateOneHook) input: UO, @Context() context?: unknown): Promise { const updateOne = await transformAndValidate(UO, input); const authorizeFilter = await getAuthFilter(this.authorizer, context); @@ -155,7 +157,7 @@ export const Updateable = >( return updateResult; } - @ResolverMutation(() => UMR, { name: `updateMany${pluralBaseName}` }, commonResolverOpts, opts.many ?? {}) + @ResolverMutation(() => UMR, { name: updateManyMutationName }, commonResolverOpts, opts.many ?? {}) async updateMany( @MutationArgs(UM, updateManyHook) input: UM, @Context() context?: unknown,