openstax_accounts 4.1.1 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +4 -1
  3. data/app/controllers/openstax/accounts/application_controller.rb +1 -1
  4. data/app/models/openstax/accounts/account.rb +11 -6
  5. data/app/models/openstax/accounts/anonymous_account.rb +1 -1
  6. data/app/models/openstax/accounts/application_account.rb +2 -1
  7. data/app/models/openstax/accounts/group.rb +14 -12
  8. data/app/models/openstax/accounts/group_member.rb +10 -10
  9. data/app/models/openstax/accounts/group_nesting.rb +7 -13
  10. data/app/models/openstax/accounts/group_owner.rb +10 -10
  11. data/app/representers/openstax/accounts/api/v1/account_representer.rb +4 -3
  12. data/app/representers/openstax/accounts/api/v1/application_account_representer.rb +7 -2
  13. data/app/representers/openstax/accounts/api/v1/application_accounts_representer.rb +0 -2
  14. data/app/representers/openstax/accounts/api/v1/application_group_representer.rb +7 -2
  15. data/app/representers/openstax/accounts/api/v1/application_groups_representer.rb +0 -2
  16. data/app/representers/openstax/accounts/api/v1/group_nesting_representer.rb +1 -1
  17. data/app/representers/openstax/accounts/api/v1/group_representer.rb +1 -1
  18. data/app/representers/openstax/accounts/api/v1/group_user_representer.rb +1 -1
  19. data/app/routines/openstax/accounts/search_accounts.rb +1 -1
  20. data/app/routines/openstax/accounts/sync_accounts.rb +24 -27
  21. data/app/routines/openstax/accounts/sync_groups.rb +22 -26
  22. data/lib/openstax/accounts/action_controller/base.rb +61 -0
  23. data/lib/openstax/accounts/api.rb +270 -0
  24. data/lib/openstax/accounts/configuration.rb +77 -0
  25. data/lib/openstax/accounts/engine.rb +13 -11
  26. data/lib/openstax/accounts/has_many_through_groups/active_record/base.rb +51 -0
  27. data/lib/openstax/accounts/version.rb +1 -1
  28. data/lib/openstax_accounts.rb +8 -331
  29. data/spec/dummy/app/controllers/api/users_controller.rb +4 -0
  30. data/spec/dummy/config/routes.rb +3 -1
  31. data/spec/dummy/log/test.log +152307 -0
  32. data/spec/lib/openstax/accounts/api_spec.rb +232 -0
  33. data/spec/lib/openstax/accounts/has_many_through_groups/active_record/base_spec.rb +57 -0
  34. data/spec/routines/openstax/accounts/sync_accounts_spec.rb +5 -9
  35. data/spec/routines/openstax/accounts/sync_groups_spec.rb +38 -39
  36. metadata +27 -16
  37. data/lib/openstax/accounts/extend_builtins.rb +0 -50
  38. data/lib/openstax/accounts/has_many_through_groups.rb +0 -47
  39. data/spec/lib/openstax/accounts/has_many_through_groups_spec.rb +0 -53
  40. data/spec/lib/openstax_accounts_spec.rb +0 -210
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 89eaeece94bdba0b11a0f199af06eb5a81c3d7cf
4
- data.tar.gz: 95b3ad8856ea3eab85788ee48e2b33ee909c416f
3
+ metadata.gz: 5c68309eb816447b9379cd570f95a2099ce13bfc
4
+ data.tar.gz: c598caec6b97bff42fe269e3bd8885b688842673
5
5
  SHA512:
6
- metadata.gz: f299c3a422edf23b9528267f04006a31efa0f15748b5f0c20c3ce12035d0898426975f08776f61d510b1adb4c0a6f3e95e931afb7829112b47fe66287c57a9d0
7
- data.tar.gz: 765d14c76d283b5dd0c1ded49117b2ae9c594ba9302c2f4988272e70d6570f25a282253721d676b9a4da29c1672f1f8eab7581324576ae3c956aea080381b4a8
6
+ metadata.gz: 969eaf95f5aa6a2d2cee9e19972ee2c0269abb4fa939ea32a3f49d7fb8b946cbddac8360b5b8438d62873c3672f6377a70cf3da88d01cde0418da682efb50a9c
7
+ data.tar.gz: 255d45ca40d05da9db31569db43b04bde685b534bc55efd3c9c5470f549c8a38ab34968993ba52c273bce5999c3520b28d72303a76611167b8c9f968f18d7290
data/README.md CHANGED
@@ -136,7 +136,7 @@ Accounts API
136
136
  OpenStax Accounts provides convenience methods for accessing
137
137
  the Accounts server API.
138
138
 
139
- `OpenStax::Accounts.api_call(http_method, url, options = {})` provides a
139
+ `OpenStax::Accounts::Api.request(http_method, url, options = {})` provides a
140
140
  convenience method capable of making API calls to Accounts. `http_method` can
141
141
  be any valid HTTP method, and `url` is the desired API URL, without the 'api/'
142
142
  prefix. Options is a hash that can contain any option that
@@ -144,6 +144,9 @@ OAuth2 requests accept, such as :headers, :params, :body, etc,
144
144
  plus the optional values :api_version (to specify an API version) and
145
145
  :access_token (to specify an OAuth access token).
146
146
 
147
+ Individual methods to access each Accounts API, such as `search_accounts`,
148
+ are also available. See lib/openstax/accounts/api.rb for more details.
149
+
147
150
  Example Application
148
151
  -------------------
149
152
 
@@ -1,7 +1,7 @@
1
1
  module OpenStax
2
2
  module Accounts
3
3
 
4
- class ApplicationController < ActionController::Base
4
+ class ApplicationController < ::ActionController::Base
5
5
 
6
6
  include Lev::HandleWith
7
7
 
@@ -4,14 +4,20 @@ module OpenStax::Accounts
4
4
  USERNAME_DISCARDED_CHAR_REGEX = /[^A-Za-z\d_]/
5
5
  USERNAME_MAX_LENGTH = 50
6
6
 
7
+ attr_accessor :syncing
8
+
7
9
  has_many :group_owners, dependent: :destroy,
8
10
  class_name: 'OpenStax::Accounts::GroupOwner',
9
- primary_key: :openstax_uid, foreign_key: :user_id, inverse_of: :user
11
+ primary_key: :openstax_uid,
12
+ foreign_key: :user_id,
13
+ inverse_of: :user
10
14
  has_many :groups_as_owner, through: :group_owners, source: :group
11
15
 
12
16
  has_many :group_members, dependent: :destroy,
13
17
  class_name: 'OpenStax::Accounts::GroupMember',
14
- primary_key: :openstax_uid, foreign_key: :user_id, inverse_of: :user
18
+ primary_key: :openstax_uid,
19
+ foreign_key: :user_id,
20
+ inverse_of: :user
15
21
  has_many :groups_as_member, through: :group_members, source: :group
16
22
 
17
23
  validates :openstax_uid, :presence => true, :uniqueness => true
@@ -37,13 +43,12 @@ module OpenStax::Accounts
37
43
  protected
38
44
 
39
45
  def syncing_or_stubbing
40
- OpenStax::Accounts.syncing ||\
41
- OpenStax::Accounts.configuration.enable_stubbing?
46
+ syncing || OpenStax::Accounts.configuration.enable_stubbing?
42
47
  end
43
48
 
44
49
  def update_openstax_accounts
45
- OpenStax::Accounts.update_account(self)
50
+ OpenStax::Accounts::Api.update_account(self)
46
51
  end
47
52
 
48
53
  end
49
- end
54
+ end
@@ -21,4 +21,4 @@ module OpenStax
21
21
 
22
22
  end
23
23
  end
24
- end
24
+ end
@@ -1,7 +1,8 @@
1
1
  module OpenStax
2
2
  module Accounts
3
3
  class ApplicationAccount
4
- attr_accessor :id, :application_id, :account, :unread_updates, :default_contact_info_id
4
+ attr_accessor :id, :application_id, :account,
5
+ :unread_updates, :default_contact_info_id
5
6
  end
6
7
  end
7
8
  end
@@ -4,7 +4,7 @@ module OpenStax::Accounts
4
4
  serialize :cached_supertree_group_ids
5
5
  serialize :cached_subtree_group_ids
6
6
 
7
- attr_accessor :requestor
7
+ attr_accessor :requestor, :syncing
8
8
 
9
9
  has_many :group_owners, dependent: :destroy,
10
10
  class_name: 'OpenStax::Accounts::GroupOwner',
@@ -28,12 +28,15 @@ module OpenStax::Accounts
28
28
 
29
29
  validates :openstax_uid, :uniqueness => true, :presence => true
30
30
  validates_presence_of :requestor, :unless => :syncing_or_stubbing
31
- validates_uniqueness_of :name, :allow_nil => true, :unless => :syncing_or_stubbing
31
+ validates_uniqueness_of :name, :allow_nil => true,
32
+ :unless => :syncing_or_stubbing
32
33
 
33
34
  before_validation :create_openstax_accounts_group,
34
35
  :on => :create, :unless => :syncing_or_stubbing
35
- before_update :update_openstax_accounts_group, :unless => :syncing_or_stubbing
36
- before_destroy :destroy_openstax_accounts_group, :unless => :syncing_or_stubbing
36
+ before_update :update_openstax_accounts_group,
37
+ :unless => :syncing_or_stubbing
38
+ before_destroy :destroy_openstax_accounts_group,
39
+ :unless => :syncing_or_stubbing
37
40
 
38
41
  scope :visible_for, lambda { |account|
39
42
  next where(is_public: true) unless account.is_a? OpenStax::Accounts::Account
@@ -110,26 +113,25 @@ module OpenStax::Accounts
110
113
  protected
111
114
 
112
115
  def syncing_or_stubbing
113
- OpenStax::Accounts.syncing ||\
114
- OpenStax::Accounts.configuration.enable_stubbing?
116
+ syncing || OpenStax::Accounts.configuration.enable_stubbing?
115
117
  end
116
118
 
117
119
  def create_openstax_accounts_group
118
- return if OpenStax::Accounts.syncing || OpenStax::Accounts.configuration.enable_stubbing?
120
+ return false unless requestor
119
121
 
120
- OpenStax::Accounts.create_group(requestor, self)
122
+ OpenStax::Accounts::Api.create_group(requestor, self)
121
123
  end
122
124
 
123
125
  def update_openstax_accounts_group
124
- return if OpenStax::Accounts.syncing || OpenStax::Accounts.configuration.enable_stubbing?
126
+ return false unless requestor
125
127
 
126
- OpenStax::Accounts.update_group(requestor, self)
128
+ OpenStax::Accounts::Api.update_group(requestor, self)
127
129
  end
128
130
 
129
131
  def destroy_openstax_accounts_group
130
- return if OpenStax::Accounts.syncing || OpenStax::Accounts.configuration.enable_stubbing?
132
+ return false unless requestor
131
133
 
132
- OpenStax::Accounts.destroy_group(requestor, self)
134
+ OpenStax::Accounts::Api.destroy_group(requestor, self)
133
135
  end
134
136
 
135
137
  end
@@ -1,7 +1,7 @@
1
1
  module OpenStax::Accounts
2
2
  class GroupMember < ActiveRecord::Base
3
3
 
4
- attr_accessor :requestor
4
+ delegate :requestor, :syncing, to: :group
5
5
 
6
6
  belongs_to :group, class_name: 'OpenStax::Accounts::Group',
7
7
  primary_key: :openstax_uid, inverse_of: :group_members
@@ -10,30 +10,30 @@ module OpenStax::Accounts
10
10
 
11
11
  validates_presence_of :user_id, :group_id
12
12
  validates_uniqueness_of :user_id, scope: :group_id
13
- validates_presence_of :group, :user, :requestor, :unless => :syncing_or_stubbing
13
+ validates_presence_of :group, :user, :requestor,
14
+ :unless => :syncing_or_stubbing
14
15
 
15
- before_create :create_openstax_accounts_group_member, :unless => :syncing_or_stubbing
16
- before_destroy :destroy_openstax_accounts_group_member, :unless => :syncing_or_stubbing
16
+ before_create :create_openstax_accounts_group_member,
17
+ :unless => :syncing_or_stubbing
18
+ before_destroy :destroy_openstax_accounts_group_member,
19
+ :unless => :syncing_or_stubbing
17
20
 
18
21
  protected
19
22
 
20
23
  def syncing_or_stubbing
21
- OpenStax::Accounts.syncing ||\
22
- OpenStax::Accounts.configuration.enable_stubbing?
24
+ syncing || OpenStax::Accounts.configuration.enable_stubbing?
23
25
  end
24
26
 
25
27
  def create_openstax_accounts_group_member
26
- return if OpenStax::Accounts.syncing || OpenStax::Accounts.configuration.enable_stubbing?
27
28
  return false unless requestor
28
29
 
29
- OpenStax::Accounts.create_group_member(requestor, self)
30
+ OpenStax::Accounts::Api.create_group_member(requestor, self)
30
31
  end
31
32
 
32
33
  def destroy_openstax_accounts_group_member
33
- return if OpenStax::Accounts.syncing || OpenStax::Accounts.configuration.enable_stubbing?
34
34
  return false unless requestor
35
35
 
36
- OpenStax::Accounts.destroy_group_member(requestor, self)
36
+ OpenStax::Accounts::Api.destroy_group_member(requestor, self)
37
37
  end
38
38
 
39
39
  end
@@ -1,7 +1,7 @@
1
1
  module OpenStax::Accounts
2
2
  class GroupNesting < ActiveRecord::Base
3
3
 
4
- attr_accessor :requestor
4
+ delegate :requestor, :syncing, to: :container_group
5
5
 
6
6
  belongs_to :container_group, class_name: 'OpenStax::Accounts::Group',
7
7
  primary_key: :openstax_uid, inverse_of: :member_group_nestings
@@ -14,22 +14,18 @@ module OpenStax::Accounts
14
14
  :unless => :syncing_or_stubbing
15
15
  validate :no_loops, :unless => :syncing_or_stubbing
16
16
 
17
- before_create :update_group_caches, :unless => :syncing?
18
- before_destroy :update_group_caches, :unless => :syncing?
17
+ before_create :update_group_caches, :unless => :syncing
18
+ before_destroy :update_group_caches, :unless => :syncing
19
19
 
20
20
  before_create :create_openstax_accounts_group_nesting,
21
21
  :unless => :syncing_or_stubbing
22
- before_destroy :update_group_caches, :destroy_openstax_accounts_group_nesting,
22
+ before_destroy :destroy_openstax_accounts_group_nesting,
23
23
  :unless => :syncing_or_stubbing
24
24
 
25
25
  protected
26
26
 
27
- def syncing?
28
- OpenStax::Accounts.syncing
29
- end
30
-
31
27
  def syncing_or_stubbing
32
- syncing? || OpenStax::Accounts.configuration.enable_stubbing?
28
+ syncing || OpenStax::Accounts.configuration.enable_stubbing?
33
29
  end
34
30
 
35
31
  def no_loops
@@ -45,17 +41,15 @@ module OpenStax::Accounts
45
41
  end
46
42
 
47
43
  def create_openstax_accounts_group_nesting
48
- return if OpenStax::Accounts.syncing || OpenStax::Accounts.configuration.enable_stubbing?
49
44
  return false unless requestor
50
45
 
51
- OpenStax::Accounts.create_group_nesting(requestor, self)
46
+ OpenStax::Accounts::Api.create_group_nesting(requestor, self)
52
47
  end
53
48
 
54
49
  def destroy_openstax_accounts_group_nesting
55
- return if OpenStax::Accounts.syncing || OpenStax::Accounts.configuration.enable_stubbing?
56
50
  return false unless requestor
57
51
 
58
- OpenStax::Accounts.destroy_group_nesting(requestor, self)
52
+ OpenStax::Accounts::Api.destroy_group_nesting(requestor, self)
59
53
  end
60
54
 
61
55
  end
@@ -1,7 +1,7 @@
1
1
  module OpenStax::Accounts
2
2
  class GroupOwner < ActiveRecord::Base
3
3
 
4
- attr_accessor :requestor
4
+ delegate :requestor, :syncing, to: :group
5
5
 
6
6
  belongs_to :group, class_name: 'OpenStax::Accounts::Group',
7
7
  primary_key: :openstax_uid, inverse_of: :group_owners
@@ -10,30 +10,30 @@ module OpenStax::Accounts
10
10
 
11
11
  validates_presence_of :user_id, :group_id
12
12
  validates_uniqueness_of :user_id, scope: :group_id
13
- validates_presence_of :group, :user, :requestor, :unless => :syncing_or_stubbing
13
+ validates_presence_of :group, :user, :requestor,
14
+ :unless => :syncing_or_stubbing
14
15
 
15
- before_create :create_openstax_accounts_group_owner, :unless => :syncing_or_stubbing
16
- before_destroy :destroy_openstax_accounts_group_owner, :unless => :syncing_or_stubbing
16
+ before_create :create_openstax_accounts_group_owner,
17
+ :unless => :syncing_or_stubbing
18
+ before_destroy :destroy_openstax_accounts_group_owner,
19
+ :unless => :syncing_or_stubbing
17
20
 
18
21
  protected
19
22
 
20
23
  def syncing_or_stubbing
21
- OpenStax::Accounts.syncing ||\
22
- OpenStax::Accounts.configuration.enable_stubbing?
24
+ syncing || OpenStax::Accounts.configuration.enable_stubbing?
23
25
  end
24
26
 
25
27
  def create_openstax_accounts_group_owner
26
- return if OpenStax::Accounts.syncing || OpenStax::Accounts.configuration.enable_stubbing?
27
28
  return false unless requestor
28
29
 
29
- OpenStax::Accounts.create_group_owner(requestor, self)
30
+ OpenStax::Accounts::Api.create_group_owner(requestor, self)
30
31
  end
31
32
 
32
33
  def destroy_openstax_accounts_group_owner
33
- return if OpenStax::Accounts.syncing || OpenStax::Accounts.configuration.enable_stubbing?
34
34
  return false unless requestor
35
35
 
36
- OpenStax::Accounts.destroy_group_owner(requestor, self)
36
+ OpenStax::Accounts::Api.destroy_group_owner(requestor, self)
37
37
  end
38
38
 
39
39
  end
@@ -1,14 +1,15 @@
1
1
  # A representer for Accounts
2
2
  #
3
- # This representer can be used directly or subclassed for an object that delegates
4
- # openstax_uid, username, first_name, last_name, full_name and title to an account
3
+ # This representer can be used directly or subclassed for an object that
4
+ # delegates openstax_uid, username, first_name, last_name, full_name and
5
+ # title to an account
5
6
 
6
7
  module OpenStax
7
8
  module Accounts
8
9
  module Api
9
10
  module V1
10
11
  class AccountRepresenter < Roar::Decorator
11
- include Roar::Representer::JSON
12
+ include Roar::JSON
12
13
 
13
14
  property :openstax_uid,
14
15
  as: :id,
@@ -3,7 +3,7 @@ module OpenStax
3
3
  module Api
4
4
  module V1
5
5
  class ApplicationAccountRepresenter < Roar::Decorator
6
- include Roar::Representer::JSON
6
+ include Roar::JSON
7
7
 
8
8
  property :id,
9
9
  type: Integer
@@ -14,7 +14,12 @@ module OpenStax
14
14
  property :account,
15
15
  as: :user,
16
16
  class: OpenStax::Accounts::Account,
17
- decorator: AccountRepresenter
17
+ decorator: AccountRepresenter,
18
+ instance: ->(*) {
19
+ a = OpenStax::Accounts::Account.new
20
+ a.syncing = true
21
+ a
22
+ }
18
23
 
19
24
  property :unread_updates,
20
25
  type: Integer
@@ -1,5 +1,3 @@
1
- require 'representable/json/collection'
2
-
3
1
  module OpenStax
4
2
  module Accounts
5
3
  module Api
@@ -3,7 +3,7 @@ module OpenStax
3
3
  module Api
4
4
  module V1
5
5
  class ApplicationGroupRepresenter < Roar::Decorator
6
- include Roar::Representer::JSON
6
+ include Roar::JSON
7
7
 
8
8
  property :id,
9
9
  type: Integer
@@ -13,7 +13,12 @@ module OpenStax
13
13
 
14
14
  property :group,
15
15
  class: OpenStax::Accounts::Group,
16
- decorator: GroupRepresenter
16
+ decorator: GroupRepresenter,
17
+ instance: ->(*) {
18
+ g = OpenStax::Accounts::Group.new
19
+ g.syncing = true
20
+ g
21
+ }
17
22
 
18
23
  property :unread_updates,
19
24
  type: Integer
@@ -1,5 +1,3 @@
1
- require 'representable/json/collection'
2
-
3
1
  module OpenStax
4
2
  module Accounts
5
3
  module Api
@@ -3,7 +3,7 @@ module OpenStax
3
3
  module Api
4
4
  module V1
5
5
  class GroupNestingRepresenter < Roar::Decorator
6
- include Roar::Representer::JSON
6
+ include Roar::JSON
7
7
 
8
8
  property :container_group_id,
9
9
  type: Integer
@@ -3,7 +3,7 @@ module OpenStax
3
3
  module Api
4
4
  module V1
5
5
  class GroupRepresenter < Roar::Decorator
6
- include Roar::Representer::JSON
6
+ include Roar::JSON
7
7
 
8
8
  property :openstax_uid,
9
9
  as: :id,
@@ -3,7 +3,7 @@ module OpenStax
3
3
  module Api
4
4
  module V1
5
5
  class GroupUserRepresenter < Roar::Decorator
6
- include Roar::Representer::JSON
6
+ include Roar::JSON
7
7
 
8
8
  property :group_id,
9
9
  type: Integer
@@ -21,7 +21,7 @@ module OpenStax
21
21
  if !OpenStax::Accounts.configuration.enable_stubbing? && \
22
22
  query =~ /email:/
23
23
  # Delegate to Accounts
24
- response = OpenStax::Accounts.search_application_accounts(query)
24
+ response = OpenStax::Accounts::Api.search_application_accounts(query)
25
25
  OpenStax::Accounts::Api::V1::AccountSearchRepresenter \
26
26
  .new(outputs).from_json(response.body)
27
27
  else
@@ -16,43 +16,40 @@ module OpenStax
16
16
 
17
17
  def exec(options={})
18
18
 
19
- begin
20
- OpenStax::Accounts.syncing = true
19
+ return if OpenStax::Accounts.configuration.enable_stubbing?
21
20
 
22
- return if OpenStax::Accounts.configuration.enable_stubbing?
21
+ response = OpenStax::Accounts::Api.get_application_account_updates
23
22
 
24
- response = OpenStax::Accounts.get_application_account_updates
23
+ app_accounts = []
24
+ app_accounts_rep = OpenStax::Accounts::Api::V1::ApplicationAccountsRepresenter
25
+ .new(app_accounts)
26
+ app_accounts_rep.from_json(response.body)
25
27
 
26
- app_accounts = []
27
- app_accounts_rep = OpenStax::Accounts::Api::V1::ApplicationAccountsRepresenter
28
- .new(app_accounts)
29
- app_accounts_rep.from_json(response.body)
28
+ return if app_accounts.empty?
30
29
 
31
- return if app_accounts.empty?
30
+ updated_app_accounts = []
31
+ app_accounts.each do |app_account|
32
+ account = OpenStax::Accounts::Account.where(
33
+ :openstax_uid => app_account.account.openstax_uid
34
+ ).first || app_account.account
35
+ account.syncing = true
32
36
 
33
- updated_app_accounts = []
34
- app_accounts.each do |app_account|
35
- account = OpenStax::Accounts::Account.where(
36
- :openstax_uid => app_account.account.openstax_uid).first ||\
37
- app_account.account
38
-
39
- if account != app_account.account
40
- SYNC_ATTRIBUTES.each do |attribute|
41
- account.send("#{attribute}=", app_account.account.send(attribute))
42
- end
37
+ if account != app_account.account
38
+ SYNC_ATTRIBUTES.each do |attribute|
39
+ account.send("#{attribute}=", app_account.account.send(attribute))
43
40
  end
44
-
45
- next unless account.save
46
-
47
- updated_app_accounts << {user_id: account.openstax_uid,
48
- read_updates: app_account.unread_updates}
49
41
  end
50
42
 
51
- OpenStax::Accounts.mark_account_updates_as_read(updated_app_accounts)
52
- ensure
53
- OpenStax::Accounts.syncing = false
43
+ next unless account.save
44
+
45
+ updated_app_accounts << {user_id: account.openstax_uid,
46
+ read_updates: app_account.unread_updates}
54
47
  end
55
48
 
49
+ OpenStax::Accounts::Api.mark_account_updates_as_read(
50
+ updated_app_accounts
51
+ )
52
+
56
53
  end
57
54
 
58
55
  end