1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
5 defmodule Pleroma.Web.MastodonAPI.ListController do
6 use Pleroma.Web, :controller
9 alias Pleroma.Web.MastodonAPI.AccountView
10 alias Pleroma.Web.Plugs.OAuthScopesPlug
12 @oauth_read_actions [:index, :show, :list_accounts]
14 plug(Pleroma.Web.ApiSpec.CastAndValidate, replace_params: false)
15 plug(:list_by_id_and_user when action not in [:index, :create])
16 plug(OAuthScopesPlug, %{scopes: ["read:lists"]} when action in @oauth_read_actions)
17 plug(OAuthScopesPlug, %{scopes: ["write:lists"]} when action not in @oauth_read_actions)
19 action_fallback(Pleroma.Web.MastodonAPI.FallbackController)
21 defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.ListOperation
24 def index(%{assigns: %{user: user}, private: %{open_api_spex: %{params: params}}} = conn, _) do
25 lists = Pleroma.List.for_user(user, params)
26 render(conn, "index.json", lists: lists)
31 %{assigns: %{user: user}, private: %{open_api_spex: %{body_params: %{title: title}}}} =
35 with {:ok, %Pleroma.List{} = list} <- Pleroma.List.create(title, user) do
36 render(conn, "show.json", list: list)
40 # GET /api/v1/lists/:idOB
41 def show(%{assigns: %{list: list}} = conn, _) do
42 render(conn, "show.json", list: list)
45 # PUT /api/v1/lists/:id
47 %{assigns: %{list: list}, private: %{open_api_spex: %{body_params: %{title: title}}}} =
51 with {:ok, list} <- Pleroma.List.rename(list, title) do
52 render(conn, "show.json", list: list)
56 # DELETE /api/v1/lists/:id
57 def delete(%{assigns: %{list: list}} = conn, _) do
58 with {:ok, _list} <- Pleroma.List.delete(list) do
63 # GET /api/v1/lists/:id/accounts
64 def list_accounts(%{assigns: %{user: user, list: list}} = conn, _) do
65 with {:ok, users} <- Pleroma.List.get_following(list) do
67 |> put_view(AccountView)
68 |> render("index.json", for: user, users: users, as: :user)
72 # POST /api/v1/lists/:id/accounts
75 assigns: %{list: list},
76 private: %{open_api_spex: %{body_params: %{account_ids: account_ids}}}
80 Enum.each(account_ids, fn account_id ->
81 with %User{} = followed <- User.get_cached_by_id(account_id) do
82 Pleroma.List.follow(list, followed)
89 # DELETE /api/v1/lists/:id/accounts
92 private: %{open_api_spex: %{params: %{account_ids: account_ids}}}
96 do_remove_from_list(conn, account_ids)
100 %{private: %{open_api_spex: %{body_params: %{account_ids: account_ids}}}} = conn,
103 do_remove_from_list(conn, account_ids)
106 defp do_remove_from_list(%{assigns: %{list: list}} = conn, account_ids) do
107 Enum.each(account_ids, fn account_id ->
108 with %User{} = followed <- User.get_cached_by_id(account_id) do
109 Pleroma.List.unfollow(list, followed)
116 defp list_by_id_and_user(
117 %{assigns: %{user: user}, private: %{open_api_spex: %{params: %{id: id}}}} = conn,
120 case Pleroma.List.get(id, user) do
121 %Pleroma.List{} = list -> assign(conn, :list, list)
122 nil -> conn |> render_error(:not_found, "List not found") |> halt()