db updates and fixes
All checks were successful
Build And Push Image / docker (push) Successful in 3m59s
All checks were successful
Build And Push Image / docker (push) Successful in 3m59s
This commit is contained in:
104
server/api/admin/backfill-event-ids.post.ts
Normal file
104
server/api/admin/backfill-event-ids.post.ts
Normal file
@@ -0,0 +1,104 @@
|
||||
// server/api/admin/backfill-event-ids.post.ts
|
||||
export default defineEventHandler(async (event) => {
|
||||
console.log('[admin/backfill-event-ids] Starting event_id backfill process...');
|
||||
|
||||
try {
|
||||
// Verify admin access
|
||||
const sessionManager = createSessionManager();
|
||||
const cookieHeader = getHeader(event, 'cookie');
|
||||
const session = sessionManager.getSession(cookieHeader);
|
||||
|
||||
if (!session || session.user.tier !== 'admin') {
|
||||
throw createError({
|
||||
statusCode: 403,
|
||||
statusMessage: 'Admin access required'
|
||||
});
|
||||
}
|
||||
|
||||
console.log(`[admin/backfill-event-ids] Admin access verified for user: ${session.user.email}`);
|
||||
|
||||
const { createNocoDBEventsClient } = await import('~/server/utils/nocodb-events');
|
||||
const eventsClient = createNocoDBEventsClient();
|
||||
|
||||
// Get all events
|
||||
const response = await eventsClient.findAll({ limit: 1000 });
|
||||
const events = response.list || [];
|
||||
|
||||
console.log(`[admin/backfill-event-ids] Found ${events.length} events to process`);
|
||||
|
||||
const results = {
|
||||
processed: 0,
|
||||
updated: 0,
|
||||
skipped: 0,
|
||||
errors: 0,
|
||||
details: [] as any[]
|
||||
};
|
||||
|
||||
for (const eventItem of events) {
|
||||
results.processed++;
|
||||
const eventId = (eventItem as any).Id;
|
||||
|
||||
try {
|
||||
// Check if event_id already exists
|
||||
if (eventItem.event_id && eventItem.event_id.trim() !== '') {
|
||||
console.log(`[admin/backfill-event-ids] Event ${eventId} already has event_id: ${eventItem.event_id}`);
|
||||
results.skipped++;
|
||||
results.details.push({
|
||||
id: eventId,
|
||||
title: eventItem.title,
|
||||
status: 'skipped',
|
||||
reason: 'Already has event_id',
|
||||
existing_event_id: eventItem.event_id
|
||||
});
|
||||
continue;
|
||||
}
|
||||
|
||||
// Generate unique event_id based on event date and title
|
||||
const eventDate = new Date(eventItem.start_datetime);
|
||||
const dateString = eventDate.toISOString().split('T')[0].replace(/-/g, ''); // YYYYMMDD
|
||||
const timeString = eventDate.toISOString().split('T')[1].split(':').slice(0,2).join(''); // HHMM
|
||||
const titleSlug = eventItem.title.toLowerCase().replace(/[^a-z0-9]/g, '').substring(0, 8);
|
||||
|
||||
const newEventId = `evt_${dateString}_${timeString}_${titleSlug}`;
|
||||
|
||||
console.log(`[admin/backfill-event-ids] Updating event ${eventId} (${eventItem.title}) with event_id: ${newEventId}`);
|
||||
|
||||
// Update the event with the new event_id
|
||||
await eventsClient.update(eventId.toString(), { event_id: newEventId });
|
||||
|
||||
results.updated++;
|
||||
results.details.push({
|
||||
id: eventId,
|
||||
title: eventItem.title,
|
||||
status: 'updated',
|
||||
new_event_id: newEventId
|
||||
});
|
||||
|
||||
} catch (updateError: any) {
|
||||
console.error(`[admin/backfill-event-ids] Error updating event ${eventId}:`, updateError);
|
||||
results.errors++;
|
||||
results.details.push({
|
||||
id: eventId,
|
||||
title: eventItem.title,
|
||||
status: 'error',
|
||||
error: updateError.message || 'Update failed'
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
console.log(`[admin/backfill-event-ids] Backfill completed. Processed: ${results.processed}, Updated: ${results.updated}, Skipped: ${results.skipped}, Errors: ${results.errors}`);
|
||||
|
||||
return {
|
||||
success: true,
|
||||
message: `Event ID backfill completed successfully`,
|
||||
data: results
|
||||
};
|
||||
|
||||
} catch (error: any) {
|
||||
console.error('[admin/backfill-event-ids] Backfill process failed:', error);
|
||||
throw createError({
|
||||
statusCode: 500,
|
||||
statusMessage: error.message || 'Event ID backfill failed'
|
||||
});
|
||||
}
|
||||
});
|
||||
@@ -92,6 +92,7 @@ export const normalizeEventFieldsFromNocoDB = (data: any): Event => {
|
||||
'Title': 'title',
|
||||
'Description': 'description',
|
||||
'Event Type': 'event_type',
|
||||
'Event ID': 'event_id',
|
||||
'Start Date': 'start_datetime',
|
||||
'End Date': 'end_datetime',
|
||||
'Location': 'location',
|
||||
@@ -106,6 +107,7 @@ export const normalizeEventFieldsFromNocoDB = (data: any): Event => {
|
||||
'title': 'title',
|
||||
'description': 'description',
|
||||
'event_type': 'event_type',
|
||||
'event_id': 'event_id',
|
||||
'start_datetime': 'start_datetime',
|
||||
'end_datetime': 'end_datetime',
|
||||
'location': 'location',
|
||||
@@ -257,7 +259,7 @@ export function createNocoDBEventsClient() {
|
||||
|
||||
// Only include allowed event fields
|
||||
const allowedFields = [
|
||||
"title", "description", "event_type", "start_datetime", "end_datetime",
|
||||
"title", "description", "event_type", "event_id", "start_datetime", "end_datetime",
|
||||
"location", "is_recurring", "recurrence_pattern", "max_attendees",
|
||||
"is_paid", "cost_members", "cost_non_members", "member_pricing_enabled",
|
||||
"visibility", "status", "creator", "current_attendees"
|
||||
@@ -269,6 +271,14 @@ export function createNocoDBEventsClient() {
|
||||
}
|
||||
}
|
||||
|
||||
// Generate unique event_id if not provided
|
||||
if (!cleanData.event_id) {
|
||||
const timestamp = Date.now();
|
||||
const randomString = Math.random().toString(36).substring(2, 8);
|
||||
cleanData.event_id = `evt_${timestamp}_${randomString}`;
|
||||
console.log('[nocodb-events] Generated event_id:', cleanData.event_id);
|
||||
}
|
||||
|
||||
// Set defaults
|
||||
cleanData.status = cleanData.status || 'active';
|
||||
cleanData.visibility = cleanData.visibility || 'public';
|
||||
@@ -411,8 +421,13 @@ export function transformEventForCalendar(event: Event): any {
|
||||
const colors = eventTypeColors[event.event_type as keyof typeof eventTypeColors] ||
|
||||
{ bg: '#757575', border: '#424242' };
|
||||
|
||||
// Use event_id as the primary identifier for FullCalendar
|
||||
const calendarId = event.event_id || event.id || `temp_${(event as any).Id}_${Date.now()}`;
|
||||
|
||||
console.log('[transformEventForCalendar] Event:', event.title, 'ID:', calendarId, 'event_id:', event.event_id, 'system id:', event.id);
|
||||
|
||||
return {
|
||||
id: event.id,
|
||||
id: calendarId,
|
||||
title: event.title,
|
||||
start: event.start_datetime,
|
||||
end: event.end_datetime,
|
||||
@@ -431,7 +446,9 @@ export function transformEventForCalendar(event: Event): any {
|
||||
user_rsvp: event.user_rsvp,
|
||||
visibility: event.visibility,
|
||||
creator: event.creator,
|
||||
status: event.status
|
||||
status: event.status,
|
||||
event_id: event.event_id,
|
||||
database_id: event.id || (event as any).Id
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user