Sulman Baig
Posted on January 14, 2023
Before we do any refactoring, currently, my project’s mutation root looks like the below in schema:
type Mutation {
adminCreateCategory(
input: AdminCreateCategoryInput!
): Category
adminCreateKind(
input: AdminCreateKindInput!
): Kind
adminCreateVendor(
input: AdminCreateVendorInput!
): Vendor
adminLogin(
input: AdminLoginInput!
): AdminLoginPayload
}
Also, the mutation_type.rb
looks like this:
module Types
# Path: app/graphql/types/mutation_type.rb
class MutationType < Types::BaseObject
description "The mutation root of this schema"
field :admin_login, mutation: Mutations::AdminLogin, description: "Admin login"
field :admin_create_category, mutation: Mutations::AdminCreateCategory, description: "Create a new category"
field :admin_create_kind, mutation: Mutations::AdminCreateKind, description: "Create a new kind"
field :admin_create_vendor, mutation: Mutations::AdminCreateVendor, description: "Create a new vendor"
end
end
My rubocop says:
Consider moving admin_login, admin_create_category, admin_create_kind, admin_create_vendor to a new type and adding the `admin` field instead (convention:GraphQL/ExtractType)
To resolve this offense, we will move to a separate common field, admin,
in the mutation type.
Solution:
Create a new file app/graphql/types/admin_mutation_type.rb
with the following text:
module Types
# Admin mutation root
class AdminMutationType < Types::BaseObject
description "The admin mutation root of this schema"
field :login, mutation: Mutations::AdminLogin, description: "Admin login"
field :create_category, mutation: Mutations::AdminCreateCategory, description: "Create a new category"
field :create_kind, mutation: Mutations::AdminCreateKind, description: "Create a new kind"
field :create_vendor, mutation: Mutations::AdminCreateVendor, description: "Create a new vendor"
end
end
Update app/graphql/types/mutation_type.rb
with the following code:
module Types
# Path: app/graphql/types/mutation_type.rb
class MutationType < Types::BaseObject
description "The mutation root of this schema"
field :admin, Types::AdminMutationType, null: false, description: "Admin mutations"
def admin
Types::AdminMutationType
end
end
end
Now the new schema will be changed as follows:
type Mutation {
admin: AdminMutation!
}
type AdminMutation {
createCategory(
input: AdminCreateCategoryInput!
): Category
createKind(
input: AdminCreateKindInput!
): Kind
createVendor(
input: AdminCreateVendorInput!
): Vendor
login(
input: AdminLoginInput!
): AdminLoginPayload
}
Now refactor test cases according to the new changes. We can also create a separate type for create
for mutation of create in the admin.
The same procedure can also be done in query_type.rb
while refactoring.
Happy Coding!
Posted on January 14, 2023
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.