94 lines
3.2 KiB
TypeScript
94 lines
3.2 KiB
TypeScript
import { createNocoDBEventsClient } from '~/server/utils/nocodb-events';
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
try {
|
|
// Try to get next meeting from events
|
|
const eventsClient = createNocoDBEventsClient();
|
|
const now = new Date();
|
|
|
|
let nextMeeting = null;
|
|
|
|
try {
|
|
const eventsResponse = await eventsClient.findAll({
|
|
limit: 100 // Increased limit to ensure we get all upcoming events
|
|
});
|
|
|
|
// Handle different possible response structures
|
|
const eventsList = (eventsResponse as any)?.list || [];
|
|
|
|
if (eventsList && Array.isArray(eventsList)) {
|
|
// Filter for future meetings and sort by date
|
|
const upcomingMeetings = eventsList
|
|
.filter((event: any) => {
|
|
if (!event.start_datetime) return false;
|
|
const eventDate = new Date(event.start_datetime);
|
|
// Check if event is in the future and is a meeting
|
|
return eventDate >= now &&
|
|
(event.event_type === 'meeting' ||
|
|
event.title?.toLowerCase().includes('meeting') ||
|
|
event.title?.toLowerCase().includes('board'));
|
|
})
|
|
.sort((a: any, b: any) => new Date(a.start_datetime).getTime() - new Date(b.start_datetime).getTime());
|
|
|
|
if (upcomingMeetings.length > 0) {
|
|
const meeting = upcomingMeetings[0];
|
|
const meetingDate = new Date(meeting.start_datetime);
|
|
|
|
nextMeeting = {
|
|
id: meeting.Id || meeting.id,
|
|
title: meeting.title || 'Board Meeting',
|
|
date: meetingDate.toLocaleDateString('en-US', {
|
|
year: 'numeric',
|
|
month: 'long',
|
|
day: 'numeric'
|
|
}),
|
|
time: meetingDate.toLocaleTimeString('en-US', {
|
|
hour: 'numeric',
|
|
minute: '2-digit',
|
|
timeZoneName: 'short'
|
|
}),
|
|
location: meeting.location || 'To be announced',
|
|
description: meeting.description || '',
|
|
// Add additional fields for better UI
|
|
isoDate: meeting.start_datetime,
|
|
endTime: meeting.end_datetime || null,
|
|
eventType: meeting.event_type || 'meeting'
|
|
};
|
|
}
|
|
}
|
|
} catch (error) {
|
|
console.error('[next-meeting] Error fetching events:', error);
|
|
}
|
|
|
|
// Return appropriate response based on whether we found a meeting
|
|
if (nextMeeting) {
|
|
console.log('[next-meeting] Found upcoming meeting:', nextMeeting.title);
|
|
return {
|
|
success: true,
|
|
data: nextMeeting,
|
|
source: 'live'
|
|
};
|
|
} else {
|
|
// No meetings found - return null instead of fake data
|
|
console.log('[next-meeting] No upcoming meetings found');
|
|
return {
|
|
success: true,
|
|
data: null,
|
|
message: 'No upcoming meetings scheduled',
|
|
source: 'live'
|
|
};
|
|
}
|
|
|
|
} catch (error: any) {
|
|
console.error('[next-meeting] Error:', error);
|
|
|
|
// Return error response instead of fallback data
|
|
return {
|
|
success: false,
|
|
data: null,
|
|
error: 'Unable to fetch meeting information',
|
|
message: 'Please check back later or contact administrator'
|
|
};
|
|
}
|
|
});
|