Class: Clerk::Account

Inherits:
ApplicationRecord show all
Defined in:
lib/clerk/account.rb

Defined Under Namespace

Classes: RolesWrapper

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from ApplicationRecord

clerk_persistence_api, clerk_persistence_path, clerk_table_name, transaction

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method_name, *args, &block) ⇒ Object (private)



91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/clerk/account.rb', line 91

def method_missing(method_name, *args, &block)
  # Rails lazy loads modules.  If an object hasn't been loaded yet, any inverse association
  # will not be here yet.  Just in case, load the constant here and re-call the method to
  # before raising an error
  @miss_test ||= {}
  if @miss_test.has_key? method_name.to_sym
    super
  else
    @miss_test[method_name.to_sym] = true
    scope_class = method_name.to_s.classify.constantize
    send(method_name, *args, &block)  
  end
rescue => e
  super
end

Class Method Details

.from_session_token(session_token) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/clerk/account.rb', line 27

def self.from_session_token(session_token)
  rsa_public = OpenSSL::PKey::RSA.new ENV["CLERK_SESSION_KEY"]
  begin
    decoded_token = ::JWT.decode (session_token), rsa_public, true, { algorithm: 'RS256' }
    session_id = decoded_token[0]["id"]
    session = clerk_persistence_api.get("/v1/sessions/#{session_id}").data
     = Clerk::Account.new(
      id: session[:account][:id],
      email_address: session[:account][:email_address],
      verified_email_address: session[:account][:verified_email_address]
    )
    .instance_variable_set(:@new_record, false)
    .clear_changes_information
    
  rescue => e 
    puts "Failed to find account from session token"
    puts e
    return nil
  end
end

Instance Method Details

#add_clerk_role(role_type_symbol, instance = nil) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/clerk/account.rb', line 48

def add_clerk_role(role_type_symbol, instance = nil)
  json = {}
  json[:name] = role_type_symbol.to_s
  json[:account_id] = self.id

  if not instance.nil?
    json[:scope_class] = instance.class.name
    json[:scope_id] = instance.id
  end

  server_url = "#{Clerk.accounts_url}/roles"
  HTTP.auth("Bearer #{Clerk.key}").post(server_url, :json => json)
end

#email(from_email_name:, email_template_token: nil, replacements: nil, subject: nil, body: nil) ⇒ Object



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/clerk/account.rb', line 10

def email(
  from_email_name:,
  email_template_token: nil,
  replacements: nil,
  subject: nil,
  body: nil
)
  Clerk::Email.create(
    account_id: self.id,
    from_email_name: from_email_name,
    email_template_token: email_template_token,
    replacements: replacements,
    subject: subject,
    body: body
  )
end

#has_permission?(permission, scope) ⇒ Boolean

Returns:

  • (Boolean)


70
71
72
# File 'lib/clerk/account.rb', line 70

def has_permission?(permission, scope)
  has_role?(scope.class.roles_with_permission(permission), scope)
end

#has_role?(role, scope) ⇒ Boolean

Returns:

  • (Boolean)


62
63
64
# File 'lib/clerk/account.rb', line 62

def has_role?(role, scope)
  roles.where(name: role, scope_class: scope.class.name, scope_id: scope.id).exists?
end

#permissions_for(scope) ⇒ Object



74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/clerk/account.rb', line 74

def permissions_for(scope)
  permissions = Set.new

  roles = roles_for(scope)
  roles.each do |role|
    role_permissions = scope.class.clerk_permissions_map[role]

    unless role_permissions.nil?
      permissions.merge(role_permissions)
    end
  end

  return permissions.to_a
end

#roles_for(scope) ⇒ Object



66
67
68
# File 'lib/clerk/account.rb', line 66

def roles_for(scope)
  roles.where(scope_class: scope.class.name, scope_id: scope.id).pluck(:name).map(&:to_sym)
end