Refactor monolithic modules and harden booking, email, and auth infrastructure.
Split oversized frontend API client, email service, and admin/booking pages into focused modules while preserving import surfaces, and add Redis-backed queues, stale booking cleanup, stronger auth, and scale deployment configs. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,45 @@
|
||||
import { fetchApi, fetchBlob } from './client';
|
||||
import type {
|
||||
DashboardData,
|
||||
AnalyticsData,
|
||||
ExportedTicket,
|
||||
ExportedPayment,
|
||||
FinancialSummary,
|
||||
} from './types';
|
||||
|
||||
export const adminApi = {
|
||||
getDashboard: () => fetchApi<{ dashboard: DashboardData }>('/api/admin/dashboard'),
|
||||
getAnalytics: () => fetchApi<{ analytics: AnalyticsData }>('/api/admin/analytics'),
|
||||
exportTickets: (eventId?: string) => {
|
||||
const query = eventId ? `?eventId=${eventId}` : '';
|
||||
return fetchApi<{ tickets: ExportedTicket[] }>(`/api/admin/export/tickets${query}`);
|
||||
},
|
||||
exportFinancial: (params?: { startDate?: string; endDate?: string; eventId?: string }) => {
|
||||
const query = new URLSearchParams();
|
||||
if (params?.startDate) query.set('startDate', params.startDate);
|
||||
if (params?.endDate) query.set('endDate', params.endDate);
|
||||
if (params?.eventId) query.set('eventId', params.eventId);
|
||||
return fetchApi<{ payments: ExportedPayment[]; summary: FinancialSummary }>(`/api/admin/export/financial?${query}`);
|
||||
},
|
||||
/** Download attendee export as a file (CSV). Returns a Blob. */
|
||||
exportAttendees: (eventId: string, params?: { status?: string; format?: string; q?: string }) => {
|
||||
const query = new URLSearchParams();
|
||||
if (params?.status) query.set('status', params.status);
|
||||
if (params?.format) query.set('format', params.format);
|
||||
if (params?.q) query.set('q', params.q);
|
||||
return fetchBlob(
|
||||
`/api/admin/events/${eventId}/attendees/export?${query}`,
|
||||
`attendees-${new Date().toISOString().split('T')[0]}.csv`
|
||||
);
|
||||
},
|
||||
/** Download tickets export as CSV. Returns a Blob. */
|
||||
exportTicketsCSV: (eventId: string, params?: { status?: string; q?: string }) => {
|
||||
const query = new URLSearchParams();
|
||||
if (params?.status) query.set('status', params.status);
|
||||
if (params?.q) query.set('q', params.q);
|
||||
return fetchBlob(
|
||||
`/api/admin/events/${eventId}/tickets/export?${query}`,
|
||||
`tickets-${new Date().toISOString().split('T')[0]}.csv`
|
||||
);
|
||||
},
|
||||
};
|
||||
Reference in New Issue
Block a user