59c69aba114819b0e5c96e77e53484753e68f15d
[akkoma] / lib / pleroma / web / admin_api / controllers / frontend_controller.ex
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Web.AdminAPI.FrontendController do
6 use Pleroma.Web, :controller
7
8 alias Pleroma.Config
9 alias Pleroma.Web.Plugs.OAuthScopesPlug
10 alias Pleroma.Workers.FrontendInstallerWorker
11
12 plug(Pleroma.Web.ApiSpec.CastAndValidate)
13 plug(OAuthScopesPlug, %{scopes: ["write"], admin: true} when action == :install)
14 plug(OAuthScopesPlug, %{scopes: ["read"], admin: true} when action == :index)
15 action_fallback(Pleroma.Web.AdminAPI.FallbackController)
16
17 defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.Admin.FrontendOperation
18
19 def index(conn, _params) do
20 installed = installed()
21
22 frontends =
23 [:frontends, :available]
24 |> Config.get([])
25 |> Enum.map(fn {name, desc} ->
26 Map.put(desc, "installed", name in installed)
27 end)
28
29 render(conn, "index.json", frontends: frontends)
30 end
31
32 def install(%{body_params: params} = conn, _params) do
33 FrontendInstallerWorker.install(params.name, Map.delete(params, :name))
34
35 index(conn, %{})
36 end
37
38 defp installed do
39 File.ls!(Pleroma.Frontend.dir())
40 end
41 end