Migrate Pleroma.Web to phoenix 1.6 formats
[akkoma] / lib / pleroma / web.ex
index 8630f244b8505dc5bba489fa88f72061f1b65396..ecd98b6cab6e1ccbe7480dcc1925be8ad7143a4b 100644 (file)
@@ -35,9 +35,10 @@ defmodule Pleroma.Web do
       import Plug.Conn
 
       import Pleroma.Web.Gettext
-      import Pleroma.Web.Router.Helpers
       import Pleroma.Web.TranslationHelpers
 
+      alias Pleroma.Web.Router.Helpers, as: Routes
+
       plug(:set_put_layout)
 
       defp set_put_layout(conn, _) do
@@ -55,12 +56,23 @@ defmodule Pleroma.Web do
               plug_module.skip_plug(conn)
             rescue
               UndefinedFunctionError ->
-                raise "`#{plug_module}` is not skippable. Append `use Pleroma.Web, :plug` to its code."
+                reraise(
+                  "`#{plug_module}` is not skippable. Append `use Pleroma.Web, :plug` to its code.",
+                  __STACKTRACE__
+                )
             end
           end
         )
       end
 
+      defp skip_auth(conn, _) do
+        skip_plug(conn, [OAuthScopesPlug, EnsurePublicOrAuthenticatedPlug])
+      end
+
+      defp skip_public_check(conn, _) do
+        skip_plug(conn, EnsurePublicOrAuthenticatedPlug)
+      end
+
       # Executed just before actual controller action, invokes before-action hooks (callbacks)
       defp action(conn, params) do
         with %{halted: false} = conn <-
@@ -120,65 +132,6 @@ defmodule Pleroma.Web do
     end
   end
 
-  def view do
-    quote do
-      use Phoenix.View,
-        root: "lib/pleroma/web/templates",
-        namespace: Pleroma.Web
-
-      # Import convenience functions from controllers
-      import Phoenix.Controller, only: [get_csrf_token: 0, get_flash: 2, view_module: 1]
-
-      import Pleroma.Web.ErrorHelpers
-      import Pleroma.Web.Gettext
-      import Pleroma.Web.Router.Helpers
-
-      require Logger
-
-      @doc "Same as `render/3` but wrapped in a rescue block"
-      def safe_render(view, template, assigns \\ %{}) do
-        Phoenix.View.render(view, template, assigns)
-      rescue
-        error ->
-          Logger.error(
-            "#{__MODULE__} failed to render #{inspect({view, template})}\n" <>
-              Exception.format(:error, error, __STACKTRACE__)
-          )
-
-          nil
-      end
-
-      @doc """
-      Same as `render_many/4` but wrapped in rescue block.
-      """
-      def safe_render_many(collection, view, template, assigns \\ %{}) do
-        Enum.map(collection, fn resource ->
-          as = Map.get(assigns, :as) || view.__resource__
-          assigns = Map.put(assigns, as, resource)
-          safe_render(view, template, assigns)
-        end)
-        |> Enum.filter(& &1)
-      end
-    end
-  end
-
-  def router do
-    quote do
-      use Phoenix.Router
-      # credo:disable-for-next-line Credo.Check.Consistency.MultiAliasImportRequireUse
-      import Plug.Conn
-      import Phoenix.Controller
-    end
-  end
-
-  def channel do
-    quote do
-      # credo:disable-for-next-line Credo.Check.Consistency.MultiAliasImportRequireUse
-      import Phoenix.Channel
-      import Pleroma.Web.Gettext
-    end
-  end
-
   def plug do
     quote do
       @behaviour Pleroma.Web.Plug
@@ -223,26 +176,84 @@ defmodule Pleroma.Web do
     end
   end
 
+  def view do
+    quote do
+      use Phoenix.View,
+        root: "lib/pleroma/web/templates",
+        namespace: Pleroma.Web
+
+      # Import convenience functions from controllers
+      import Phoenix.Controller,
+        only: [get_flash: 1, get_flash: 2, view_module: 1, view_template: 1]
+
+      # Include shared imports and aliases for views
+      unquote(view_helpers())
+    end
+  end
+
+  def live_view do
+    quote do
+      use Phoenix.LiveView,
+        layout: {Pleroma.Web.LayoutView, "live.html"}
+
+      unquote(view_helpers())
+    end
+  end
+
+  def live_component do
+    quote do
+      use Phoenix.LiveComponent
+
+      unquote(view_helpers())
+    end
+  end
+
+  def component do
+    quote do
+      use Phoenix.Component
+
+      unquote(view_helpers())
+    end
+  end
+
+  def router do
+    quote do
+      use Phoenix.Router
+
+      import Plug.Conn
+      import Phoenix.Controller
+      import Phoenix.LiveView.Router
+    end
+  end
+
+  def channel do
+    quote do
+      use Phoenix.Channel
+      import Pleroma.Web.Gettext
+    end
+  end
+
+  defp view_helpers do
+    quote do
+      # Use all HTML functionality (forms, tags, etc)
+      use Phoenix.HTML
+
+      # Import LiveView and .heex helpers (live_render, live_patch, <.form>, etc)
+      import Phoenix.LiveView.Helpers
+
+      # Import basic rendering functionality (render, render_layout, etc)
+      import Phoenix.View
+
+      import Pleroma.Web.ErrorHelpers
+      import Pleroma.Web.Gettext
+      alias Pleroma.Web.Router.Helpers, as: Routes
+    end
+  end
+
   @doc """
   When used, dispatch to the appropriate controller/view/etc.
   """
   defmacro __using__(which) when is_atom(which) do
     apply(__MODULE__, which, [])
   end
-
-  def base_url do
-    Pleroma.Web.Endpoint.url()
-  end
-
-  # TODO: Change to Phoenix.Router.routes/1 for Phoenix 1.6.0+
-  def get_api_routes do
-    Pleroma.Web.Router.__routes__()
-    |> Enum.reject(fn r -> r.plug == Pleroma.Web.Fallback.RedirectController end)
-    |> Enum.map(fn r ->
-      r.path
-      |> String.split("/", trim: true)
-      |> List.first()
-    end)
-    |> Enum.uniq()
-  end
 end