diff --git a/lib/mobilizon/actors/actor.ex b/lib/mobilizon/actors/actor.ex index 39b802add..0d3e33767 100644 --- a/lib/mobilizon/actors/actor.ex +++ b/lib/mobilizon/actors/actor.ex @@ -322,4 +322,13 @@ defmodule Mobilizon.Actors.Actor do |> Enum.map(& &1.actor_id) |> Enum.member?(follower_actor_id) end + + @spec actor_acct_from_actor(struct()) :: String.t() + def actor_acct_from_actor(%Actor{preferred_username: preferred_username, domain: domain}) do + if is_nil(domain) do + preferred_username + else + "#{preferred_username}@#{domain}" + end + end end diff --git a/lib/mobilizon/events/event.ex b/lib/mobilizon/events/event.ex index 10ee6fb03..5f76d6e50 100644 --- a/lib/mobilizon/events/event.ex +++ b/lib/mobilizon/events/event.ex @@ -45,21 +45,6 @@ defmodule Mobilizon.Events.Event do @doc false def changeset(%Event{} = event, attrs) do - # TODO : Change all of this - actor_url = - if Map.has_key?(attrs, :organizer_actor) do - attrs.organizer_actor.preferred_username - else - "" - end - - uuid = Ecto.UUID.generate() - - url = - if Map.has_key?(attrs, "url"), - do: attrs["url"], - else: "#{MobilizonWeb.Endpoint.url()}/@#{actor_url}/#{uuid}" - event |> Ecto.Changeset.cast(attrs, [ :title, @@ -81,8 +66,7 @@ defmodule Mobilizon.Events.Event do ]) |> cast_assoc(:tags) |> cast_assoc(:physical_address) - |> put_change(:uuid, uuid) - |> put_change(:url, url) + |> build_url() |> validate_required([ :title, :begins_on, @@ -93,4 +77,31 @@ defmodule Mobilizon.Events.Event do :address_type ]) end + + @spec build_url(Ecto.Changeset.t()) :: Ecto.Changeset.t() + defp build_url(%Ecto.Changeset{changes: %{url: _url}} = changeset), do: changeset + + defp build_url(%Ecto.Changeset{changes: %{organizer_actor: organizer_actor}} = changeset) do + organizer_actor + |> Actor.actor_acct_from_actor() + |> do_build_url(changeset) + end + + defp build_url(%Ecto.Changeset{changes: %{organizer_actor_id: organizer_actor_id}} = changeset) do + organizer_actor_id + |> Mobilizon.Actors.get_actor!() + |> Actor.actor_acct_from_actor() + |> do_build_url(changeset) + end + + defp build_url(%Ecto.Changeset{} = changeset), do: changeset + + @spec do_build_url(String.t(), Ecto.Changeset.t()) :: Ecto.Changeset.t() + defp do_build_url(actor_acct, changeset) do + uuid = Ecto.UUID.generate() + + changeset + |> put_change(:uuid, uuid) + |> put_change(:url, "#{MobilizonWeb.Endpoint.url()}/@#{actor_acct}/#{uuid}") + end end