diff --git a/lib/pleroma/web/admin_api/controllers/tag_controller.ex b/lib/pleroma/web/admin_api/controllers/tag_controller.ex index 60b5d2ab9..ee48efbd7 100644 --- a/lib/pleroma/web/admin_api/controllers/tag_controller.ex +++ b/lib/pleroma/web/admin_api/controllers/tag_controller.ex @@ -10,6 +10,7 @@ defmodule Pleroma.Web.AdminAPI.TagController do alias Pleroma.ModerationLog alias Pleroma.User alias Pleroma.Web.AdminAPI + alias Pleroma.Web.ApiSpec alias Pleroma.Web.Plugs.OAuthScopesPlug plug( @@ -22,15 +23,19 @@ defmodule Pleroma.Web.AdminAPI.TagController do %{scopes: ["read:accounts"], admin: true} when action in [:list] ) + plug(ApiSpec.CastAndValidate) + action_fallback(AdminAPI.FallbackController) + defdelegate open_api_operation(action), to: ApiSpec.Admin.TagOperation + def list(%{assigns: %{user: _admin}} = conn, _) do tags = Pleroma.Tag.list_tags() json(conn, tags) end - def tag(%{assigns: %{user: admin}} = conn, %{"nicknames" => nicknames, "tags" => tags}) do + def tag(%{assigns: %{user: admin}} = conn, %{nicknames: nicknames, tags: tags}) do with {:ok, _} <- User.tag(nicknames, tags) do ModerationLog.insert_log(%{ actor: admin, @@ -43,7 +48,7 @@ defmodule Pleroma.Web.AdminAPI.TagController do end end - def untag(%{assigns: %{user: admin}} = conn, %{"nicknames" => nicknames, "tags" => tags}) do + def untag(%{assigns: %{user: admin}} = conn, %{nicknames: nicknames, tags: tags}) do with {:ok, _} <- User.untag(nicknames, tags) do ModerationLog.insert_log(%{ actor: admin, diff --git a/lib/pleroma/web/api_spec/operations/admin/tag_operation.ex b/lib/pleroma/web/api_spec/operations/admin/tag_operation.ex new file mode 100644 index 000000000..83a6b5c26 --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/admin/tag_operation.ex @@ -0,0 +1,83 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.Admin.TagOperation do + alias OpenApiSpex.Operation + alias OpenApiSpex.Schema + + import Pleroma.Web.ApiSpec.Helpers + + def open_api_operation(action) do + operation = String.to_existing_atom("#{action}_operation") + apply(__MODULE__, operation, []) + end + + def list_operation do + %Operation{ + tags: ["Admin", "Tags"], + summary: "List available tags.", + operationId: "AdminAPI.TagController.list", + responses: %{ + 200 => + Operation.response("Array of tags", "application/json", %Schema{ + type: :array, + items: %Schema{type: :string} + }) + }, + security: [%{"oAuth" => ["read:accounts"]}] + } + end + + def tag_operation do + %Operation{ + tags: ["Admin", "Tags"], + summary: "Adds tags to users.", + operationId: "AdminAPI.TagController.tag", + parameters: [ + Operation.parameter( + :nicknames, + :query, + %Schema{type: :array, items: %Schema{type: :string}}, + "User's nicknames" + ), + Operation.parameter( + :tags, + :query, + %Schema{type: :array, items: %Schema{type: :string}}, + "tags" + ) + ], + responses: %{ + 200 => empty_object_response() + }, + security: [%{"oAuth" => ["write:accounts"]}] + } + end + + def untag_operation do + %Operation{ + tags: ["Admin", "Tags"], + summary: "Remove tags from users.", + operationId: "AdminAPI.TagController.untag", + parameters: [ + Operation.parameter( + :nicknames, + :query, + %Schema{type: :array, items: %Schema{type: :string}}, + "User's nicknames" + ), + Operation.parameter( + :tags, + :query, + %Schema{type: :array, items: %Schema{type: :string}}, + "tags" + ) + ], + responses: %{ + 200 => empty_object_response() + }, + security: [%{"oAuth" => ["write:accounts"]}] + } + end +end diff --git a/test/pleroma/web/admin_api/controllers/tag_controller_test.exs b/test/pleroma/web/admin_api/controllers/tag_controller_test.exs index 1ead1ca76..5d9963dcb 100644 --- a/test/pleroma/web/admin_api/controllers/tag_controller_test.exs +++ b/test/pleroma/web/admin_api/controllers/tag_controller_test.exs @@ -40,7 +40,7 @@ defmodule Pleroma.Web.AdminAPI.TagControllerTest do conn |> put_req_header("accept", "application/json") |> get("/api/pleroma/admin/users/tag") - |> json_response(200) + |> json_response_and_validate_schema(200) assert [ "mrf_tag:disable-any-subscription",