Merge develop
[akkoma] / lib / pleroma / web / web.ex
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Web do
6 @moduledoc """
7 A module that keeps using definitions for controllers,
8 views and so on.
9
10 This can be used in your application as:
11
12 use Pleroma.Web, :controller
13 use Pleroma.Web, :view
14
15 The definitions below will be executed for every view,
16 controller, etc, so keep them short and clean, focused
17 on imports, uses and aliases.
18
19 Do NOT define functions inside the quoted expressions
20 below.
21 """
22
23 def controller do
24 quote do
25 use Phoenix.Controller, namespace: Pleroma.Web
26 import Plug.Conn
27 import Pleroma.Web.Gettext
28 import Pleroma.Web.Router.Helpers
29
30 plug(:set_put_layout)
31
32 defp set_put_layout(conn, _) do
33 put_layout(conn, Pleroma.Config.get(:app_layout, "app.html"))
34 end
35 end
36 end
37
38 def view do
39 quote do
40 use Phoenix.View,
41 root: "lib/pleroma/web/templates",
42 namespace: Pleroma.Web
43
44 # Import convenience functions from controllers
45 import Phoenix.Controller, only: [get_csrf_token: 0, get_flash: 2, view_module: 1]
46
47 import Pleroma.Web.ErrorHelpers
48 import Pleroma.Web.Gettext
49 import Pleroma.Web.Router.Helpers
50
51 require Logger
52
53 @doc "Same as `render/3` but wrapped in a rescue block"
54 def safe_render(view, template, assigns \\ %{}) do
55 Phoenix.View.render(view, template, assigns)
56 rescue
57 error ->
58 Logger.error(
59 "#{__MODULE__} failed to render #{inspect({view, template})}: #{inspect(error)}"
60 )
61
62 Logger.error(inspect(__STACKTRACE__))
63 nil
64 end
65
66 @doc """
67 Same as `render_many/4` but wrapped in rescue block.
68 """
69 def safe_render_many(collection, view, template, assigns \\ %{}) do
70 Enum.map(collection, fn resource ->
71 as = Map.get(assigns, :as) || view.__resource__
72 assigns = Map.put(assigns, as, resource)
73 safe_render(view, template, assigns)
74 end)
75 |> Enum.filter(& &1)
76 end
77 end
78 end
79
80 def router do
81 quote do
82 use Phoenix.Router
83 # credo:disable-for-next-line Credo.Check.Consistency.MultiAliasImportRequireUse
84 import Plug.Conn
85 import Phoenix.Controller
86 end
87 end
88
89 def channel do
90 quote do
91 # credo:disable-for-next-line Credo.Check.Consistency.MultiAliasImportRequireUse
92 use Phoenix.Channel
93 import Pleroma.Web.Gettext
94 end
95 end
96
97 @doc """
98 When used, dispatch to the appropriate controller/view/etc.
99 """
100 defmacro __using__(which) when is_atom(which) do
101 apply(__MODULE__, which, [])
102 end
103
104 def base_url do
105 Pleroma.Web.Endpoint.url()
106 end
107 end