Skip to content

Commit a4f1121

Browse files
committed
* add account model to app with reference to user
* add user resolver
1 parent fd48e00 commit a4f1121

File tree

18 files changed

+304
-23
lines changed

18 files changed

+304
-23
lines changed

.rubocop.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,5 @@ RSpec/UnspecifiedException:
3434
Enabled: false
3535
RSpec/ExampleLength:
3636
Max: 10
37+
RSpec/MultipleMemoizedHelpers:
38+
Max: 10
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# frozen_string_literal: true
2+
3+
module Resolvers
4+
# Base resolver class
5+
class BaseResolver < GraphQL::Schema::Resolver
6+
def current_ability
7+
Ability.new(context[:current_user])
8+
end
9+
end
10+
end

app/graphql/resolvers/me.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
module Resolvers
44
# Get current user object
5-
class Me < GraphQL::Schema::Resolver
5+
class Me < BaseResolver
66
type Types::UserType, null: true
77
description 'Returns the current user'
88

app/graphql/resolvers/user.rb

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# frozen_string_literal: true
2+
3+
module Resolvers
4+
# Resolver to return a user
5+
class User < BaseResolver
6+
type Types::UserType, null: true
7+
description 'Returns the user for a requested id'
8+
9+
argument :id, ID, required: true
10+
11+
def resolve(id:)
12+
::User.accessible_by(current_ability).find_by(id: id)
13+
end
14+
end
15+
end

app/graphql/types/query_type.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,15 @@ module Types
55
# include other queries and resolvers here
66
class QueryType < BaseObject
77
field :me, resolver: Resolvers::Me
8+
9+
field :users, Types::UserType.connection_type, null: false
10+
def users(**_args)
11+
::User.accessible_by(current_ability)
12+
end
13+
field :user, resolver: Resolvers::User
14+
15+
def current_ability
16+
Ability.new(context[:current_user])
17+
end
818
end
919
end

app/models/ability.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
# frozen_string_literal: true
22

33
# Defines abilities for user
4-
# rubocop:disable Style/GuardClause
54
class Ability
65
include CanCan::Ability
76

@@ -15,12 +14,13 @@ def initialize(user)
1514
if user.superadmin?
1615
can :access, :rails_admin # grant access to rails_admin
1716
can :manage, :all # admins can manage all objects
18-
# elsif user.admin?
19-
# can :crud, Survey::QuestionAnswer # user can crud all question answers
17+
elsif user.admin?
18+
can :crud, User, account_id: user.account_id
19+
else
20+
can :read, User, account_id: user.account_id
2021
end
2122

2223
# See the wiki for details:
2324
# https://github.com/CanCanCommunity/cancancan/wiki/Defining-Abilities
2425
end
2526
end
26-
# rubocop:enable Style/GuardClause

app/models/account.rb

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# frozen_string_literal: true
2+
3+
# == Schema Information
4+
#
5+
# Table name: accounts
6+
#
7+
# id :uuid not null, primary key
8+
# name :string
9+
# created_at :datetime not null
10+
# updated_at :datetime not null
11+
#
12+
class Account < ApplicationRecord
13+
validates :name, presence: true
14+
validates :name, length: { maximum: 255 }
15+
has_many :users, dependent: :destroy
16+
end

app/models/user.rb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
# unlock_token :string
2929
# created_at :datetime not null
3030
# updated_at :datetime not null
31+
# account_id :uuid
3132
#
3233
# Indexes
3334
#
@@ -37,7 +38,6 @@
3738
# index_users_on_reset_password_token (reset_password_token) UNIQUE
3839
# index_users_on_unlock_token (unlock_token) UNIQUE
3940
#
40-
# User model to access application
4141
class User < ApplicationRecord
4242
# Include default devise modules. Others available are:
4343
# :confirmable, :timeoutable, :trackable and :omniauthable
@@ -59,6 +59,9 @@ class User < ApplicationRecord
5959
validates :first_name, length: { maximum: 255 }
6060
validates :last_name, length: { maximum: 255 }
6161

62+
# - RELATIONS
63+
belongs_to :account
64+
6265
# - CALLBACKS
6366
after_initialize :setup_new_user, if: :new_record?
6467

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
class CreateAccounts < ActiveRecord::Migration[6.0]
2+
def change
3+
create_table :accounts, id: :uuid do |t|
4+
t.string :name
5+
t.timestamps
6+
end
7+
end
8+
end
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class AddAccountIdToUsers < ActiveRecord::Migration[6.0]
2+
def change
3+
add_column :users, :account_id, :uuid
4+
end
5+
end

0 commit comments

Comments
 (0)