DEV Community

Cover image for Resolving GraphQL/ExtractType rubocop offense in mutation type rails
Sulman Baig
Sulman Baig

Posted on • Originally published at sulmanweb.com

1

Resolving GraphQL/ExtractType rubocop offense in mutation type rails

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
}
Enter fullscreen mode Exit fullscreen mode

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 
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
}
Enter fullscreen mode Exit fullscreen mode

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!

Top comments (0)

Postmark Image

Speedy emails, satisfied customers

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up