aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/pleroma/user.ex43
-rw-r--r--lib/pleroma/web/admin_api/admin_api_controller.ex12
-rw-r--r--lib/pleroma/web/controller_helper.ex9
-rw-r--r--lib/pleroma/web/mastodon_api/views/account_view.ex4
-rw-r--r--lib/pleroma/web/router.ex2
-rw-r--r--lib/pleroma/web/twitter_api/views/user_view.ex4
6 files changed, 72 insertions, 2 deletions
diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex
index 74ae5ef0d..24bc80894 100644
--- a/lib/pleroma/user.ex
+++ b/lib/pleroma/user.ex
@@ -23,6 +23,7 @@ defmodule Pleroma.User do
field(:local, :boolean, default: true)
field(:follower_address, :string)
field(:search_distance, :float, virtual: true)
+ field(:tags, {:array, :string}, default: [])
field(:last_refreshed_at, :naive_datetime)
has_many(:notifications, Notification)
embeds_one(:info, Pleroma.User.Info)
@@ -819,4 +820,46 @@ defmodule Pleroma.User do
CommonUtils.format_input(bio, mentions, tags, "text/plain") |> Formatter.emojify(emoji)
end
+
+ def tag(user_identifiers, tags), do: tag_or_untag(user_identifiers, tags, :tag)
+
+ def untag(user_identifiers, tags), do: tag_or_untag(user_identifiers, tags, :untag)
+
+ defp tag_or_untag(user_identifier, tags, action) when not is_list(user_identifier),
+ do: tag_or_untag([user_identifier], tags, action)
+
+ defp tag_or_untag([hd | _] = nicknames, tags, action) when is_binary(hd) do
+ users = Repo.all(from(u in User, where: u.nickname in ^nicknames))
+
+ if length(users) == length(nicknames) do
+ tag_or_untag(users, tags, action)
+ else
+ {:error, :not_found}
+ end
+ end
+
+ defp tag_or_untag([hd | _] = users, tags, action) when is_map(hd) do
+ tags =
+ [tags]
+ |> List.flatten()
+ |> Enum.map(&String.downcase(&1))
+
+ Repo.transaction(fn ->
+ for user <- users do
+ new_tags =
+ if action == :tag do
+ Enum.uniq(user.tags ++ tags)
+ else
+ user.tags -- tags
+ end
+
+ {:ok, updated_user} =
+ user
+ |> change(%{tags: new_tags})
+ |> Repo.update()
+
+ updated_user
+ end
+ end)
+ end
end
diff --git a/lib/pleroma/web/admin_api/admin_api_controller.ex b/lib/pleroma/web/admin_api/admin_api_controller.ex
index 2c67d9cda..0bd85e0b6 100644
--- a/lib/pleroma/web/admin_api/admin_api_controller.ex
+++ b/lib/pleroma/web/admin_api/admin_api_controller.ex
@@ -3,6 +3,8 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do
alias Pleroma.{User, Repo}
alias Pleroma.Web.ActivityPub.Relay
+ import Pleroma.Web.ControllerHelper, only: [json_response: 3]
+
require Logger
action_fallback(:errors)
@@ -40,6 +42,16 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do
|> json(new_user.nickname)
end
+ def tag_users(conn, %{"nicknames" => nicknames, "tags" => tags}) do
+ with {:ok, _} <- User.tag(nicknames, tags),
+ do: json_response(conn, :no_content, "")
+ end
+
+ def untag_users(conn, %{"nicknames" => nicknames, "tags" => tags}) do
+ with {:ok, _} <- User.untag(nicknames, tags),
+ do: json_response(conn, :no_content, "")
+ end
+
def right_add(conn, %{"permission_group" => permission_group, "nickname" => nickname})
when permission_group in ["moderator", "admin"] do
user = User.get_by_nickname(nickname)
diff --git a/lib/pleroma/web/controller_helper.ex b/lib/pleroma/web/controller_helper.ex
new file mode 100644
index 000000000..ddf958811
--- /dev/null
+++ b/lib/pleroma/web/controller_helper.ex
@@ -0,0 +1,9 @@
+defmodule Pleroma.Web.ControllerHelper do
+ use Pleroma.Web, :controller
+
+ def json_response(conn, status, json) do
+ conn
+ |> put_status(status)
+ |> json(json)
+ end
+end
diff --git a/lib/pleroma/web/mastodon_api/views/account_view.ex b/lib/pleroma/web/mastodon_api/views/account_view.ex
index bcfa8836e..0add1b686 100644
--- a/lib/pleroma/web/mastodon_api/views/account_view.ex
+++ b/lib/pleroma/web/mastodon_api/views/account_view.ex
@@ -58,7 +58,9 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do
note: "",
privacy: user_info.default_scope,
sensitive: false
- }
+ },
+ # Note: Mastodon does not return this field:
+ tags: user.tags
}
end
diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex
index b7c79d2eb..ae942701e 100644
--- a/lib/pleroma/web/router.ex
+++ b/lib/pleroma/web/router.ex
@@ -98,6 +98,8 @@ defmodule Pleroma.Web.Router do
pipe_through(:admin_api)
delete("/user", AdminAPIController, :user_delete)
post("/user", AdminAPIController, :user_create)
+ put("/users/tag", AdminAPIController, :tag_users)
+ put("/users/untag", AdminAPIController, :untag_users)
get("/permission_group/:nickname", AdminAPIController, :right_get)
get("/permission_group/:nickname/:permission_group", AdminAPIController, :right_get)
diff --git a/lib/pleroma/web/twitter_api/views/user_view.ex b/lib/pleroma/web/twitter_api/views/user_view.ex
index b78024ed7..dae656372 100644
--- a/lib/pleroma/web/twitter_api/views/user_view.ex
+++ b/lib/pleroma/web/twitter_api/views/user_view.ex
@@ -77,7 +77,9 @@ defmodule Pleroma.Web.TwitterAPI.UserView do
"locked" => user.info.locked,
"default_scope" => user.info.default_scope,
"no_rich_text" => user.info.no_rich_text,
- "fields" => fields
+ "fields" => fields,
+ # Note: twitter.com does not return this field:
+ "tags" => user.tags
}
if assigns[:token] do