Skip to content

Commit 3304bae

Browse files
committed
account params wip
1 parent 24a509b commit 3304bae

7 files changed

Lines changed: 93 additions & 50 deletions

File tree

app/controllers/admin/api/signups_controller.rb

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,30 @@ class Admin::Api::SignupsController < Admin::Api::BaseController
77
def create
88
authorize!(:create, Account) if current_user
99

10-
@signup_result = Signup::DeveloperAccountManager.new(current_account).create(signup_params)
10+
@signup_result = account_manager.create(signup_params)
1111

1212
check_creation_errors
1313
respond_with(@signup_result.account, user_options: { with_apps: true })
1414
end
1515

1616
private
1717

18+
def account_manager
19+
@account_manager ||= Signup::DeveloperAccountManager.new(current_account)
20+
end
21+
1822
def user_params
19-
flat_params.merge({signup_type: :minimal})
23+
@user_params ||= begin
24+
allowed_attrs = account_manager.user.defined_fields_names | %i(password signup_type)
25+
flat_params.permit(*allowed_attrs).merge({signup_type: :minimal})
26+
end
27+
end
28+
29+
def account_params
30+
@account_params ||= begin
31+
allowed_attrs = account_manager.account.defined_fields_names - %i(billing_address country) + %i(country_id)
32+
flat_params.permit(*allowed_attrs)
33+
end
2034
end
2135

2236
def check_creation_errors
@@ -31,7 +45,7 @@ def check_creation_errors
3145
end
3246

3347
def signup_params
34-
Signup::SignupParams.new(plans: plans, user_attributes: user_params, account_attributes: flat_params, defaults: defaults)
48+
Signup::SignupParams.new(plans: plans, user_attributes: user_params, account_attributes: account_params, defaults: defaults)
3549
end
3650

3751
def defaults

app/controllers/buyers/accounts_controller.rb

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ class Buyers::AccountsController < Buyers::BaseController
99

1010
before_action :set_plans, :only => %i[new create]
1111
before_action :find_account, except: %i[index new create]
12+
before_action :init_signup_account_manager, only: %i[create]
1213

1314
activate_menu :buyers, :accounts, :listing
1415

@@ -41,7 +42,7 @@ def update
4142
end
4243

4344
def create
44-
signup_result = Signup::DeveloperAccountManager.new(current_account).create(signup_params)
45+
signup_result = @account_manager.create(signup_params)
4546
@buyer = signup_result.account
4647

4748
if signup_result.persisted?
@@ -84,7 +85,7 @@ def show
8485

8586
protected
8687

87-
attr_reader :account
88+
attr_reader :account, :user
8889

8990
def find_account
9091
with_deleted = %w[show resume].include?(action_name)
@@ -109,13 +110,19 @@ def signup_params
109110
Signup::SignupParams.new(plans: [], user_attributes: user_params.merge(signup_type: :created_by_provider), account_attributes: account_params, validate_fields: false)
110111
end
111112

112-
# TODO: using `permit` later
113113
def account_params
114-
@account_params ||= params.require(:account).except(:user)
114+
@account_params ||= begin
115+
allowed_attrs = account.defined_builtin_fields_names - %i(billing_address country) + %i(country_id)
116+
params.require(:account).permit(*allowed_attrs, extra_fields: account.defined_extra_fields_names)
117+
end
115118
end
116119

117120
def user_params
118-
params.require(:account).fetch(:user, {})
121+
@user_params ||= begin
122+
allowed_attrs = user.defined_builtin_fields_names | %i(password signup_type)
123+
params.require(:account).fetch(:user, ActionController::Parameters.new)
124+
.permit(*allowed_attrs, extra_fields: user.defined_extra_fields_names)
125+
end
119126
end
120127

121128
def set_plans
@@ -131,4 +138,10 @@ def presenter
131138
user: current_user,
132139
params: params)
133140
end
141+
142+
def init_signup_account_manager
143+
@account_manager = Signup::DeveloperAccountManager.new(current_account)
144+
@account = @account_manager.account
145+
@user = @account_manager.user
146+
end
134147
end

app/lib/signup/account_manager.rb

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,17 @@ module Signup
44
class AccountManager
55
def initialize(manager_account)
66
@manager_account = manager_account
7+
@account = manager_account.buyers.new
8+
@user = @account.users.new
79
end
810

9-
attr_reader :manager_account
11+
attr_reader :manager_account, :account, :user
1012

1113
def create(signup_params, signup_result_class = ::Signup::Result)
1214
transaction do
13-
signup_result = build_signup_result(signup_params, signup_result_class)
15+
assign_attributes_for_account(signup_params)
16+
assign_attributes_for_user(signup_params)
17+
signup_result = build_signup_result(signup_result_class)
1418
yield(signup_result) if block_given?
1519
save_result_with_plans(signup_result, signup_params) if signup_result.valid?
1620
signup_result
@@ -44,21 +48,22 @@ def persist!(*)
4448
raise NotImplementedError, 'persist! should be implemented in subclasses'
4549
end
4650

47-
def build_signup_result(signup_params, signup_result_class)
48-
account = build_account(signup_params)
49-
signup_result_class.new(user: build_user(signup_params, account), account: account)
51+
def build_signup_result(signup_result_class)
52+
signup_result_class.new(user: user, account: account)
5053
end
5154

52-
def build_user(signup_params, account)
53-
user = signup_params.build_user_with_attributes_for_account(account)
54-
user.role = :admin
55-
user
55+
def assign_attributes_for_account(signup_params)
56+
account.validate_fields! if signup_params.validate_fields
57+
account_attributes = signup_params.attributes[:account]
58+
account_attributes.delete('name') if account_attributes['org_name'].present?
59+
account.assign_attributes(account_attributes)
60+
account_builder.call(account)
5661
end
5762

58-
def build_account(signup_params)
59-
account = signup_params.build_account_with_attributes_for_provider_account(manager_account)
60-
account_builder.call(account)
61-
account
63+
def assign_attributes_for_user(signup_params)
64+
user.validate_fields! if signup_params.validate_fields
65+
user.assign_attributes(signup_params.attributes[:user])
66+
user.role = :admin
6267
end
6368

6469
def create_contract_plans_for_account!(account, plans, defaults)

app/lib/signup/signup_params.rb

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ def initialize(user_attributes: {}, account_attributes: {}, plans: [], defaults:
88
@defaults = defaults
99
@validate_fields = validate_fields
1010
end
11-
attr_reader :plans, :defaults
11+
attr_reader :plans, :defaults, :attributes, :validate_fields
1212

1313
def build_user_with_attributes_for_account(account)
1414
user = account.users.new
@@ -29,8 +29,6 @@ def build_account_with_attributes_for_provider_account(provider_account)
2929

3030
private
3131

32-
attr_reader :attributes, :validate_fields
33-
3432
def account_attributes
3533
attributes[:account]
3634
end

app/services/signup_service.rb

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,18 @@
22

33
class SignupService
44

5-
attr_reader :provider, :plans, :session, :account_params, :user_params, :authentication_provider
5+
attr_reader :provider, :plans, :session, :authentication_provider, :account_manager
66

7-
def initialize(provider:, plans:, session:, account_params:, user_params:, authentication_provider: nil)
7+
def initialize(provider:, plans:, session:, authentication_provider: nil)
88
@provider = provider
99
@plans = plans
1010
@session = session
11-
@account_params = account_params
12-
@user_params = user_params.merge(signup_type: :new_signup)
1311
@authentication_provider = authentication_provider
12+
@account_manager = Signup::DeveloperAccountManager.new(provider)
1413
end
1514

16-
def create
17-
signup_result = Signup::DeveloperAccountManager.new(provider).create(signup_params) do |signup|
15+
def create(account_params:, user_params:)
16+
signup_result = account_manager.create(signup_params(account_params:, user_params:)) do |signup|
1817
strategy.on_new_user(signup.user, session)
1918
yield(signup) if block_given?
2019
end
@@ -40,8 +39,8 @@ def account_should_be_approved?(signup_result)
4039
authentication_provider.automatically_approve_accounts? && !signup_result.account_approved?
4140
end
4241

43-
def signup_params
44-
Signup::SignupParams.new(plans: plans, user_attributes: user_params, account_attributes: account_params)
42+
def signup_params(account_params:, user_params:)
43+
Signup::SignupParams.new(plans: plans, user_attributes: user_params.merge(signup_type: :new_signup), account_attributes: account_params)
4544
end
4645

4746
def push_webhooks(user)

lib/developer_portal/app/controllers/developer_portal/signup_controller.rb

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ class SignupController < DeveloperPortal::BaseController
1111
before_action :deny_if_signup_disabled
1212
before_action :find_plans, :except => :success
1313
before_action :set_strategy, :only => %i[show create]
14+
before_action :init_signup_service, only: %i[create]
1415
skip_before_action :finish_signup_for_paid_plan
1516

1617
self.builtin_template_scope = 'signup'
@@ -30,10 +31,7 @@ def show
3031
end
3132

3233
def create
33-
account_params = filter_readonly_params(params[:account], Account)
34-
user_params = filter_readonly_params(account_params.try(:delete, :user), User)
35-
36-
if signup_user!(account_params, user_params)
34+
if signup_user!
3735
if @user.can_login?
3836
self.current_user = @user
3937
create_user_session!
@@ -67,9 +65,9 @@ def authentication_provider
6765
.find_by(system_name: session[:authentication_provider])
6866
end
6967

70-
def signup_user!(account_params, user_params)
68+
def signup_user!
7169
Account.transaction do
72-
SignupService.create(**signup_service_params(account_params, user_params)) do |signup_result|
70+
@signup_service.create(account_params:, user_params:) do |signup_result|
7371
@signup_result = signup_result
7472
@user = signup_result.user
7573
@buyer = signup_result.account
@@ -80,16 +78,6 @@ def signup_user!(account_params, user_params)
8078
@signup_result.persisted?
8179
end
8280

83-
def signup_service_params(account_params, user_params)
84-
{ provider: @provider,
85-
plans: @plans,
86-
session: session,
87-
account_params: account_params,
88-
user_params: user_params,
89-
authentication_provider: authentication_provider
90-
}
91-
end
92-
9381
def redirect_if_logged_in
9482
redirect_to admin_dashboard_path if logged_in?
9583
end
@@ -134,5 +122,31 @@ def convert_legacy_params
134122
params[:plans] << params[type] if params[type].present?
135123
end
136124
end
125+
126+
def init_signup_service
127+
signup_service_params = {
128+
provider: @provider,
129+
plans: @plans,
130+
session: session,
131+
authentication_provider: authentication_provider
132+
}
133+
@signup_service = SignupService.new(**signup_service_params)
134+
end
135+
136+
def account_params
137+
@account_params ||= begin
138+
account = @signup_service.account_manager.account
139+
allowed_attrs = account.defined_fields_names - %i(billing_address country) + %i(country_id)
140+
filter_readonly_params(params.fetch(:account, {}), Account).permit(*allowed_attrs)
141+
end
142+
end
143+
144+
def user_params
145+
@user_params ||= begin
146+
user = @signup_service.account_manager.user
147+
allowed_attrs = user.defined_fields_names | %i(password signup_type)
148+
filter_readonly_params(params.fetch(:account, {})[:user], User).permit(*allowed_attrs).merge({ signup_type: :minimal })
149+
end
150+
end
137151
end
138152
end

test/integration/buyers/accounts_controller_test.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@ def setup
3232
assert_equal 'hi', user.extra_fields['created_by']
3333
end
3434

35-
test 'billing address extra field and webhooks' do
35+
test 'legal address extra field and webhooks' do
3636
FactoryBot.create(:fields_definition, account: @provider,
37-
target: 'Account', name: 'billing_address', read_only: true)
37+
target: 'Account', name: 'org_legaladdress')
3838

3939
@provider.settings.allow_web_hooks!
4040
WebHook.delete_all

0 commit comments

Comments
 (0)