Browse Source

Merge branch 'feature/pinned-posts' into 'develop'

Pinned Statuses

Closes #440

See merge request pleroma/pleroma!636
tags/v0.9.9
kaniini 5 years ago
parent
commit
7f5efddd6e
19 changed files with 370 additions and 14 deletions
  1. +2
    -1
      config/config.exs
  2. +2
    -1
      docs/config.md
  3. +23
    -0
      lib/pleroma/user/info.ex
  4. +8
    -0
      lib/pleroma/web/activity_pub/activity_pub.ex
  5. +44
    -0
      lib/pleroma/web/common_api/common_api.ex
  6. +22
    -7
      lib/pleroma/web/mastodon_api/mastodon_api_controller.ex
  7. +5
    -0
      lib/pleroma/web/mastodon_api/views/status_view.ex
  8. +5
    -0
      lib/pleroma/web/router.ex
  9. +2
    -0
      lib/pleroma/web/twitter_api/representers/activity_representer.ex
  10. +8
    -0
      lib/pleroma/web/twitter_api/twitter_api.ex
  11. +24
    -0
      lib/pleroma/web/twitter_api/twitter_api_controller.ex
  12. +2
    -0
      lib/pleroma/web/twitter_api/views/activity_view.ex
  13. +22
    -0
      test/web/activity_pub/activity_pub_test.exs
  14. +39
    -1
      test/web/common_api/common_api_test.exs
  15. +81
    -1
      test/web/mastodon_api/mastodon_api_controller_test.exs
  16. +1
    -0
      test/web/mastodon_api/status_view_test.exs
  17. +2
    -1
      test/web/twitter_api/representers/activity_representer_test.exs
  18. +76
    -1
      test/web/twitter_api/twitter_api_controller_test.exs
  19. +2
    -1
      test/web/twitter_api/views/activity_view_test.exs

+ 2
- 1
config/config.exs View File

@@ -138,7 +138,8 @@ config :pleroma, :instance,
],
finmoji_enabled: true,
mrf_transparency: true,
autofollowed_nicknames: []
autofollowed_nicknames: [],
max_pinned_statuses: 1

config :pleroma, :markup,
# XXX - unfortunately, inline images must be enabled by default right now, because


+ 2
- 1
docs/config.md View File

@@ -32,7 +32,7 @@ This filter replaces the filename (not the path) of an upload. For complete obfu

## Pleroma.Mailer
* `adapter`: one of the mail adapters listed in [Swoosh readme](https://github.com/swoosh/swoosh#adapters), or `Swoosh.Adapters.Local` for in-memory mailbox.
* `api_key` / `password` and / or other adapter-specific settings, per the above documentation.
* `api_key` / `password` and / or other adapter-specific settings, per the above documentation.

An example for Sendgrid adapter:

@@ -93,6 +93,7 @@ config :pleroma, Pleroma.Mailer,
* `always_show_subject_input`: When set to false, auto-hide the subject field when it's empty.
* `extended_nickname_format`: Set to `true` to use extended local nicknames format (allows underscores/dashes). This will break federation with
older software for theses nicknames.
* `max_pinned_statuses`: The maximum number of pinned statuses. `0` will disable the feature.
* `autofollowed_nicknames`: Set to nicknames of (local) users that every new user should automatically follow.

## :logger


+ 23
- 0
lib/pleroma/user/info.ex View File

@@ -31,6 +31,7 @@ defmodule Pleroma.User.Info do
field(:hub, :string, default: nil)
field(:salmon, :string, default: nil)
field(:hide_network, :boolean, default: false)
field(:pinned_activities, {:array, :integer}, default: [])

# Found in the wild
# ap_id -> Where is this used?
@@ -196,4 +197,26 @@ defmodule Pleroma.User.Info do
:is_admin
])
end

def add_pinnned_activity(info, %Pleroma.Activity{id: id}) do
if id not in info.pinned_activities do
max_pinned_statuses = Pleroma.Config.get([:instance, :max_pinned_statuses], 0)
params = %{pinned_activities: info.pinned_activities ++ [id]}

info
|> cast(params, [:pinned_activities])
|> validate_length(:pinned_activities,
max: max_pinned_statuses,
message: "You have already pinned the maximum number of statuses"
)
else
change(info)
end
end

def remove_pinnned_activity(info, %Pleroma.Activity{id: id}) do
params = %{pinned_activities: List.delete(info.pinned_activities, id)}

cast(info, params, [:pinned_activities])
end
end

+ 8
- 0
lib/pleroma/web/activity_pub/activity_pub.ex View File

@@ -391,6 +391,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
|> Map.put("type", ["Create", "Announce"])
|> Map.put("actor_id", user.ap_id)
|> Map.put("whole_db", true)
|> Map.put("pinned_activity_ids", user.info.pinned_activities)

recipients =
if reading_user do
@@ -549,6 +550,12 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
)
end

defp restrict_pinned(query, %{"pinned" => "true", "pinned_activity_ids" => ids}) do
from(activity in query, where: activity.id in ^ids)
end

defp restrict_pinned(query, _), do: query

def fetch_activities_query(recipients, opts \\ %{}) do
base_query =
from(
@@ -573,6 +580,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
|> restrict_visibility(opts)
|> restrict_replies(opts)
|> restrict_reblogs(opts)
|> restrict_pinned(opts)
end

def fetch_activities(recipients, opts \\ %{}) do


+ 44
- 0
lib/pleroma/web/common_api/common_api.ex View File

@@ -164,4 +164,48 @@ defmodule Pleroma.Web.CommonAPI do
object: Pleroma.Web.ActivityPub.UserView.render("user.json", %{user: user})
})
end

def pin(id_or_ap_id, %{ap_id: user_ap_id} = user) do
with %Activity{
actor: ^user_ap_id,
data: %{
"type" => "Create",
"object" => %{
"to" => object_to,
"type" => "Note"
}
}
} = activity <- get_by_id_or_ap_id(id_or_ap_id),
true <- Enum.member?(object_to, "https://www.w3.org/ns/activitystreams#Public"),
%{valid?: true} = info_changeset <-
Pleroma.User.Info.add_pinnned_activity(user.info, activity),
changeset <-
Ecto.Changeset.change(user) |> Ecto.Changeset.put_embed(:info, info_changeset),
{:ok, _user} <- User.update_and_set_cache(changeset) do
{:ok, activity}
else
%{errors: [pinned_activities: {err, _}]} ->
{:error, err}

_ ->
{:error, "Could not pin"}
end
end

def unpin(id_or_ap_id, user) do
with %Activity{} = activity <- get_by_id_or_ap_id(id_or_ap_id),
%{valid?: true} = info_changeset <-
Pleroma.User.Info.remove_pinnned_activity(user.info, activity),
changeset <-
Ecto.Changeset.change(user) |> Ecto.Changeset.put_embed(:info, info_changeset),
{:ok, _user} <- User.update_and_set_cache(changeset) do
{:ok, activity}
else
%{errors: [pinned_activities: {err, _}]} ->
{:error, err}

_ ->
{:error, "Could not unpin"}
end
end
end

+ 22
- 7
lib/pleroma/web/mastodon_api/mastodon_api_controller.ex View File

@@ -256,13 +256,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do

def user_statuses(%{assigns: %{user: reading_user}} = conn, params) do
with %User{} = user <- Repo.get(User, params["id"]) do
# Since Pleroma has no "pinned" posts feature, we'll just set an empty list here
activities =
if params["pinned"] == "true" do
[]
else
ActivityPub.fetch_user_activities(user, reading_user, params)
end
activities = ActivityPub.fetch_user_activities(user, reading_user, params)

conn
|> add_link_headers(:user_statuses, activities, params["id"])
@@ -409,6 +403,27 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
end
end

def pin_status(%{assigns: %{user: user}} = conn, %{"id" => ap_id_or_id}) do
with {:ok, activity} <- CommonAPI.pin(ap_id_or_id, user) do
conn
|> put_view(StatusView)
|> try_render("status.json", %{activity: activity, for: user, as: :activity})
else
{:error, reason} ->
conn
|> put_resp_content_type("application/json")
|> send_resp(:bad_request, Jason.encode!(%{"error" => reason}))
end
end

def unpin_status(%{assigns: %{user: user}} = conn, %{"id" => ap_id_or_id}) do
with {:ok, activity} <- CommonAPI.unpin(ap_id_or_id, user) do
conn
|> put_view(StatusView)
|> try_render("status.json", %{activity: activity, for: user, as: :activity})
end
end

def notifications(%{assigns: %{user: user}} = conn, params) do
notifications = Notification.for_user(user, params)



+ 5
- 0
lib/pleroma/web/mastodon_api/views/status_view.ex View File

@@ -76,6 +76,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
reblogged: false,
favourited: false,
muted: false,
pinned: pinned?(activity, user),
sensitive: false,
spoiler_text: "",
visibility: "public",
@@ -142,6 +143,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
reblogged: present?(repeated),
favourited: present?(favorited),
muted: false,
pinned: pinned?(activity, user),
sensitive: sensitive,
spoiler_text: object["summary"] || "",
visibility: get_visibility(object),
@@ -295,4 +297,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
defp present?(nil), do: false
defp present?(false), do: false
defp present?(_), do: true

defp pinned?(%Activity{id: id}, %User{info: %{pinned_activities: pinned_activities}}),
do: id in pinned_activities
end

+ 5
- 0
lib/pleroma/web/router.ex View File

@@ -188,6 +188,8 @@ defmodule Pleroma.Web.Router do
post("/statuses/:id/unreblog", MastodonAPIController, :unreblog_status)
post("/statuses/:id/favourite", MastodonAPIController, :fav_status)
post("/statuses/:id/unfavourite", MastodonAPIController, :unfav_status)
post("/statuses/:id/pin", MastodonAPIController, :pin_status)
post("/statuses/:id/unpin", MastodonAPIController, :unpin_status)

post("/notifications/clear", MastodonAPIController, :clear_notifications)
post("/notifications/dismiss", MastodonAPIController, :dismiss_notification)
@@ -353,6 +355,9 @@ defmodule Pleroma.Web.Router do
post("/statuses/unretweet/:id", TwitterAPI.Controller, :unretweet)
post("/statuses/destroy/:id", TwitterAPI.Controller, :delete_post)

post("/statuses/pin/:id", TwitterAPI.Controller, :pin)
post("/statuses/unpin/:id", TwitterAPI.Controller, :unpin)

get("/pleroma/friend_requests", TwitterAPI.Controller, :friend_requests)
post("/pleroma/friendships/approve", TwitterAPI.Controller, :approve_friend_request)
post("/pleroma/friendships/deny", TwitterAPI.Controller, :deny_friend_request)


+ 2
- 0
lib/pleroma/web/twitter_api/representers/activity_representer.ex View File

@@ -153,6 +153,7 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenter do
announcement_count = object["announcement_count"] || 0
favorited = opts[:for] && opts[:for].ap_id in (object["likes"] || [])
repeated = opts[:for] && opts[:for].ap_id in (object["announcements"] || [])
pinned = activity.id in user.info.pinned_activities

mentions = opts[:mentioned] || []

@@ -204,6 +205,7 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenter do
"repeat_num" => announcement_count,
"favorited" => to_boolean(favorited),
"repeated" => to_boolean(repeated),
"pinned" => pinned,
"external_url" => object["external_url"] || object["id"],
"tags" => tags,
"activity_type" => "post",


+ 8
- 0
lib/pleroma/web/twitter_api/twitter_api.ex View File

@@ -82,6 +82,14 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do
end
end

def pin(%User{} = user, ap_id_or_id) do
CommonAPI.pin(ap_id_or_id, user)
end

def unpin(%User{} = user, ap_id_or_id) do
CommonAPI.unpin(ap_id_or_id, user)
end

def fav(%User{} = user, ap_id_or_id) do
with {:ok, _fav, %{data: %{"id" => id}}} <- CommonAPI.favorite(ap_id_or_id, user),
%Activity{} = activity <- Activity.get_create_activity_by_object_ap_id(id) do


+ 24
- 0
lib/pleroma/web/twitter_api/twitter_api_controller.ex View File

@@ -375,6 +375,30 @@ defmodule Pleroma.Web.TwitterAPI.Controller do
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
conn
|> put_view(ActivityView)
|> render("activity.json", %{activity: activity, for: user})
else
{:error, message} -> bad_request_reply(conn, message)
err -> err
end
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
conn
|> put_view(ActivityView)
|> render("activity.json", %{activity: activity, for: user})
else
{:error, message} -> bad_request_reply(conn, message)
err -> err
end
end

def register(conn, params) do
with {:ok, user} <- TwitterAPI.register_user(params) do
conn


+ 2
- 0
lib/pleroma/web/twitter_api/views/activity_view.ex View File

@@ -243,6 +243,7 @@ defmodule Pleroma.Web.TwitterAPI.ActivityView do
announcement_count = object["announcement_count"] || 0
favorited = opts[:for] && opts[:for].ap_id in (object["likes"] || [])
repeated = opts[:for] && opts[:for].ap_id in (object["announcements"] || [])
pinned = activity.id in user.info.pinned_activities

attentions =
activity.recipients
@@ -302,6 +303,7 @@ defmodule Pleroma.Web.TwitterAPI.ActivityView do
"repeat_num" => announcement_count,
"favorited" => !!favorited,
"repeated" => !!repeated,
"pinned" => pinned,
"external_url" => object["external_url"] || object["id"],
"tags" => tags,
"activity_type" => "post",


+ 22
- 0
test/web/activity_pub/activity_pub_test.exs View File

@@ -637,6 +637,28 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
assert object
end

test "returned pinned statuses" do
Pleroma.Config.put([:instance, :max_pinned_statuses], 3)
user = insert(:user)

{:ok, activity_one} = CommonAPI.post(user, %{"status" => "HI!!!"})
{:ok, activity_two} = CommonAPI.post(user, %{"status" => "HI!!!"})
{:ok, activity_three} = CommonAPI.post(user, %{"status" => "HI!!!"})

CommonAPI.pin(activity_one.id, user)
user = refresh_record(user)

CommonAPI.pin(activity_two.id, user)
user = refresh_record(user)

CommonAPI.pin(activity_three.id, user)
user = refresh_record(user)

activities = ActivityPub.fetch_user_activities(user, nil, %{"pinned" => "true"})

assert 3 = length(activities)
end

def data_uri do
File.read!("test/fixtures/avatar_data_uri")
end


+ 39
- 1
test/web/common_api/common_api_test.exs View File

@@ -1,5 +1,5 @@
# Pleroma: A lightweight social networking server
# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only

defmodule Pleroma.Web.CommonAPI.Test do
@@ -96,4 +96,42 @@ defmodule Pleroma.Web.CommonAPI.Test do
{:error, _} = CommonAPI.favorite(activity.id, user)
end
end

describe "pinned statuses" do
setup do
Pleroma.Config.put([:instance, :max_pinned_statuses], 1)

user = insert(:user)
{:ok, activity} = CommonAPI.post(user, %{"status" => "HI!!!"})

[user: user, activity: activity]
end

test "pin status", %{user: user, activity: activity} do
assert {:ok, ^activity} = CommonAPI.pin(activity.id, user)
end

test "only self-authored can be pinned", %{activity: activity} do
user = insert(:user)

assert {:error, "Could not pin"} = CommonAPI.pin(activity.id, user)
end

test "max pinned statuses", %{user: user, activity: activity_one} do
{:ok, activity_two} = CommonAPI.post(user, %{"status" => "HI!!!"})

assert {:ok, ^activity_one} = CommonAPI.pin(activity_one.id, user)

user = refresh_record(user)

assert {:error, "You have already pinned the maximum number of statuses"} =
CommonAPI.pin(activity_two.id, user)
end

test "unpin status", %{user: user, activity: activity} do
{:ok, activity} = CommonAPI.pin(activity.id, user)

assert {:ok, ^activity} = CommonAPI.unpin(activity.id, user)
end
end
end

+ 81
- 1
test/web/mastodon_api/mastodon_api_controller_test.exs View File

@@ -1,5 +1,5 @@
# Pleroma: A lightweight social networking server
# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only

defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
@@ -1471,4 +1471,84 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
user = User.get_cached_by_ap_id(user.ap_id)
assert user.info.settings == %{"programming" => "socks"}
end

describe "pinned statuses" do
setup do
Pleroma.Config.put([:instance, :max_pinned_statuses], 1)

user = insert(:user)
{:ok, activity} = CommonAPI.post(user, %{"status" => "HI!!!"})

[user: user, activity: activity]
end

test "returns pinned statuses", %{conn: conn, user: user, activity: activity} do
{:ok, _} = CommonAPI.pin(activity.id, user)

result =
conn
|> assign(:user, user)
|> get("/api/v1/accounts/#{user.id}/statuses?pinned=true")
|> json_response(200)

id_str = to_string(activity.id)

assert [%{"id" => ^id_str, "pinned" => true}] = result
end

test "pin status", %{conn: conn, user: user, activity: activity} do
id_str = to_string(activity.id)

assert %{"id" => ^id_str, "pinned" => true} =
conn
|> assign(:user, user)
|> post("/api/v1/statuses/#{activity.id}/pin")
|> json_response(200)

assert [%{"id" => ^id_str, "pinned" => true}] =
conn
|> assign(:user, user)
|> get("/api/v1/accounts/#{user.id}/statuses?pinned=true")
|> json_response(200)
end

test "unpin status", %{conn: conn, user: user, activity: activity} do
{:ok, _} = CommonAPI.pin(activity.id, user)

id_str = to_string(activity.id)
user = refresh_record(user)

assert %{"id" => ^id_str, "pinned" => false} =
conn
|> assign(:user, user)
|> post("/api/v1/statuses/#{activity.id}/unpin")
|> json_response(200)

assert [] =
conn
|> assign(:user, user)
|> get("/api/v1/accounts/#{user.id}/statuses?pinned=true")
|> json_response(200)
end

test "max pinned statuses", %{conn: conn, user: user, activity: activity_one} do
{:ok, activity_two} = CommonAPI.post(user, %{"status" => "HI!!!"})

id_str_one = to_string(activity_one.id)

assert %{"id" => ^id_str_one, "pinned" => true} =
conn
|> assign(:user, user)
|> post("/api/v1/statuses/#{id_str_one}/pin")
|> json_response(200)

user = refresh_record(user)

assert %{"error" => "You have already pinned the maximum number of statuses"} =
conn
|> assign(:user, user)
|> post("/api/v1/statuses/#{activity_two.id}/pin")
|> json_response(400)
end
end
end

+ 1
- 0
test/web/mastodon_api/status_view_test.exs View File

@@ -63,6 +63,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
reblogged: false,
favourited: false,
muted: false,
pinned: false,
sensitive: false,
spoiler_text: note.data["object"]["summary"],
visibility: "public",


+ 2
- 1
test/web/twitter_api/representers/activity_representer_test.exs View File

@@ -1,5 +1,5 @@
# Pleroma: A lightweight social networking server
# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only

defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenterTest do
@@ -157,6 +157,7 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenterTest do
"repeat_num" => 3,
"favorited" => false,
"repeated" => false,
"pinned" => false,
"external_url" => "some url",
"tags" => ["nsfw", "content", "mentioning"],
"activity_type" => "post",


+ 76
- 1
test/web/twitter_api/twitter_api_controller_test.exs View File

@@ -1,5 +1,5 @@
# Pleroma: A lightweight social networking server
# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only

defmodule Pleroma.Web.TwitterAPI.ControllerTest do
@@ -1694,4 +1694,79 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
assert object.data["name"] == description
end
end

describe "POST /api/statuses/user_timeline.json?user_id=:user_id&pinned=true" do
test "it returns a list of pinned statuses", %{conn: conn} do
Pleroma.Config.put([:instance, :max_pinned_statuses], 1)

user = insert(:user, %{name: "egor"})
{:ok, %{id: activity_id}} = CommonAPI.post(user, %{"status" => "HI!!!"})
{:ok, _} = CommonAPI.pin(activity_id, user)

resp =
conn
|> get("/api/statuses/user_timeline.json", %{user_id: user.id, pinned: true})
|> json_response(200)

assert length(resp) == 1
assert [%{"id" => ^activity_id, "pinned" => true}] = resp
end
end

describe "POST /api/statuses/pin/:id" do
setup do
Pleroma.Config.put([:instance, :max_pinned_statuses], 1)
[user: insert(:user)]
end

test "without valid credentials", %{conn: conn} do
note_activity = insert(:note_activity)
conn = post(conn, "/api/statuses/pin/#{note_activity.id}.json")
assert json_response(conn, 403) == %{"error" => "Invalid credentials."}
end

test "with credentials", %{conn: conn, user: user} do
{:ok, activity} = CommonAPI.post(user, %{"status" => "test!"})

request_path = "/api/statuses/pin/#{activity.id}.json"

response =
conn
|> with_credentials(user.nickname, "test")
|> post(request_path)

user = refresh_record(user)

assert json_response(response, 200) == ActivityRepresenter.to_map(activity, %{user: user})
end
end

describe "POST /api/statuses/unpin/:id" do
setup do
Pleroma.Config.put([:instance, :max_pinned_statuses], 1)
[user: insert(:user)]
end

test "without valid credentials", %{conn: conn} do
note_activity = insert(:note_activity)
conn = post(conn, "/api/statuses/unpin/#{note_activity.id}.json")
assert json_response(conn, 403) == %{"error" => "Invalid credentials."}
end

test "with credentials", %{conn: conn, user: user} do
{:ok, activity} = CommonAPI.post(user, %{"status" => "test!"})
{:ok, activity} = CommonAPI.pin(activity.id, user)

request_path = "/api/statuses/unpin/#{activity.id}.json"

response =
conn
|> with_credentials(user.nickname, "test")
|> post(request_path)

user = refresh_record(user)

assert json_response(response, 200) == ActivityRepresenter.to_map(activity, %{user: user})
end
end
end

+ 2
- 1
test/web/twitter_api/views/activity_view_test.exs View File

@@ -1,5 +1,5 @@
# Pleroma: A lightweight social networking server
# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only

defmodule Pleroma.Web.TwitterAPI.ActivityViewTest do
@@ -136,6 +136,7 @@ defmodule Pleroma.Web.TwitterAPI.ActivityViewTest do
"possibly_sensitive" => false,
"repeat_num" => 0,
"repeated" => false,
"pinned" => false,
"statusnet_conversation_id" => convo_id,
"summary" => "",
"summary_html" => "",


Loading…
Cancel
Save