fix: Eliminate duplicate email notifications after Stripe checkout
Previously, users received multiple emails after successful payment: - One email per individual ticket (via orders_controller.rb) - One order-level email with all tickets (via order.rb mark_as_paid!) This resulted in N+1 emails for N tickets purchased. Changes: - Removed individual ticket email sending from orders_controller.rb - Kept single comprehensive order email in order.rb - Updated test to reflect that email failures don't prevent order completion - Users now receive exactly one email with all tickets as PDF attachments 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -188,15 +188,8 @@ class OrdersController < ApplicationController
|
|||||||
# Don't fail the payment process due to job scheduling issues
|
# Don't fail the payment process due to job scheduling issues
|
||||||
end
|
end
|
||||||
|
|
||||||
# Send confirmation emails
|
# Email confirmation is handled by the order model's mark_as_paid! method
|
||||||
@order.tickets.each do |ticket|
|
# to avoid duplicate emails
|
||||||
begin
|
|
||||||
TicketMailer.purchase_confirmation(ticket).deliver_now
|
|
||||||
rescue => e
|
|
||||||
Rails.logger.error "Failed to send confirmation email for ticket #{ticket.id}: #{e.message}"
|
|
||||||
# Don't fail the entire payment process due to email/PDF generation issues
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# Clear session data
|
# Clear session data
|
||||||
session.delete(:pending_cart)
|
session.delete(:pending_cart)
|
||||||
|
|||||||
@@ -25,15 +25,14 @@ class OrderEmailTest < ActiveSupport::TestCase
|
|||||||
assert @order.tickets.all? { |ticket| ticket.status == "active" }
|
assert @order.tickets.all? { |ticket| ticket.status == "active" }
|
||||||
end
|
end
|
||||||
|
|
||||||
test "email sending is part of the transaction" do
|
test "email sending failure does not prevent order completion" do
|
||||||
# Mock mailer to raise an error
|
# Mock mailer to raise an error
|
||||||
TicketMailer.stubs(:purchase_confirmation_order).raises(StandardError.new("Email error"))
|
TicketMailer.stubs(:purchase_confirmation_order).raises(StandardError.new("Email error"))
|
||||||
|
|
||||||
assert_raises(StandardError) do
|
# Should not raise error - email failure is logged but doesn't fail the payment
|
||||||
@order.mark_as_paid!
|
@order.mark_as_paid!
|
||||||
end
|
|
||||||
|
|
||||||
# Order should not be marked as paid if email fails
|
# Order should still be marked as paid even if email fails
|
||||||
assert_equal "draft", @order.reload.status
|
assert_equal "paid", @order.reload.status
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
Reference in New Issue
Block a user