Fork of Pleroma with site-specific changes and feature branches https://git.pleroma.social/pleroma/pleroma
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

95 行
3.1KB

  1. # Pleroma: A lightweight social networking server
  2. # Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
  3. # SPDX-License-Identifier: AGPL-3.0-only
  4. defmodule Pleroma.Web.PleromaAPI.ConversationController do
  5. use Pleroma.Web, :controller
  6. import Pleroma.Web.ControllerHelper, only: [add_link_headers: 2]
  7. alias Pleroma.Conversation.Participation
  8. alias Pleroma.Web.ActivityPub.ActivityPub
  9. alias Pleroma.Web.MastodonAPI.StatusView
  10. alias Pleroma.Web.Plugs.OAuthScopesPlug
  11. plug(Pleroma.Web.ApiSpec.CastAndValidate)
  12. plug(:put_view, Pleroma.Web.MastodonAPI.ConversationView)
  13. plug(OAuthScopesPlug, %{scopes: ["read:statuses"]} when action in [:show, :statuses])
  14. plug(
  15. OAuthScopesPlug,
  16. %{scopes: ["write:conversations"]} when action in [:update, :mark_as_read]
  17. )
  18. defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.PleromaConversationOperation
  19. def show(%{assigns: %{user: %{id: user_id} = user}} = conn, %{id: participation_id}) do
  20. with %Participation{user_id: ^user_id} = participation <- Participation.get(participation_id) do
  21. render(conn, "participation.json", participation: participation, for: user)
  22. else
  23. _error ->
  24. conn
  25. |> put_status(:not_found)
  26. |> json(%{"error" => "Unknown conversation id"})
  27. end
  28. end
  29. def statuses(
  30. %{assigns: %{user: %{id: user_id} = user}} = conn,
  31. %{id: participation_id} = params
  32. ) do
  33. with %Participation{user_id: ^user_id} = participation <-
  34. Participation.get(participation_id, preload: [:conversation]) do
  35. params =
  36. params
  37. |> Map.put(:blocking_user, user)
  38. |> Map.put(:muting_user, user)
  39. |> Map.put(:user, user)
  40. activities =
  41. participation.conversation.ap_id
  42. |> ActivityPub.fetch_activities_for_context_query(params)
  43. |> Pleroma.Pagination.fetch_paginated(Map.put(params, :total, false))
  44. |> Enum.reverse()
  45. conn
  46. |> add_link_headers(activities)
  47. |> put_view(StatusView)
  48. |> render("index.json", activities: activities, for: user, as: :activity)
  49. else
  50. _error ->
  51. conn
  52. |> put_status(:not_found)
  53. |> json(%{"error" => "Unknown conversation id"})
  54. end
  55. end
  56. def update(
  57. %{assigns: %{user: %{id: user_id} = user}} = conn,
  58. %{id: participation_id, recipients: recipients}
  59. ) do
  60. with %Participation{user_id: ^user_id} = participation <- Participation.get(participation_id),
  61. {:ok, participation} <- Participation.set_recipients(participation, recipients) do
  62. render(conn, "participation.json", participation: participation, for: user)
  63. else
  64. {:error, message} ->
  65. conn
  66. |> put_status(:bad_request)
  67. |> json(%{"error" => message})
  68. _error ->
  69. conn
  70. |> put_status(:not_found)
  71. |> json(%{"error" => "Unknown conversation id"})
  72. end
  73. end
  74. def mark_as_read(%{assigns: %{user: user}} = conn, _params) do
  75. with {:ok, _, participations} <- Participation.mark_all_as_read(user) do
  76. conn
  77. |> add_link_headers(participations)
  78. |> render("participations.json", participations: participations, for: user)
  79. end
  80. end
  81. end