Initial commit - Black Canyon Tickets whitelabel platform
🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
120
src/pages/api/admin/events.ts
Normal file
120
src/pages/api/admin/events.ts
Normal file
@@ -0,0 +1,120 @@
|
||||
import type { APIRoute } from 'astro';
|
||||
import { createClient } from '@supabase/supabase-js';
|
||||
import { logAPIRequest } from '../../../lib/logger';
|
||||
|
||||
// Handle missing environment variables gracefully
|
||||
const supabaseUrl = process.env.SUPABASE_URL || import.meta.env.SUPABASE_URL || 'https://zctjaivtfyfxokfaemek.supabase.co';
|
||||
const supabaseServiceKey = process.env.SUPABASE_SERVICE_KEY || import.meta.env.SUPABASE_SERVICE_KEY || '';
|
||||
|
||||
let supabase: any = null;
|
||||
try {
|
||||
if (supabaseUrl && supabaseServiceKey) {
|
||||
supabase = createClient(supabaseUrl, supabaseServiceKey);
|
||||
}
|
||||
} catch (error) {
|
||||
// Silently handle Supabase initialization errors
|
||||
}
|
||||
|
||||
export const GET: APIRoute = async ({ request, url }) => {
|
||||
const startTime = Date.now();
|
||||
const clientIP = request.headers.get('x-forwarded-for') || request.headers.get('x-real-ip') || 'unknown';
|
||||
const userAgent = request.headers.get('user-agent') || 'unknown';
|
||||
|
||||
try {
|
||||
if (!supabase) {
|
||||
return new Response(JSON.stringify({
|
||||
success: false,
|
||||
error: 'Database not available'
|
||||
}), {
|
||||
status: 500,
|
||||
headers: { 'Content-Type': 'application/json' }
|
||||
});
|
||||
}
|
||||
|
||||
// Get all events with organization info (admin view)
|
||||
const { data: events, error } = await supabase
|
||||
.from('events')
|
||||
.select(`
|
||||
id,
|
||||
title,
|
||||
description,
|
||||
venue,
|
||||
start_time,
|
||||
end_time,
|
||||
image_url,
|
||||
slug,
|
||||
category,
|
||||
is_featured,
|
||||
is_public,
|
||||
is_published,
|
||||
external_source,
|
||||
organization_id,
|
||||
created_at
|
||||
`)
|
||||
.order('created_at', { ascending: false });
|
||||
|
||||
if (error) {
|
||||
return new Response(JSON.stringify({
|
||||
success: false,
|
||||
error: error.message
|
||||
}), {
|
||||
status: 500,
|
||||
headers: { 'Content-Type': 'application/json' }
|
||||
});
|
||||
}
|
||||
|
||||
const responseTime = Date.now() - startTime;
|
||||
|
||||
logAPIRequest({
|
||||
method: 'GET',
|
||||
url: url.pathname + url.search,
|
||||
statusCode: 200,
|
||||
responseTime,
|
||||
ipAddress: clientIP,
|
||||
userAgent
|
||||
});
|
||||
|
||||
return new Response(JSON.stringify({
|
||||
success: true,
|
||||
events: events || [],
|
||||
total: events?.length || 0,
|
||||
summary: {
|
||||
total: events?.length || 0,
|
||||
featured: events?.filter(e => e.is_featured).length || 0,
|
||||
public: events?.filter(e => e.is_public).length || 0,
|
||||
firebase: events?.filter(e => e.external_source === 'firebase').length || 0,
|
||||
byOrganization: events?.reduce((acc: any, event) => {
|
||||
const orgId = event.organization_id || 'no-org';
|
||||
acc[orgId] = (acc[orgId] || 0) + 1;
|
||||
return acc;
|
||||
}, {}) || {}
|
||||
}
|
||||
}), {
|
||||
status: 200,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'Cache-Control': 'no-cache'
|
||||
}
|
||||
});
|
||||
|
||||
} catch (error) {
|
||||
const responseTime = Date.now() - startTime;
|
||||
|
||||
logAPIRequest({
|
||||
method: 'GET',
|
||||
url: url.pathname + url.search,
|
||||
statusCode: 500,
|
||||
responseTime,
|
||||
ipAddress: clientIP,
|
||||
userAgent
|
||||
});
|
||||
|
||||
return new Response(JSON.stringify({
|
||||
success: false,
|
||||
error: 'Internal server error'
|
||||
}), {
|
||||
status: 500,
|
||||
headers: { 'Content-Type': 'application/json' }
|
||||
});
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user