Merge branch 'feat/allow_alt_text_search_config' into 'develop'
[akkoma] / lib / pleroma / web / admin_api / controllers / config_controller.ex
index 742980976a28fedd69b7f1fc931474ec10971835..4ebf2a305c58c7ab142cb7133f67b5c213ba43e2 100644 (file)
@@ -1,5 +1,5 @@
 # Pleroma: A lightweight social networking server
-# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
+# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
 # SPDX-License-Identifier: AGPL-3.0-only
 
 defmodule Pleroma.Web.AdminAPI.ConfigController do
@@ -7,9 +7,10 @@ defmodule Pleroma.Web.AdminAPI.ConfigController do
 
   alias Pleroma.Config
   alias Pleroma.ConfigDB
-  alias Pleroma.Plugs.OAuthScopesPlug
+  alias Pleroma.Web.Plugs.OAuthScopesPlug
 
-  @descriptions Pleroma.Docs.JSON.compile()
+  plug(Pleroma.Web.ApiSpec.CastAndValidate)
+  plug(OAuthScopesPlug, %{scopes: ["write"], admin: true} when action == :update)
 
   plug(
     OAuthScopesPlug,
@@ -17,20 +18,24 @@ defmodule Pleroma.Web.AdminAPI.ConfigController do
     when action in [:show, :descriptions]
   )
 
-  plug(OAuthScopesPlug, %{scopes: ["write"], admin: true} when action == :update)
-
   action_fallback(Pleroma.Web.AdminAPI.FallbackController)
 
+  defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.Admin.ConfigOperation
+
   def descriptions(conn, _params) do
-    descriptions = Enum.filter(@descriptions, &whitelisted_config?/1)
+    descriptions = Enum.filter(Pleroma.Docs.JSON.compiled_descriptions(), &whitelisted_config?/1)
 
     json(conn, descriptions)
   end
 
-  def show(conn, %{"only_db" => true}) do
+  def show(conn, %{only_db: true}) do
     with :ok <- configurable_from_database() do
       configs = Pleroma.Repo.all(ConfigDB)
-      render(conn, "index.json", %{configs: configs})
+
+      render(conn, "index.json", %{
+        configs: configs,
+        need_reboot: Restarter.Pleroma.need_reboot?()
+      })
     end
   end
 
@@ -58,55 +63,50 @@ defmodule Pleroma.Web.AdminAPI.ConfigController do
                 value
               end
 
-            setting = %{
-              group: ConfigDB.convert(group),
-              key: ConfigDB.convert(key),
-              value: ConfigDB.convert(merged_value)
+            %ConfigDB{
+              group: group,
+              key: key,
+              value: merged_value
             }
-
-            if db, do: Map.put(setting, :db, db), else: setting
+            |> Pleroma.Maps.put_if_present(:db, db)
           end)
         end)
         |> List.flatten()
 
-      json(conn, %{configs: merged, need_reboot: Restarter.Pleroma.need_reboot?()})
+      render(conn, "index.json", %{
+        configs: merged,
+        need_reboot: Restarter.Pleroma.need_reboot?()
+      })
     end
   end
 
-  def update(conn, %{"configs" => configs}) do
+  def update(%{body_params: %{configs: configs}} = conn, _) do
     with :ok <- configurable_from_database() do
       results =
         configs
         |> Enum.filter(&whitelisted_config?/1)
         |> Enum.map(fn
-          %{"group" => group, "key" => key, "delete" => true} = params ->
-            ConfigDB.delete(%{group: group, key: key, subkeys: params["subkeys"]})
+          %{group: group, key: key, delete: true} = params ->
+            ConfigDB.delete(%{group: group, key: key, subkeys: params[:subkeys]})
 
-          %{"group" => group, "key" => key, "value" => value} ->
+          %{group: group, key: key, value: value} ->
             ConfigDB.update_or_create(%{group: group, key: key, value: value})
         end)
         |> Enum.reject(fn {result, _} -> result == :error end)
 
       {deleted, updated} =
         results
-        |> Enum.map(fn {:ok, config} ->
-          Map.put(config, :db, ConfigDB.get_db_keys(config))
-        end)
-        |> Enum.split_with(fn config ->
-          Ecto.get_meta(config, :state) == :deleted
+        |> Enum.map(fn {:ok, %{key: key, value: value} = config} ->
+          Map.put(config, :db, ConfigDB.get_db_keys(value, key))
         end)
+        |> Enum.split_with(&(Ecto.get_meta(&1, :state) == :deleted))
 
       Config.TransferTask.load_and_update_env(deleted, false)
 
       if not Restarter.Pleroma.need_reboot?() do
         changed_reboot_settings? =
           (updated ++ deleted)
-          |> Enum.any?(fn config ->
-            group = ConfigDB.from_string(config.group)
-            key = ConfigDB.from_string(config.key)
-            value = ConfigDB.from_binary(config.value)
-            Config.TransferTask.pleroma_need_restart?(group, key, value)
-          end)
+          |> Enum.any?(&Config.TransferTask.pleroma_need_restart?(&1.group, &1.key, &1.value))
 
         if changed_reboot_settings?, do: Restarter.Pleroma.need_reboot()
       end
@@ -122,7 +122,7 @@ defmodule Pleroma.Web.AdminAPI.ConfigController do
     if Config.get(:configurable_from_database) do
       :ok
     else
-      {:error, "To use this endpoint you need to enable configuration from database."}
+      {:error, "You must enable configurable_from_database in your config file."}
     end
   end
 
@@ -140,11 +140,11 @@ defmodule Pleroma.Web.AdminAPI.ConfigController do
     end
   end
 
-  defp whitelisted_config?(%{"group" => group, "key" => key}) do
+  defp whitelisted_config?(%{group: group, key: key}) do
     whitelisted_config?(group, key)
   end
 
-  defp whitelisted_config?(%{:group => group} = config) do
+  defp whitelisted_config?(%{group: group} = config) do
     whitelisted_config?(group, config[:key])
   end
 end