Mechanical cleanup, quick fixes & deduplication closes #531 #543

Merged
moritz merged 17 commits from issue/mitgliederverwaltung-531 into main 2026-06-16 16:06:52 +02:00
4 changed files with 28 additions and 20 deletions
Showing only changes of commit 1adf6aa664 - Show all commits

View file

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

View file

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

View file

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

View file

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