Views: wrap activity rendering in a rescue

this avoids complete timeline breakage when an activity fucks up
rendering.
This commit is contained in:
href 2019-01-27 19:15:35 +01:00
parent 6383fa3a5d
commit f83bae7c22
No known key found for this signature in database
GPG Key ID: EE8296C1A152C325
3 changed files with 29 additions and 2 deletions

View File

@ -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)

View File

@ -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",

View File

@ -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