Merge branch 'classic-flakeids' into 'develop'
authorkaniini <nenolod@gmail.com>
Fri, 25 Jan 2019 04:59:06 +0000 (04:59 +0000)
committerkaniini <nenolod@gmail.com>
Fri, 25 Jan 2019 04:59:06 +0000 (04:59 +0000)
Flake Ids for Users and Activities

Closes #450

See merge request pleroma/pleroma!645

1  2 
lib/pleroma/activity.ex
lib/pleroma/web/activity_pub/transmogrifier.ex
lib/pleroma/web/twitter_api/twitter_api_controller.ex

diff --combined lib/pleroma/activity.ex
index cd61f6ac858672e564ab5925fdd17af29c793e99,d907791b57f4fda10529ea0597db39edff73a5c2..f0aa3ce978f437c854b66b49cbedc9b248760a05
@@@ -8,6 -8,7 +8,7 @@@ defmodule Pleroma.Activity d
    import Ecto.Query
  
    @type t :: %__MODULE__{}
+   @primary_key {:id, Pleroma.FlakeId, autogenerate: true}
  
    # https://github.com/tootsuite/mastodon/blob/master/app/models/notification.rb#L19
    @mastodon_notification_types %{
      Repo.get(Activity, id)
    end
  
 -  # TODO:
 -  # Go through these and fix them everywhere.
 -  # Wrong name, only returns create activities
 -  def all_by_object_ap_id_q(ap_id) do
 +  def by_object_ap_id(ap_id) do
      from(
        activity in Activity,
        where:
            activity.data,
            activity.data,
            ^to_string(ap_id)
 -        ),
 -      where: fragment("(?)->>'type' = 'Create'", activity.data)
 +        )
      )
    end
  
 -  # Wrong name, returns all.
 -  def all_non_create_by_object_ap_id_q(ap_id) do
 +  def create_by_object_ap_id(ap_ids) when is_list(ap_ids) do
      from(
        activity in Activity,
        where:
          fragment(
 -          "coalesce((?)->'object'->>'id', (?)->>'object') = ?",
 +          "coalesce((?)->'object'->>'id', (?)->>'object') = ANY(?)",
            activity.data,
            activity.data,
 -          ^to_string(ap_id)
 -        )
 +          ^ap_ids
 +        ),
 +      where: fragment("(?)->>'type' = 'Create'", activity.data)
      )
    end
  
 -  # Wrong name plz fix thx
 -  def all_by_object_ap_id(ap_id) do
 -    Repo.all(all_by_object_ap_id_q(ap_id))
 -  end
 -
 -  def create_activity_by_object_id_query(ap_ids) do
 +  def create_by_object_ap_id(ap_id) do
      from(
        activity in Activity,
        where:
          fragment(
 -          "coalesce((?)->'object'->>'id', (?)->>'object') = ANY(?)",
 +          "coalesce((?)->'object'->>'id', (?)->>'object') = ?",
            activity.data,
            activity.data,
 -          ^ap_ids
 +          ^to_string(ap_id)
          ),
        where: fragment("(?)->>'type' = 'Create'", activity.data)
      )
    end
  
 -  def get_create_activity_by_object_ap_id(ap_id) when is_binary(ap_id) do
 -    create_activity_by_object_id_query([ap_id])
 +  def get_all_create_by_object_ap_id(ap_id) do
 +    Repo.all(create_by_object_ap_id(ap_id))
 +  end
 +
 +  def get_create_by_object_ap_id(ap_id) when is_binary(ap_id) do
 +    create_by_object_ap_id(ap_id)
      |> Repo.one()
    end
  
 -  def get_create_activity_by_object_ap_id(_), do: nil
 +  def get_create_by_object_ap_id(_), do: nil
  
    def normalize(obj) when is_map(obj), do: Activity.get_by_ap_id(obj["id"])
    def normalize(ap_id) when is_binary(ap_id), do: Activity.get_by_ap_id(ap_id)
    def normalize(_), do: nil
  
    def get_in_reply_to_activity(%Activity{data: %{"object" => %{"inReplyTo" => ap_id}}}) do
 -    get_create_activity_by_object_ap_id(ap_id)
 +    get_create_by_object_ap_id(ap_id)
    end
  
    def get_in_reply_to_activity(_), do: nil
index 46b1646f7e1c77c1b9b1716d8c42460789fa1bb0,e646de608c95178cc10dc0d796ef94c7644922d9..6656a11c6ceadbe83c885a518adcdf393ce1cc64
@@@ -176,7 -176,7 +176,7 @@@ defmodule Pleroma.Web.ActivityPub.Trans
      case fetch_obj_helper(in_reply_to_id) do
        {:ok, replied_object} ->
          with %Activity{} = activity <-
 -               Activity.get_create_activity_by_object_ap_id(replied_object.data["id"]) do
 +               Activity.get_create_by_object_ap_id(replied_object.data["id"]) do
            object
            |> Map.put("inReplyTo", replied_object.data["id"])
            |> Map.put("inReplyToAtomUri", object["inReplyToAtomUri"] || in_reply_to_id)
        Map.put(data, "actor", actor)
        |> fix_addressing
  
 -    with nil <- Activity.get_create_activity_by_object_ap_id(object["id"]),
 +    with nil <- Activity.get_create_by_object_ap_id(object["id"]),
           %User{} = user <- User.get_or_fetch_by_ap_id(data["actor"]) do
        object = fix_object(data["object"])
  
  
      maybe_retire_websub(user.ap_id)
  
-     # Only do this for recent activties, don't go through the whole db.
-     # Only look at the last 1000 activities.
-     since = (Repo.aggregate(Activity, :max, :id) || 0) - 1_000
      q =
        from(
          a in Activity,
          where: ^old_follower_address in a.recipients,
-         where: a.id > ^since,
          update: [
            set: [
              recipients:
index 8c9060cf2cf885fb14f91c2d682533a6b270d73a,65ae7aabffb841e01a580afa93b564aeaa046e9e..3064d61eaa2e1ecd09ecd108ebce7814b675be58
@@@ -265,8 -265,6 +265,6 @@@ defmodule Pleroma.Web.TwitterAPI.Contro
    end
  
    def fetch_conversation(%{assigns: %{user: user}} = conn, %{"id" => id}) do
-     id = String.to_integer(id)
      with context when is_binary(context) <- TwitterAPI.conversation_id_to_context(id),
           activities <-
             ActivityPub.fetch_activities_for_context(context, %{
    end
  
    def get_by_id_or_ap_id(id) do
 -    activity = Repo.get(Activity, id) || Activity.get_create_activity_by_object_ap_id(id)
 +    activity = Repo.get(Activity, id) || Activity.get_create_by_object_ap_id(id)
  
      if activity.data["type"] == "Create" do
        activity
      else
 -      Activity.get_create_activity_by_object_ap_id(activity.data["object"])
 +      Activity.get_create_by_object_ap_id(activity.data["object"])
      end
    end
  
    def favorite(%{assigns: %{user: user}} = conn, %{"id" => id}) do
-     with {_, {:ok, id}} <- {:param_cast, Ecto.Type.cast(:integer, id)},
-          {:ok, activity} <- TwitterAPI.fav(user, id) do
+     with {:ok, activity} <- TwitterAPI.fav(user, id) do
        conn
        |> put_view(ActivityView)
        |> render("activity.json", %{activity: activity, for: user})
+     else
+       _ -> json_reply(conn, 400, Jason.encode!(%{}))
      end
    end
  
    def unfavorite(%{assigns: %{user: user}} = conn, %{"id" => id}) do
-     with {_, {:ok, id}} <- {:param_cast, Ecto.Type.cast(:integer, id)},
-          {:ok, activity} <- TwitterAPI.unfav(user, id) do
+     with {:ok, activity} <- TwitterAPI.unfav(user, id) do
        conn
        |> put_view(ActivityView)
        |> render("activity.json", %{activity: activity, for: user})
+     else
+       _ -> json_reply(conn, 400, Jason.encode!(%{}))
      end
    end
  
    def retweet(%{assigns: %{user: user}} = conn, %{"id" => id}) do
-     with {_, {:ok, id}} <- {:param_cast, Ecto.Type.cast(:integer, id)},
-          {:ok, activity} <- TwitterAPI.repeat(user, id) do
+     with {:ok, activity} <- TwitterAPI.repeat(user, id) do
        conn
        |> put_view(ActivityView)
        |> render("activity.json", %{activity: activity, for: user})
+     else
+       _ -> json_reply(conn, 400, Jason.encode!(%{}))
      end
    end
  
    def unretweet(%{assigns: %{user: user}} = conn, %{"id" => id}) do
-     with {_, {:ok, id}} <- {:param_cast, Ecto.Type.cast(:integer, id)},
-          {:ok, activity} <- TwitterAPI.unrepeat(user, id) do
+     with {:ok, activity} <- TwitterAPI.unrepeat(user, id) do
        conn
        |> put_view(ActivityView)
        |> render("activity.json", %{activity: activity, for: user})
+     else
+       _ -> json_reply(conn, 400, Jason.encode!(%{}))
      end
    end
  
    def pin(%{assigns: %{user: user}} = conn, %{"id" => id}) do
-     with {_, {:ok, id}} <- {:param_cast, Ecto.Type.cast(:integer, id)},
-          {:ok, activity} <- TwitterAPI.pin(user, id) do
+     with {:ok, activity} <- TwitterAPI.pin(user, id) do
        conn
        |> put_view(ActivityView)
        |> render("activity.json", %{activity: activity, for: user})
    end
  
    def unpin(%{assigns: %{user: user}} = conn, %{"id" => id}) do
-     with {_, {:ok, id}} <- {:param_cast, Ecto.Type.cast(:integer, id)},
-          {:ok, activity} <- TwitterAPI.unpin(user, id) do
+     with {:ok, activity} <- TwitterAPI.unpin(user, id) do
        conn
        |> put_view(ActivityView)
        |> render("activity.json", %{activity: activity, for: user})
  
    def approve_friend_request(conn, %{"user_id" => uid} = _params) do
      with followed <- conn.assigns[:user],
-          uid when is_number(uid) <- String.to_integer(uid),
           %User{} = follower <- Repo.get(User, uid),
           {:ok, follower} <- User.maybe_follow(follower, followed),
           %Activity{} = follow_activity <- Utils.fetch_latest_follow(follower, followed),
  
    def deny_friend_request(conn, %{"user_id" => uid} = _params) do
      with followed <- conn.assigns[:user],
-          uid when is_number(uid) <- String.to_integer(uid),
           %User{} = follower <- Repo.get(User, uid),
           %Activity{} = follow_activity <- Utils.fetch_latest_follow(follower, followed),
           {:ok, follow_activity} <- Utils.update_follow_state(follow_activity, "reject"),