Skip to content

Commit b8f1314

Browse files
committed
Refactor petition creation
Remove the stage manager class and replace it with a simpler form/service object based on Active Model. This allows us to flatten the parameter hash and control when and what is validated much easier than using the Active Record classes.
1 parent a11b37b commit b8f1314

48 files changed

Lines changed: 580 additions & 1318 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

app/controllers/petitions_controller.rb

Lines changed: 18 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
require 'csv'
22

33
class PetitionsController < ApplicationController
4-
include ManagingMoveParameter
5-
64
before_action :redirect_to_valid_state, only: [:index]
75
before_action :do_not_cache, except: [:index, :show]
86

@@ -12,6 +10,8 @@ class PetitionsController < ApplicationController
1210

1311
before_action :retrieve_petitions, only: [:index]
1412
before_action :retrieve_petition, only: [:show, :count, :gathering_support, :moderation_info]
13+
before_action :build_petition_creator, only: [:check, :check_results, :new, :create]
14+
1515
before_action :redirect_to_stopped_page, if: :stopped?, only: [:moderation_info, :show]
1616
before_action :redirect_to_gathering_support_url, if: :collecting_sponsors?, only: [:moderation_info, :show]
1717
before_action :redirect_to_moderation_info_url, if: :in_moderation?, only: [:gathering_support, :show]
@@ -41,41 +41,31 @@ def count
4141
end
4242
end
4343

44-
def new
45-
assign_action
46-
assign_stage
47-
@stage_manager = Staged::PetitionCreator.manager(petition_params_for_new, request, params[:stage], params[:move])
48-
44+
def check
4945
respond_to do |format|
5046
format.html
5147
end
5248
end
5349

54-
def create
55-
assign_move
56-
assign_stage
57-
@stage_manager = Staged::PetitionCreator.manager(petition_params_for_create, request, params[:stage], params[:move])
58-
if @stage_manager.create_petition
59-
@stage_manager.petition.creator.store_constituency_id
60-
send_email_to_gather_sponsors(@stage_manager.petition)
61-
redirect_to thank_you_petition_url(@stage_manager.petition)
62-
else
63-
respond_to do |format|
64-
format.html { render :new }
65-
end
50+
def check_results
51+
respond_to do |format|
52+
format.html
6653
end
6754
end
6855

69-
def check
56+
def new
7057
respond_to do |format|
7158
format.html
7259
end
7360
end
7461

75-
def check_results
76-
@petitions = Petition.current.search(params.merge(count: 3))
77-
respond_to do |format|
78-
format.html
62+
def create
63+
if @new_petition.save
64+
redirect_to thank_you_petition_url(@new_petition)
65+
else
66+
respond_to do |format|
67+
format.html { render :new }
68+
end
7969
end
8070
end
8171

@@ -119,6 +109,10 @@ def retrieve_petition
119109
@petition = Petition.show.find(petition_id)
120110
end
121111

112+
def build_petition_creator
113+
@new_petition = PetitionCreator.new(params, request)
114+
end
115+
122116
def redirect_to_valid_state
123117
if state_present? && !valid_state?
124118
redirect_to petitions_url(search_params(state: :all))
@@ -169,42 +163,6 @@ def redirect_to_petition_url
169163
redirect_to petition_url(@petition)
170164
end
171165

172-
def petition_params_for_new
173-
params.
174-
fetch('petition', {}).
175-
permit(:action)
176-
end
177-
178-
def petition_params_for_create
179-
params.
180-
require(:petition).
181-
permit(:action, :background, :additional_details, :duration,
182-
creator: [
183-
:name, :email, :email_confirmation,
184-
:postcode, :location_code, :uk_citizenship
185-
]).tap do |sanitized|
186-
if sanitized['creator'].present?
187-
sanitized['creator_attributes'] = sanitized.delete('creator')
188-
end
189-
end
190-
end
191-
192-
def assign_action
193-
return if params[:petition_action].blank?
194-
petition_action = params.delete(:petition_action)
195-
params[:petition] ||= {}
196-
params[:petition][:action] = petition_action
197-
end
198-
199-
def assign_stage
200-
return if Staged::PetitionCreator.stages.include? params[:stage]
201-
params[:stage] = 'petition'
202-
end
203-
204-
def send_email_to_gather_sponsors(petition)
205-
GatherSponsorsForPetitionEmailJob.perform_later(petition)
206-
end
207-
208166
def csv_filename
209167
"#{@petitions.scope}-petitions.csv"
210168
end

app/helpers/petition_helper.rb

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,4 @@
11
module PetitionHelper
2-
def render_petition_form(stage_manager, form)
3-
capture do
4-
concat render_petition_hidden_details(stage_manager, form)
5-
concat render_petition_ui(stage_manager, form)
6-
end
7-
end
8-
92
def public_petition_facets_with_counts(petition_search)
103
petition_search.facets.slice(*public_petition_facets)
114
end
@@ -40,33 +33,4 @@ def petition_list_header?
4033
def reveal_government_response?
4134
params[:reveal_response] == "yes"
4235
end
43-
44-
private
45-
46-
def render_petition_hidden_details(stage_manager, form)
47-
capture do
48-
concat hidden_field_tag(:stage, stage_manager.stage)
49-
concat hidden_field_tag(:move, 'next')
50-
concat render('/petitions/create/petition_details_hidden', petition: stage_manager.stage_object, f: form) unless stage_manager.stage == 'petition'
51-
if stage_manager.stage_object.creator.present?
52-
concat render('/petitions/create/your_details_hidden', petition: stage_manager.stage_object, f: form) unless stage_manager.stage == 'creator'
53-
concat render('/petitions/create/email_hidden', petition: stage_manager.stage_object, f: form) unless ['creator', 'replay-email'].include? stage_manager.stage
54-
end
55-
end
56-
end
57-
58-
def render_petition_ui(stage_manager, form)
59-
# NOTE: make sure we skip past the existing tabindex-ed elements on the page, no matter which ui we render
60-
increment(4)
61-
case stage_manager.stage
62-
when 'petition'
63-
render('/petitions/create/petition_details_ui', petition: stage_manager.stage_object, f: form)
64-
when 'creator'
65-
render('/petitions/create/your_details_ui', petition: stage_manager.stage_object, f: form)
66-
when 'replay-petition'
67-
render('/petitions/create/replay_petition_ui', petition: stage_manager.stage_object, f: form)
68-
when 'replay-email'
69-
render('/petitions/create/replay_email_ui', petition: stage_manager.stage_object, f: form)
70-
end
71-
end
7236
end

0 commit comments

Comments
 (0)