From 98ff6c19445c2acb4f1a41d8dea2ca071242dd4d Mon Sep 17 00:00:00 2001 From: Moritz Date: Tue, 16 Jun 2026 15:06:34 +0200 Subject: [PATCH] refactor(web): extract shared current_actor controller helper --- lib/mv_web/controllers/controller_helpers.ex | 22 +++++++++++++++++++ .../controllers/import_template_controller.ex | 8 ++----- .../controllers/member_export_controller.ex | 8 ++----- .../member_pdf_export_controller.ex | 10 ++------- 4 files changed, 28 insertions(+), 20 deletions(-) create mode 100644 lib/mv_web/controllers/controller_helpers.ex diff --git a/lib/mv_web/controllers/controller_helpers.ex b/lib/mv_web/controllers/controller_helpers.ex new file mode 100644 index 0000000..04087c0 --- /dev/null +++ b/lib/mv_web/controllers/controller_helpers.ex @@ -0,0 +1,22 @@ +defmodule MvWeb.ControllerHelpers do + @moduledoc """ + Shared helpers for plug-based controllers. + + The LiveView equivalent lives in `MvWeb.LiveHelpers`; this module is the + controller-side counterpart that works on a `Plug.Conn`. + """ + + alias Mv.Authorization.Actor + + @doc """ + Returns the request actor for a controller, loaded for authorization. + + Reads `:current_user` from the connection assigns and ensures it is loaded via + `Mv.Authorization.Actor.ensure_loaded/1`. + """ + @spec current_actor(Plug.Conn.t()) :: Mv.Accounts.User.t() | nil + def current_actor(conn) do + conn.assigns[:current_user] + |> Actor.ensure_loaded() + end +end diff --git a/lib/mv_web/controllers/import_template_controller.ex b/lib/mv_web/controllers/import_template_controller.ex index f040c7a..877697d 100644 --- a/lib/mv_web/controllers/import_template_controller.ex +++ b/lib/mv_web/controllers/import_template_controller.ex @@ -13,11 +13,12 @@ defmodule MvWeb.ImportTemplateController do """ use MvWeb, :controller - alias Mv.Authorization.Actor alias Mv.Membership.Member alias Mv.Membership.MembersCSV alias MvWeb.Authorization + import MvWeb.ControllerHelpers, only: [current_actor: 1] + # Standard member columns in template order, with their English and German headers # and a placeholder example value. Groups and fee type are importable extras. @columns [ @@ -105,11 +106,6 @@ defmodule MvWeb.ImportTemplateController do end end - defp current_actor(conn) do - conn.assigns[:current_user] - |> Actor.ensure_loaded() - end - defp return_forbidden(conn) do conn |> put_status(403) diff --git a/lib/mv_web/controllers/member_export_controller.ex b/lib/mv_web/controllers/member_export_controller.ex index 1f70a18..240db34 100644 --- a/lib/mv_web/controllers/member_export_controller.ex +++ b/lib/mv_web/controllers/member_export_controller.ex @@ -10,7 +10,6 @@ defmodule MvWeb.MemberExportController do require Ash.Query import Ash.Expr - alias Mv.Authorization.Actor alias Mv.Membership.CustomField alias Mv.Membership.CustomFieldSort alias Mv.Membership.Member @@ -18,6 +17,8 @@ defmodule MvWeb.MemberExportController do alias Mv.Membership.MembersCSV alias MvWeb.MemberLive.Index.MembershipFeeStatus alias MvWeb.Translations.MemberFields + + import MvWeb.ControllerHelpers, only: [current_actor: 1] use Gettext, backend: MvWeb.Gettext @member_fields_allowlist (Mv.Constants.member_fields() |> Enum.map(&Atom.to_string/1)) ++ @@ -53,11 +54,6 @@ defmodule MvWeb.MemberExportController do |> json(%{error: message}) end - defp current_actor(conn) do - conn.assigns[:current_user] - |> Actor.ensure_loaded() - end - defp return_forbidden(conn) do conn |> put_status(403) diff --git a/lib/mv_web/controllers/member_pdf_export_controller.ex b/lib/mv_web/controllers/member_pdf_export_controller.ex index f00c0d1..1e82898 100644 --- a/lib/mv_web/controllers/member_pdf_export_controller.ex +++ b/lib/mv_web/controllers/member_pdf_export_controller.ex @@ -10,10 +10,11 @@ defmodule MvWeb.MemberPdfExportController do require Logger - alias Mv.Authorization.Actor alias Mv.Membership.{MemberExport, MemberExport.Build, MembersPDF} alias MvWeb.Translations.MemberFields + import MvWeb.ControllerHelpers, only: [current_actor: 1] + use Gettext, backend: MvWeb.Gettext @payload_required_message "payload required" @@ -79,13 +80,6 @@ defmodule MvWeb.MemberPdfExportController do bad_request(conn, @payload_required_message) end - # --- Actor / auth --- - - defp current_actor(conn) do - conn.assigns[:current_user] - |> Actor.ensure_loaded() - end - defp forbidden(conn) do conn |> put_status(:forbidden)