From 4fa7d266cd0b352c1585a77f307b76de54817169 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Moritz=20St=C3=BCckler?= Date: Fri, 17 Oct 2025 21:31:57 +0200 Subject: [PATCH] feat: add social links and company to user api endpoint Co-authored-by: Pablo Brasero <36066+pablobm@users.noreply.github.com> --- app/views/api/users/_user.json.jbuilder | 8 ++++ app/views/api/users/_user.xml.builder | 9 +++++ test/controllers/api/users_controller_test.rb | 37 ++++++++++++++++++- 3 files changed, 53 insertions(+), 1 deletion(-) diff --git a/app/views/api/users/_user.json.jbuilder b/app/views/api/users/_user.json.jbuilder index d54c5602b..e82ee3531 100644 --- a/app/views/api/users/_user.json.jbuilder +++ b/app/views/api/users/_user.json.jbuilder @@ -5,6 +5,14 @@ json.user do json.display_name user.display_name json.account_created user.created_at.xmlschema json.description user.description if user.description + json.company user.company if user.company + json.social_links do + json.array! user.social_links do |link| + details = link.parsed + json.url details[:url] + json.platform details[:platform] + end + end if current_user && current_user == user && can?(:details, User) json.contributor_terms do diff --git a/app/views/api/users/_user.xml.builder b/app/views/api/users/_user.xml.builder index 6c2e272d7..463666fd3 100644 --- a/app/views/api/users/_user.xml.builder +++ b/app/views/api/users/_user.xml.builder @@ -4,6 +4,15 @@ xml.tag! "user", :id => user.id, :display_name => user.display_name, :account_created => user.created_at.xmlschema do xml.tag! "description", user.description if user.description + xml.tag! "company", user.company if user.company + + xml.tag! "social-links" do + user.social_links.each do |link| + details = link.parsed + xml.tag! "link", details[:url], :platform => details[:platform] + end + end + if current_user && current_user == user && can?(:details, User) xml.tag! "contributor-terms", :agreed => user.terms_agreed.present?, :pd => user.consider_pd diff --git a/test/controllers/api/users_controller_test.rb b/test/controllers/api/users_controller_test.rb index c0a5d1729..13f73b35f 100644 --- a/test/controllers/api/users_controller_test.rb +++ b/test/controllers/api/users_controller_test.rb @@ -38,7 +38,10 @@ module Api :description => "test", :terms_agreed => Date.yesterday, :home_lat => 12.1, :home_lon => 23.4, - :languages => ["en"]) + :languages => ["en"]) do |user| + create(:social_link, :user => user, :url => "https://twitter.com/testuser") + create(:social_link, :user => user, :url => "https://github.com/testuser") + end # check that a visible user is returned properly get api_user_path(:id => user.id) @@ -408,6 +411,18 @@ module Api def check_xml_details(user, include_private, include_email) assert_select "user[id='#{user.id}']", :count => 1 do assert_select "description", :count => 1, :text => user.description + assert_select "company", :count => 1, :text => user.company if user.company + + if user.social_links.present? + assert_select "social-links link", :count => user.social_links.count do + user.social_links.each do |link| + details = link.parsed + assert_select "link[platform='#{details[:platform]}']", :count => 1, :text => details[:url] + end + end + else + assert_select "social-links link", :count => 0 + end assert_select "contributor-terms", :count => 1 do if user.terms_agreed.present? @@ -487,6 +502,26 @@ module Api def check_json_details(js, user, include_private, include_email) assert_equal user.id, js["user"]["id"] assert_equal user.description, js["user"]["description"] + if user.company + assert_equal user.company, js["user"]["company"] + else + assert_nil js["user"]["company"] + end + + if user.social_links.present? + ordered_js_links = js.dig("user", "social_links").sort_by { |link| link["url"] } + ordered_user_links = user.social_links.sort_by(&:url).map(&:parsed) + + assert_equal ordered_user_links.count, ordered_js_links.count + + ordered_user_links.zip(ordered_js_links).each do |user_link, js_link| + assert_equal user_link[:url], js_link["url"] + assert_equal user_link[:platform], js_link["platform"] + end + else + assert_empty js["user"]["social_links"] + end + assert_operator js["user"]["contributor_terms"], :[], "agreed" if include_private -- 2.39.5