forked from AkkomaGang/akkoma
Views: wrap activity rendering in a rescue
this avoids complete timeline breakage when an activity fucks up rendering.
This commit is contained in:
parent
6383fa3a5d
commit
f83bae7c22
3 changed files with 29 additions and 2 deletions
|
@ -49,7 +49,7 @@ def render("index.json", opts) do
|
||||||
replied_to_activities = get_replied_to_activities(opts.activities)
|
replied_to_activities = get_replied_to_activities(opts.activities)
|
||||||
|
|
||||||
opts.activities
|
opts.activities
|
||||||
|> render_many(
|
|> safe_render_many(
|
||||||
StatusView,
|
StatusView,
|
||||||
"status.json",
|
"status.json",
|
||||||
Map.put(opts, :replied_to_activities, replied_to_activities)
|
Map.put(opts, :replied_to_activities, replied_to_activities)
|
||||||
|
|
|
@ -114,7 +114,7 @@ def render("index.json", opts) do
|
||||||
|> Map.put(:context_ids, context_ids)
|
|> Map.put(:context_ids, context_ids)
|
||||||
|> Map.put(:users, users)
|
|> Map.put(:users, users)
|
||||||
|
|
||||||
render_many(
|
safe_render_many(
|
||||||
opts.activities,
|
opts.activities,
|
||||||
ActivityView,
|
ActivityView,
|
||||||
"activity.json",
|
"activity.json",
|
||||||
|
|
|
@ -38,6 +38,33 @@ def view do
|
||||||
import Phoenix.Controller, only: [get_csrf_token: 0, get_flash: 2, view_module: 1]
|
import Phoenix.Controller, only: [get_csrf_token: 0, get_flash: 2, view_module: 1]
|
||||||
|
|
||||||
import Pleroma.Web.{ErrorHelpers, Gettext, Router.Helpers}
|
import Pleroma.Web.{ErrorHelpers, Gettext, 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})}: #{inspect(error)}"
|
||||||
|
)
|
||||||
|
|
||||||
|
Logger.error(inspect(__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
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue