Merge branch 'list-controller' into 'develop'
Extract list actions from `MastodonAPIController` into `ListController` See merge request pleroma/pleroma!1600
This commit is contained in:
commit
66519f2100
|
@ -109,15 +109,19 @@ def rename(%Pleroma.List{} = list, title) do
|
||||||
end
|
end
|
||||||
|
|
||||||
def create(title, %User{} = creator) do
|
def create(title, %User{} = creator) do
|
||||||
list = %Pleroma.List{user_id: creator.id, title: title}
|
changeset = title_changeset(%Pleroma.List{user_id: creator.id}, %{title: title})
|
||||||
|
|
||||||
Repo.transaction(fn ->
|
if changeset.valid? do
|
||||||
list = Repo.insert!(list)
|
Repo.transaction(fn ->
|
||||||
|
list = Repo.insert!(changeset)
|
||||||
|
|
||||||
list
|
list
|
||||||
|> change(ap_id: "#{creator.ap_id}/lists/#{list.id}")
|
|> change(ap_id: "#{creator.ap_id}/lists/#{list.id}")
|
||||||
|> Repo.update!()
|
|> Repo.update!()
|
||||||
end)
|
end)
|
||||||
|
else
|
||||||
|
{:error, changeset}
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def follow(%Pleroma.List{following: following} = list, %User{} = followed) do
|
def follow(%Pleroma.List{following: following} = list, %User{} = followed) do
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
# 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.FallbackController do
|
||||||
|
use Pleroma.Web, :controller
|
||||||
|
|
||||||
|
def call(conn, {:error, %Ecto.Changeset{} = changeset}) do
|
||||||
|
error_message =
|
||||||
|
changeset
|
||||||
|
|> Ecto.Changeset.traverse_errors(fn {message, _opt} -> message end)
|
||||||
|
|> Enum.map_join(", ", fn {_k, v} -> v end)
|
||||||
|
|
||||||
|
conn
|
||||||
|
|> put_status(:unprocessable_entity)
|
||||||
|
|> json(%{error: error_message})
|
||||||
|
end
|
||||||
|
|
||||||
|
def call(conn, {:error, :not_found}) do
|
||||||
|
render_error(conn, :not_found, "Record not found")
|
||||||
|
end
|
||||||
|
|
||||||
|
def call(conn, {:error, error_message}) do
|
||||||
|
conn
|
||||||
|
|> put_status(:bad_request)
|
||||||
|
|> json(%{error: error_message})
|
||||||
|
end
|
||||||
|
|
||||||
|
def call(conn, _) do
|
||||||
|
conn
|
||||||
|
|> put_status(:internal_server_error)
|
||||||
|
|> json(dgettext("errors", "Something went wrong"))
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,84 @@
|
||||||
|
# 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.ListController do
|
||||||
|
use Pleroma.Web, :controller
|
||||||
|
|
||||||
|
alias Pleroma.User
|
||||||
|
alias Pleroma.Web.MastodonAPI.AccountView
|
||||||
|
|
||||||
|
plug(:list_by_id_and_user when action not in [:index, :create])
|
||||||
|
|
||||||
|
action_fallback(Pleroma.Web.MastodonAPI.FallbackController)
|
||||||
|
|
||||||
|
# GET /api/v1/lists
|
||||||
|
def index(%{assigns: %{user: user}} = conn, opts) do
|
||||||
|
lists = Pleroma.List.for_user(user, opts)
|
||||||
|
render(conn, "index.json", lists: lists)
|
||||||
|
end
|
||||||
|
|
||||||
|
# POST /api/v1/lists
|
||||||
|
def create(%{assigns: %{user: user}} = conn, %{"title" => title}) do
|
||||||
|
with {:ok, %Pleroma.List{} = list} <- Pleroma.List.create(title, user) do
|
||||||
|
render(conn, "show.json", list: list)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# GET /api/v1/lists/:id
|
||||||
|
def show(%{assigns: %{list: list}} = conn, _) do
|
||||||
|
render(conn, "show.json", list: list)
|
||||||
|
end
|
||||||
|
|
||||||
|
# PUT /api/v1/lists/:id
|
||||||
|
def update(%{assigns: %{list: list}} = conn, %{"title" => title}) do
|
||||||
|
with {:ok, list} <- Pleroma.List.rename(list, title) do
|
||||||
|
render(conn, "show.json", list: list)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# DELETE /api/v1/lists/:id
|
||||||
|
def delete(%{assigns: %{list: list}} = conn, _) do
|
||||||
|
with {:ok, _list} <- Pleroma.List.delete(list) do
|
||||||
|
json(conn, %{})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# GET /api/v1/lists/:id/accounts
|
||||||
|
def list_accounts(%{assigns: %{user: user, list: list}} = conn, _) do
|
||||||
|
with {:ok, users} <- Pleroma.List.get_following(list) do
|
||||||
|
conn
|
||||||
|
|> put_view(AccountView)
|
||||||
|
|> render("accounts.json", for: user, users: users, as: :user)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# POST /api/v1/lists/:id/accounts
|
||||||
|
def add_to_list(%{assigns: %{list: list}} = conn, %{"account_ids" => account_ids}) do
|
||||||
|
Enum.each(account_ids, fn account_id ->
|
||||||
|
with %User{} = followed <- User.get_cached_by_id(account_id) do
|
||||||
|
Pleroma.List.follow(list, followed)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
json(conn, %{})
|
||||||
|
end
|
||||||
|
|
||||||
|
# DELETE /api/v1/lists/:id/accounts
|
||||||
|
def remove_from_list(%{assigns: %{list: list}} = conn, %{"account_ids" => account_ids}) do
|
||||||
|
Enum.each(account_ids, fn account_id ->
|
||||||
|
with %User{} = followed <- User.get_cached_by_id(account_id) do
|
||||||
|
Pleroma.List.unfollow(list, followed)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
json(conn, %{})
|
||||||
|
end
|
||||||
|
|
||||||
|
defp list_by_id_and_user(%{assigns: %{user: user}, params: %{"id" => id}} = conn, _) do
|
||||||
|
case Pleroma.List.get(id, user) do
|
||||||
|
%Pleroma.List{} = list -> assign(conn, :list, list)
|
||||||
|
nil -> conn |> render_error(:not_found, "List not found") |> halt()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -83,7 +83,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
|
||||||
|
|
||||||
@local_mastodon_name "Mastodon-Local"
|
@local_mastodon_name "Mastodon-Local"
|
||||||
|
|
||||||
action_fallback(:errors)
|
action_fallback(Pleroma.Web.MastodonAPI.FallbackController)
|
||||||
|
|
||||||
def create_app(conn, params) do
|
def create_app(conn, params) do
|
||||||
scopes = Scopes.fetch_scopes(params, ["read"])
|
scopes = Scopes.fetch_scopes(params, ["read"])
|
||||||
|
@ -189,7 +189,7 @@ def update_credentials(%{assigns: %{user: user}} = conn, params) do
|
||||||
info_cng = User.Info.profile_update(user.info, info_params)
|
info_cng = User.Info.profile_update(user.info, info_params)
|
||||||
|
|
||||||
with changeset <- User.update_changeset(user, user_params),
|
with changeset <- User.update_changeset(user, user_params),
|
||||||
changeset <- Ecto.Changeset.put_embed(changeset, :info, info_cng),
|
changeset <- Changeset.put_embed(changeset, :info, info_cng),
|
||||||
{:ok, user} <- User.update_and_set_cache(changeset) do
|
{:ok, user} <- User.update_and_set_cache(changeset) do
|
||||||
if original_user != user do
|
if original_user != user do
|
||||||
CommonAPI.update(user)
|
CommonAPI.update(user)
|
||||||
|
@ -225,7 +225,7 @@ def update_avatar(%{assigns: %{user: user}} = conn, params) do
|
||||||
def update_banner(%{assigns: %{user: user}} = conn, %{"banner" => ""}) do
|
def update_banner(%{assigns: %{user: user}} = conn, %{"banner" => ""}) do
|
||||||
with new_info <- %{"banner" => %{}},
|
with new_info <- %{"banner" => %{}},
|
||||||
info_cng <- User.Info.profile_update(user.info, new_info),
|
info_cng <- User.Info.profile_update(user.info, new_info),
|
||||||
changeset <- Ecto.Changeset.change(user) |> Ecto.Changeset.put_embed(:info, info_cng),
|
changeset <- Changeset.change(user) |> Changeset.put_embed(:info, info_cng),
|
||||||
{:ok, user} <- User.update_and_set_cache(changeset) do
|
{:ok, user} <- User.update_and_set_cache(changeset) do
|
||||||
CommonAPI.update(user)
|
CommonAPI.update(user)
|
||||||
|
|
||||||
|
@ -237,7 +237,7 @@ def update_banner(%{assigns: %{user: user}} = conn, params) do
|
||||||
with {:ok, object} <- ActivityPub.upload(%{"img" => params["banner"]}, type: :banner),
|
with {:ok, object} <- ActivityPub.upload(%{"img" => params["banner"]}, type: :banner),
|
||||||
new_info <- %{"banner" => object.data},
|
new_info <- %{"banner" => object.data},
|
||||||
info_cng <- User.Info.profile_update(user.info, new_info),
|
info_cng <- User.Info.profile_update(user.info, new_info),
|
||||||
changeset <- Ecto.Changeset.change(user) |> Ecto.Changeset.put_embed(:info, info_cng),
|
changeset <- Changeset.change(user) |> Changeset.put_embed(:info, info_cng),
|
||||||
{:ok, user} <- User.update_and_set_cache(changeset) do
|
{:ok, user} <- User.update_and_set_cache(changeset) do
|
||||||
CommonAPI.update(user)
|
CommonAPI.update(user)
|
||||||
%{"url" => [%{"href" => href} | _]} = object.data
|
%{"url" => [%{"href" => href} | _]} = object.data
|
||||||
|
@ -249,7 +249,7 @@ def update_banner(%{assigns: %{user: user}} = conn, params) do
|
||||||
def update_background(%{assigns: %{user: user}} = conn, %{"img" => ""}) do
|
def update_background(%{assigns: %{user: user}} = conn, %{"img" => ""}) do
|
||||||
with new_info <- %{"background" => %{}},
|
with new_info <- %{"background" => %{}},
|
||||||
info_cng <- User.Info.profile_update(user.info, new_info),
|
info_cng <- User.Info.profile_update(user.info, new_info),
|
||||||
changeset <- Ecto.Changeset.change(user) |> Ecto.Changeset.put_embed(:info, info_cng),
|
changeset <- Changeset.change(user) |> Changeset.put_embed(:info, info_cng),
|
||||||
{:ok, _user} <- User.update_and_set_cache(changeset) do
|
{:ok, _user} <- User.update_and_set_cache(changeset) do
|
||||||
json(conn, %{url: nil})
|
json(conn, %{url: nil})
|
||||||
end
|
end
|
||||||
|
@ -259,7 +259,7 @@ def update_background(%{assigns: %{user: user}} = conn, params) do
|
||||||
with {:ok, object} <- ActivityPub.upload(params, type: :background),
|
with {:ok, object} <- ActivityPub.upload(params, type: :background),
|
||||||
new_info <- %{"background" => object.data},
|
new_info <- %{"background" => object.data},
|
||||||
info_cng <- User.Info.profile_update(user.info, new_info),
|
info_cng <- User.Info.profile_update(user.info, new_info),
|
||||||
changeset <- Ecto.Changeset.change(user) |> Ecto.Changeset.put_embed(:info, info_cng),
|
changeset <- Changeset.change(user) |> Changeset.put_embed(:info, info_cng),
|
||||||
{:ok, _user} <- User.update_and_set_cache(changeset) do
|
{:ok, _user} <- User.update_and_set_cache(changeset) do
|
||||||
%{"url" => [%{"href" => href} | _]} = object.data
|
%{"url" => [%{"href" => href} | _]} = object.data
|
||||||
|
|
||||||
|
@ -806,8 +806,8 @@ def set_mascot(%{assigns: %{user: user}} = conn, %{"file" => file}) do
|
||||||
|
|
||||||
user_changeset =
|
user_changeset =
|
||||||
user
|
user
|
||||||
|> Ecto.Changeset.change()
|
|> Changeset.change()
|
||||||
|> Ecto.Changeset.put_embed(:info, info_changeset)
|
|> Changeset.put_embed(:info, info_changeset)
|
||||||
|
|
||||||
{:ok, _user} = User.update_and_set_cache(user_changeset)
|
{:ok, _user} = User.update_and_set_cache(user_changeset)
|
||||||
|
|
||||||
|
@ -1205,88 +1205,12 @@ def bookmarks(%{assigns: %{user: user}} = conn, params) do
|
||||||
|> render("index.json", %{activities: activities, for: user, as: :activity})
|
|> render("index.json", %{activities: activities, for: user, as: :activity})
|
||||||
end
|
end
|
||||||
|
|
||||||
def get_lists(%{assigns: %{user: user}} = conn, opts) do
|
|
||||||
lists = Pleroma.List.for_user(user, opts)
|
|
||||||
res = ListView.render("lists.json", lists: lists)
|
|
||||||
json(conn, res)
|
|
||||||
end
|
|
||||||
|
|
||||||
def get_list(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
|
||||||
with %Pleroma.List{} = list <- Pleroma.List.get(id, user) do
|
|
||||||
res = ListView.render("list.json", list: list)
|
|
||||||
json(conn, res)
|
|
||||||
else
|
|
||||||
_e -> render_error(conn, :not_found, "Record not found")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def account_lists(%{assigns: %{user: user}} = conn, %{"id" => account_id}) do
|
def account_lists(%{assigns: %{user: user}} = conn, %{"id" => account_id}) do
|
||||||
lists = Pleroma.List.get_lists_account_belongs(user, account_id)
|
lists = Pleroma.List.get_lists_account_belongs(user, account_id)
|
||||||
res = ListView.render("lists.json", lists: lists)
|
res = ListView.render("lists.json", lists: lists)
|
||||||
json(conn, res)
|
json(conn, res)
|
||||||
end
|
end
|
||||||
|
|
||||||
def delete_list(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
|
||||||
with %Pleroma.List{} = list <- Pleroma.List.get(id, user),
|
|
||||||
{:ok, _list} <- Pleroma.List.delete(list) do
|
|
||||||
json(conn, %{})
|
|
||||||
else
|
|
||||||
_e ->
|
|
||||||
json(conn, dgettext("errors", "error"))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def create_list(%{assigns: %{user: user}} = conn, %{"title" => title}) do
|
|
||||||
with {:ok, %Pleroma.List{} = list} <- Pleroma.List.create(title, user) do
|
|
||||||
res = ListView.render("list.json", list: list)
|
|
||||||
json(conn, res)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def add_to_list(%{assigns: %{user: user}} = conn, %{"id" => id, "account_ids" => accounts}) do
|
|
||||||
accounts
|
|
||||||
|> Enum.each(fn account_id ->
|
|
||||||
with %Pleroma.List{} = list <- Pleroma.List.get(id, user),
|
|
||||||
%User{} = followed <- User.get_cached_by_id(account_id) do
|
|
||||||
Pleroma.List.follow(list, followed)
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
json(conn, %{})
|
|
||||||
end
|
|
||||||
|
|
||||||
def remove_from_list(%{assigns: %{user: user}} = conn, %{"id" => id, "account_ids" => accounts}) do
|
|
||||||
accounts
|
|
||||||
|> Enum.each(fn account_id ->
|
|
||||||
with %Pleroma.List{} = list <- Pleroma.List.get(id, user),
|
|
||||||
%User{} = followed <- User.get_cached_by_id(account_id) do
|
|
||||||
Pleroma.List.unfollow(list, followed)
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
json(conn, %{})
|
|
||||||
end
|
|
||||||
|
|
||||||
def list_accounts(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
|
||||||
with %Pleroma.List{} = list <- Pleroma.List.get(id, user),
|
|
||||||
{:ok, users} = Pleroma.List.get_following(list) do
|
|
||||||
conn
|
|
||||||
|> put_view(AccountView)
|
|
||||||
|> render("accounts.json", %{for: user, users: users, as: :user})
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def rename_list(%{assigns: %{user: user}} = conn, %{"id" => id, "title" => title}) do
|
|
||||||
with %Pleroma.List{} = list <- Pleroma.List.get(id, user),
|
|
||||||
{:ok, list} <- Pleroma.List.rename(list, title) do
|
|
||||||
res = ListView.render("list.json", list: list)
|
|
||||||
json(conn, res)
|
|
||||||
else
|
|
||||||
_e ->
|
|
||||||
json(conn, dgettext("errors", "error"))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def list_timeline(%{assigns: %{user: user}} = conn, %{"list_id" => id} = params) do
|
def list_timeline(%{assigns: %{user: user}} = conn, %{"list_id" => id} = params) do
|
||||||
with %Pleroma.List{title: _title, following: following} <- Pleroma.List.get(id, user) do
|
with %Pleroma.List{title: _title, following: following} <- Pleroma.List.get(id, user) do
|
||||||
params =
|
params =
|
||||||
|
@ -1420,8 +1344,8 @@ def index(%{assigns: %{user: user}} = conn, _params) do
|
||||||
def put_settings(%{assigns: %{user: user}} = conn, %{"data" => settings} = _params) do
|
def put_settings(%{assigns: %{user: user}} = conn, %{"data" => settings} = _params) do
|
||||||
info_cng = User.Info.mastodon_settings_update(user.info, settings)
|
info_cng = User.Info.mastodon_settings_update(user.info, settings)
|
||||||
|
|
||||||
with changeset <- Ecto.Changeset.change(user),
|
with changeset <- Changeset.change(user),
|
||||||
changeset <- Ecto.Changeset.put_embed(changeset, :info, info_cng),
|
changeset <- Changeset.put_embed(changeset, :info, info_cng),
|
||||||
{:ok, _user} <- User.update_and_set_cache(changeset) do
|
{:ok, _user} <- User.update_and_set_cache(changeset) do
|
||||||
json(conn, %{})
|
json(conn, %{})
|
||||||
else
|
else
|
||||||
|
@ -1485,7 +1409,7 @@ defp get_or_make_app do
|
||||||
{:ok, app}
|
{:ok, app}
|
||||||
else
|
else
|
||||||
app
|
app
|
||||||
|> Ecto.Changeset.change(%{scopes: scopes})
|
|> Changeset.change(%{scopes: scopes})
|
||||||
|> Repo.update()
|
|> Repo.update()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -1587,35 +1511,6 @@ def delete_filter(%{assigns: %{user: user}} = conn, %{"id" => filter_id}) do
|
||||||
json(conn, %{})
|
json(conn, %{})
|
||||||
end
|
end
|
||||||
|
|
||||||
# fallback action
|
|
||||||
#
|
|
||||||
def errors(conn, {:error, %Changeset{} = changeset}) do
|
|
||||||
error_message =
|
|
||||||
changeset
|
|
||||||
|> Changeset.traverse_errors(fn {message, _opt} -> message end)
|
|
||||||
|> Enum.map_join(", ", fn {_k, v} -> v end)
|
|
||||||
|
|
||||||
conn
|
|
||||||
|> put_status(:unprocessable_entity)
|
|
||||||
|> json(%{error: error_message})
|
|
||||||
end
|
|
||||||
|
|
||||||
def errors(conn, {:error, :not_found}) do
|
|
||||||
render_error(conn, :not_found, "Record not found")
|
|
||||||
end
|
|
||||||
|
|
||||||
def errors(conn, {:error, error_message}) do
|
|
||||||
conn
|
|
||||||
|> put_status(:bad_request)
|
|
||||||
|> json(%{error: error_message})
|
|
||||||
end
|
|
||||||
|
|
||||||
def errors(conn, _) do
|
|
||||||
conn
|
|
||||||
|> put_status(:internal_server_error)
|
|
||||||
|> json(dgettext("errors", "Something went wrong"))
|
|
||||||
end
|
|
||||||
|
|
||||||
def suggestions(%{assigns: %{user: user}} = conn, _) do
|
def suggestions(%{assigns: %{user: user}} = conn, _) do
|
||||||
suggestions = Config.get(:suggestions)
|
suggestions = Config.get(:suggestions)
|
||||||
|
|
|
@ -64,8 +64,6 @@ def errors(conn, {:error, :not_found}) do
|
||||||
end
|
end
|
||||||
|
|
||||||
def errors(conn, _) do
|
def errors(conn, _) do
|
||||||
conn
|
Pleroma.Web.MastodonAPI.FallbackController.call(conn, nil)
|
||||||
|> put_status(:internal_server_error)
|
|
||||||
|> json(dgettext("errors", "Something went wrong"))
|
|
||||||
end
|
end
|
||||||
end
|
end
|
|
@ -6,11 +6,11 @@ defmodule Pleroma.Web.MastodonAPI.ListView do
|
||||||
use Pleroma.Web, :view
|
use Pleroma.Web, :view
|
||||||
alias Pleroma.Web.MastodonAPI.ListView
|
alias Pleroma.Web.MastodonAPI.ListView
|
||||||
|
|
||||||
def render("lists.json", %{lists: lists} = opts) do
|
def render("index.json", %{lists: lists} = opts) do
|
||||||
render_many(lists, ListView, "list.json", opts)
|
render_many(lists, ListView, "show.json", opts)
|
||||||
end
|
end
|
||||||
|
|
||||||
def render("list.json", %{list: list}) do
|
def render("show.json", %{list: list}) do
|
||||||
%{
|
%{
|
||||||
id: to_string(list.id),
|
id: to_string(list.id),
|
||||||
title: list.title
|
title: list.title
|
||||||
|
|
|
@ -312,9 +312,9 @@ defmodule Pleroma.Web.Router do
|
||||||
get("/scheduled_statuses", MastodonAPIController, :scheduled_statuses)
|
get("/scheduled_statuses", MastodonAPIController, :scheduled_statuses)
|
||||||
get("/scheduled_statuses/:id", MastodonAPIController, :show_scheduled_status)
|
get("/scheduled_statuses/:id", MastodonAPIController, :show_scheduled_status)
|
||||||
|
|
||||||
get("/lists", MastodonAPIController, :get_lists)
|
get("/lists", ListController, :index)
|
||||||
get("/lists/:id", MastodonAPIController, :get_list)
|
get("/lists/:id", ListController, :show)
|
||||||
get("/lists/:id/accounts", MastodonAPIController, :list_accounts)
|
get("/lists/:id/accounts", ListController, :list_accounts)
|
||||||
|
|
||||||
get("/domain_blocks", MastodonAPIController, :domain_blocks)
|
get("/domain_blocks", MastodonAPIController, :domain_blocks)
|
||||||
|
|
||||||
|
@ -355,12 +355,12 @@ defmodule Pleroma.Web.Router do
|
||||||
post("/media", MastodonAPIController, :upload)
|
post("/media", MastodonAPIController, :upload)
|
||||||
put("/media/:id", MastodonAPIController, :update_media)
|
put("/media/:id", MastodonAPIController, :update_media)
|
||||||
|
|
||||||
delete("/lists/:id", MastodonAPIController, :delete_list)
|
delete("/lists/:id", ListController, :delete)
|
||||||
post("/lists", MastodonAPIController, :create_list)
|
post("/lists", ListController, :create)
|
||||||
put("/lists/:id", MastodonAPIController, :rename_list)
|
put("/lists/:id", ListController, :update)
|
||||||
|
|
||||||
post("/lists/:id/accounts", MastodonAPIController, :add_to_list)
|
post("/lists/:id/accounts", ListController, :add_to_list)
|
||||||
delete("/lists/:id/accounts", MastodonAPIController, :remove_from_list)
|
delete("/lists/:id/accounts", ListController, :remove_from_list)
|
||||||
|
|
||||||
post("/filters", MastodonAPIController, :create_filter)
|
post("/filters", MastodonAPIController, :create_filter)
|
||||||
get("/filters/:id", MastodonAPIController, :get_filter)
|
get("/filters/:id", MastodonAPIController, :get_filter)
|
||||||
|
|
|
@ -15,6 +15,13 @@ test "creating a list" do
|
||||||
assert title == "title"
|
assert title == "title"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "validates title" do
|
||||||
|
user = insert(:user)
|
||||||
|
|
||||||
|
assert {:error, changeset} = Pleroma.List.create("", user)
|
||||||
|
assert changeset.errors == [title: {"can't be blank", [validation: :required]}]
|
||||||
|
end
|
||||||
|
|
||||||
test "getting a list not belonging to the user" do
|
test "getting a list not belonging to the user" do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
other_user = insert(:user)
|
other_user = insert(:user)
|
||||||
|
|
|
@ -0,0 +1,166 @@
|
||||||
|
# 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.ListControllerTest do
|
||||||
|
use Pleroma.Web.ConnCase
|
||||||
|
|
||||||
|
alias Pleroma.Repo
|
||||||
|
|
||||||
|
import Pleroma.Factory
|
||||||
|
|
||||||
|
test "creating a list", %{conn: conn} do
|
||||||
|
user = insert(:user)
|
||||||
|
|
||||||
|
conn =
|
||||||
|
conn
|
||||||
|
|> assign(:user, user)
|
||||||
|
|> post("/api/v1/lists", %{"title" => "cuties"})
|
||||||
|
|
||||||
|
assert %{"title" => title} = json_response(conn, 200)
|
||||||
|
assert title == "cuties"
|
||||||
|
end
|
||||||
|
|
||||||
|
test "renders error for invalid params", %{conn: conn} do
|
||||||
|
user = insert(:user)
|
||||||
|
|
||||||
|
conn =
|
||||||
|
conn
|
||||||
|
|> assign(:user, user)
|
||||||
|
|> post("/api/v1/lists", %{"title" => nil})
|
||||||
|
|
||||||
|
assert %{"error" => "can't be blank"} == json_response(conn, :unprocessable_entity)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "listing a user's lists", %{conn: conn} do
|
||||||
|
user = insert(:user)
|
||||||
|
|
||||||
|
conn
|
||||||
|
|> assign(:user, user)
|
||||||
|
|> post("/api/v1/lists", %{"title" => "cuties"})
|
||||||
|
|
||||||
|
conn
|
||||||
|
|> assign(:user, user)
|
||||||
|
|> post("/api/v1/lists", %{"title" => "cofe"})
|
||||||
|
|
||||||
|
conn =
|
||||||
|
conn
|
||||||
|
|> assign(:user, user)
|
||||||
|
|> get("/api/v1/lists")
|
||||||
|
|
||||||
|
assert [
|
||||||
|
%{"id" => _, "title" => "cofe"},
|
||||||
|
%{"id" => _, "title" => "cuties"}
|
||||||
|
] = json_response(conn, :ok)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "adding users to a list", %{conn: conn} do
|
||||||
|
user = insert(:user)
|
||||||
|
other_user = insert(:user)
|
||||||
|
{:ok, list} = Pleroma.List.create("name", user)
|
||||||
|
|
||||||
|
conn =
|
||||||
|
conn
|
||||||
|
|> assign(:user, user)
|
||||||
|
|> post("/api/v1/lists/#{list.id}/accounts", %{"account_ids" => [other_user.id]})
|
||||||
|
|
||||||
|
assert %{} == json_response(conn, 200)
|
||||||
|
%Pleroma.List{following: following} = Pleroma.List.get(list.id, user)
|
||||||
|
assert following == [other_user.follower_address]
|
||||||
|
end
|
||||||
|
|
||||||
|
test "removing users from a list", %{conn: conn} do
|
||||||
|
user = insert(:user)
|
||||||
|
other_user = insert(:user)
|
||||||
|
third_user = insert(:user)
|
||||||
|
{:ok, list} = Pleroma.List.create("name", user)
|
||||||
|
{:ok, list} = Pleroma.List.follow(list, other_user)
|
||||||
|
{:ok, list} = Pleroma.List.follow(list, third_user)
|
||||||
|
|
||||||
|
conn =
|
||||||
|
conn
|
||||||
|
|> assign(:user, user)
|
||||||
|
|> delete("/api/v1/lists/#{list.id}/accounts", %{"account_ids" => [other_user.id]})
|
||||||
|
|
||||||
|
assert %{} == json_response(conn, 200)
|
||||||
|
%Pleroma.List{following: following} = Pleroma.List.get(list.id, user)
|
||||||
|
assert following == [third_user.follower_address]
|
||||||
|
end
|
||||||
|
|
||||||
|
test "listing users in a list", %{conn: conn} do
|
||||||
|
user = insert(:user)
|
||||||
|
other_user = insert(:user)
|
||||||
|
{:ok, list} = Pleroma.List.create("name", user)
|
||||||
|
{:ok, list} = Pleroma.List.follow(list, other_user)
|
||||||
|
|
||||||
|
conn =
|
||||||
|
conn
|
||||||
|
|> assign(:user, user)
|
||||||
|
|> get("/api/v1/lists/#{list.id}/accounts", %{"account_ids" => [other_user.id]})
|
||||||
|
|
||||||
|
assert [%{"id" => id}] = json_response(conn, 200)
|
||||||
|
assert id == to_string(other_user.id)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "retrieving a list", %{conn: conn} do
|
||||||
|
user = insert(:user)
|
||||||
|
{:ok, list} = Pleroma.List.create("name", user)
|
||||||
|
|
||||||
|
conn =
|
||||||
|
conn
|
||||||
|
|> assign(:user, user)
|
||||||
|
|> get("/api/v1/lists/#{list.id}")
|
||||||
|
|
||||||
|
assert %{"id" => id} = json_response(conn, 200)
|
||||||
|
assert id == to_string(list.id)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "renders 404 if list is not found", %{conn: conn} do
|
||||||
|
user = insert(:user)
|
||||||
|
|
||||||
|
conn =
|
||||||
|
conn
|
||||||
|
|> assign(:user, user)
|
||||||
|
|> get("/api/v1/lists/666")
|
||||||
|
|
||||||
|
assert %{"error" => "List not found"} = json_response(conn, :not_found)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "renaming a list", %{conn: conn} do
|
||||||
|
user = insert(:user)
|
||||||
|
{:ok, list} = Pleroma.List.create("name", user)
|
||||||
|
|
||||||
|
conn =
|
||||||
|
conn
|
||||||
|
|> assign(:user, user)
|
||||||
|
|> put("/api/v1/lists/#{list.id}", %{"title" => "newname"})
|
||||||
|
|
||||||
|
assert %{"title" => name} = json_response(conn, 200)
|
||||||
|
assert name == "newname"
|
||||||
|
end
|
||||||
|
|
||||||
|
test "validates title when renaming a list", %{conn: conn} do
|
||||||
|
user = insert(:user)
|
||||||
|
{:ok, list} = Pleroma.List.create("name", user)
|
||||||
|
|
||||||
|
conn =
|
||||||
|
conn
|
||||||
|
|> assign(:user, user)
|
||||||
|
|> put("/api/v1/lists/#{list.id}", %{"title" => " "})
|
||||||
|
|
||||||
|
assert %{"error" => "can't be blank"} == json_response(conn, :unprocessable_entity)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "deleting a list", %{conn: conn} do
|
||||||
|
user = insert(:user)
|
||||||
|
{:ok, list} = Pleroma.List.create("name", user)
|
||||||
|
|
||||||
|
conn =
|
||||||
|
conn
|
||||||
|
|> assign(:user, user)
|
||||||
|
|> delete("/api/v1/lists/#{list.id}")
|
||||||
|
|
||||||
|
assert %{} = json_response(conn, 200)
|
||||||
|
assert is_nil(Repo.get(Pleroma.List, list.id))
|
||||||
|
end
|
||||||
|
end
|
|
@ -927,106 +927,7 @@ test "delete a filter", %{conn: conn} do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "lists" do
|
describe "list timelines" do
|
||||||
test "creating a list", %{conn: conn} do
|
|
||||||
user = insert(:user)
|
|
||||||
|
|
||||||
conn =
|
|
||||||
conn
|
|
||||||
|> assign(:user, user)
|
|
||||||
|> post("/api/v1/lists", %{"title" => "cuties"})
|
|
||||||
|
|
||||||
assert %{"title" => title} = json_response(conn, 200)
|
|
||||||
assert title == "cuties"
|
|
||||||
end
|
|
||||||
|
|
||||||
test "adding users to a list", %{conn: conn} do
|
|
||||||
user = insert(:user)
|
|
||||||
other_user = insert(:user)
|
|
||||||
{:ok, list} = Pleroma.List.create("name", user)
|
|
||||||
|
|
||||||
conn =
|
|
||||||
conn
|
|
||||||
|> assign(:user, user)
|
|
||||||
|> post("/api/v1/lists/#{list.id}/accounts", %{"account_ids" => [other_user.id]})
|
|
||||||
|
|
||||||
assert %{} == json_response(conn, 200)
|
|
||||||
%Pleroma.List{following: following} = Pleroma.List.get(list.id, user)
|
|
||||||
assert following == [other_user.follower_address]
|
|
||||||
end
|
|
||||||
|
|
||||||
test "removing users from a list", %{conn: conn} do
|
|
||||||
user = insert(:user)
|
|
||||||
other_user = insert(:user)
|
|
||||||
third_user = insert(:user)
|
|
||||||
{:ok, list} = Pleroma.List.create("name", user)
|
|
||||||
{:ok, list} = Pleroma.List.follow(list, other_user)
|
|
||||||
{:ok, list} = Pleroma.List.follow(list, third_user)
|
|
||||||
|
|
||||||
conn =
|
|
||||||
conn
|
|
||||||
|> assign(:user, user)
|
|
||||||
|> delete("/api/v1/lists/#{list.id}/accounts", %{"account_ids" => [other_user.id]})
|
|
||||||
|
|
||||||
assert %{} == json_response(conn, 200)
|
|
||||||
%Pleroma.List{following: following} = Pleroma.List.get(list.id, user)
|
|
||||||
assert following == [third_user.follower_address]
|
|
||||||
end
|
|
||||||
|
|
||||||
test "listing users in a list", %{conn: conn} do
|
|
||||||
user = insert(:user)
|
|
||||||
other_user = insert(:user)
|
|
||||||
{:ok, list} = Pleroma.List.create("name", user)
|
|
||||||
{:ok, list} = Pleroma.List.follow(list, other_user)
|
|
||||||
|
|
||||||
conn =
|
|
||||||
conn
|
|
||||||
|> assign(:user, user)
|
|
||||||
|> get("/api/v1/lists/#{list.id}/accounts", %{"account_ids" => [other_user.id]})
|
|
||||||
|
|
||||||
assert [%{"id" => id}] = json_response(conn, 200)
|
|
||||||
assert id == to_string(other_user.id)
|
|
||||||
end
|
|
||||||
|
|
||||||
test "retrieving a list", %{conn: conn} do
|
|
||||||
user = insert(:user)
|
|
||||||
{:ok, list} = Pleroma.List.create("name", user)
|
|
||||||
|
|
||||||
conn =
|
|
||||||
conn
|
|
||||||
|> assign(:user, user)
|
|
||||||
|> get("/api/v1/lists/#{list.id}")
|
|
||||||
|
|
||||||
assert %{"id" => id} = json_response(conn, 200)
|
|
||||||
assert id == to_string(list.id)
|
|
||||||
end
|
|
||||||
|
|
||||||
test "renaming a list", %{conn: conn} do
|
|
||||||
user = insert(:user)
|
|
||||||
{:ok, list} = Pleroma.List.create("name", user)
|
|
||||||
|
|
||||||
conn =
|
|
||||||
conn
|
|
||||||
|> assign(:user, user)
|
|
||||||
|> put("/api/v1/lists/#{list.id}", %{"title" => "newname"})
|
|
||||||
|
|
||||||
assert %{"title" => name} = json_response(conn, 200)
|
|
||||||
assert name == "newname"
|
|
||||||
end
|
|
||||||
|
|
||||||
test "deleting a list", %{conn: conn} do
|
|
||||||
user = insert(:user)
|
|
||||||
{:ok, list} = Pleroma.List.create("name", user)
|
|
||||||
|
|
||||||
conn =
|
|
||||||
conn
|
|
||||||
|> assign(:user, user)
|
|
||||||
|> delete("/api/v1/lists/#{list.id}")
|
|
||||||
|
|
||||||
assert %{} = json_response(conn, 200)
|
|
||||||
assert is_nil(Repo.get(Pleroma.List, list.id))
|
|
||||||
end
|
|
||||||
|
|
||||||
test "list timeline", %{conn: conn} do
|
test "list timeline", %{conn: conn} do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
other_user = insert(:user)
|
other_user = insert(:user)
|
||||||
|
|
|
@ -7,7 +7,7 @@ defmodule Pleroma.Web.MastodonAPI.ListViewTest do
|
||||||
import Pleroma.Factory
|
import Pleroma.Factory
|
||||||
alias Pleroma.Web.MastodonAPI.ListView
|
alias Pleroma.Web.MastodonAPI.ListView
|
||||||
|
|
||||||
test "Represent a list" do
|
test "show" do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
title = "mortal enemies"
|
title = "mortal enemies"
|
||||||
{:ok, list} = Pleroma.List.create(title, user)
|
{:ok, list} = Pleroma.List.create(title, user)
|
||||||
|
@ -17,6 +17,16 @@ test "Represent a list" do
|
||||||
title: title
|
title: title
|
||||||
}
|
}
|
||||||
|
|
||||||
assert expected == ListView.render("list.json", %{list: list})
|
assert expected == ListView.render("show.json", %{list: list})
|
||||||
|
end
|
||||||
|
|
||||||
|
test "index" do
|
||||||
|
user = insert(:user)
|
||||||
|
|
||||||
|
{:ok, list} = Pleroma.List.create("my list", user)
|
||||||
|
{:ok, list2} = Pleroma.List.create("cofe", user)
|
||||||
|
|
||||||
|
assert [%{id: _, title: "my list"}, %{id: _, title: "cofe"}] =
|
||||||
|
ListView.render("index.json", lists: [list, list2])
|
||||||
end
|
end
|
||||||
end
|
end
|
Loading…
Reference in New Issue