67 lines
1.9 KiB
Elixir
67 lines
1.9 KiB
Elixir
# Pleroma: A lightweight social networking server
|
|
# Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
|
|
# SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
defmodule Pleroma.Web.PleromaAPI.StatusController do
|
|
use Pleroma.Web, :controller
|
|
|
|
import Pleroma.Web.ControllerHelper, only: [add_link_headers: 2]
|
|
|
|
require Ecto.Query
|
|
require Pleroma.Constants
|
|
|
|
alias Pleroma.Activity
|
|
alias Pleroma.User
|
|
alias Pleroma.Web.ActivityPub.ActivityPub
|
|
alias Pleroma.Web.ActivityPub.Visibility
|
|
alias Pleroma.Web.MastodonAPI.StatusView
|
|
alias Pleroma.Web.Plugs.OAuthScopesPlug
|
|
|
|
plug(Pleroma.Web.ApiSpec.CastAndValidate)
|
|
|
|
action_fallback(Pleroma.Web.MastodonAPI.FallbackController)
|
|
|
|
plug(
|
|
OAuthScopesPlug,
|
|
%{scopes: ["read:statuses"], fallback: :proceed_unauthenticated} when action == :quotes
|
|
)
|
|
|
|
defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.PleromaStatusOperation
|
|
|
|
@doc "GET /api/v1/pleroma/statuses/:id/quotes"
|
|
def quotes(%{assigns: %{user: user}} = conn, %{id: id} = params) do
|
|
with %Activity{object: object} = activity <- Activity.get_by_id_with_object(id),
|
|
true <- Visibility.visible_for_user?(activity, user) do
|
|
params =
|
|
params
|
|
|> Map.put(:type, "Create")
|
|
|> Map.put(:blocking_user, user)
|
|
|> Map.put(:quote_url, object.data["id"])
|
|
|
|
recipients =
|
|
if user do
|
|
[Pleroma.Constants.as_public()] ++ [user.ap_id | User.following(user)]
|
|
else
|
|
[Pleroma.Constants.as_public()]
|
|
end
|
|
|
|
activities =
|
|
recipients
|
|
|> ActivityPub.fetch_activities(params)
|
|
|> Enum.reverse()
|
|
|
|
conn
|
|
|> add_link_headers(activities)
|
|
|> put_view(StatusView)
|
|
|> render("index.json",
|
|
activities: activities,
|
|
for: user,
|
|
as: :activity
|
|
)
|
|
else
|
|
nil -> {:error, :not_found}
|
|
false -> {:error, :not_found}
|
|
end
|
|
end
|
|
end
|