diff --git a/app/api/events/[slug]/registrations/export/route.ts b/app/api/events/[slug]/registrations/export/route.ts index 314f88bd..5edc493b 100644 --- a/app/api/events/[slug]/registrations/export/route.ts +++ b/app/api/events/[slug]/registrations/export/route.ts @@ -73,34 +73,33 @@ export async function GET( 'Full Name', 'Email', 'Phone', - 'Institution', - 'Department', - 'Year of Study', - 'Experience Level', 'Status', 'Payment Status', 'Payment Amount', - 'Registration Date', - 'Created At' + 'Registered On' ]; const csvRows = [headers.join(',')]; registrations?.forEach(reg => { + // Format date to be more readable (e.g., "Nov 19 2025") + const registeredDate = reg.created_at + ? new Date(reg.created_at).toLocaleDateString('en-US', { + year: 'numeric', + month: 'short', + day: 'numeric' + }).replace(/,/g, '') + : ''; + const row = [ reg.id, `"${reg.full_name || ''}"`, `"${reg.email || ''}"`, `"${reg.phone || ''}"`, - `"${reg.institution || ''}"`, - `"${reg.department || ''}"`, - `"${reg.year_of_study || ''}"`, - `"${reg.experience_level || ''}"`, reg.status, reg.payment_status, - reg.payment_amount || '', - reg.registration_date, - reg.created_at + reg.payment_amount ? `₹${reg.payment_amount / 100}` : 'N/A', + `"${registeredDate}"` ]; csvRows.push(row.join(',')); }); diff --git a/app/api/events/[slug]/registrations/route.ts b/app/api/events/[slug]/registrations/route.ts index 28adb264..9c02001d 100644 --- a/app/api/events/[slug]/registrations/route.ts +++ b/app/api/events/[slug]/registrations/route.ts @@ -94,11 +94,6 @@ export async function GET( query = query.eq('payment_status', paymentStatus); } - // Apply search (search in full_name, email, phone) - if (search) { - query = query.or(`full_name.ilike.%${search}%,email.ilike.%${search}%,phone.ilike.%${search}%`); - } - // Apply pagination query = query.range(offset, offset + limit - 1); @@ -155,9 +150,26 @@ export async function GET( }; }); + // Apply search filter after enrichment (search in profile_name, full_name, email, phone) + let filteredRegistrations = enrichedRegistrations || []; + if (search) { + const searchLower = search.toLowerCase(); + filteredRegistrations = filteredRegistrations.filter(reg => { + const profileName = reg.profile_name?.toLowerCase() || ''; + const fullName = reg.full_name?.toLowerCase() || ''; + const email = reg.email?.toLowerCase() || ''; + const phone = reg.phone?.toLowerCase() || ''; + + return profileName.includes(searchLower) || + fullName.includes(searchLower) || + email.includes(searchLower) || + phone.includes(searchLower); + }); + } + return NextResponse.json({ - registrations: enrichedRegistrations || [], - total: count || 0, + registrations: filteredRegistrations, + total: search ? filteredRegistrations.length : (count || 0), event: { id: event.id, title: event.title, diff --git a/app/api/hackathons/[id]/registrations/export/route.ts b/app/api/hackathons/[id]/registrations/export/route.ts index 5292b37b..4408ec22 100644 --- a/app/api/hackathons/[id]/registrations/export/route.ts +++ b/app/api/hackathons/[id]/registrations/export/route.ts @@ -1,8 +1,23 @@ import { NextRequest, NextResponse } from 'next/server'; -import { createClient } from '@/lib/supabase/server'; +import { createClient as createServerClient } from '@/lib/supabase/server'; +import { createClient } from '@supabase/supabase-js'; export const runtime = 'nodejs'; +// Create Supabase client with service role key to bypass RLS for master_registrations +const getServiceRoleClient = () => { + return createClient( + process.env.NEXT_PUBLIC_SUPABASE_URL!, + process.env.SUPABASE_SERVICE_ROLE_KEY!, + { + auth: { + autoRefreshToken: false, + persistSession: false + } + } + ); +}; + // GET: Export registrations as CSV export async function GET( request: NextRequest, @@ -10,10 +25,10 @@ export async function GET( ) { try { const { id } = await params; - const supabase = await createClient(); - - // Get the current user - const { data: { user }, error: authError } = await supabase.auth.getUser(); + + // Use server client for authentication + const serverClient = await createServerClient(); + const { data: { user }, error: authError } = await serverClient.auth.getUser(); if (authError || !user) { return NextResponse.json( @@ -22,6 +37,9 @@ export async function GET( ); } + // Use service role client for querying (bypasses RLS) + const supabase = getServiceRoleClient(); + // Get the hackathon by slug const { data: hackathon, error: hackathonError } = await supabase .from('hackathons') @@ -73,34 +91,33 @@ export async function GET( 'Full Name', 'Email', 'Phone', - 'Institution', - 'Department', - 'Year of Study', - 'Experience Level', 'Status', 'Payment Status', 'Payment Amount', - 'Registration Date', - 'Created At' + 'Registered On' ]; const csvRows = [headers.join(',')]; registrations?.forEach(reg => { + // Format date to be more readable (e.g., "Nov 19 2025") + const registeredDate = reg.created_at + ? new Date(reg.created_at).toLocaleDateString('en-US', { + year: 'numeric', + month: 'short', + day: 'numeric' + }).replace(/,/g, '') + : ''; + const row = [ reg.id, `"${reg.full_name || ''}"`, `"${reg.email || ''}"`, `"${reg.phone || ''}"`, - `"${reg.institution || ''}"`, - `"${reg.department || ''}"`, - `"${reg.year_of_study || ''}"`, - `"${reg.experience_level || ''}"`, reg.status, reg.payment_status, - reg.payment_amount || '', - reg.registration_date, - reg.created_at + reg.payment_amount ? `₹${reg.payment_amount / 100}` : 'N/A', + `"${registeredDate}"` ]; csvRows.push(row.join(',')); });