logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma git clone https://hacktivis.me/git/pleroma.git

settings_controller.ex (1843B)


  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. defmodule Pleroma.Web.PleromaAPI.SettingsController do
  5. use Pleroma.Web, :controller
  6. alias Pleroma.Web.Plugs.OAuthScopesPlug
  7. plug(Pleroma.Web.ApiSpec.CastAndValidate)
  8. plug(
  9. OAuthScopesPlug,
  10. %{scopes: ["write:accounts"]} when action in [:update]
  11. )
  12. plug(
  13. OAuthScopesPlug,
  14. %{scopes: ["read:accounts"]} when action in [:show]
  15. )
  16. defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.PleromaSettingsOperation
  17. @doc "GET /api/v1/pleroma/settings/:app"
  18. def show(%{assigns: %{user: user}} = conn, %{app: app} = _params) do
  19. conn
  20. |> json(get_settings(user, app))
  21. end
  22. @doc "PATCH /api/v1/pleroma/settings/:app"
  23. def update(%{assigns: %{user: user}, body_params: body_params} = conn, %{app: app} = _params) do
  24. settings =
  25. get_settings(user, app)
  26. |> merge_recursively(body_params)
  27. with changeset <-
  28. Pleroma.User.update_changeset(
  29. user,
  30. %{pleroma_settings_store: %{app => settings}}
  31. ),
  32. {:ok, _} <- Pleroma.Repo.update(changeset) do
  33. conn
  34. |> json(settings)
  35. end
  36. end
  37. defp merge_recursively(old, %{} = new) do
  38. old = ensure_object(old)
  39. Enum.reduce(
  40. new,
  41. old,
  42. fn
  43. {k, nil}, acc ->
  44. Map.drop(acc, [k])
  45. {k, %{} = new_child}, acc ->
  46. Map.put(acc, k, merge_recursively(acc[k], new_child))
  47. {k, v}, acc ->
  48. Map.put(acc, k, v)
  49. end
  50. )
  51. end
  52. defp get_settings(user, app) do
  53. user.pleroma_settings_store
  54. |> Map.get(app, %{})
  55. |> ensure_object()
  56. end
  57. defp ensure_object(%{} = object) do
  58. object
  59. end
  60. defp ensure_object(_) do
  61. %{}
  62. end
  63. end