diff options
| -rw-r--r-- | docs/Pleroma-API.md | 14 | ||||
| -rw-r--r-- | lib/pleroma/notification.ex | 12 | ||||
| -rw-r--r-- | lib/pleroma/user.ex | 8 | ||||
| -rw-r--r-- | lib/pleroma/user/info.ex | 13 | ||||
| -rw-r--r-- | lib/pleroma/web/mastodon_api/views/account_view.ex | 22 | ||||
| -rw-r--r-- | lib/pleroma/web/router.ex | 1 | ||||
| -rw-r--r-- | lib/pleroma/web/twitter_api/controllers/util_controller.ex | 6 | ||||
| -rw-r--r-- | test/web/mastodon_api/account_view_test.exs | 14 | ||||
| -rw-r--r-- | test/web/twitter_api/util_controller_test.exs | 21 | 
9 files changed, 95 insertions, 16 deletions
diff --git a/docs/Pleroma-API.md b/docs/Pleroma-API.md index 478c9d874..bb7ed3744 100644 --- a/docs/Pleroma-API.md +++ b/docs/Pleroma-API.md @@ -27,14 +27,14 @@ Request parameters can be passed via [query strings](https://en.wikipedia.org/wi  * Method: `GET`  * Authentication: not required  * 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"}`  ## `/api/pleroma/delete_account`  ### Delete an account  * Method `POST`  * Authentication: required -* Params:  +* Params:      * `password`: user's password  * Response: JSON. Returns `{"status": "success"}` if the deletion was successful, `{"error": "[error message]"}` otherwise  * Example response: `{"error": "Invalid password."}` @@ -116,3 +116,13 @@ See [Admin-API](Admin-API.md)  * Params:      * `id`: notifications's id  * 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"}` diff --git a/lib/pleroma/notification.ex b/lib/pleroma/notification.ex index caa6b755e..14de1a097 100644 --- a/lib/pleroma/notification.ex +++ b/lib/pleroma/notification.ex @@ -163,13 +163,11 @@ defmodule Pleroma.Notification do      User.blocks?(user, %{ap_id: actor})    end -  def skip?(:local, %{local: true}, user) do -    user.info.notification_settings["local"] == false -  end +  def skip?(:local, %{local: true}, %{info: %{notification_settings: %{"local" => false}}}), +    do: true -  def skip?(:local, %{local: false}, user) do -    user.info.notification_settings["remote"] == false -  end +  def skip?(:local, %{local: false}, %{info: %{notification_settings: %{"remote" => false}}}), +    do: true    def skip?(:muted, activity, user) do      actor = activity.data["actor"] @@ -194,7 +192,7 @@ defmodule Pleroma.Notification do      User.following?(user, followed)    end -  def skip?(:recently_followed, activity, user) do +  def skip?(:recently_followed, %{data: %{"type" => "Follow"}} = activity, user) do      actor = activity.data["actor"]      Notification.for_user(user) diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index 728b00a56..73c2a82a7 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -1082,6 +1082,14 @@ defmodule Pleroma.User do      update_and_set_cache(cng)    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      {:ok, user} = User.deactivate(user) diff --git a/lib/pleroma/user/info.ex b/lib/pleroma/user/info.ex index c36efa126..33fd77b02 100644 --- a/lib/pleroma/user/info.ex +++ b/lib/pleroma/user/info.ex @@ -61,6 +61,19 @@ defmodule Pleroma.User.Info do      |> validate_required([:deactivated])    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      set_note_count(info, info.note_count + number)    end diff --git a/lib/pleroma/web/mastodon_api/views/account_view.ex b/lib/pleroma/web/mastodon_api/views/account_view.ex index b5f3bbb9d..25899e491 100644 --- a/lib/pleroma/web/mastodon_api/views/account_view.ex +++ b/lib/pleroma/web/mastodon_api/views/account_view.ex @@ -117,13 +117,15 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do        },        # Pleroma extension -      pleroma: %{ -        confirmation_pending: user_info.confirmation_pending, -        tags: user.tags, -        is_moderator: user.info.is_moderator, -        is_admin: user.info.is_admin, -        relationship: relationship -      } +      pleroma: +        %{ +          confirmation_pending: user_info.confirmation_pending, +          tags: user.tags, +          is_moderator: user.info.is_moderator, +          is_admin: user.info.is_admin, +          relationship: relationship +        } +        |> with_notification_settings(user, opts[:for])      }    end @@ -132,4 +134,10 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do    end    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 diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index 32e5f7644..36cbf0f57 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -182,6 +182,7 @@ defmodule Pleroma.Web.Router do        post("/change_password", UtilController, :change_password)        post("/delete_account", UtilController, :delete_account) +      put("/notification_settings", UtilController, :update_notificaton_settings)      end      scope [] do diff --git a/lib/pleroma/web/twitter_api/controllers/util_controller.ex b/lib/pleroma/web/twitter_api/controllers/util_controller.ex index faa733fec..2708299cb 100644 --- a/lib/pleroma/web/twitter_api/controllers/util_controller.ex +++ b/lib/pleroma/web/twitter_api/controllers/util_controller.ex @@ -269,6 +269,12 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do      json(conn, Enum.into(Emoji.get_all(), %{}))    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      follow_import(conn, %{"list" => File.read!(listfile.path)})    end diff --git a/test/web/mastodon_api/account_view_test.exs b/test/web/mastodon_api/account_view_test.exs index 6dc60afe9..aa6a1e960 100644 --- a/test/web/mastodon_api/account_view_test.exs +++ b/test/web/mastodon_api/account_view_test.exs @@ -71,6 +71,20 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do      assert expected == AccountView.render("account.json", %{user: user})    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      user =        insert(:user, %{ diff --git a/test/web/twitter_api/util_controller_test.exs b/test/web/twitter_api/util_controller_test.exs index 832fdc096..426508353 100644 --- a/test/web/twitter_api/util_controller_test.exs +++ b/test/web/twitter_api/util_controller_test.exs @@ -3,6 +3,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do    alias Pleroma.Notification    alias Pleroma.Repo +  alias Pleroma.User    alias Pleroma.Web.CommonAPI    import Pleroma.Factory @@ -74,6 +75,26 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do      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      test "returns the state of safe_dm_mentions flag", %{conn: conn} do        option = Pleroma.Config.get([:instance, :safe_dm_mentions])  | 
