diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/pleroma/object.ex | 18 | ||||
| -rw-r--r-- | lib/pleroma/object/fetcher.ex | 17 | ||||
| -rw-r--r-- | lib/pleroma/web/mastodon_api/controllers/mastodon_api_controller.ex | 2 | 
3 files changed, 33 insertions, 4 deletions
| diff --git a/lib/pleroma/object.ex b/lib/pleroma/object.ex index 5033798ae..640e068e5 100644 --- a/lib/pleroma/object.ex +++ b/lib/pleroma/object.ex @@ -38,6 +38,24 @@ defmodule Pleroma.Object do    def get_by_id(nil), do: nil    def get_by_id(id), do: Repo.get(Object, id) +  def get_by_id_and_maybe_refetch(id, opts \\ []) do +    %{updated_at: updated_at} = object = get_by_id(id) + +    if opts[:interval] && +         NaiveDateTime.diff(updated_at, NaiveDateTime.utc_now()) > opts[:interval] do +      case Fetcher.refetch_object(object) do +        {:ok, %Object{} = object} -> +          object + +        e -> +          Logger.error("Couldn't refresh #{object.data["id"]}:\n#{inspect(e)}") +          object +      end +    else +      object +    end +  end +    def get_by_ap_id(nil), do: nil    def get_by_ap_id(ap_id) do diff --git a/lib/pleroma/object/fetcher.ex b/lib/pleroma/object/fetcher.ex index c1795ae0f..da1ebd8b3 100644 --- a/lib/pleroma/object/fetcher.ex +++ b/lib/pleroma/object/fetcher.ex @@ -7,17 +7,19 @@ defmodule Pleroma.Object.Fetcher do    alias Pleroma.Object    alias Pleroma.Object.Containment    alias Pleroma.Signature +  alias Pleroma.Repo    alias Pleroma.Web.ActivityPub.InternalFetchActor    alias Pleroma.Web.ActivityPub.Transmogrifier    alias Pleroma.Web.OStatus    require Logger -  defp reinject_object(data) do +  defp reinject_object(struct, data) do      Logger.debug("Reinjecting object #{data["id"]}")      with data <- Transmogrifier.fix_object(data), -         {:ok, object} <- Object.create(data) do +         changeset <- Object.change(struct, %{data: data}), +         {:ok, object} <- Repo.insert_or_update(changeset) do        {:ok, object}      else        e -> @@ -26,6 +28,15 @@ defmodule Pleroma.Object.Fetcher do      end    end +  def refetch_object(%Object{data: %{"id" => id}} = object) do +    with {:ok, data} <- fetch_and_contain_remote_object_from_id(id), +         {:ok, object} <- reinject_object(object, data) do +      {:ok, object} +    else +      e -> {:error, e} +    end +  end +    # TODO:    # This will create a Create activity, which we need internally at the moment.    def fetch_object_from_id(id, options \\ []) do @@ -57,7 +68,7 @@ defmodule Pleroma.Object.Fetcher do            {:reject, nil}          {:object, data, nil} -> -          reinject_object(data) +          reinject_object(%Object{}, data)          {:normalize, object = %Object{}} ->            {:ok, object} diff --git a/lib/pleroma/web/mastodon_api/controllers/mastodon_api_controller.ex b/lib/pleroma/web/mastodon_api/controllers/mastodon_api_controller.ex index 060137b80..970cfd8db 100644 --- a/lib/pleroma/web/mastodon_api/controllers/mastodon_api_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/mastodon_api_controller.ex @@ -485,7 +485,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do    end    def get_poll(%{assigns: %{user: user}} = conn, %{"id" => id}) do -    with %Object{} = object <- Object.get_by_id(id), +    with %Object{} = object <- Object.get_by_id_and_maybe_refetch(id, interval: 60),           %Activity{} = activity <- Activity.get_create_by_object_ap_id(object.data["id"]),           true <- Visibility.visible_for_user?(activity, user) do        conn | 
