feat: Implement event image upload system for promoters

- Add Active Storage migrations for file attachments
- Update Event model to handle image uploads with validation
- Replace image URL fields with file upload in forms
- Add client-side image preview with validation
- Update all views to display uploaded images properly
- Fix JSON serialization to prevent stack overflow in API
- Add custom image validation methods for format and size
- Include image processing variants for different display sizes
- Fix promotion code test infrastructure and Stripe configuration

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
kbe
2025-09-30 00:41:03 +02:00
parent be7b3d5c18
commit 6be8b95ed3
22 changed files with 450 additions and 36 deletions

67
debug_test.rb Executable file
View File

@@ -0,0 +1,67 @@
#!/usr/bin/env ruby
# Debug script to understand the test failure
require_relative './config/environment'
# Load test data
user = User.find_by(email: 'user1@example.com')
event = Event.find_by(name: 'Summer Concert')
order = Order.find_by(status: 'draft')
puts "User: #{user.inspect}"
puts "Event: #{event.inspect}"
puts "Order: #{order.inspect}"
# Check if the user can manage events
puts "User can manage events: #{user.can_manage_events?}"
# Create a promotion code
promotion_code = PromotionCode.create(
code: "TESTDISCOUNT",
discount_amount_cents: 500,
expires_at: 1.month.from_now,
active: true,
user: user,
event: event
)
puts "Promotion code: #{promotion_code.inspect}"
puts "Promotion code valid?: #{promotion_code.valid_for_use?}"
# Try to create a ticket type and ticket
ticket_type = TicketType.create!(
name: "Test Ticket Type",
description: "A valid description for the ticket type that is long enough",
price_cents: 2000,
quantity: 10,
sale_start_at: Time.current,
sale_end_at: Time.current + 1.day,
requires_id: false,
event: event
)
puts "Ticket type: #{ticket_type.inspect}"
# Create ticket with all required fields
ticket = Ticket.create!(
order: order,
ticket_type: ticket_type,
status: "draft",
first_name: "John",
last_name: "Doe",
price_cents: 2000
)
puts "Ticket: #{ticket.inspect}"
puts "Ticket valid?: #{ticket.valid?}"
puts "Ticket errors: #{ticket.errors.full_messages}" unless ticket.valid?
# Recalculate order total
order.calculate_total!
puts "Order total: #{order.total_amount_cents}"
# Test the promotion code application
puts "Applying promotion code..."
order.promotion_codes << promotion_code
order.calculate_total!
puts "Order total after promotion: #{order.total_amount_cents}"