Skip to content

Commit ea5e90f

Browse files
committed
Add footer data to site details API
1 parent 41552fb commit ea5e90f

File tree

3 files changed

+148
-6
lines changed

3 files changed

+148
-6
lines changed

app/controllers/pwb/pages_controller.rb

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,7 @@ def show_page
1313
default_page_slug = "home"
1414
page_slug = params[:page_slug] || default_page_slug
1515
@page = @current_website.pages.find_by_slug page_slug
16-
if @page.blank?
17-
@page = @current_website.pages.find_by_slug default_page_slug
18-
end
16+
@page = @current_website.pages.find_by_slug default_page_slug if @page.blank?
1917
@content_to_show = []
2018
@page_contents_for_edit = []
2119
@has_rails_parts = false
@@ -85,7 +83,7 @@ def header_image_url
8583
# lc_content = Content.where(tag: 'landing-carousel')[0]
8684
lc_photo = ContentPhoto.find_by_block_key "landing_img"
8785
# used for header background images
88-
@header_image_url = lc_photo.present? ? lc_photo.optimized_image_url : nil
86+
@header_image_url = lc_photo.presence&.optimized_image_url
8987
end
9088

9189
# Extract LCP (Largest Contentful Paint) image from page content

app/models/pwb/website.rb

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -366,10 +366,19 @@ def as_json(options = nil)
366366
"style_variables", "css_variables",
367367
"contact_info", "social_links",
368368
"top_nav_links", "footer_links",
369-
"agency"
369+
"agency", "footer_data"
370370
] }.merge(options || {}))
371371
end
372372

373+
# API helper: Returns all footer-related data in a single object
374+
def footer_data
375+
{
376+
"page_parts" => footer_page_parts,
377+
"whitelabel" => whitelabel_for_api,
378+
"admin_url" => admin_url
379+
}
380+
end
381+
373382
# API helper: Returns contact information from agency
374383
def contact_info
375384
return {} unless agency
@@ -378,10 +387,52 @@ def contact_info
378387
"phone" => agency.phone_number_primary,
379388
"phone_mobile" => agency.phone_number_mobile,
380389
"email" => agency.email_primary,
381-
"address" => format_agency_address
390+
"address" => format_agency_address,
391+
"address_details" => full_agency_address
382392
}
383393
end
384394

395+
# API helper: Returns full address details
396+
def full_agency_address
397+
return nil unless agency&.primary_address
398+
399+
addr = agency.primary_address
400+
{
401+
"street_number" => addr.street_number,
402+
"street_address" => addr.street_address,
403+
"city" => addr.city,
404+
"region" => addr.region,
405+
"postal_code" => addr.postal_code,
406+
"country" => addr.country,
407+
"latitude" => addr.latitude,
408+
"longitude" => addr.longitude
409+
}.compact
410+
end
411+
412+
# API helper: Returns footer page parts (custom HTML content)
413+
def footer_page_parts
414+
footer_part = ordered_visible_page_contents&.find_by_page_part_key("footer_content_html")
415+
return {} unless footer_part&.content
416+
417+
{
418+
"footer_content_html" => footer_part.content.raw
419+
}
420+
end
421+
422+
# API helper: Returns whitelabel configuration for API
423+
def whitelabel_for_api
424+
config = whitelabel_config || {}
425+
{
426+
"show_powered_by" => config["show_powered_by"] != false,
427+
"powered_by_url" => config["powered_by_url"] || "https://www.propertywebbuilder.com"
428+
}
429+
end
430+
431+
# API helper: Returns admin login URL
432+
def admin_url
433+
"/pwb_login"
434+
end
435+
385436
# API helper: Returns structured social media links
386437
def social_links
387438
{

spec/requests/api_public/v1/site_details_spec.rb

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,98 @@
1616
json = response.parsed_body
1717
expect(json).to be_present
1818
end
19+
20+
it "includes footer_data object" do
21+
get "/api_public/v1/site_details", params: { locale: "en" }
22+
json = response.parsed_body
23+
24+
expect(json).to have_key("footer_data")
25+
expect(json["footer_data"]).to have_key("page_parts")
26+
expect(json["footer_data"]).to have_key("whitelabel")
27+
expect(json["footer_data"]).to have_key("admin_url")
28+
end
29+
30+
it "returns whitelabel configuration with defaults in footer_data" do
31+
get "/api_public/v1/site_details", params: { locale: "en" }
32+
json = response.parsed_body
33+
34+
expect(json["footer_data"]["whitelabel"]).to include(
35+
"show_powered_by" => true,
36+
"powered_by_url" => "https://www.propertywebbuilder.com"
37+
)
38+
end
39+
40+
it "returns admin_url in footer_data" do
41+
get "/api_public/v1/site_details", params: { locale: "en" }
42+
json = response.parsed_body
43+
44+
expect(json["footer_data"]["admin_url"]).to eq("/pwb_login")
45+
end
46+
47+
it "returns empty page_parts in footer_data when none exist" do
48+
get "/api_public/v1/site_details", params: { locale: "en" }
49+
json = response.parsed_body
50+
51+
expect(json["footer_data"]["page_parts"]).to eq({})
52+
end
53+
end
54+
end
55+
56+
RSpec.describe Pwb::Website, "footer data methods", type: :model do
57+
let(:website) { FactoryBot.create(:pwb_website) }
58+
59+
describe "#footer_data" do
60+
it "returns nested object with page_parts, whitelabel, and admin_url" do
61+
expect(website.footer_data).to have_key("page_parts")
62+
expect(website.footer_data).to have_key("whitelabel")
63+
expect(website.footer_data).to have_key("admin_url")
64+
end
65+
end
66+
67+
describe "#whitelabel_for_api" do
68+
it "returns default values when whitelabel_config is nil" do
69+
expect(website.whitelabel_for_api).to eq({
70+
"show_powered_by" => true,
71+
"powered_by_url" => "https://www.propertywebbuilder.com"
72+
})
73+
end
74+
75+
it "respects custom whitelabel_config" do
76+
website.update!(whitelabel_config: {
77+
"show_powered_by" => false,
78+
"powered_by_url" => "https://custom.com"
79+
})
80+
81+
expect(website.whitelabel_for_api).to eq({
82+
"show_powered_by" => false,
83+
"powered_by_url" => "https://custom.com"
84+
})
85+
end
86+
end
87+
88+
describe "#admin_url" do
89+
it "returns /pwb_login" do
90+
expect(website.admin_url).to eq("/pwb_login")
91+
end
92+
end
93+
94+
describe "#footer_page_parts" do
95+
it "returns empty hash when no footer content exists" do
96+
expect(website.footer_page_parts).to eq({})
97+
end
98+
end
99+
100+
describe "#full_agency_address" do
101+
it "returns nil when no agency" do
102+
expect(website.full_agency_address).to be_nil
103+
end
104+
end
105+
106+
describe "#contact_info" do
107+
it "returns empty hash when no agency" do
108+
website.agency&.destroy
109+
website.reload
110+
expect(website.contact_info).to eq({})
111+
end
19112
end
20113
end

0 commit comments

Comments
 (0)