Skip to content

Commit d3dad99

Browse files
Add logic to make individual languages live separately
Co-authored-by: Stephen Daly <stephen.daly@digital.cabinet-office.gov.uk>
1 parent 2732da9 commit d3dad99

10 files changed

Lines changed: 803 additions & 36 deletions

File tree

app/controllers/forms/make_language_live_controller.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@ module Forms
22
class MakeLanguageLiveController < FormsController
33
def new
44
authorize current_form, :can_make_language_live?
5+
return redirect_to form_path(form_id: current_form.id) unless current_form.can_make_language_live?(language: params[:language])
6+
57
@make_language_live_input = MakeLiveInput.new(form: current_form)
8+
69
render_new
710
end
811

@@ -13,9 +16,10 @@ def create
1316

1417
return render_new(status: :unprocessable_content) unless @make_language_live_input.valid?
1518
return redirect_to form_path(@make_language_live_input.form.id) unless @make_language_live_input.confirmed?
19+
return redirect_to form_path(form_id: current_form.id) unless current_form.can_make_language_live?(language: params[:language])
1620

1721
@make_form_live_service = MakeFormLiveService.call(current_form:, current_user:, language: params[:language])
18-
# TODO: actually make the language live
22+
@make_form_live_service.make_language_live
1923

2024
redirect_to make_language_live_show_confirmation_path
2125
end

app/models/form.rb

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,12 @@ def set_task_status_service(service)
224224
self.task_status_service = service
225225
end
226226

227+
def can_make_language_live?(language:)
228+
return can_make_english_version_live? if language == "en"
229+
230+
can_make_welsh_version_live? if language == "cy"
231+
end
232+
227233
private
228234

229235
def set_external_id
@@ -267,6 +273,30 @@ def after_make_live
267273
FormDocumentSyncService.new(self).synchronize_live_form
268274
end
269275

276+
def before_make_english_live
277+
before_make_live
278+
end
279+
280+
def after_make_english_live
281+
FormDocumentSyncService.new(self).synchronize_only_live_english_form
282+
end
283+
284+
def before_make_welsh_live
285+
before_make_live
286+
end
287+
288+
def after_make_welsh_live
289+
FormDocumentSyncService.new(self).synchronize_only_live_welsh_form
290+
end
291+
292+
def can_make_english_version_live?
293+
draft? && ready_for_live && live_form_document.blank? && live_welsh_form_document.blank?
294+
end
295+
296+
def can_make_welsh_version_live?
297+
has_live_version && ready_for_live && live_form_document.present? && live_welsh_form_document.blank?
298+
end
299+
270300
def after_archive
271301
FormDocumentSyncService.new(self).synchronize_archived_form
272302
end

app/services/form_document_sync_service.rb

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,44 @@ def synchronize_archived_welsh_form
5252
end
5353
end
5454

55+
def synchronize_only_live_english_form
56+
FormDocument.transaction do
57+
# If we've already made the Welsh version live, changes to the Welsh version must be made live at the same time by calling a different method
58+
raise ActiveRecord::RecordNotFound, "Cannot make changes to only the live English form if there is already a live Welsh version." if FormDocument.where(form:, tag: LIVE_TAG, language: "cy").exists?
59+
60+
content = form_content("en", live_at: form.updated_at)
61+
update_or_create_form_document(LIVE_TAG, content, "en")
62+
63+
# Update the content of the live English version to to not include Welsh in available_languages
64+
FormDocument.where(form:, tag: [LIVE_TAG], language: "en").find_each do |live_document|
65+
live_document.content["available_languages"] = %w[en]
66+
live_document.save!
67+
end
68+
69+
# A new live version replaces any previous archived version
70+
delete_form_documents_by_tag(ARCHIVED_TAG)
71+
end
72+
end
73+
74+
def synchronize_only_live_welsh_form
75+
FormDocument.transaction do
76+
# Ensure we only make Welsh version live if there is already an existing live English version
77+
raise ActiveRecord::RecordNotFound, "Cannot make Welsh version live unless there is already a live English version." unless FormDocument.where(form:, tag: LIVE_TAG, language: "en").exists?
78+
79+
content = form_content("cy", live_at: form.updated_at)
80+
update_or_create_form_document(LIVE_TAG, content, "cy")
81+
82+
# Update the content of the live English version to show that it now supports Welsh
83+
FormDocument.where(form:, tag: [LIVE_TAG], language: "en").find_each do |live_document|
84+
live_document.content["available_languages"] = %w[en cy]
85+
live_document.save!
86+
end
87+
88+
# A new live version replaces any previous archived version
89+
delete_form_documents_by_tag(ARCHIVED_TAG)
90+
end
91+
end
92+
5593
def update_draft_form_document
5694
synchronize_documents_for_tag(DRAFT_TAG)
5795
end
@@ -79,6 +117,7 @@ def update_or_create_form_document(tag, content, language)
79117
language:,
80118
)
81119
form_document.content = content
120+
82121
form_document.save!
83122
end
84123

app/services/make_form_live_service.rb

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,14 @@ def make_live
2727
end
2828
end
2929

30+
def make_language_live
31+
if @language == "en"
32+
make_english_live
33+
else
34+
make_welsh_live
35+
end
36+
end
37+
3038
def page_title
3139
return I18n.t("page_titles.your_form_is_live") if @current_form_was_archived
3240
return I18n.t("page_titles.your_changes_are_live") if @current_form_was_live
@@ -48,6 +56,14 @@ def confirmation_page_body
4856

4957
private
5058

59+
def make_english_live
60+
@current_form.make_english_version_live!
61+
end
62+
63+
def make_welsh_live
64+
@current_form.make_welsh_version_live!
65+
end
66+
5167
def live_form_submission_email_has_changed
5268
@current_form_was_live && @current_live_form.submission_email != @current_form.submission_email
5369
end

app/state_machines/form_state_machine.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,20 @@ module FormStateMachine
3333
transitions from: %i[draft live_with_draft archived archived_with_draft], to: :live, guard: :ready_for_live
3434
end
3535

36+
event :make_english_version_live do
37+
before :before_make_english_live
38+
after :after_make_english_live
39+
40+
transitions from: %i[draft live live_with_draft], to: :live, guard: :can_make_english_version_live?
41+
end
42+
43+
event :make_welsh_version_live do
44+
before :before_make_welsh_live
45+
after :after_make_welsh_live
46+
47+
transitions from: %i[live live_with_draft], to: :live, guard: :can_make_welsh_version_live?
48+
end
49+
3650
event :create_draft_from_live_form do
3751
after :after_create_draft
3852

spec/models/form_spec.rb

Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1464,4 +1464,182 @@
14641464
end
14651465
end
14661466
end
1467+
1468+
describe "#can_make_language_live" do
1469+
let(:form) { create :form }
1470+
1471+
before do
1472+
form.set_task_status_service(TaskStatusService.new(form:, current_user:))
1473+
end
1474+
1475+
context "when the language being checked is English" do
1476+
let(:language) { "en" }
1477+
1478+
context "when the form is draft" do
1479+
context "when the form does not have all mandatory tasks completed" do
1480+
let(:form) { create :form }
1481+
1482+
it "returns false" do
1483+
expect(form.can_make_language_live?(language:)).to be false
1484+
end
1485+
end
1486+
1487+
context "when the form has all mandatory tasks completed" do
1488+
let(:form) { create :form, :ready_for_live }
1489+
1490+
context "when the form does not have a live English form document" do
1491+
context "when the form does not have a live Welsh form document" do
1492+
it "returns true" do
1493+
expect(form.can_make_language_live?(language:)).to be true
1494+
end
1495+
end
1496+
1497+
context "when the form already has a live Welsh form document" do
1498+
before do
1499+
create :form_document, :live, form:, language: "cy", content: form.as_form_document
1500+
end
1501+
1502+
it "returns false" do
1503+
expect(form.can_make_language_live?(language:)).to be false
1504+
end
1505+
end
1506+
end
1507+
1508+
context "when the form already has a live English form document" do
1509+
before do
1510+
create :form_document, :live, form:, language: "en", content: form.as_form_document
1511+
end
1512+
1513+
it "returns false" do
1514+
expect(form.can_make_language_live?(language:)).to be false
1515+
end
1516+
end
1517+
end
1518+
end
1519+
1520+
context "when the form is live" do
1521+
context "when the form has all mandatory tasks completed" do
1522+
let(:form) { create :form, state: "live" }
1523+
1524+
context "when the form does not have a live English form document" do
1525+
context "when the form does not have a live Welsh form document" do
1526+
it "returns false" do
1527+
expect(form.can_make_language_live?(language:)).to be false
1528+
end
1529+
end
1530+
1531+
context "when the form already has a live Welsh form document" do
1532+
before do
1533+
create :form_document, :live, form:, language: "cy", content: form.as_form_document
1534+
end
1535+
1536+
it "returns false" do
1537+
expect(form.can_make_language_live?(language:)).to be false
1538+
end
1539+
end
1540+
end
1541+
1542+
context "when the form already has a live English form document" do
1543+
before do
1544+
create :form_document, :live, form:, language: "en", content: form.as_form_document
1545+
end
1546+
1547+
it "returns false" do
1548+
expect(form.can_make_language_live?(language:)).to be false
1549+
end
1550+
end
1551+
end
1552+
end
1553+
end
1554+
1555+
context "when the language being checked is Welsh" do
1556+
let(:language) { "cy" }
1557+
1558+
context "when the form is draft" do
1559+
context "when the form does not have all mandatory tasks completed" do
1560+
let(:form) { create :form }
1561+
1562+
it "returns false" do
1563+
expect(form.can_make_language_live?(language:)).to be false
1564+
end
1565+
end
1566+
1567+
context "when the form has all mandatory tasks completed" do
1568+
let(:form) { create :form, :ready_for_live }
1569+
1570+
context "when the form does not have a live English form document" do
1571+
context "when the form does not have a live Welsh form document" do
1572+
it "returns false" do
1573+
expect(form.can_make_language_live?(language:)).to be false
1574+
end
1575+
end
1576+
1577+
context "when the form already has a live Welsh form document" do
1578+
before do
1579+
create :form_document, :live, form:, language: "cy", content: form.as_form_document
1580+
end
1581+
1582+
it "returns false" do
1583+
expect(form.can_make_language_live?(language:)).to be false
1584+
end
1585+
end
1586+
end
1587+
1588+
context "when the form already has a live English form document" do
1589+
before do
1590+
create :form_document, :live, form:, language: "en", content: form.as_form_document
1591+
end
1592+
1593+
it "returns false" do
1594+
expect(form.can_make_language_live?(language:)).to be false
1595+
end
1596+
end
1597+
end
1598+
end
1599+
1600+
context "when the form is live" do
1601+
let(:form) { create :form, :ready_for_live, state: "live" }
1602+
1603+
context "when the form does not have a live English form document" do
1604+
context "when the form does not have a live Welsh form document" do
1605+
it "returns false" do
1606+
expect(form.can_make_language_live?(language:)).to be false
1607+
end
1608+
end
1609+
1610+
context "when the form already has a live Welsh form document" do
1611+
before do
1612+
create :form_document, :live, form:, language: "cy", content: form.as_form_document
1613+
end
1614+
1615+
it "returns false" do
1616+
expect(form.can_make_language_live?(language:)).to be false
1617+
end
1618+
end
1619+
end
1620+
1621+
context "when the form already has a live English form document" do
1622+
before do
1623+
create :form_document, :live, form:, language: "en", content: form.as_form_document
1624+
end
1625+
1626+
context "when the form does not have a live Welsh form document" do
1627+
it "returns true" do
1628+
expect(form.can_make_language_live?(language:)).to be true
1629+
end
1630+
end
1631+
1632+
context "when the form already has a live Welsh form document" do
1633+
before do
1634+
create :form_document, :live, form:, language: "cy", content: form.as_form_document
1635+
end
1636+
1637+
it "returns false" do
1638+
expect(form.can_make_language_live?(language:)).to be false
1639+
end
1640+
end
1641+
end
1642+
end
1643+
end
1644+
end
14671645
end

0 commit comments

Comments
 (0)