From 64237cfc2633794a48022a059c79155b1ece14d1 Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Tue, 19 Dec 2023 10:52:31 +0100 Subject: [PATCH 1/2] feat(activitypub): allow simple text for address field Closes #1387 Signed-off-by: Thomas Citharel --- .../activity_stream/converter/address.ex | 27 ++++--- .../activity_stream/converter/utils.ex | 4 +- .../converter/address_test.exs | 74 +++++++++++++++++++ 3 files changed, 93 insertions(+), 12 deletions(-) create mode 100644 test/federation/activity_stream/converter/address_test.exs diff --git a/lib/federation/activity_stream/converter/address.ex b/lib/federation/activity_stream/converter/address.ex index 012747f3b..1dc4d0f4d 100644 --- a/lib/federation/activity_stream/converter/address.ex +++ b/lib/federation/activity_stream/converter/address.ex @@ -24,16 +24,23 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.Address do } res = - if is_nil(object["address"]) or not is_map(object["address"]) do - res - else - Map.merge(res, %{ - "country" => object["address"]["addressCountry"], - "postal_code" => object["address"]["postalCode"], - "region" => object["address"]["addressRegion"], - "street" => object["address"]["streetAddress"], - "locality" => object["address"]["addressLocality"] - }) + cond do + is_binary(object["address"]) -> + Map.merge(res, %{ + "street" => object["address"] + }) + + is_map(object["address"]) -> + Map.merge(res, %{ + "country" => object["address"]["addressCountry"], + "postal_code" => object["address"]["postalCode"], + "region" => object["address"]["addressRegion"], + "street" => object["address"]["streetAddress"], + "locality" => object["address"]["addressLocality"] + }) + + is_nil(object["address"]) -> + res end latitude = Map.get(object, "latitude") diff --git a/lib/federation/activity_stream/converter/utils.ex b/lib/federation/activity_stream/converter/utils.ex index 9101fc117..c0b1100a5 100644 --- a/lib/federation/activity_stream/converter/utils.ex +++ b/lib/federation/activity_stream/converter/utils.ex @@ -278,8 +278,8 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.Utils do end @spec get_address(map | binary | nil) :: Address.t() | nil - def get_address(address_url) when is_binary(address_url) do - get_address(%{"id" => address_url}) + def get_address(text_address) when is_binary(text_address) do + get_address(%{"type" => "Place", "name" => text_address}) end def get_address(%{"id" => url} = map) when is_map(map) and is_binary(url) do diff --git a/test/federation/activity_stream/converter/address_test.exs b/test/federation/activity_stream/converter/address_test.exs new file mode 100644 index 000000000..2c8527c5e --- /dev/null +++ b/test/federation/activity_stream/converter/address_test.exs @@ -0,0 +1,74 @@ +defmodule Mobilizon.Federation.ActivityStream.Converter.AddressTest do + use Mobilizon.DataCase + + alias Mobilizon.Addresses.Address + + alias Mobilizon.Federation.ActivityStream.Converter.Address, as: AddressConverter + + describe "address to AS" do + test "valid address to as" do + data = + AddressConverter.model_to_as(%Address{ + country: "France", + locality: "Lyon", + description: "Locaux'Motiv", + postal_code: "69007", + street: "10Bis Rue Jangot" + }) + + assert is_map(data) + assert data["type"] == "Place" + assert data["name"] == "Locaux'Motiv" + assert data["address"]["type"] == "PostalAddress" + assert data["address"]["addressLocality"] == "Lyon" + assert data["address"]["postalCode"] == "69007" + assert data["address"]["addressCountry"] == "France" + assert data["address"]["streetAddress"] == "10Bis Rue Jangot" + end + end + + describe "AS to Address" do + test "basic AS data to model" do + address = + AddressConverter.as_to_model_data(%{ + "type" => "Place", + "name" => "Federazione Anarchica Torinese", + "address" => "corso Palermo 46", + "latitude" => nil, + "longitude" => nil + }) + + assert address["description"] == "Federazione Anarchica Torinese" + assert address["street"] == "corso Palermo 46" + assert address["locality"] == nil + assert address["geom"] == nil + end + + test "AS data with PostalAddress to model" do + address = + AddressConverter.as_to_model_data(%{ + "type" => "Place", + "name" => "Federazione Anarchica Torinese", + "address" => %{ + "streetAddress" => "Corso Palermo, 46", + "addressCountry" => "Italia", + "postalCode" => "10152", + "addressLocality" => "Torino" + }, + "latitude" => 45.08281, + "longitude" => 7.69311 + }) + + assert address["description"] == "Federazione Anarchica Torinese" + assert address["street"] == "Corso Palermo, 46" + assert address["locality"] == "Torino" + assert address["postal_code"] == "10152" + assert address["country"] == "Italia" + + assert address["geom"] == %Geo.Point{ + coordinates: {7.69311, 45.08281}, + srid: 4326 + } + end + end +end From 001a0ed1a50894ad1abe0f7fc9dc5b9666de5dae Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Tue, 19 Dec 2023 10:53:12 +0100 Subject: [PATCH 2/2] fix(activitypub): do not try to calculate timezone from missing geo-coordinates Signed-off-by: Thomas Citharel --- lib/federation/activity_stream/converter/event.ex | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/federation/activity_stream/converter/event.ex b/lib/federation/activity_stream/converter/event.ex index 2eca4e805..76e695383 100644 --- a/lib/federation/activity_stream/converter/event.ex +++ b/lib/federation/activity_stream/converter/event.ex @@ -198,6 +198,8 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.Event do defp calculate_timezone(_object, nil), do: nil + defp calculate_timezone(_object, %Address{geom: nil}), do: nil + defp calculate_timezone(_object, %Address{geom: geom}) do TimezoneDetector.detect( nil,