Skip to content

Commit

Permalink
scope mutations belong to users under Users module
Browse files Browse the repository at this point in the history
  • Loading branch information
simonfranzen committed Sep 18, 2020
1 parent 26b86cc commit 3498e55
Show file tree
Hide file tree
Showing 27 changed files with 166 additions and 150 deletions.
22 changes: 0 additions & 22 deletions app/graphql/mutations/delete_user.rb

This file was deleted.

20 changes: 0 additions & 20 deletions app/graphql/mutations/update_user.rb

This file was deleted.

27 changes: 0 additions & 27 deletions app/graphql/mutations/update_user_role.rb

This file was deleted.

24 changes: 24 additions & 0 deletions app/graphql/mutations/users/delete_user.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# frozen_string_literal: true

module Mutations
module Users
# Deletes an user as an admin.
class DeleteUser < Mutations::BaseMutation
description 'Deletes an user as an admin.'
argument :id, ID, required: true
payload_type Boolean

def resolve(id:)
user = ::User.accessible_by(current_ability).find_by(id: id)
if user.nil?
raise ActiveRecord::RecordNotFound, I18n.t('errors.messages.resource_not_found', resource: ::User.model_name.human)
end

current_ability.authorize! :destroy, user
return true if user.destroy!

false
end
end
end
end
22 changes: 22 additions & 0 deletions app/graphql/mutations/users/update_user.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# frozen_string_literal: true

module Mutations
module Users
# Updates an existing user as an admin.
class UpdateUser < Mutations::BaseMutation
description 'Updates an existing user as an admin.'
argument :id, ID, required: true
argument :attributes, Types::Users::UserInputType, required: true
payload_type Types::Users::UserType

def resolve(id:, attributes:)
user = ::User.accessible_by(current_ability).find_by(id: id)
raise ActiveRecord::RecordNotFound, I18n.t('errors.messages.resource_not_found', resource: ::User.model_name.human) if user.nil?

user.attributes = attributes.to_h
current_ability.authorize! :update, user
return user if user.save!
end
end
end
end
29 changes: 29 additions & 0 deletions app/graphql/mutations/users/update_user_role.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# frozen_string_literal: true

module Mutations
module Users
# Updates the role for an user as an admin.
class UpdateUserRole < Mutations::BaseMutation
description 'Updates the role for an user as an admin.'
argument :id, ID, required: true
argument :role, String, required: true, description: '"user" or "admin"'
payload_type Boolean

def resolve(id:, role:)
user = ::User.accessible_by(current_ability).find_by(id: id)
if user.nil?
raise ActiveRecord::RecordNotFound, I18n.t('errors.messages.resource_not_found', resource: ::User.model_name.human)
end

if %w[admin user].include?(role)
user.role = role
current_ability.authorize! :update, user
user.save!
return true
end

false
end
end
end
end
13 changes: 0 additions & 13 deletions app/graphql/resolvers/me.rb

This file was deleted.

15 changes: 0 additions & 15 deletions app/graphql/resolvers/user.rb

This file was deleted.

13 changes: 0 additions & 13 deletions app/graphql/resolvers/users.rb

This file was deleted.

15 changes: 15 additions & 0 deletions app/graphql/resolvers/users/me.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# frozen_string_literal: true

module Resolvers
module Users
# Get current user object
class Me < Resolvers::BaseResolver
type Types::Users::UserType, null: true
description 'Returns the current user'

def resolve
context[:current_user]
end
end
end
end
17 changes: 17 additions & 0 deletions app/graphql/resolvers/users/user.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# frozen_string_literal: true

module Resolvers
module Users
# Resolver to return a user
class User < Resolvers::BaseResolver
type Types::Users::UserType, null: true
description 'Returns the user for a requested id'

argument :id, ID, required: true

def resolve(id:)
::User.accessible_by(current_ability).find_by(id: id)
end
end
end
end
15 changes: 15 additions & 0 deletions app/graphql/resolvers/users/users.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# frozen_string_literal: true

module Resolvers
module Users
# Resolver to return a user
class Users < Resolvers::BaseResolver
type Types::Users::UserType.connection_type, null: true
description 'Returns all user for the current user company'

def resolve(**_args)
::User.accessible_by(current_ability).includes(:company)
end
end
end
end
2 changes: 1 addition & 1 deletion app/graphql/types/companies/company_type.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
module Types
module Companies
# GraphQL type for a company
class CompanyType < ::Types::BaseModel
class CompanyType < Types::BaseModel
field :name, String, null: false
field :slug, String, null: true
# field :users, [::Types::UserType], null: true
Expand Down
6 changes: 3 additions & 3 deletions app/graphql/types/mutation_type.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ class MutationType < Types::BaseObject
implements ::Types::GraphqlAuth

# Mutations
field :update_user, mutation: Mutations::UpdateUser
field :update_user_role, mutation: Mutations::UpdateUserRole
field :delete_user, mutation: Mutations::DeleteUser
field :update_user, mutation: Mutations::Users::UpdateUser
field :update_user_role, mutation: Mutations::Users::UpdateUserRole
field :delete_user, mutation: Mutations::Users::DeleteUser

# Company
field :update_company, mutation: Mutations::Companies::UpdateCompany
Expand Down
6 changes: 3 additions & 3 deletions app/graphql/types/query_type.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ module Types
# Loads queries into schema
# include other queries and resolvers here
class QueryType < BaseObject
field :me, resolver: Resolvers::Me
field :me, resolver: Resolvers::Users::Me

field :users, resolver: Resolvers::Users
field :user, resolver: Resolvers::User
field :users, resolver: Resolvers::Users::Users
field :user, resolver: Resolvers::Users::User

field :company, resolver: Resolvers::Companies::Company
end
Expand Down
13 changes: 0 additions & 13 deletions app/graphql/types/user_input_type.rb

This file was deleted.

13 changes: 0 additions & 13 deletions app/graphql/types/user_type.rb

This file was deleted.

15 changes: 15 additions & 0 deletions app/graphql/types/users/user_input_type.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# frozen_string_literal: true

module Types
module Users
# Input type for user
class UserInputType < Types::BaseInputObject
description 'Attributes to create a user.'
argument :email, String, 'Email of user', required: true
argument :first_name, String, 'Firstname of user', required: true
argument :last_name, String, 'Lastname of user', required: true
argument :password, String, 'Password of user', required: false
argument :password_confirmation, String, 'Password confirmation', required: false
end
end
end
15 changes: 15 additions & 0 deletions app/graphql/types/users/user_type.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# frozen_string_literal: true

module Types
module Users
# GraphQL type for a user
class UserType < Types::BaseModel
field :name, String, null: false
field :first_name, String, null: false
field :last_name, String, null: false
field :email, String, null: true
field :role, String, null: false
field :company, Types::Companies::CompanyType, null: false
end
end
end
2 changes: 1 addition & 1 deletion config/initializers/graphql_auth.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
config.jwt_secret_key = ENV['DEVISE_SECRET_KEY']
config.app_url = ENV['CLIENT_URL']

config.user_type = '::Types::UserType'
config.user_type = '::Types::Users::UserType'

# Devise allowed actions
# Don't forget to enable the lockable setting in your Devise user model if you plan on using the lock_account feature
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

require 'rails_helper'

RSpec.describe Mutations::DeleteUser do
RSpec.describe Mutations::Users::DeleteUser do
subject(:graphql!) { result }

let!(:admin) do
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

require 'rails_helper'

RSpec.describe Mutations::UpdateUserRole do
RSpec.describe Mutations::Users::UpdateUserRole do
subject(:graphql!) { result }

let!(:admin) do
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

require 'rails_helper'

RSpec.describe Mutations::UpdateUser do
RSpec.describe Mutations::Users::UpdateUser do
subject(:graphql!) { result }

let!(:admin) do
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

require 'rails_helper'

RSpec.describe Resolvers::Me, type: :request do
RSpec.describe Resolvers::Users::Me, type: :request do
subject(:graphql!) { result }

let(:result) do
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

require 'rails_helper'

RSpec.describe Resolvers::User, type: :request do
RSpec.describe Resolvers::Users::User, type: :request do
subject(:graphql!) { result }

let!(:company) do
Expand Down
Loading

0 comments on commit 3498e55

Please sign in to comment.