Skip to content

Commit 706cacb

Browse files
committed
Migrate application controllers to strong parameters
1 parent 48251bb commit 706cacb

10 files changed

Lines changed: 52 additions & 36 deletions

File tree

app/controllers/admin/api/buyers_applications_controller.rb

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@ class Admin::Api::BuyersApplicationsController < Admin::Api::BuyersBaseControlle
22
representer Cinstance
33

44
before_action :find_or_create_service_contract, :only => :create
5+
before_action :find_application, except: %i[create index find]
6+
before_action :build_new_application, only: %i[create]
7+
8+
attr_reader :application
59

610
# Application List
711
# GET /admin/api/accounts/{account_id}/applications.xml
@@ -12,10 +16,7 @@ def index
1216
# Application Create
1317
# POST /admin/api/accounts/{account_id}/applications.xml
1418
def create
15-
application = applications.new(user_account: buyer, plan: application_plan, create_origin: "api")
16-
application.unflattened_attributes = application_params
17-
application.user_key = params[:user_key] if params[:user_key]
18-
application.application_id = params[:application_id] if params[:application_id]
19+
application.assign_attributes(application_params)
1920

2021
Array(params[:application_key]).each do |key|
2122
application.application_keys.build(value: key)
@@ -35,10 +36,7 @@ def show
3536
# Application Update
3637
# PUT /admin/api/accounts/{account_id}/applications/{id}.xml
3738
def update
38-
application.unflattened_attributes = flat_params
39-
application.user_key = params[:user_key] if params[:user_key]
40-
41-
application.save
39+
application.update(application_update_params)
4240

4341
respond_with application
4442
end
@@ -115,16 +113,27 @@ def applications
115113
@applications ||= accessible_bought_cinstances.includes(:user_account, :plan, :service)
116114
end
117115

118-
def application
119-
@application ||= applications.find params[:id]
116+
def build_new_application
117+
@application = applications.new(user_account: buyer, plan: application_plan, create_origin: "api")
118+
end
119+
120+
def find_application
121+
@application = applications.find params[:id]
120122
end
121123

122124
def application_plan
123125
@application_plan ||= accessible_application_plans.find(params[:plan_id])
124126
end
125127

126128
def application_params
127-
flat_params.slice(*application_attributes)
129+
@application_params ||= begin
130+
allowed_attrs = application.defined_fields_names + %w[user_key application_id redirect_url first_traffic_at first_daily_traffic_at]
131+
flat_params.permit(*allowed_attrs)
132+
end
133+
end
134+
135+
def application_update_params
136+
application_params.except(:application_id)
128137
end
129138

130139
def application_attributes

app/controllers/api/applications_controller.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ class Api::ApplicationsController < FrontendController
2020
def new; end
2121

2222
def create
23+
@cinstance.assign_attributes(application_params)
2324
if @cinstance.save
2425
redirect_to provider_admin_application_path(@cinstance), success: t('.success')
2526
else

app/controllers/buyers/applications_controller.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ def new
2323
end
2424

2525
def create
26+
@cinstance.assign_attributes(application_params)
27+
2628
if @cinstance.save
2729
redirect_to provider_admin_application_path(@cinstance), success: t('.success')
2830
else

app/controllers/provider/admin/applications_controller.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ def show
2929
def new; end
3030

3131
def create
32+
@cinstance.assign_attributes(application_params)
33+
3234
if @cinstance.save
3335
redirect_to provider_admin_application_path(@cinstance), success: t('.success')
3436
else
@@ -43,7 +45,7 @@ def edit; end
4345
def update
4446
# TODO: this is not needed if this controller is used only by providers
4547
@cinstance.validate_human_edition!
46-
@cinstance.attributes = params[:cinstance]
48+
@cinstance.assign_attributes(application_params)
4749

4850
respond_to do |format|
4951
json = @cinstance.to_json(only: %i[id name], methods: %i[errors])

app/lib/applications_controller_methods.rb

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ def index
2323

2424
# TODO: this should be done by buy! method
2525
def initialize_cinstance
26-
@cinstance = current_account.provider_builds_application_for(@account, @application_plan, params[:cinstance], @service_plan)
26+
@cinstance = current_account.provider_builds_application_for(@account, @application_plan, @service_plan)
2727
@cinstance.validate_human_edition!
2828
end
2929

@@ -74,15 +74,24 @@ def find_application_plan
7474

7575
def find_service_plan
7676
service_plans = @service.service_plans
77-
@service_plan = if (service_plan_id = params[:cinstance].delete(:service_plan_id))
77+
@service_plan = if (service_plan_id = cinstance_params[:service_plan_id])
7878
service_plans.find(service_plan_id)
7979
else
8080
@service.default_service_plan || service_plans.first
8181
end
8282
end
8383

84+
def cinstance_params
85+
@cinstance_params ||= params.require(:cinstance)
86+
end
87+
88+
def application_params
89+
allowed_attrs = @cinstance.defined_builtin_fields_names
90+
cinstance_params.permit(*allowed_attrs, extra_fields: @cinstance.defined_extra_fields_names)
91+
end
92+
8493
def plan_id
85-
@plan_id ||= params.require(:cinstance).permit(:plan_id).tap { |plan_params| plan_params.require(:plan_id) }[:plan_id]
94+
@plan_id ||= cinstance_params.require(:plan_id)
8695
end
8796

8897
def accessible_services

app/lib/logic/contracting.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ def can_create_service_contract?
2828
end
2929

3030
module Provider
31-
def provider_builds_application_for(buyer, application_plan, application_attrs = {}, service_plan = nil)
31+
def provider_builds_application_for(buyer, application_plan, service_plan = nil, application_attrs: {})
3232
service_contracted = buyer.bought_service_contracts.map(&:service).include?(application_plan.service)
3333

3434
service_contract = unless service_contracted

app/models/contract.rb

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,6 @@ class Contract < ApplicationRecord
4848
# TODO: remove with Rails 3
4949
attr_reader :old_plan, :accepted_on_create
5050

51-
attr_protected :plan_id, :state, :provider_public_key, :paid_until, :trial_period_expires_at, :setup_fee, :type, :variable_cost_paid_until, :application_id, :user_key, :user_account_id, :tenant_id, :audit_ids
52-
5351
# TODO: unit test this scope
5452
def self.provided_by(account)
5553
where.has do

app/models/contract/trial.rb

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@ module Contract::Trial
66
included do
77
before_create :set_trial_period_expires_at, :set_setup_fee
88

9-
attr_protected :trial_period_expires_at
10-
119
sifter :trial_period_expires_on do |date|
1210
sift(:date, trial_period_expires_at) == sift(:to_date, quoted(date.to_date))
1311
end

lib/developer_portal/app/controllers/developer_portal/admin/applications_controller.rb

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ def update
6363
application.validate_fields!
6464
end
6565

66-
application.update(application_params)
66+
application.update(permitted_application_params)
6767
assign_drops application: application
6868
# make sure to prevent xss on js rendering if this notice is changed to include e.g. application name
6969
if application.valid?
@@ -127,7 +127,7 @@ def application
127127
end
128128

129129
def new_application
130-
@cinstance ||= applications.build_with_fields(application_params) do |application|
130+
@cinstance ||= applications.build_with_fields(permitted_application_params) do |application|
131131
application.plan = application.can_change_plan?(service) ? plan : default_plan
132132
end
133133
end
@@ -148,10 +148,6 @@ def plan
148148
end
149149
end
150150

151-
def application_params
152-
@application_params ||= accepted_application_params
153-
end
154-
155151
def authorize_new_app
156152
if service
157153
authorize! :create_application, service
@@ -168,13 +164,14 @@ def authorize_update_app
168164
authorize! :update, application
169165
end
170166

171-
def accepted_application_params
167+
def application_params
172168
# cinstance[*] naming is present for legacy reasons
173-
application_attributes = params[:application] || params[:cinstance]
174-
return {} unless application_attributes
169+
@application_params ||= params[:application] || params.fetch(:cinstance, {})
170+
end
175171

176-
permitted_params = fields_definitions + %i[plan_id redirect_url]
177-
application_attributes.permit(*permitted_params)
172+
def permitted_application_params
173+
permitted_params = fields_definitions + %i[redirect_url]
174+
application_params.permit(*permitted_params)
178175
end
179176

180177
def fields_definitions

test/integration/api/applications_controller_test.rb

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -82,22 +82,22 @@ def setup
8282

8383
attr_reader :service_plan, :buyer, :application_plan, :service
8484

85-
test 'crate application redirects to the provider admin index page' do
85+
test 'create application redirects to the provider admin index page' do
8686
post admin_service_applications_path(service), params: { account_id: buyer.id,
8787
cinstance: { service_plan_id: service_plan.id, plan_id: application_plan.id, name: 'My Application' } }
8888

8989
assert_redirected_to provider_admin_application_path(Cinstance.last)
9090
end
9191

92-
test 'crate application with no service plan selected' do
92+
test 'create application with no service plan selected' do
9393
post admin_service_applications_path(service), params: { account_id: buyer.id,
9494
cinstance: { plan_id: application_plan.id, name: 'My Application' } }
9595

9696
application = Cinstance.last
9797
assert_redirected_to provider_admin_application_path(application)
9898
end
9999

100-
test 'crate application with no service plan selected and a default service plan' do
100+
test 'create application with no service plan selected and a default service plan' do
101101
default_service_plan = FactoryBot.create(:service_plan, service: service)
102102
service.update(default_service_plan: default_service_plan)
103103
post admin_service_applications_path(service), params: { account_id: buyer.id,
@@ -107,7 +107,7 @@ def setup
107107
assert_equal default_service_plan, buyer.bought_service_contracts.first.service_plan
108108
end
109109

110-
test 'crate application with no service plan selected and no default service plan' do
110+
test 'create application with no service plan selected and no default service plan' do
111111
other_service_plan = FactoryBot.create(:service_plan, service: service)
112112
service.update(default_service_plan: nil)
113113
post admin_service_applications_path(service), params: { account_id: buyer.id,
@@ -117,7 +117,7 @@ def setup
117117
assert_not_equal other_service_plan, buyer.bought_service_contracts.first.service_plan
118118
end
119119

120-
test 'crate application with no service plan selected and a subscription' do
120+
test 'create application with no service plan selected and a subscription' do
121121
subscribed_service_plan = FactoryBot.create(:service_plan, service: service)
122122
buyer.bought_service_contracts.create(plan: subscribed_service_plan)
123123
post admin_service_applications_path(service), params: { account_id: buyer.id,

0 commit comments

Comments
 (0)