monacousa-portal/server/api/events/index.get.ts

80 lines
2.5 KiB
TypeScript

// server/api/events/index.get.ts
import { createNocoDBEventsClient, transformEventForCalendar } from '~/server/utils/nocodb-events';
import { createSessionManager } from '~/server/utils/session';
import type { EventFilters } from '~/utils/types';
export default defineEventHandler(async (event) => {
try {
const query = getQuery(event) as EventFilters & {
limit?: string;
offset?: string;
calendar_format?: string
};
// Get user session using the proper SessionManager
const sessionManager = createSessionManager();
const cookieHeader = getHeader(event, 'cookie');
const session = sessionManager.getSession(cookieHeader);
if (!session || !session.user) {
throw createError({
statusCode: 401,
statusMessage: 'Authentication required'
});
}
const eventsClient = createNocoDBEventsClient();
// Build filters with user role
const filters: EventFilters & { limit?: number; offset?: number } = {
...query,
user_role: session.user.tier,
limit: query.limit ? parseInt(query.limit) : 50,
offset: query.offset ? parseInt(query.offset) : 0
};
// If no date range provided, default to current month + 2 months ahead
if (!filters.start_date || !filters.end_date) {
const now = new Date();
const startOfMonth = new Date(now.getFullYear(), now.getMonth(), 1);
const endDate = new Date(now.getFullYear(), now.getMonth() + 3, 0); // 3 months ahead
filters.start_date = startOfMonth.toISOString();
filters.end_date = endDate.toISOString();
}
// Get events from database
const response = await eventsClient.findUserEvents(session.user.id, filters);
// Transform for FullCalendar if requested
if (query.calendar_format === 'true') {
const calendarEvents = response.list.map(transformEventForCalendar);
return {
success: true,
data: calendarEvents,
total: response.PageInfo?.totalRows || response.list.length
};
}
return {
success: true,
data: response.list,
total: response.PageInfo?.totalRows || response.list.length,
pagination: response.PageInfo
};
} catch (error: any) {
console.error('Error fetching events:', error);
// Re-throw authentication errors as-is
if (error.statusCode === 401) {
throw error;
}
throw createError({
statusCode: 500,
statusMessage: 'Failed to fetch events'
});
}
});