logo

pleroma

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

media_proxy_cache_controller.ex (2225B)


  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.AdminAPI.MediaProxyCacheController do
  5. use Pleroma.Web, :controller
  6. alias Pleroma.Web.ApiSpec.Admin, as: Spec
  7. alias Pleroma.Web.MediaProxy
  8. alias Pleroma.Web.Plugs.OAuthScopesPlug
  9. @cachex Pleroma.Config.get([:cachex, :provider], Cachex)
  10. plug(Pleroma.Web.ApiSpec.CastAndValidate, replace_params: false)
  11. plug(
  12. OAuthScopesPlug,
  13. %{scopes: ["admin:read:media_proxy_caches"]} when action in [:index]
  14. )
  15. plug(
  16. OAuthScopesPlug,
  17. %{scopes: ["admin:write:media_proxy_caches"]} when action in [:purge, :delete]
  18. )
  19. action_fallback(Pleroma.Web.AdminAPI.FallbackController)
  20. defdelegate open_api_operation(action), to: Spec.MediaProxyCacheOperation
  21. def index(%{assigns: %{user: _}, private: %{open_api_spex: %{params: params}}} = conn, _) do
  22. entries = fetch_entries(params)
  23. urls = paginate_entries(entries, params.page, params.page_size)
  24. render(conn, "index.json",
  25. urls: urls,
  26. page_size: params.page_size,
  27. count: length(entries)
  28. )
  29. end
  30. defp fetch_entries(params) do
  31. MediaProxy.cache_table()
  32. |> @cachex.stream!(Cachex.Query.create(true, :key))
  33. |> filter_entries(params[:query])
  34. end
  35. defp filter_entries(stream, query) when is_binary(query) do
  36. regex = ~r/#{query}/i
  37. stream
  38. |> Enum.filter(fn url -> String.match?(url, regex) end)
  39. |> Enum.to_list()
  40. end
  41. defp filter_entries(stream, _), do: Enum.to_list(stream)
  42. defp paginate_entries(entries, page, page_size) do
  43. offset = page_size * (page - 1)
  44. Enum.slice(entries, offset, page_size)
  45. end
  46. def delete(
  47. %{assigns: %{user: _}, private: %{open_api_spex: %{body_params: %{urls: urls}}}} = conn,
  48. _
  49. ) do
  50. MediaProxy.remove_from_banned_urls(urls)
  51. json(conn, %{})
  52. end
  53. def purge(
  54. %{assigns: %{user: _}, private: %{open_api_spex: %{body_params: %{urls: urls, ban: ban}}}} =
  55. conn,
  56. _
  57. ) do
  58. MediaProxy.Invalidation.purge(urls)
  59. if ban do
  60. MediaProxy.put_in_banned_urls(urls)
  61. end
  62. json(conn, %{})
  63. end
  64. end