diff options
| author | kaniini <nenolod@gmail.com> | 2019-03-08 22:33:31 +0000 | 
|---|---|---|
| committer | kaniini <nenolod@gmail.com> | 2019-03-08 22:33:31 +0000 | 
| commit | 130fc9eae63ef5860e383c8f31c968103ba3b894 (patch) | |
| tree | 98acfd979208a17e4aa37cc733ce977a698849f1 /lib | |
| parent | 3c04460c9c0ae5119a08e50389bf6efd984d22a1 (diff) | |
| parent | b775fded101f5ae17dc694a342a0f80d72b786a7 (diff) | |
| download | pleroma-130fc9eae63ef5860e383c8f31c968103ba3b894.tar.gz pleroma-130fc9eae63ef5860e383c8f31c968103ba3b894.zip | |
Merge branch 'fetch-posts-on-first-federation' into 'develop'
Fetch user's outbox posts on first federation with that user
Closes #131
See merge request pleroma/pleroma!907
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/pleroma/user.ex | 47 | ||||
| -rw-r--r-- | lib/pleroma/web/activity_pub/utils.ex | 39 | 
2 files changed, 76 insertions, 10 deletions
| diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index 3878e4efa..f49ede149 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -532,6 +532,10 @@ defmodule Pleroma.User do        _e ->          with [_nick, _domain] <- String.split(nickname, "@"),               {:ok, user} <- fetch_by_nickname(nickname) do +          if Pleroma.Config.get([:fetch_initial_posts, :enabled]) do +            {:ok, _} = Task.start(__MODULE__, :fetch_initial_posts, [user]) +          end +            user          else            _e -> nil @@ -539,6 +543,17 @@ defmodule Pleroma.User do      end    end +  @doc "Fetch some posts when the user has just been federated with" +  def fetch_initial_posts(user) do +    pages = Pleroma.Config.get!([:fetch_initial_posts, :pages]) + +    Enum.each( +      # Insert all the posts in reverse order, so they're in the right order on the timeline +      Enum.reverse(Utils.fetch_ordered_collection(user.info.source_data["outbox"], pages)), +      &Pleroma.Web.Federator.incoming_ap_doc/1 +    ) +  end +    def get_followers_query(%User{id: id, follower_address: follower_address}, nil) do      from(        u in User, @@ -1121,24 +1136,36 @@ defmodule Pleroma.User do    def html_filter_policy(_), do: @default_scrubbers +  def fetch_by_ap_id(ap_id) do +    ap_try = ActivityPub.make_user_from_ap_id(ap_id) + +    case ap_try do +      {:ok, user} -> +        user + +      _ -> +        case OStatus.make_user(ap_id) do +          {:ok, user} -> user +          _ -> {:error, "Could not fetch by AP id"} +        end +    end +  end +    def get_or_fetch_by_ap_id(ap_id) do      user = get_by_ap_id(ap_id)      if !is_nil(user) and !User.needs_update?(user) do        user      else -      ap_try = ActivityPub.make_user_from_ap_id(ap_id) - -      case ap_try do -        {:ok, user} -> -          user +      user = fetch_by_ap_id(ap_id) -        _ -> -          case OStatus.make_user(ap_id) do -            {:ok, user} -> user -            _ -> {:error, "Could not fetch by AP id"} -          end +      if Pleroma.Config.get([:fetch_initial_posts, :enabled]) do +        with %User{} = user do +          {:ok, _} = Task.start(__MODULE__, :fetch_initial_posts, [user]) +        end        end + +      user      end    end diff --git a/lib/pleroma/web/activity_pub/utils.ex b/lib/pleroma/web/activity_pub/utils.ex index 9e50789db..629c39315 100644 --- a/lib/pleroma/web/activity_pub/utils.ex +++ b/lib/pleroma/web/activity_pub/utils.ex @@ -633,4 +633,43 @@ defmodule Pleroma.Web.ActivityPub.Utils do      }      |> Map.merge(additional)    end + +  @doc """ +  Fetches the OrderedCollection/OrderedCollectionPage from `from`, limiting the amount of pages fetched after +  the first one to `pages_left` pages. +  If the amount of pages is higher than the collection has, it returns whatever was there. +  """ +  def fetch_ordered_collection(from, pages_left, acc \\ []) do +    with {:ok, response} <- Tesla.get(from), +         {:ok, collection} <- Poison.decode(response.body) do +      case collection["type"] do +        "OrderedCollection" -> +          # If we've encountered the OrderedCollection and not the page, +          # just call the same function on the page address +          fetch_ordered_collection(collection["first"], pages_left) + +        "OrderedCollectionPage" -> +          if pages_left > 0 do +            # There are still more pages +            if Map.has_key?(collection, "next") do +              # There are still more pages, go deeper saving what we have into the accumulator +              fetch_ordered_collection( +                collection["next"], +                pages_left - 1, +                acc ++ collection["orderedItems"] +              ) +            else +              # No more pages left, just return whatever we already have +              acc ++ collection["orderedItems"] +            end +          else +            # Got the amount of pages needed, add them all to the accumulator +            acc ++ collection["orderedItems"] +          end + +        _ -> +          {:error, "Not an OrderedCollection or OrderedCollectionPage"} +      end +    end +  end  end | 
