logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma git clone https://hacktivis.me/git/pleroma.git
commit: 2b39b36e490fc1222d8f3d737cb26e62af294e03
parent aa1fff279e98c6d16095538382413d3b870cee2b
Author: Tusooa Zhu <tusooa@kazv.moe>
Date:   Tue,  8 Mar 2022 16:59:20 -0500

Implement POST /api/v1/announcements/:id/dismiss

Diffstat:

Mlib/pleroma/web/api_spec/operations/announcement_operation.ex2+-
Mlib/pleroma/web/mastodon_api/controllers/announcement_controller.ex18++++++++++++------
Mtest/pleroma/web/mastodon_api/controllers/announcement_controller_test.exs50+++++++++++++++++++++++++++++++++++++++++++++++++-
3 files changed, 62 insertions(+), 8 deletions(-)

diff --git a/lib/pleroma/web/api_spec/operations/announcement_operation.ex b/lib/pleroma/web/api_spec/operations/announcement_operation.ex @@ -61,7 +61,7 @@ defmodule Pleroma.Web.ApiSpec.AnnouncementOperation do ) ], responses: %{ - 200 => Operation.response("Response", "application/json", Announcement), + 200 => Operation.response("Response", "application/json", %Schema{type: :object}), 403 => Operation.response("Forbidden", "application/json", ApiError), 404 => Operation.response("Not Found", "application/json", ApiError) } diff --git a/lib/pleroma/web/mastodon_api/controllers/announcement_controller.ex b/lib/pleroma/web/mastodon_api/controllers/announcement_controller.ex @@ -5,10 +5,10 @@ defmodule Pleroma.Web.MastodonAPI.AnnouncementController do use Pleroma.Web, :controller - # import Pleroma.Web.ControllerHelper, - # only: [ - # json_response: 3 - # ] + import Pleroma.Web.ControllerHelper, + only: [ + json_response: 3 + ] alias Pleroma.Announcement alias Pleroma.Web.Plugs.OAuthScopesPlug @@ -50,8 +50,14 @@ defmodule Pleroma.Web.MastodonAPI.AnnouncementController do end @doc "POST /api/v1/announcements/:id/dismiss" - def mark_read(_conn, _params) do - {:error, :not_found} + def mark_read(%{assigns: %{user: user}} = conn, %{id: id} = _params) do + with announcement when not is_nil(announcement) <- Announcement.get_by_id(id), + {:ok, _} <- Announcement.mark_read_by(announcement, user) do + json_response(conn, :ok, %{}) + else + _ -> + {:error, :not_found} + end end @doc "POST /api/v1/announcements/:id" diff --git a/test/pleroma/web/mastodon_api/controllers/announcement_controller_test.exs b/test/pleroma/web/mastodon_api/controllers/announcement_controller_test.exs @@ -2,11 +2,12 @@ # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/> # SPDX-License-Identifier: AGPL-3.0-only -defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do +defmodule Pleroma.Web.MastodonAPI.AnnouncementControllerTest do use Pleroma.Web.ConnCase import Pleroma.Factory + alias Pleroma.Announcement alias Pleroma.AnnouncementReadRelationship describe "GET /api/v1/announcements" do @@ -103,4 +104,51 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do assert %{"id" => ^id, "read" => true} = response end end + + describe "POST /api/v1/announcements/:id/dismiss" do + setup do: oauth_access(["write:accounts"]) + + test "it requires auth", %{conn: conn} do + %{id: id} = insert(:announcement) + + _response = + conn + |> assign(:token, nil) + |> post("/api/v1/announcements/#{id}/dismiss") + |> json_response_and_validate_schema(:forbidden) + end + + test "it requires write:accounts oauth scope" do + %{id: id} = insert(:announcement) + + %{conn: conn} = oauth_access(["read:accounts"]) + + _response = + conn + |> post("/api/v1/announcements/#{id}/dismiss") + |> json_response_and_validate_schema(:forbidden) + end + + test "it gives 404 for non-existent announcements", %{conn: conn} do + %{id: id} = insert(:announcement) + + _response = + conn + |> post("/api/v1/announcements/#{id}xxx/dismiss") + |> json_response_and_validate_schema(:not_found) + end + + test "it marks announcement as read", %{user: user, conn: conn} do + %{id: id} = announcement = insert(:announcement) + + refute Announcement.read_by?(announcement, user) + + _response = + conn + |> post("/api/v1/announcements/#{id}/dismiss") + |> json_response_and_validate_schema(:ok) + + assert Announcement.read_by?(announcement, user) + end + end end