Merge branch 'refactor/status-controller' into 'develop'
Extract status actions from `MastodonAPIController` to `StatusController` See merge request pleroma/pleroma!1719
This commit is contained in:
commit
91e2bcf218
|
@ -42,7 +42,7 @@ defp loop(state) do
|
||||||
end
|
end
|
||||||
|
|
||||||
def puts_activity(activity) do
|
def puts_activity(activity) do
|
||||||
status = Pleroma.Web.MastodonAPI.StatusView.render("status.json", %{activity: activity})
|
status = Pleroma.Web.MastodonAPI.StatusView.render("show.json", %{activity: activity})
|
||||||
IO.puts("-- #{status.id} by #{status.account.display_name} (#{status.account.acct})")
|
IO.puts("-- #{status.id} by #{status.account.display_name} (#{status.account.acct})")
|
||||||
IO.puts(HtmlSanitizeEx.strip_tags(status.content))
|
IO.puts(HtmlSanitizeEx.strip_tags(status.content))
|
||||||
IO.puts("")
|
IO.puts("")
|
||||||
|
|
|
@ -513,7 +513,7 @@ def report_respond(%{assigns: %{user: user}} = conn, %{"id" => id} = params) do
|
||||||
|
|
||||||
conn
|
conn
|
||||||
|> put_view(StatusView)
|
|> put_view(StatusView)
|
||||||
|> render("status.json", %{activity: activity})
|
|> render("show.json", %{activity: activity})
|
||||||
else
|
else
|
||||||
true ->
|
true ->
|
||||||
{:param_cast, nil}
|
{:param_cast, nil}
|
||||||
|
@ -537,7 +537,7 @@ def status_update(%{assigns: %{user: admin}} = conn, %{"id" => id} = params) do
|
||||||
|
|
||||||
conn
|
conn
|
||||||
|> put_view(StatusView)
|
|> put_view(StatusView)
|
||||||
|> render("status.json", %{activity: activity})
|
|> render("show.json", %{activity: activity})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -51,28 +51,12 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
|
||||||
|
|
||||||
@rate_limited_relations_actions ~w(follow unfollow)a
|
@rate_limited_relations_actions ~w(follow unfollow)a
|
||||||
|
|
||||||
@rate_limited_status_actions ~w(reblog_status unreblog_status fav_status unfav_status
|
|
||||||
post_status delete_status)a
|
|
||||||
|
|
||||||
plug(
|
|
||||||
RateLimiter,
|
|
||||||
{:status_id_action, bucket_name: "status_id_action:reblog_unreblog", params: ["id"]}
|
|
||||||
when action in ~w(reblog_status unreblog_status)a
|
|
||||||
)
|
|
||||||
|
|
||||||
plug(
|
|
||||||
RateLimiter,
|
|
||||||
{:status_id_action, bucket_name: "status_id_action:fav_unfav", params: ["id"]}
|
|
||||||
when action in ~w(fav_status unfav_status)a
|
|
||||||
)
|
|
||||||
|
|
||||||
plug(
|
plug(
|
||||||
RateLimiter,
|
RateLimiter,
|
||||||
{:relations_id_action, params: ["id", "uri"]} when action in @rate_limited_relations_actions
|
{:relations_id_action, params: ["id", "uri"]} when action in @rate_limited_relations_actions
|
||||||
)
|
)
|
||||||
|
|
||||||
plug(RateLimiter, :relations_actions when action in @rate_limited_relations_actions)
|
plug(RateLimiter, :relations_actions when action in @rate_limited_relations_actions)
|
||||||
plug(RateLimiter, :statuses_actions when action in @rate_limited_status_actions)
|
|
||||||
plug(RateLimiter, :app_account_creation when action == :account_register)
|
plug(RateLimiter, :app_account_creation when action == :account_register)
|
||||||
plug(RateLimiter, :search when action in [:search, :search2, :account_search])
|
plug(RateLimiter, :search when action in [:search, :search2, :account_search])
|
||||||
plug(RateLimiter, :password_reset when action == :password_reset)
|
plug(RateLimiter, :password_reset when action == :password_reset)
|
||||||
|
@ -362,63 +346,6 @@ def user_statuses(%{assigns: %{user: reading_user}} = conn, params) do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def get_statuses(%{assigns: %{user: user}} = conn, %{"ids" => ids}) do
|
|
||||||
limit = 100
|
|
||||||
|
|
||||||
activities =
|
|
||||||
ids
|
|
||||||
|> Enum.take(limit)
|
|
||||||
|> Activity.all_by_ids_with_object()
|
|
||||||
|> Enum.filter(&Visibility.visible_for_user?(&1, user))
|
|
||||||
|
|
||||||
conn
|
|
||||||
|> put_view(StatusView)
|
|
||||||
|> render("index.json", activities: activities, for: user, as: :activity)
|
|
||||||
end
|
|
||||||
|
|
||||||
def get_status(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
|
||||||
with %Activity{} = activity <- Activity.get_by_id_with_object(id),
|
|
||||||
true <- Visibility.visible_for_user?(activity, user) do
|
|
||||||
conn
|
|
||||||
|> put_view(StatusView)
|
|
||||||
|> try_render("status.json", %{activity: activity, for: user})
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def get_context(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
|
||||||
with %Activity{} = activity <- Activity.get_by_id(id),
|
|
||||||
activities <-
|
|
||||||
ActivityPub.fetch_activities_for_context(activity.data["context"], %{
|
|
||||||
"blocking_user" => user,
|
|
||||||
"user" => user,
|
|
||||||
"exclude_id" => activity.id
|
|
||||||
}),
|
|
||||||
grouped_activities <- Enum.group_by(activities, fn %{id: id} -> id < activity.id end) do
|
|
||||||
result = %{
|
|
||||||
ancestors:
|
|
||||||
StatusView.render(
|
|
||||||
"index.json",
|
|
||||||
for: user,
|
|
||||||
activities: grouped_activities[true] || [],
|
|
||||||
as: :activity
|
|
||||||
)
|
|
||||||
|> Enum.reverse(),
|
|
||||||
# credo:disable-for-previous-line Credo.Check.Refactor.PipeChainStart
|
|
||||||
descendants:
|
|
||||||
StatusView.render(
|
|
||||||
"index.json",
|
|
||||||
for: user,
|
|
||||||
activities: grouped_activities[false] || [],
|
|
||||||
as: :activity
|
|
||||||
)
|
|
||||||
|> Enum.reverse()
|
|
||||||
# credo:disable-for-previous-line Credo.Check.Refactor.PipeChainStart
|
|
||||||
}
|
|
||||||
|
|
||||||
json(conn, result)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def get_poll(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
def get_poll(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
||||||
with %Object{} = object <- Object.get_by_id_and_maybe_refetch(id, interval: 60),
|
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"]),
|
%Activity{} = activity <- Activity.get_create_by_object_ap_id(object.data["id"]),
|
||||||
|
@ -518,143 +445,6 @@ def delete_scheduled_status(%{assigns: %{user: user}} = conn, %{"id" => schedule
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def post_status(
|
|
||||||
%{assigns: %{user: user}} = conn,
|
|
||||||
%{"status" => _, "scheduled_at" => scheduled_at} = params
|
|
||||||
) do
|
|
||||||
if ScheduledActivity.far_enough?(scheduled_at) do
|
|
||||||
with {:ok, scheduled_activity} <-
|
|
||||||
ScheduledActivity.create(user, %{"params" => params, "scheduled_at" => scheduled_at}) do
|
|
||||||
conn
|
|
||||||
|> put_view(ScheduledActivityView)
|
|
||||||
|> render("show.json", %{scheduled_activity: scheduled_activity})
|
|
||||||
end
|
|
||||||
else
|
|
||||||
post_status(conn, Map.drop(params, ["scheduled_at"]))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def post_status(%{assigns: %{user: user}} = conn, %{"status" => _} = params) do
|
|
||||||
case CommonAPI.post(user, params) do
|
|
||||||
{:ok, activity} ->
|
|
||||||
conn
|
|
||||||
|> put_view(StatusView)
|
|
||||||
|> try_render("status.json", %{
|
|
||||||
activity: activity,
|
|
||||||
for: user,
|
|
||||||
as: :activity,
|
|
||||||
with_direct_conversation_id: true
|
|
||||||
})
|
|
||||||
|
|
||||||
{:error, message} ->
|
|
||||||
conn
|
|
||||||
|> put_status(:unprocessable_entity)
|
|
||||||
|> json(%{error: message})
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def delete_status(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
|
||||||
with {:ok, %Activity{}} <- CommonAPI.delete(id, user) do
|
|
||||||
json(conn, %{})
|
|
||||||
else
|
|
||||||
_e -> render_error(conn, :forbidden, "Can't delete this post")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def reblog_status(%{assigns: %{user: user}} = conn, %{"id" => ap_id_or_id}) do
|
|
||||||
with {:ok, announce, _activity} <- CommonAPI.repeat(ap_id_or_id, user),
|
|
||||||
%Activity{} = announce <- Activity.normalize(announce.data) do
|
|
||||||
conn
|
|
||||||
|> put_view(StatusView)
|
|
||||||
|> try_render("status.json", %{activity: announce, for: user, as: :activity})
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def unreblog_status(%{assigns: %{user: user}} = conn, %{"id" => ap_id_or_id}) do
|
|
||||||
with {:ok, _unannounce, %{data: %{"id" => id}}} <- CommonAPI.unrepeat(ap_id_or_id, user),
|
|
||||||
%Activity{} = activity <- Activity.get_create_by_object_ap_id_with_object(id) do
|
|
||||||
conn
|
|
||||||
|> put_view(StatusView)
|
|
||||||
|> try_render("status.json", %{activity: activity, for: user, as: :activity})
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def fav_status(%{assigns: %{user: user}} = conn, %{"id" => ap_id_or_id}) do
|
|
||||||
with {:ok, _fav, %{data: %{"id" => id}}} <- CommonAPI.favorite(ap_id_or_id, user),
|
|
||||||
%Activity{} = activity <- Activity.get_create_by_object_ap_id(id) do
|
|
||||||
conn
|
|
||||||
|> put_view(StatusView)
|
|
||||||
|> try_render("status.json", %{activity: activity, for: user, as: :activity})
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def unfav_status(%{assigns: %{user: user}} = conn, %{"id" => ap_id_or_id}) do
|
|
||||||
with {:ok, _, _, %{data: %{"id" => id}}} <- CommonAPI.unfavorite(ap_id_or_id, user),
|
|
||||||
%Activity{} = activity <- Activity.get_create_by_object_ap_id(id) do
|
|
||||||
conn
|
|
||||||
|> put_view(StatusView)
|
|
||||||
|> try_render("status.json", %{activity: activity, for: user, as: :activity})
|
|
||||||
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})
|
|
||||||
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 bookmark_status(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
|
||||||
with %Activity{} = activity <- Activity.get_by_id_with_object(id),
|
|
||||||
%User{} = user <- User.get_cached_by_nickname(user.nickname),
|
|
||||||
true <- Visibility.visible_for_user?(activity, user),
|
|
||||||
{:ok, _bookmark} <- Bookmark.create(user.id, activity.id) do
|
|
||||||
conn
|
|
||||||
|> put_view(StatusView)
|
|
||||||
|> try_render("status.json", %{activity: activity, for: user, as: :activity})
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def unbookmark_status(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
|
||||||
with %Activity{} = activity <- Activity.get_by_id_with_object(id),
|
|
||||||
%User{} = user <- User.get_cached_by_nickname(user.nickname),
|
|
||||||
true <- Visibility.visible_for_user?(activity, user),
|
|
||||||
{:ok, _bookmark} <- Bookmark.destroy(user.id, activity.id) do
|
|
||||||
conn
|
|
||||||
|> put_view(StatusView)
|
|
||||||
|> try_render("status.json", %{activity: activity, for: user, as: :activity})
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def mute_conversation(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
|
||||||
activity = Activity.get_by_id(id)
|
|
||||||
|
|
||||||
with {:ok, activity} <- CommonAPI.add_mute(user, activity) do
|
|
||||||
conn
|
|
||||||
|> put_view(StatusView)
|
|
||||||
|> try_render("status.json", %{activity: activity, for: user, as: :activity})
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def unmute_conversation(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
|
||||||
activity = Activity.get_by_id(id)
|
|
||||||
|
|
||||||
with {:ok, activity} <- CommonAPI.remove_mute(user, activity) do
|
|
||||||
conn
|
|
||||||
|> put_view(StatusView)
|
|
||||||
|> try_render("status.json", %{activity: activity, for: user, as: :activity})
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def relationships(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
def relationships(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
||||||
id = List.wrap(id)
|
id = List.wrap(id)
|
||||||
q = from(u in User, where: u.id in ^id)
|
q = from(u in User, where: u.id in ^id)
|
||||||
|
@ -726,44 +516,6 @@ def get_mascot(%{assigns: %{user: user}} = conn, _params) do
|
||||||
|> json(mascot)
|
|> json(mascot)
|
||||||
end
|
end
|
||||||
|
|
||||||
def favourited_by(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
|
||||||
with %Activity{} = activity <- Activity.get_by_id_with_object(id),
|
|
||||||
{:visible, true} <- {:visible, Visibility.visible_for_user?(activity, user)},
|
|
||||||
%Object{data: %{"likes" => likes}} <- Object.normalize(activity) do
|
|
||||||
q = from(u in User, where: u.ap_id in ^likes)
|
|
||||||
|
|
||||||
users =
|
|
||||||
Repo.all(q)
|
|
||||||
|> Enum.filter(&(not User.blocks?(user, &1)))
|
|
||||||
|
|
||||||
conn
|
|
||||||
|> put_view(AccountView)
|
|
||||||
|> render("accounts.json", %{for: user, users: users, as: :user})
|
|
||||||
else
|
|
||||||
{:visible, false} -> {:error, :not_found}
|
|
||||||
_ -> json(conn, [])
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def reblogged_by(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
|
||||||
with %Activity{} = activity <- Activity.get_by_id_with_object(id),
|
|
||||||
{:visible, true} <- {:visible, Visibility.visible_for_user?(activity, user)},
|
|
||||||
%Object{data: %{"announcements" => announces}} <- Object.normalize(activity) do
|
|
||||||
q = from(u in User, where: u.ap_id in ^announces)
|
|
||||||
|
|
||||||
users =
|
|
||||||
Repo.all(q)
|
|
||||||
|> Enum.filter(&(not User.blocks?(user, &1)))
|
|
||||||
|
|
||||||
conn
|
|
||||||
|> put_view(AccountView)
|
|
||||||
|> render("accounts.json", %{for: user, users: users, as: :user})
|
|
||||||
else
|
|
||||||
{:visible, false} -> {:error, :not_found}
|
|
||||||
_ -> json(conn, [])
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def followers(%{assigns: %{user: for_user}} = conn, %{"id" => id} = params) do
|
def followers(%{assigns: %{user: for_user}} = conn, %{"id" => id} = params) do
|
||||||
with %User{} = user <- User.get_cached_by_id(id),
|
with %User{} = user <- User.get_cached_by_id(id),
|
||||||
followers <- MastodonAPI.get_followers(user, params) do
|
followers <- MastodonAPI.get_followers(user, params) do
|
||||||
|
@ -1394,22 +1146,6 @@ defp fetch_suggestion_id(attrs) do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def status_card(%{assigns: %{user: user}} = conn, %{"id" => status_id}) do
|
|
||||||
with %Activity{} = activity <- Activity.get_by_id(status_id),
|
|
||||||
true <- Visibility.visible_for_user?(activity, user) do
|
|
||||||
data =
|
|
||||||
StatusView.render(
|
|
||||||
"card.json",
|
|
||||||
Pleroma.Web.RichMedia.Helpers.fetch_data_for_activity(activity)
|
|
||||||
)
|
|
||||||
|
|
||||||
json(conn, data)
|
|
||||||
else
|
|
||||||
_e ->
|
|
||||||
%{}
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def reports(%{assigns: %{user: user}} = conn, params) do
|
def reports(%{assigns: %{user: user}} = conn, params) do
|
||||||
case CommonAPI.report(user, params) do
|
case CommonAPI.report(user, params) do
|
||||||
{:ok, activity} ->
|
{:ok, activity} ->
|
||||||
|
|
|
@ -0,0 +1,269 @@
|
||||||
|
# Pleroma: A lightweight social networking server
|
||||||
|
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
|
||||||
|
defmodule Pleroma.Web.MastodonAPI.StatusController do
|
||||||
|
use Pleroma.Web, :controller
|
||||||
|
|
||||||
|
import Pleroma.Web.MastodonAPI.MastodonAPIController, only: [try_render: 3]
|
||||||
|
|
||||||
|
require Ecto.Query
|
||||||
|
|
||||||
|
alias Pleroma.Activity
|
||||||
|
alias Pleroma.Bookmark
|
||||||
|
alias Pleroma.Object
|
||||||
|
alias Pleroma.Plugs.RateLimiter
|
||||||
|
alias Pleroma.Repo
|
||||||
|
alias Pleroma.ScheduledActivity
|
||||||
|
alias Pleroma.User
|
||||||
|
alias Pleroma.Web.ActivityPub.ActivityPub
|
||||||
|
alias Pleroma.Web.ActivityPub.Visibility
|
||||||
|
alias Pleroma.Web.CommonAPI
|
||||||
|
alias Pleroma.Web.MastodonAPI.AccountView
|
||||||
|
alias Pleroma.Web.MastodonAPI.ScheduledActivityView
|
||||||
|
|
||||||
|
@rate_limited_status_actions ~w(reblog unreblog favourite unfavourite create delete)a
|
||||||
|
|
||||||
|
plug(
|
||||||
|
RateLimiter,
|
||||||
|
{:status_id_action, bucket_name: "status_id_action:reblog_unreblog", params: ["id"]}
|
||||||
|
when action in ~w(reblog unreblog)a
|
||||||
|
)
|
||||||
|
|
||||||
|
plug(
|
||||||
|
RateLimiter,
|
||||||
|
{:status_id_action, bucket_name: "status_id_action:fav_unfav", params: ["id"]}
|
||||||
|
when action in ~w(favourite unfavourite)a
|
||||||
|
)
|
||||||
|
|
||||||
|
plug(RateLimiter, :statuses_actions when action in @rate_limited_status_actions)
|
||||||
|
|
||||||
|
action_fallback(Pleroma.Web.MastodonAPI.FallbackController)
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
GET `/api/v1/statuses?ids[]=1&ids[]=2`
|
||||||
|
|
||||||
|
`ids` query param is required
|
||||||
|
"""
|
||||||
|
def index(%{assigns: %{user: user}} = conn, %{"ids" => ids}) do
|
||||||
|
limit = 100
|
||||||
|
|
||||||
|
activities =
|
||||||
|
ids
|
||||||
|
|> Enum.take(limit)
|
||||||
|
|> Activity.all_by_ids_with_object()
|
||||||
|
|> Enum.filter(&Visibility.visible_for_user?(&1, user))
|
||||||
|
|
||||||
|
render(conn, "index.json", activities: activities, for: user, as: :activity)
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
POST /api/v1/statuses
|
||||||
|
|
||||||
|
Creates a scheduled status when `scheduled_at` param is present and it's far enough
|
||||||
|
"""
|
||||||
|
def create(
|
||||||
|
%{assigns: %{user: user}} = conn,
|
||||||
|
%{"status" => _, "scheduled_at" => scheduled_at} = params
|
||||||
|
) do
|
||||||
|
params = Map.put(params, "in_reply_to_status_id", params["in_reply_to_id"])
|
||||||
|
|
||||||
|
if ScheduledActivity.far_enough?(scheduled_at) do
|
||||||
|
with {:ok, scheduled_activity} <-
|
||||||
|
ScheduledActivity.create(user, %{"params" => params, "scheduled_at" => scheduled_at}) do
|
||||||
|
conn
|
||||||
|
|> put_view(ScheduledActivityView)
|
||||||
|
|> render("show.json", scheduled_activity: scheduled_activity)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
create(conn, Map.drop(params, ["scheduled_at"]))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
POST /api/v1/statuses
|
||||||
|
|
||||||
|
Creates a regular status
|
||||||
|
"""
|
||||||
|
def create(%{assigns: %{user: user}} = conn, %{"status" => _} = params) do
|
||||||
|
params = Map.put(params, "in_reply_to_status_id", params["in_reply_to_id"])
|
||||||
|
|
||||||
|
with {:ok, activity} <- CommonAPI.post(user, params) do
|
||||||
|
try_render(conn, "show.json",
|
||||||
|
activity: activity,
|
||||||
|
for: user,
|
||||||
|
as: :activity,
|
||||||
|
with_direct_conversation_id: true
|
||||||
|
)
|
||||||
|
else
|
||||||
|
{:error, message} ->
|
||||||
|
conn
|
||||||
|
|> put_status(:unprocessable_entity)
|
||||||
|
|> json(%{error: message})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc "GET /api/v1/statuses/:id"
|
||||||
|
def show(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
||||||
|
with %Activity{} = activity <- Activity.get_by_id_with_object(id),
|
||||||
|
true <- Visibility.visible_for_user?(activity, user) do
|
||||||
|
try_render(conn, "show.json", activity: activity, for: user)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc "DELETE /api/v1/statuses/:id"
|
||||||
|
def delete(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
||||||
|
with {:ok, %Activity{}} <- CommonAPI.delete(id, user) do
|
||||||
|
json(conn, %{})
|
||||||
|
else
|
||||||
|
_e -> render_error(conn, :forbidden, "Can't delete this post")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc "POST /api/v1/statuses/:id/reblog"
|
||||||
|
def reblog(%{assigns: %{user: user}} = conn, %{"id" => ap_id_or_id}) do
|
||||||
|
with {:ok, announce, _activity} <- CommonAPI.repeat(ap_id_or_id, user),
|
||||||
|
%Activity{} = announce <- Activity.normalize(announce.data) do
|
||||||
|
try_render(conn, "show.json", %{activity: announce, for: user, as: :activity})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc "POST /api/v1/statuses/:id/unreblog"
|
||||||
|
def unreblog(%{assigns: %{user: user}} = conn, %{"id" => ap_id_or_id}) do
|
||||||
|
with {:ok, _unannounce, %{data: %{"id" => id}}} <- CommonAPI.unrepeat(ap_id_or_id, user),
|
||||||
|
%Activity{} = activity <- Activity.get_create_by_object_ap_id_with_object(id) do
|
||||||
|
try_render(conn, "show.json", %{activity: activity, for: user, as: :activity})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc "POST /api/v1/statuses/:id/favourite"
|
||||||
|
def favourite(%{assigns: %{user: user}} = conn, %{"id" => ap_id_or_id}) do
|
||||||
|
with {:ok, _fav, %{data: %{"id" => id}}} <- CommonAPI.favorite(ap_id_or_id, user),
|
||||||
|
%Activity{} = activity <- Activity.get_create_by_object_ap_id(id) do
|
||||||
|
try_render(conn, "show.json", activity: activity, for: user, as: :activity)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc "POST /api/v1/statuses/:id/unfavourite"
|
||||||
|
def unfavourite(%{assigns: %{user: user}} = conn, %{"id" => ap_id_or_id}) do
|
||||||
|
with {:ok, _, _, %{data: %{"id" => id}}} <- CommonAPI.unfavorite(ap_id_or_id, user),
|
||||||
|
%Activity{} = activity <- Activity.get_create_by_object_ap_id(id) do
|
||||||
|
try_render(conn, "show.json", activity: activity, for: user, as: :activity)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc "POST /api/v1/statuses/:id/pin"
|
||||||
|
def pin(%{assigns: %{user: user}} = conn, %{"id" => ap_id_or_id}) do
|
||||||
|
with {:ok, activity} <- CommonAPI.pin(ap_id_or_id, user) do
|
||||||
|
try_render(conn, "show.json", activity: activity, for: user, as: :activity)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc "POST /api/v1/statuses/:id/unpin"
|
||||||
|
def unpin(%{assigns: %{user: user}} = conn, %{"id" => ap_id_or_id}) do
|
||||||
|
with {:ok, activity} <- CommonAPI.unpin(ap_id_or_id, user) do
|
||||||
|
try_render(conn, "show.json", activity: activity, for: user, as: :activity)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc "POST /api/v1/statuses/:id/bookmark"
|
||||||
|
def bookmark(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
||||||
|
with %Activity{} = activity <- Activity.get_by_id_with_object(id),
|
||||||
|
%User{} = user <- User.get_cached_by_nickname(user.nickname),
|
||||||
|
true <- Visibility.visible_for_user?(activity, user),
|
||||||
|
{:ok, _bookmark} <- Bookmark.create(user.id, activity.id) do
|
||||||
|
try_render(conn, "show.json", activity: activity, for: user, as: :activity)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc "POST /api/v1/statuses/:id/unbookmark"
|
||||||
|
def unbookmark(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
||||||
|
with %Activity{} = activity <- Activity.get_by_id_with_object(id),
|
||||||
|
%User{} = user <- User.get_cached_by_nickname(user.nickname),
|
||||||
|
true <- Visibility.visible_for_user?(activity, user),
|
||||||
|
{:ok, _bookmark} <- Bookmark.destroy(user.id, activity.id) do
|
||||||
|
try_render(conn, "show.json", activity: activity, for: user, as: :activity)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc "POST /api/v1/statuses/:id/mute"
|
||||||
|
def mute_conversation(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
||||||
|
with %Activity{} = activity <- Activity.get_by_id(id),
|
||||||
|
{:ok, activity} <- CommonAPI.add_mute(user, activity) do
|
||||||
|
try_render(conn, "show.json", activity: activity, for: user, as: :activity)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc "POST /api/v1/statuses/:id/unmute"
|
||||||
|
def unmute_conversation(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
||||||
|
with %Activity{} = activity <- Activity.get_by_id(id),
|
||||||
|
{:ok, activity} <- CommonAPI.remove_mute(user, activity) do
|
||||||
|
try_render(conn, "show.json", activity: activity, for: user, as: :activity)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc "GET /api/v1/statuses/:id/card"
|
||||||
|
def card(%{assigns: %{user: user}} = conn, %{"id" => status_id}) do
|
||||||
|
with %Activity{} = activity <- Activity.get_by_id(status_id),
|
||||||
|
true <- Visibility.visible_for_user?(activity, user) do
|
||||||
|
data = Pleroma.Web.RichMedia.Helpers.fetch_data_for_activity(activity)
|
||||||
|
render(conn, "card.json", data)
|
||||||
|
else
|
||||||
|
_ -> render_error(conn, :not_found, "Record not found")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc "GET /api/v1/statuses/:id/favourited_by"
|
||||||
|
def favourited_by(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
||||||
|
with %Activity{} = activity <- Activity.get_by_id_with_object(id),
|
||||||
|
{:visible, true} <- {:visible, Visibility.visible_for_user?(activity, user)},
|
||||||
|
%Object{data: %{"likes" => likes}} <- Object.normalize(activity) do
|
||||||
|
users =
|
||||||
|
User
|
||||||
|
|> Ecto.Query.where([u], u.ap_id in ^likes)
|
||||||
|
|> Repo.all()
|
||||||
|
|> Enum.filter(&(not User.blocks?(user, &1)))
|
||||||
|
|
||||||
|
conn
|
||||||
|
|> put_view(AccountView)
|
||||||
|
|> render("accounts.json", for: user, users: users, as: :user)
|
||||||
|
else
|
||||||
|
{:visible, false} -> {:error, :not_found}
|
||||||
|
_ -> json(conn, [])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc "GET /api/v1/statuses/:id/reblogged_by"
|
||||||
|
def reblogged_by(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
||||||
|
with %Activity{} = activity <- Activity.get_by_id_with_object(id),
|
||||||
|
{:visible, true} <- {:visible, Visibility.visible_for_user?(activity, user)},
|
||||||
|
%Object{data: %{"announcements" => announces}} <- Object.normalize(activity) do
|
||||||
|
users =
|
||||||
|
User
|
||||||
|
|> Ecto.Query.where([u], u.ap_id in ^announces)
|
||||||
|
|> Repo.all()
|
||||||
|
|> Enum.filter(&(not User.blocks?(user, &1)))
|
||||||
|
|
||||||
|
conn
|
||||||
|
|> put_view(AccountView)
|
||||||
|
|> render("accounts.json", for: user, users: users, as: :user)
|
||||||
|
else
|
||||||
|
{:visible, false} -> {:error, :not_found}
|
||||||
|
_ -> json(conn, [])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc "GET /api/v1/statuses/:id/context"
|
||||||
|
def context(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
||||||
|
with %Activity{} = activity <- Activity.get_by_id(id) do
|
||||||
|
activities =
|
||||||
|
ActivityPub.fetch_activities_for_context(activity.data["context"], %{
|
||||||
|
"blocking_user" => user,
|
||||||
|
"user" => user,
|
||||||
|
"exclude_id" => activity.id
|
||||||
|
})
|
||||||
|
|
||||||
|
render(conn, "context.json", activity: activity, activities: activities, user: user)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -24,7 +24,7 @@ def render("participation.json", %{participation: participation, for: user}) do
|
||||||
|
|
||||||
activity = Activity.get_by_id_with_object(last_activity_id)
|
activity = Activity.get_by_id_with_object(last_activity_id)
|
||||||
|
|
||||||
last_status = StatusView.render("status.json", %{activity: activity, for: user})
|
last_status = StatusView.render("show.json", %{activity: activity, for: user})
|
||||||
|
|
||||||
# Conversations return all users except the current user.
|
# Conversations return all users except the current user.
|
||||||
users =
|
users =
|
||||||
|
|
|
@ -39,19 +39,19 @@ def render("show.json", %{
|
||||||
"mention" ->
|
"mention" ->
|
||||||
response
|
response
|
||||||
|> Map.merge(%{
|
|> Map.merge(%{
|
||||||
status: StatusView.render("status.json", %{activity: activity, for: user})
|
status: StatusView.render("show.json", %{activity: activity, for: user})
|
||||||
})
|
})
|
||||||
|
|
||||||
"favourite" ->
|
"favourite" ->
|
||||||
response
|
response
|
||||||
|> Map.merge(%{
|
|> Map.merge(%{
|
||||||
status: StatusView.render("status.json", %{activity: parent_activity, for: user})
|
status: StatusView.render("show.json", %{activity: parent_activity, for: user})
|
||||||
})
|
})
|
||||||
|
|
||||||
"reblog" ->
|
"reblog" ->
|
||||||
response
|
response
|
||||||
|> Map.merge(%{
|
|> Map.merge(%{
|
||||||
status: StatusView.render("status.json", %{activity: parent_activity, for: user})
|
status: StatusView.render("show.json", %{activity: parent_activity, for: user})
|
||||||
})
|
})
|
||||||
|
|
||||||
"follow" ->
|
"follow" ->
|
||||||
|
|
|
@ -73,17 +73,13 @@ defp reblogged?(activity, user) do
|
||||||
|
|
||||||
def render("index.json", opts) do
|
def render("index.json", opts) do
|
||||||
replied_to_activities = get_replied_to_activities(opts.activities)
|
replied_to_activities = get_replied_to_activities(opts.activities)
|
||||||
|
opts = Map.put(opts, :replied_to_activities, replied_to_activities)
|
||||||
|
|
||||||
opts.activities
|
safe_render_many(opts.activities, StatusView, "show.json", opts)
|
||||||
|> safe_render_many(
|
|
||||||
StatusView,
|
|
||||||
"status.json",
|
|
||||||
Map.put(opts, :replied_to_activities, replied_to_activities)
|
|
||||||
)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def render(
|
def render(
|
||||||
"status.json",
|
"show.json",
|
||||||
%{activity: %{data: %{"type" => "Announce", "object" => _object}} = activity} = opts
|
%{activity: %{data: %{"type" => "Announce", "object" => _object}} = activity} = opts
|
||||||
) do
|
) do
|
||||||
user = get_user(activity.data["actor"])
|
user = get_user(activity.data["actor"])
|
||||||
|
@ -96,7 +92,7 @@ def render(
|
||||||
|> Activity.with_set_thread_muted_field(opts[:for])
|
|> Activity.with_set_thread_muted_field(opts[:for])
|
||||||
|> Repo.one()
|
|> Repo.one()
|
||||||
|
|
||||||
reblogged = render("status.json", Map.put(opts, :activity, reblogged_activity))
|
reblogged = render("show.json", Map.put(opts, :activity, reblogged_activity))
|
||||||
|
|
||||||
favorited = opts[:for] && opts[:for].ap_id in (activity_object.data["likes"] || [])
|
favorited = opts[:for] && opts[:for].ap_id in (activity_object.data["likes"] || [])
|
||||||
|
|
||||||
|
@ -144,7 +140,7 @@ def render(
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
def render("status.json", %{activity: %{data: %{"object" => _object}} = activity} = opts) do
|
def render("show.json", %{activity: %{data: %{"object" => _object}} = activity} = opts) do
|
||||||
object = Object.normalize(activity)
|
object = Object.normalize(activity)
|
||||||
|
|
||||||
user = get_user(activity.data["actor"])
|
user = get_user(activity.data["actor"])
|
||||||
|
@ -303,7 +299,7 @@ def render("status.json", %{activity: %{data: %{"object" => _object}} = activity
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
def render("status.json", _) do
|
def render("show.json", _) do
|
||||||
nil
|
nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -443,6 +439,20 @@ def render("poll.json", %{object: object} = opts) do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def render("context.json", %{activity: activity, activities: activities, user: user}) do
|
||||||
|
%{ancestors: ancestors, descendants: descendants} =
|
||||||
|
activities
|
||||||
|
|> Enum.reverse()
|
||||||
|
|> Enum.group_by(fn %{id: id} -> if id < activity.id, do: :ancestors, else: :descendants end)
|
||||||
|
|> Map.put_new(:ancestors, [])
|
||||||
|
|> Map.put_new(:descendants, [])
|
||||||
|
|
||||||
|
%{
|
||||||
|
ancestors: render("index.json", for: user, activities: ancestors, as: :activity),
|
||||||
|
descendants: render("index.json", for: user, activities: descendants, as: :activity)
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
def get_reply_to(activity, %{replied_to_activities: replied_to_activities}) do
|
def get_reply_to(activity, %{replied_to_activities: replied_to_activities}) do
|
||||||
object = Object.normalize(activity)
|
object = Object.normalize(activity)
|
||||||
|
|
||||||
|
|
|
@ -363,19 +363,19 @@ defmodule Pleroma.Web.Router do
|
||||||
|
|
||||||
patch("/accounts/update_credentials", MastodonAPIController, :update_credentials)
|
patch("/accounts/update_credentials", MastodonAPIController, :update_credentials)
|
||||||
|
|
||||||
post("/statuses", MastodonAPIController, :post_status)
|
post("/statuses", StatusController, :create)
|
||||||
delete("/statuses/:id", MastodonAPIController, :delete_status)
|
delete("/statuses/:id", StatusController, :delete)
|
||||||
|
|
||||||
post("/statuses/:id/reblog", MastodonAPIController, :reblog_status)
|
post("/statuses/:id/reblog", StatusController, :reblog)
|
||||||
post("/statuses/:id/unreblog", MastodonAPIController, :unreblog_status)
|
post("/statuses/:id/unreblog", StatusController, :unreblog)
|
||||||
post("/statuses/:id/favourite", MastodonAPIController, :fav_status)
|
post("/statuses/:id/favourite", StatusController, :favourite)
|
||||||
post("/statuses/:id/unfavourite", MastodonAPIController, :unfav_status)
|
post("/statuses/:id/unfavourite", StatusController, :unfavourite)
|
||||||
post("/statuses/:id/pin", MastodonAPIController, :pin_status)
|
post("/statuses/:id/pin", StatusController, :pin)
|
||||||
post("/statuses/:id/unpin", MastodonAPIController, :unpin_status)
|
post("/statuses/:id/unpin", StatusController, :unpin)
|
||||||
post("/statuses/:id/bookmark", MastodonAPIController, :bookmark_status)
|
post("/statuses/:id/bookmark", StatusController, :bookmark)
|
||||||
post("/statuses/:id/unbookmark", MastodonAPIController, :unbookmark_status)
|
post("/statuses/:id/unbookmark", StatusController, :unbookmark)
|
||||||
post("/statuses/:id/mute", MastodonAPIController, :mute_conversation)
|
post("/statuses/:id/mute", StatusController, :mute_conversation)
|
||||||
post("/statuses/:id/unmute", MastodonAPIController, :unmute_conversation)
|
post("/statuses/:id/unmute", StatusController, :unmute_conversation)
|
||||||
|
|
||||||
put("/scheduled_statuses/:id", MastodonAPIController, :update_scheduled_status)
|
put("/scheduled_statuses/:id", MastodonAPIController, :update_scheduled_status)
|
||||||
delete("/scheduled_statuses/:id", MastodonAPIController, :delete_scheduled_status)
|
delete("/scheduled_statuses/:id", MastodonAPIController, :delete_scheduled_status)
|
||||||
|
@ -456,10 +456,10 @@ defmodule Pleroma.Web.Router do
|
||||||
get("/apps/verify_credentials", MastodonAPIController, :verify_app_credentials)
|
get("/apps/verify_credentials", MastodonAPIController, :verify_app_credentials)
|
||||||
get("/custom_emojis", MastodonAPIController, :custom_emojis)
|
get("/custom_emojis", MastodonAPIController, :custom_emojis)
|
||||||
|
|
||||||
get("/statuses/:id/card", MastodonAPIController, :status_card)
|
get("/statuses/:id/card", StatusController, :card)
|
||||||
|
|
||||||
get("/statuses/:id/favourited_by", MastodonAPIController, :favourited_by)
|
get("/statuses/:id/favourited_by", StatusController, :favourited_by)
|
||||||
get("/statuses/:id/reblogged_by", MastodonAPIController, :reblogged_by)
|
get("/statuses/:id/reblogged_by", StatusController, :reblogged_by)
|
||||||
|
|
||||||
get("/trends", MastodonAPIController, :empty_array)
|
get("/trends", MastodonAPIController, :empty_array)
|
||||||
|
|
||||||
|
@ -478,9 +478,9 @@ defmodule Pleroma.Web.Router do
|
||||||
get("/timelines/tag/:tag", TimelineController, :hashtag)
|
get("/timelines/tag/:tag", TimelineController, :hashtag)
|
||||||
get("/timelines/list/:list_id", TimelineController, :list)
|
get("/timelines/list/:list_id", TimelineController, :list)
|
||||||
|
|
||||||
get("/statuses", MastodonAPIController, :get_statuses)
|
get("/statuses", StatusController, :index)
|
||||||
get("/statuses/:id", MastodonAPIController, :get_status)
|
get("/statuses/:id", StatusController, :show)
|
||||||
get("/statuses/:id/context", MastodonAPIController, :get_context)
|
get("/statuses/:id/context", StatusController, :context)
|
||||||
|
|
||||||
get("/polls/:id", MastodonAPIController, :get_poll)
|
get("/polls/:id", MastodonAPIController, :get_poll)
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@ def render("update.json", %Activity{} = activity, %User{} = user) do
|
||||||
event: "update",
|
event: "update",
|
||||||
payload:
|
payload:
|
||||||
Pleroma.Web.MastodonAPI.StatusView.render(
|
Pleroma.Web.MastodonAPI.StatusView.render(
|
||||||
"status.json",
|
"show.json",
|
||||||
activity: activity,
|
activity: activity,
|
||||||
for: user
|
for: user
|
||||||
)
|
)
|
||||||
|
@ -43,7 +43,7 @@ def render("update.json", %Activity{} = activity) do
|
||||||
event: "update",
|
event: "update",
|
||||||
payload:
|
payload:
|
||||||
Pleroma.Web.MastodonAPI.StatusView.render(
|
Pleroma.Web.MastodonAPI.StatusView.render(
|
||||||
"status.json",
|
"show.json",
|
||||||
activity: activity
|
activity: activity
|
||||||
)
|
)
|
||||||
|> Jason.encode!()
|
|> Jason.encode!()
|
||||||
|
|
|
@ -68,7 +68,7 @@ test "receives well formatted events" do
|
||||||
assert {:ok, json} = Jason.decode(json["payload"])
|
assert {:ok, json} = Jason.decode(json["payload"])
|
||||||
|
|
||||||
view_json =
|
view_json =
|
||||||
Pleroma.Web.MastodonAPI.StatusView.render("status.json", activity: activity, for: nil)
|
Pleroma.Web.MastodonAPI.StatusView.render("show.json", activity: activity, for: nil)
|
||||||
|> Jason.encode!()
|
|> Jason.encode!()
|
||||||
|> Jason.decode!()
|
|> Jason.decode!()
|
||||||
|
|
||||||
|
|
|
@ -61,7 +61,7 @@ test "includes reported statuses" do
|
||||||
AccountView.render("account.json", %{user: other_user}),
|
AccountView.render("account.json", %{user: other_user}),
|
||||||
Pleroma.Web.AdminAPI.AccountView.render("show.json", %{user: other_user})
|
Pleroma.Web.AdminAPI.AccountView.render("show.json", %{user: other_user})
|
||||||
),
|
),
|
||||||
statuses: [StatusView.render("status.json", %{activity: activity})],
|
statuses: [StatusView.render("show.json", %{activity: activity})],
|
||||||
state: "open",
|
state: "open",
|
||||||
id: report_activity.id
|
id: report_activity.id
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -28,7 +28,7 @@ test "Mention notification" do
|
||||||
pleroma: %{is_seen: false},
|
pleroma: %{is_seen: false},
|
||||||
type: "mention",
|
type: "mention",
|
||||||
account: AccountView.render("account.json", %{user: user, for: mentioned_user}),
|
account: AccountView.render("account.json", %{user: user, for: mentioned_user}),
|
||||||
status: StatusView.render("status.json", %{activity: activity, for: mentioned_user}),
|
status: StatusView.render("show.json", %{activity: activity, for: mentioned_user}),
|
||||||
created_at: Utils.to_masto_date(notification.inserted_at)
|
created_at: Utils.to_masto_date(notification.inserted_at)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,7 +51,7 @@ test "Favourite notification" do
|
||||||
pleroma: %{is_seen: false},
|
pleroma: %{is_seen: false},
|
||||||
type: "favourite",
|
type: "favourite",
|
||||||
account: AccountView.render("account.json", %{user: another_user, for: user}),
|
account: AccountView.render("account.json", %{user: another_user, for: user}),
|
||||||
status: StatusView.render("status.json", %{activity: create_activity, for: user}),
|
status: StatusView.render("show.json", %{activity: create_activity, for: user}),
|
||||||
created_at: Utils.to_masto_date(notification.inserted_at)
|
created_at: Utils.to_masto_date(notification.inserted_at)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -73,7 +73,7 @@ test "Reblog notification" do
|
||||||
pleroma: %{is_seen: false},
|
pleroma: %{is_seen: false},
|
||||||
type: "reblog",
|
type: "reblog",
|
||||||
account: AccountView.render("account.json", %{user: another_user, for: user}),
|
account: AccountView.render("account.json", %{user: another_user, for: user}),
|
||||||
status: StatusView.render("status.json", %{activity: reblog_activity, for: user}),
|
status: StatusView.render("show.json", %{activity: reblog_activity, for: user}),
|
||||||
created_at: Utils.to_masto_date(notification.inserted_at)
|
created_at: Utils.to_masto_date(notification.inserted_at)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,7 @@ test "returns the direct conversation id when given the `with_conversation_id` o
|
||||||
{:ok, activity} = CommonAPI.post(user, %{"status" => "Hey @shp!", "visibility" => "direct"})
|
{:ok, activity} = CommonAPI.post(user, %{"status" => "Hey @shp!", "visibility" => "direct"})
|
||||||
|
|
||||||
status =
|
status =
|
||||||
StatusView.render("status.json",
|
StatusView.render("show.json",
|
||||||
activity: activity,
|
activity: activity,
|
||||||
with_direct_conversation_id: true,
|
with_direct_conversation_id: true,
|
||||||
for: user
|
for: user
|
||||||
|
@ -46,7 +46,7 @@ test "returns a temporary ap_id based user for activities missing db users" do
|
||||||
Repo.delete(user)
|
Repo.delete(user)
|
||||||
Cachex.clear(:user_cache)
|
Cachex.clear(:user_cache)
|
||||||
|
|
||||||
%{account: ms_user} = StatusView.render("status.json", activity: activity)
|
%{account: ms_user} = StatusView.render("show.json", activity: activity)
|
||||||
|
|
||||||
assert ms_user.acct == "erroruser@example.com"
|
assert ms_user.acct == "erroruser@example.com"
|
||||||
end
|
end
|
||||||
|
@ -63,7 +63,7 @@ test "tries to get a user by nickname if fetching by ap_id doesn't work" do
|
||||||
|
|
||||||
Cachex.clear(:user_cache)
|
Cachex.clear(:user_cache)
|
||||||
|
|
||||||
result = StatusView.render("status.json", activity: activity)
|
result = StatusView.render("show.json", activity: activity)
|
||||||
|
|
||||||
assert result[:account][:id] == to_string(user.id)
|
assert result[:account][:id] == to_string(user.id)
|
||||||
end
|
end
|
||||||
|
@ -81,7 +81,7 @@ test "a note with null content" do
|
||||||
|
|
||||||
User.get_cached_by_ap_id(note.data["actor"])
|
User.get_cached_by_ap_id(note.data["actor"])
|
||||||
|
|
||||||
status = StatusView.render("status.json", %{activity: note})
|
status = StatusView.render("show.json", %{activity: note})
|
||||||
|
|
||||||
assert status.content == ""
|
assert status.content == ""
|
||||||
end
|
end
|
||||||
|
@ -93,7 +93,7 @@ test "a note activity" do
|
||||||
|
|
||||||
convo_id = Utils.context_to_conversation_id(object_data["context"])
|
convo_id = Utils.context_to_conversation_id(object_data["context"])
|
||||||
|
|
||||||
status = StatusView.render("status.json", %{activity: note})
|
status = StatusView.render("show.json", %{activity: note})
|
||||||
|
|
||||||
created_at =
|
created_at =
|
||||||
(object_data["published"] || "")
|
(object_data["published"] || "")
|
||||||
|
@ -165,11 +165,11 @@ test "tells if the message is muted for some reason" do
|
||||||
{:ok, user} = User.mute(user, other_user)
|
{:ok, user} = User.mute(user, other_user)
|
||||||
|
|
||||||
{:ok, activity} = CommonAPI.post(other_user, %{"status" => "test"})
|
{:ok, activity} = CommonAPI.post(other_user, %{"status" => "test"})
|
||||||
status = StatusView.render("status.json", %{activity: activity})
|
status = StatusView.render("show.json", %{activity: activity})
|
||||||
|
|
||||||
assert status.muted == false
|
assert status.muted == false
|
||||||
|
|
||||||
status = StatusView.render("status.json", %{activity: activity, for: user})
|
status = StatusView.render("show.json", %{activity: activity, for: user})
|
||||||
|
|
||||||
assert status.muted == true
|
assert status.muted == true
|
||||||
end
|
end
|
||||||
|
@ -181,13 +181,13 @@ test "tells if the message is thread muted" do
|
||||||
{:ok, user} = User.mute(user, other_user)
|
{:ok, user} = User.mute(user, other_user)
|
||||||
|
|
||||||
{:ok, activity} = CommonAPI.post(other_user, %{"status" => "test"})
|
{:ok, activity} = CommonAPI.post(other_user, %{"status" => "test"})
|
||||||
status = StatusView.render("status.json", %{activity: activity, for: user})
|
status = StatusView.render("show.json", %{activity: activity, for: user})
|
||||||
|
|
||||||
assert status.pleroma.thread_muted == false
|
assert status.pleroma.thread_muted == false
|
||||||
|
|
||||||
{:ok, activity} = CommonAPI.add_mute(user, activity)
|
{:ok, activity} = CommonAPI.add_mute(user, activity)
|
||||||
|
|
||||||
status = StatusView.render("status.json", %{activity: activity, for: user})
|
status = StatusView.render("show.json", %{activity: activity, for: user})
|
||||||
|
|
||||||
assert status.pleroma.thread_muted == true
|
assert status.pleroma.thread_muted == true
|
||||||
end
|
end
|
||||||
|
@ -196,11 +196,11 @@ test "tells if the status is bookmarked" do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
|
|
||||||
{:ok, activity} = CommonAPI.post(user, %{"status" => "Cute girls doing cute things"})
|
{:ok, activity} = CommonAPI.post(user, %{"status" => "Cute girls doing cute things"})
|
||||||
status = StatusView.render("status.json", %{activity: activity})
|
status = StatusView.render("show.json", %{activity: activity})
|
||||||
|
|
||||||
assert status.bookmarked == false
|
assert status.bookmarked == false
|
||||||
|
|
||||||
status = StatusView.render("status.json", %{activity: activity, for: user})
|
status = StatusView.render("show.json", %{activity: activity, for: user})
|
||||||
|
|
||||||
assert status.bookmarked == false
|
assert status.bookmarked == false
|
||||||
|
|
||||||
|
@ -208,7 +208,7 @@ test "tells if the status is bookmarked" do
|
||||||
|
|
||||||
activity = Activity.get_by_id_with_object(activity.id)
|
activity = Activity.get_by_id_with_object(activity.id)
|
||||||
|
|
||||||
status = StatusView.render("status.json", %{activity: activity, for: user})
|
status = StatusView.render("show.json", %{activity: activity, for: user})
|
||||||
|
|
||||||
assert status.bookmarked == true
|
assert status.bookmarked == true
|
||||||
end
|
end
|
||||||
|
@ -220,7 +220,7 @@ test "a reply" do
|
||||||
{:ok, activity} =
|
{:ok, activity} =
|
||||||
CommonAPI.post(user, %{"status" => "he", "in_reply_to_status_id" => note.id})
|
CommonAPI.post(user, %{"status" => "he", "in_reply_to_status_id" => note.id})
|
||||||
|
|
||||||
status = StatusView.render("status.json", %{activity: activity})
|
status = StatusView.render("show.json", %{activity: activity})
|
||||||
|
|
||||||
assert status.in_reply_to_id == to_string(note.id)
|
assert status.in_reply_to_id == to_string(note.id)
|
||||||
|
|
||||||
|
@ -237,7 +237,7 @@ test "contains mentions" do
|
||||||
|
|
||||||
{:ok, [activity]} = OStatus.handle_incoming(incoming)
|
{:ok, [activity]} = OStatus.handle_incoming(incoming)
|
||||||
|
|
||||||
status = StatusView.render("status.json", %{activity: activity})
|
status = StatusView.render("show.json", %{activity: activity})
|
||||||
|
|
||||||
assert status.mentions ==
|
assert status.mentions ==
|
||||||
Enum.map([user], fn u -> AccountView.render("mention.json", %{user: u}) end)
|
Enum.map([user], fn u -> AccountView.render("mention.json", %{user: u}) end)
|
||||||
|
@ -263,7 +263,7 @@ test "create mentions from the 'to' field" do
|
||||||
|
|
||||||
assert length(activity.recipients) == 3
|
assert length(activity.recipients) == 3
|
||||||
|
|
||||||
%{mentions: [mention] = mentions} = StatusView.render("status.json", %{activity: activity})
|
%{mentions: [mention] = mentions} = StatusView.render("show.json", %{activity: activity})
|
||||||
|
|
||||||
assert length(mentions) == 1
|
assert length(mentions) == 1
|
||||||
assert mention.url == recipient_ap_id
|
assert mention.url == recipient_ap_id
|
||||||
|
@ -300,7 +300,7 @@ test "create mentions from the 'tag' field" do
|
||||||
|
|
||||||
assert length(activity.recipients) == 3
|
assert length(activity.recipients) == 3
|
||||||
|
|
||||||
%{mentions: [mention] = mentions} = StatusView.render("status.json", %{activity: activity})
|
%{mentions: [mention] = mentions} = StatusView.render("show.json", %{activity: activity})
|
||||||
|
|
||||||
assert length(mentions) == 1
|
assert length(mentions) == 1
|
||||||
assert mention.url == recipient.ap_id
|
assert mention.url == recipient.ap_id
|
||||||
|
@ -340,7 +340,7 @@ test "put the url advertised in the Activity in to the url attribute" do
|
||||||
id = "https://wedistribute.org/wp-json/pterotype/v1/object/85810"
|
id = "https://wedistribute.org/wp-json/pterotype/v1/object/85810"
|
||||||
[activity] = Activity.search(nil, id)
|
[activity] = Activity.search(nil, id)
|
||||||
|
|
||||||
status = StatusView.render("status.json", %{activity: activity})
|
status = StatusView.render("show.json", %{activity: activity})
|
||||||
|
|
||||||
assert status.uri == id
|
assert status.uri == id
|
||||||
assert status.url == "https://wedistribute.org/2019/07/mastodon-drops-ostatus/"
|
assert status.url == "https://wedistribute.org/2019/07/mastodon-drops-ostatus/"
|
||||||
|
@ -352,7 +352,7 @@ test "a reblog" do
|
||||||
|
|
||||||
{:ok, reblog, _} = CommonAPI.repeat(activity.id, user)
|
{:ok, reblog, _} = CommonAPI.repeat(activity.id, user)
|
||||||
|
|
||||||
represented = StatusView.render("status.json", %{for: user, activity: reblog})
|
represented = StatusView.render("show.json", %{for: user, activity: reblog})
|
||||||
|
|
||||||
assert represented[:id] == to_string(reblog.id)
|
assert represented[:id] == to_string(reblog.id)
|
||||||
assert represented[:reblog][:id] == to_string(activity.id)
|
assert represented[:reblog][:id] == to_string(activity.id)
|
||||||
|
@ -369,7 +369,7 @@ test "a peertube video" do
|
||||||
|
|
||||||
%Activity{} = activity = Activity.get_create_by_object_ap_id(object.data["id"])
|
%Activity{} = activity = Activity.get_create_by_object_ap_id(object.data["id"])
|
||||||
|
|
||||||
represented = StatusView.render("status.json", %{for: user, activity: activity})
|
represented = StatusView.render("show.json", %{for: user, activity: activity})
|
||||||
|
|
||||||
assert represented[:id] == to_string(activity.id)
|
assert represented[:id] == to_string(activity.id)
|
||||||
assert length(represented[:media_attachments]) == 1
|
assert length(represented[:media_attachments]) == 1
|
||||||
|
@ -570,7 +570,7 @@ test "embeds a relationship in the account" do
|
||||||
"status" => "drink more water"
|
"status" => "drink more water"
|
||||||
})
|
})
|
||||||
|
|
||||||
result = StatusView.render("status.json", %{activity: activity, for: other_user})
|
result = StatusView.render("show.json", %{activity: activity, for: other_user})
|
||||||
|
|
||||||
assert result[:account][:pleroma][:relationship] ==
|
assert result[:account][:pleroma][:relationship] ==
|
||||||
AccountView.render("relationship.json", %{user: other_user, target: user})
|
AccountView.render("relationship.json", %{user: other_user, target: user})
|
||||||
|
@ -587,7 +587,7 @@ test "embeds a relationship in the account in reposts" do
|
||||||
|
|
||||||
{:ok, activity, _object} = CommonAPI.repeat(activity.id, other_user)
|
{:ok, activity, _object} = CommonAPI.repeat(activity.id, other_user)
|
||||||
|
|
||||||
result = StatusView.render("status.json", %{activity: activity, for: user})
|
result = StatusView.render("show.json", %{activity: activity, for: user})
|
||||||
|
|
||||||
assert result[:account][:pleroma][:relationship] ==
|
assert result[:account][:pleroma][:relationship] ==
|
||||||
AccountView.render("relationship.json", %{user: user, target: other_user})
|
AccountView.render("relationship.json", %{user: user, target: other_user})
|
||||||
|
@ -604,7 +604,7 @@ test "visibility/list" do
|
||||||
{:ok, activity} =
|
{:ok, activity} =
|
||||||
CommonAPI.post(user, %{"status" => "foobar", "visibility" => "list:#{list.id}"})
|
CommonAPI.post(user, %{"status" => "foobar", "visibility" => "list:#{list.id}"})
|
||||||
|
|
||||||
status = StatusView.render("status.json", activity: activity)
|
status = StatusView.render("show.json", activity: activity)
|
||||||
|
|
||||||
assert status.visibility == "list"
|
assert status.visibility == "list"
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue