From 2e8c9eeccb9949b63293a2bf5ff83bb0e4aff0bc Mon Sep 17 00:00:00 2001 From: Moritz Date: Fri, 12 Dec 2025 16:09:37 +0100 Subject: [PATCH] feat: add error logging in after_action cycle generation hooks - Log warnings when cycle generation fails in Member create/update - Extract generate_fn to reduce code duplication - Improves debuggability of silent failures --- lib/membership/member.ex | 40 ++++++++++++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/lib/membership/member.ex b/lib/membership/member.ex index 702b436..ae32abd 100644 --- a/lib/membership/member.ex +++ b/lib/membership/member.ex @@ -112,14 +112,26 @@ defmodule Mv.Membership.Member do # but in test environment it runs synchronously for DB sandbox compatibility change after_action(fn _changeset, member, _context -> if member.membership_fee_type_id && member.join_date do + generate_fn = fn -> + case Mv.MembershipFees.CycleGenerator.generate_cycles_for_member(member.id) do + {:ok, _cycles} -> + :ok + + {:error, reason} -> + require Logger + + Logger.warning( + "Failed to generate cycles for member #{member.id}: #{inspect(reason)}" + ) + end + end + if Application.get_env(:mv, :sql_sandbox, false) do # Run synchronously in test environment for DB sandbox compatibility - Mv.MembershipFees.CycleGenerator.generate_cycles_for_member(member.id) + generate_fn.() else # Run asynchronously in other environments - Task.start(fn -> - Mv.MembershipFees.CycleGenerator.generate_cycles_for_member(member.id) - end) + Task.start(generate_fn) end end @@ -180,14 +192,26 @@ defmodule Mv.Membership.Member do Ash.Changeset.changing_attribute?(changeset, :membership_fee_type_id) if fee_type_changed && member.membership_fee_type_id && member.join_date do + generate_fn = fn -> + case Mv.MembershipFees.CycleGenerator.generate_cycles_for_member(member.id) do + {:ok, _cycles} -> + :ok + + {:error, reason} -> + require Logger + + Logger.warning( + "Failed to generate cycles for member #{member.id}: #{inspect(reason)}" + ) + end + end + if Application.get_env(:mv, :sql_sandbox, false) do # Run synchronously in test environment for DB sandbox compatibility - Mv.MembershipFees.CycleGenerator.generate_cycles_for_member(member.id) + generate_fn.() else # Run asynchronously in other environments - Task.start(fn -> - Mv.MembershipFees.CycleGenerator.generate_cycles_for_member(member.id) - end) + Task.start(generate_fn) end end