From 0b0e95978f41757c2d27e710bd9fbd2fe21b3671 Mon Sep 17 00:00:00 2001 From: Emiel Date: Wed, 11 Sep 2024 16:14:37 +0200 Subject: [PATCH] #855 Participant who does not give consent causes runaway memory usage --- core/systems/assignment/_public.ex | 7 +++++++ core/systems/assignment/controller.ex | 14 ++++++++++++++ core/systems/assignment/crew_page.ex | 17 +++++++++++++---- core/systems/assignment/declined_view.ex | 4 +++- .../assignment/onboarding_consent_view.ex | 4 ++-- core/systems/storage/delivery.ex | 4 +++- 6 files changed, 42 insertions(+), 8 deletions(-) diff --git a/core/systems/assignment/_public.ex b/core/systems/assignment/_public.ex index 140c70890..64e64e128 100644 --- a/core/systems/assignment/_public.ex +++ b/core/systems/assignment/_public.ex @@ -342,6 +342,13 @@ defmodule Systems.Assignment.Public do end end + def participant_id(%Assignment.Model{crew: crew}, user) do + case Crew.Public.get_member_unsafe(crew, user) do + %{public_id: public_id} -> {:ok, public_id} + _ -> :error + end + end + def owner!(%Assignment.Model{} = assignment), do: parent_owner!(assignment) def owner!(%Workflow.Model{} = workflow), do: parent_owner!(workflow) def owner!(%Workflow.ItemModel{} = item), do: parent_owner!(item) diff --git a/core/systems/assignment/controller.ex b/core/systems/assignment/controller.ex index 8323cbfc8..47acc55d4 100644 --- a/core/systems/assignment/controller.ex +++ b/core/systems/assignment/controller.ex @@ -58,9 +58,23 @@ defmodule Systems.Assignment.Controller do defp start_participant(conn, %{id: id} = assignment) do conn |> authorize_user(assignment) + |> add_panel_info(assignment) |> redirect(to: ~p"/assignment/#{id}") end + defp add_panel_info(%{assigns: %{current_user: user}} = conn, assignment) do + {:ok, participant} = Assignment.Public.participant_id(assignment, user) + + panel_info = %{ + panel: :next, + embedded?: false, + participant: participant, + query_string: [] + } + + conn |> put_session(:panel_info, panel_info) + end + defp authorize_user(%{assigns: %{current_user: user}} = conn, %Assignment.Model{} = assignment) do Assignment.Public.add_participant!(assignment, user) conn diff --git a/core/systems/assignment/crew_page.ex b/core/systems/assignment/crew_page.ex index ffc441e8b..debf81504 100644 --- a/core/systems/assignment/crew_page.ex +++ b/core/systems/assignment/crew_page.ex @@ -50,6 +50,14 @@ defmodule Systems.Assignment.CrewPage do } end + @impl true + def compose(:declined_view, _) do + %{ + module: Assignment.DeclinedView, + params: %{} + } + end + @impl true def handle_view_model_updated(socket) do socket @@ -132,10 +140,9 @@ defmodule Systems.Assignment.CrewPage do if embedded? do socket else - title = dgettext("eyra-assignment", "declined_view.title") - child = prepare_child(socket, :declined_view, Assignment.DeclinedView, %{title: title}) - modal = %{live_component: child, style: :notification} - assign(socket, modal: modal) + socket + |> compose_child(:declined_view) + |> show_modal(:declined_view, :notification) end {:noreply, socket} @@ -158,6 +165,8 @@ defmodule Systems.Assignment.CrewPage do @impl true def handle_event(name, event, socket) do + Logger.warn("forwarding to flow: name=#{name}, event=#{inspect(event)}") + { :noreply, socket |> send_event(:flow, name, event) diff --git a/core/systems/assignment/declined_view.ex b/core/systems/assignment/declined_view.ex index 79d16ffd4..dd294d29b 100644 --- a/core/systems/assignment/declined_view.ex +++ b/core/systems/assignment/declined_view.ex @@ -6,10 +6,11 @@ defmodule Systems.Assignment.DeclinedView do @impl true def update(_, socket) do body = dgettext("eyra-assignment", "declined_view.body") + title = dgettext("eyra-assignment", "declined_view.title") { :ok, - socket |> assign(body: body) + socket |> assign(body: body, title: title) } end @@ -17,6 +18,7 @@ defmodule Systems.Assignment.DeclinedView do def render(assigns) do ~H"""
+ <%= @title %>
<%= raw @body %> diff --git a/core/systems/assignment/onboarding_consent_view.ex b/core/systems/assignment/onboarding_consent_view.ex index c82b4f9b4..e48adaeac 100644 --- a/core/systems/assignment/onboarding_consent_view.ex +++ b/core/systems/assignment/onboarding_consent_view.ex @@ -33,12 +33,12 @@ defmodule Systems.Assignment.OnboardingConsentView do end @impl true - def handle_event("accept", _payload, socket) do + def handle_event("accept", %{source: %{name: :clickwrap_view}}, socket) do {:noreply, socket |> send_event(:parent, "accept")} end @impl true - def handle_event("decline", _payload, socket) do + def handle_event("decline", %{source: %{name: :clickwrap_view}}, socket) do {:noreply, socket |> send_event(:parent, "decline")} end diff --git a/core/systems/storage/delivery.ex b/core/systems/storage/delivery.ex index e2d36d795..8fdb77287 100644 --- a/core/systems/storage/delivery.ex +++ b/core/systems/storage/delivery.ex @@ -28,7 +28,9 @@ defmodule Systems.Storage.Delivery do end def deliver(backend, endpoint, data, meta_data) do - Logger.notice("[Storage.Delivery] deliver", ansi_color: :light_magenta) + Logger.notice("[Storage.Delivery] deliver #{byte_size(data)} bytes", + ansi_color: :light_magenta + ) try do backend.store(endpoint, data, meta_data)