forked from AkkomaGang/akkoma
Add PUT /api/pleroma/notification_settings endpoint
This commit is contained in:
parent
55d086b520
commit
cd90695a34
9 changed files with 95 additions and 16 deletions
|
@ -27,14 +27,14 @@ Request parameters can be passed via [query strings](https://en.wikipedia.org/wi
|
||||||
* Method: `GET`
|
* Method: `GET`
|
||||||
* Authentication: not required
|
* Authentication: not required
|
||||||
* Params: none
|
* Params: none
|
||||||
* Response: Provider specific JSON, the only guaranteed parameter is `type`
|
* Response: Provider specific JSON, the only guaranteed parameter is `type`
|
||||||
* Example response: `{"type": "kocaptcha", "token": "whatever", "url": "https://captcha.kotobank.ch/endpoint"}`
|
* Example response: `{"type": "kocaptcha", "token": "whatever", "url": "https://captcha.kotobank.ch/endpoint"}`
|
||||||
|
|
||||||
## `/api/pleroma/delete_account`
|
## `/api/pleroma/delete_account`
|
||||||
### Delete an account
|
### Delete an account
|
||||||
* Method `POST`
|
* Method `POST`
|
||||||
* Authentication: required
|
* Authentication: required
|
||||||
* Params:
|
* Params:
|
||||||
* `password`: user's password
|
* `password`: user's password
|
||||||
* Response: JSON. Returns `{"status": "success"}` if the deletion was successful, `{"error": "[error message]"}` otherwise
|
* Response: JSON. Returns `{"status": "success"}` if the deletion was successful, `{"error": "[error message]"}` otherwise
|
||||||
* Example response: `{"error": "Invalid password."}`
|
* Example response: `{"error": "Invalid password."}`
|
||||||
|
@ -116,3 +116,13 @@ See [Admin-API](Admin-API.md)
|
||||||
* Params:
|
* Params:
|
||||||
* `id`: notifications's id
|
* `id`: notifications's id
|
||||||
* Response: JSON. Returns `{"status": "success"}` if the reading was successful, otherwise returns `{"error": "error_msg"}`
|
* Response: JSON. Returns `{"status": "success"}` if the reading was successful, otherwise returns `{"error": "error_msg"}`
|
||||||
|
## `/api/pleroma/notification_settings`
|
||||||
|
### Updates user notification settings
|
||||||
|
* Method `PUT`
|
||||||
|
* Authentication: required
|
||||||
|
* Params:
|
||||||
|
* `followers`: BOOLEAN field, receives notifications from followers
|
||||||
|
* `follows`: BOOLEAN field, receives notifications from people the user follows
|
||||||
|
* `remote`: BOOLEAN field, receives notifications from people on remote instances
|
||||||
|
* `local`: BOOLEAN field, receives notifications from people on the local instance
|
||||||
|
* Response: JSON. Returns `{"status": "success"}` if the update was successful, otherwise returns `{"error": "error_msg"}`
|
||||||
|
|
|
@ -163,13 +163,11 @@ def skip?(:blocked, activity, user) do
|
||||||
User.blocks?(user, %{ap_id: actor})
|
User.blocks?(user, %{ap_id: actor})
|
||||||
end
|
end
|
||||||
|
|
||||||
def skip?(:local, %{local: true}, user) do
|
def skip?(:local, %{local: true}, %{info: %{notification_settings: %{"local" => false}}}),
|
||||||
user.info.notification_settings["local"] == false
|
do: true
|
||||||
end
|
|
||||||
|
|
||||||
def skip?(:local, %{local: false}, user) do
|
def skip?(:local, %{local: false}, %{info: %{notification_settings: %{"remote" => false}}}),
|
||||||
user.info.notification_settings["remote"] == false
|
do: true
|
||||||
end
|
|
||||||
|
|
||||||
def skip?(:muted, activity, user) do
|
def skip?(:muted, activity, user) do
|
||||||
actor = activity.data["actor"]
|
actor = activity.data["actor"]
|
||||||
|
@ -194,7 +192,7 @@ def skip?(:follows, activity, %{info: %{notification_settings: %{"follows" => fa
|
||||||
User.following?(user, followed)
|
User.following?(user, followed)
|
||||||
end
|
end
|
||||||
|
|
||||||
def skip?(:recently_followed, activity, user) do
|
def skip?(:recently_followed, %{data: %{"type" => "Follow"}} = activity, user) do
|
||||||
actor = activity.data["actor"]
|
actor = activity.data["actor"]
|
||||||
|
|
||||||
Notification.for_user(user)
|
Notification.for_user(user)
|
||||||
|
|
|
@ -1082,6 +1082,14 @@ def deactivate(%User{} = user, status \\ true) do
|
||||||
update_and_set_cache(cng)
|
update_and_set_cache(cng)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def update_notification_settings(%User{} = user, settings \\ %{}) do
|
||||||
|
info_changeset = User.Info.update_notification_settings(user.info, settings)
|
||||||
|
|
||||||
|
change(user)
|
||||||
|
|> put_embed(:info, info_changeset)
|
||||||
|
|> update_and_set_cache()
|
||||||
|
end
|
||||||
|
|
||||||
def delete(%User{} = user) do
|
def delete(%User{} = user) do
|
||||||
{:ok, user} = User.deactivate(user)
|
{:ok, user} = User.deactivate(user)
|
||||||
|
|
||||||
|
|
|
@ -61,6 +61,19 @@ def set_activation_status(info, deactivated) do
|
||||||
|> validate_required([:deactivated])
|
|> validate_required([:deactivated])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def update_notification_settings(info, settings) do
|
||||||
|
notification_settings =
|
||||||
|
info.notification_settings
|
||||||
|
|> Map.merge(settings)
|
||||||
|
|> Map.take(["remote", "local", "followers", "follows"])
|
||||||
|
|
||||||
|
params = %{notification_settings: notification_settings}
|
||||||
|
|
||||||
|
info
|
||||||
|
|> cast(params, [:notification_settings])
|
||||||
|
|> validate_required([:notification_settings])
|
||||||
|
end
|
||||||
|
|
||||||
def add_to_note_count(info, number) do
|
def add_to_note_count(info, number) do
|
||||||
set_note_count(info, info.note_count + number)
|
set_note_count(info, info.note_count + number)
|
||||||
end
|
end
|
||||||
|
|
|
@ -117,13 +117,15 @@ defp do_render("account.json", %{user: user} = opts) do
|
||||||
},
|
},
|
||||||
|
|
||||||
# Pleroma extension
|
# Pleroma extension
|
||||||
pleroma: %{
|
pleroma:
|
||||||
confirmation_pending: user_info.confirmation_pending,
|
%{
|
||||||
tags: user.tags,
|
confirmation_pending: user_info.confirmation_pending,
|
||||||
is_moderator: user.info.is_moderator,
|
tags: user.tags,
|
||||||
is_admin: user.info.is_admin,
|
is_moderator: user.info.is_moderator,
|
||||||
relationship: relationship
|
is_admin: user.info.is_admin,
|
||||||
}
|
relationship: relationship
|
||||||
|
}
|
||||||
|
|> with_notification_settings(user, opts[:for])
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -132,4 +134,10 @@ defp username_from_nickname(string) when is_binary(string) do
|
||||||
end
|
end
|
||||||
|
|
||||||
defp username_from_nickname(_), do: nil
|
defp username_from_nickname(_), do: nil
|
||||||
|
|
||||||
|
defp with_notification_settings(data, %User{id: user_id} = user, %User{id: user_id}) do
|
||||||
|
Map.put(data, :notification_settings, user.info.notification_settings)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp with_notification_settings(data, _, _), do: data
|
||||||
end
|
end
|
||||||
|
|
|
@ -182,6 +182,7 @@ defmodule Pleroma.Web.Router do
|
||||||
|
|
||||||
post("/change_password", UtilController, :change_password)
|
post("/change_password", UtilController, :change_password)
|
||||||
post("/delete_account", UtilController, :delete_account)
|
post("/delete_account", UtilController, :delete_account)
|
||||||
|
put("/notification_settings", UtilController, :update_notificaton_settings)
|
||||||
end
|
end
|
||||||
|
|
||||||
scope [] do
|
scope [] do
|
||||||
|
|
|
@ -269,6 +269,12 @@ def emoji(conn, _params) do
|
||||||
json(conn, Enum.into(Emoji.get_all(), %{}))
|
json(conn, Enum.into(Emoji.get_all(), %{}))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def update_notificaton_settings(%{assigns: %{user: user}} = conn, params) do
|
||||||
|
with {:ok, _} <- User.update_notification_settings(user, params) do
|
||||||
|
json(conn, %{status: "success"})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def follow_import(conn, %{"list" => %Plug.Upload{} = listfile}) do
|
def follow_import(conn, %{"list" => %Plug.Upload{} = listfile}) do
|
||||||
follow_import(conn, %{"list" => File.read!(listfile.path)})
|
follow_import(conn, %{"list" => File.read!(listfile.path)})
|
||||||
end
|
end
|
||||||
|
|
|
@ -71,6 +71,20 @@ test "Represent a user account" do
|
||||||
assert expected == AccountView.render("account.json", %{user: user})
|
assert expected == AccountView.render("account.json", %{user: user})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "Represent the user account for the account owner" do
|
||||||
|
user = insert(:user)
|
||||||
|
|
||||||
|
notification_settings = %{
|
||||||
|
"remote" => true,
|
||||||
|
"local" => true,
|
||||||
|
"followers" => true,
|
||||||
|
"follows" => true
|
||||||
|
}
|
||||||
|
|
||||||
|
assert %{pleroma: %{notification_settings: ^notification_settings}} =
|
||||||
|
AccountView.render("account.json", %{user: user, for: user})
|
||||||
|
end
|
||||||
|
|
||||||
test "Represent a Service(bot) account" do
|
test "Represent a Service(bot) account" do
|
||||||
user =
|
user =
|
||||||
insert(:user, %{
|
insert(:user, %{
|
||||||
|
|
|
@ -3,6 +3,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do
|
||||||
|
|
||||||
alias Pleroma.Notification
|
alias Pleroma.Notification
|
||||||
alias Pleroma.Repo
|
alias Pleroma.Repo
|
||||||
|
alias Pleroma.User
|
||||||
alias Pleroma.Web.CommonAPI
|
alias Pleroma.Web.CommonAPI
|
||||||
import Pleroma.Factory
|
import Pleroma.Factory
|
||||||
|
|
||||||
|
@ -74,6 +75,26 @@ test "it marks a single notification as read", %{conn: conn} do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "PUT /api/pleroma/notification_settings" do
|
||||||
|
test "it updates notification settings", %{conn: conn} do
|
||||||
|
user = insert(:user)
|
||||||
|
|
||||||
|
conn
|
||||||
|
|> assign(:user, user)
|
||||||
|
|> put("/api/pleroma/notification_settings", %{
|
||||||
|
"remote" => false,
|
||||||
|
"followers" => false,
|
||||||
|
"bar" => 1
|
||||||
|
})
|
||||||
|
|> json_response(:ok)
|
||||||
|
|
||||||
|
user = Repo.get(User, user.id)
|
||||||
|
|
||||||
|
assert %{"remote" => false, "local" => true, "followers" => false, "follows" => true} ==
|
||||||
|
user.info.notification_settings
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe "GET /api/statusnet/config.json" do
|
describe "GET /api/statusnet/config.json" do
|
||||||
test "returns the state of safe_dm_mentions flag", %{conn: conn} do
|
test "returns the state of safe_dm_mentions flag", %{conn: conn} do
|
||||||
option = Pleroma.Config.get([:instance, :safe_dm_mentions])
|
option = Pleroma.Config.get([:instance, :safe_dm_mentions])
|
||||||
|
|
Loading…
Reference in a new issue