First
[anni] / lib / pleroma / web / admin_api / controllers / o_auth_app_controller.ex
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Web.AdminAPI.OAuthAppController do
6   use Pleroma.Web, :controller
7
8   import Pleroma.Web.ControllerHelper, only: [json_response: 3]
9
10   alias Pleroma.Web.OAuth.App
11   alias Pleroma.Web.Plugs.OAuthScopesPlug
12
13   require Logger
14
15   plug(Pleroma.Web.ApiSpec.CastAndValidate)
16
17   plug(
18     OAuthScopesPlug,
19     %{scopes: ["admin:write"]}
20     when action in [:create, :index, :update, :delete]
21   )
22
23   action_fallback(Pleroma.Web.AdminAPI.FallbackController)
24
25   defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.Admin.OAuthAppOperation
26
27   def index(conn, params) do
28     search_params =
29       params
30       |> Map.take([:client_id, :page, :page_size, :trusted])
31       |> Map.put(:client_name, params[:name])
32
33     with {:ok, apps, count} <- App.search(search_params) do
34       render(conn, "index.json",
35         apps: apps,
36         count: count,
37         page_size: params.page_size,
38         admin: true
39       )
40     end
41   end
42
43   def create(%{body_params: params} = conn, _) do
44     params = Pleroma.Maps.put_if_present(params, :client_name, params[:name])
45
46     case App.create(params) do
47       {:ok, app} ->
48         render(conn, "show.json", app: app, admin: true)
49
50       {:error, changeset} ->
51         json(conn, App.errors(changeset))
52     end
53   end
54
55   def update(%{body_params: params} = conn, %{id: id}) do
56     params = Pleroma.Maps.put_if_present(params, :client_name, params[:name])
57
58     with {:ok, app} <- App.update(id, params) do
59       render(conn, "show.json", app: app, admin: true)
60     else
61       {:error, changeset} ->
62         json(conn, App.errors(changeset))
63
64       nil ->
65         json_response(conn, :bad_request, "")
66     end
67   end
68
69   def delete(conn, params) do
70     with {:ok, _app} <- App.destroy(params.id) do
71       json_response(conn, :no_content, "")
72     else
73       _ -> json_response(conn, :bad_request, "")
74     end
75   end
76 end