Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 12 additions & 13 deletions app/api/events/[slug]/registrations/export/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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(','));
});
Expand Down
26 changes: 19 additions & 7 deletions app/api/events/[slug]/registrations/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down Expand Up @@ -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,
Expand Down
53 changes: 35 additions & 18 deletions app/api/hackathons/[id]/registrations/export/route.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,34 @@
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,
{ params }: { params: Promise<{ id: string }> }
) {
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(
Expand All @@ -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')
Expand Down Expand Up @@ -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(','));
});
Expand Down
Loading