fix: Implement comprehensive edit event button functionality and resolve authentication issues

Major fixes and improvements:
- Fixed edit event button functionality with proper event handlers and DOM ready state checking
- Added status column to tickets table via Supabase migration to resolve 500 API errors
- Updated stats API to correctly calculate revenue from decimal price values
- Resolved authentication redirect loops by fixing cookie configuration for Docker environment
- Fixed Permissions-Policy header syntax errors
- Added comprehensive debugging and error handling for event management
- Implemented modal-based event editing with form validation and API integration
- Enhanced event data loading with proper error handling and user feedback

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

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-07-14 18:49:49 -06:00
parent b07ee8cdff
commit dbf4b11e81
216 changed files with 15891 additions and 468 deletions

118
verify-schema.cjs Normal file
View File

@@ -0,0 +1,118 @@
const { createClient } = require('@supabase/supabase-js');
require('dotenv').config();
const supabaseUrl = process.env.PUBLIC_SUPABASE_URL;
const supabaseServiceKey = process.env.SUPABASE_SERVICE_ROLE_KEY;
if (!supabaseUrl || !supabaseServiceKey) {
console.error('❌ Missing required environment variables');
process.exit(1);
}
const supabase = createClient(supabaseUrl, supabaseServiceKey, {
auth: {
autoRefreshToken: false,
persistSession: false
}
});
async function verifySchema() {
console.log('🔍 Verifying database schema...');
try {
// Check if tables exist and what columns they have
const eventId = '7ac12bd2-8509-4db3-b1bc-98a808646311';
console.log('\n1⃣ Checking events table...');
const { data: eventData, error: eventError } = await supabase
.from('events')
.select('*')
.eq('id', eventId)
.single();
if (eventError) {
console.error('❌ Event query error:', eventError);
} else {
console.log('✅ Event found:', eventData.title);
console.log('Columns:', Object.keys(eventData));
}
console.log('\n2⃣ Checking ticket_types table...');
const { data: ticketTypesData, error: ticketTypesError } = await supabase
.from('ticket_types')
.select('*')
.eq('event_id', eventId)
.limit(1);
if (ticketTypesError) {
console.error('❌ Ticket types query error:', ticketTypesError);
} else {
console.log(`✅ Found ${ticketTypesData.length} ticket types`);
if (ticketTypesData.length > 0) {
console.log('Columns:', Object.keys(ticketTypesData[0]));
console.log('Sample:', ticketTypesData[0]);
}
}
console.log('\n3⃣ Checking tickets table...');
const { data: ticketsData, error: ticketsError } = await supabase
.from('tickets')
.select('*')
.eq('event_id', eventId)
.limit(1);
if (ticketsError) {
console.error('❌ Tickets query error:', ticketsError);
} else {
console.log(`✅ Found ${ticketsData.length} tickets`);
if (ticketsData.length > 0) {
console.log('Columns:', Object.keys(ticketsData[0]));
console.log('Sample:', ticketsData[0]);
}
}
console.log('\n4⃣ Testing the exact stats query...');
// Test the exact query from the stats API
const { data: testTickets, error: testError } = await supabase
.from('tickets')
.select(`
id,
ticket_type_id,
price,
checked_in,
scanned_at,
created_at
`)
.eq('event_id', eventId);
if (testError) {
console.error('❌ Stats query error:', testError);
} else {
console.log(`✅ Stats query successful: ${testTickets.length} tickets`);
if (testTickets.length > 0) {
console.log('Sample ticket:', testTickets[0]);
}
}
console.log('\n5⃣ Testing ticket types query...');
const { data: testTicketTypes, error: testTicketTypesError } = await supabase
.from('ticket_types')
.select('id, quantity_available, price, name')
.eq('event_id', eventId);
if (testTicketTypesError) {
console.error('❌ Ticket types stats query error:', testTicketTypesError);
} else {
console.log(`✅ Ticket types query successful: ${testTicketTypes.length} types`);
if (testTicketTypes.length > 0) {
console.log('Sample type:', testTicketTypes[0]);
}
}
} catch (error) {
console.error('💥 Unexpected error:', error);
}
}
verifySchema();