fix(events): Complete field name and query syntax fix based on debug findings
Build And Push Image / docker (push) Successful in 3m34s
Details
Build And Push Image / docker (push) Successful in 3m34s
Details
Root cause identified and fixed: - Events table uses 'Id' (capital I) not 'id' (lowercase) - Fixed all field references to use correct NocoDB field names - Added proper filtering with gte/lte operators (btw didn't work) - Fixed RSVP lookup to prevent undefined event ID errors - Updated calendar transformation to use correct field names Debug findings showed: - Basic table access works (mp3wigub1fzdo1b confirmed correct) - Sample record revealed actual field structure - Issue was field name mismatch causing undefined IDs in queries This should resolve all 422 errors and make events calendar functional
This commit is contained in:
parent
9c029eb510
commit
c4789ec9df
|
|
@ -62,48 +62,63 @@ export function createNocoDBEventsClient() {
|
||||||
if (filters?.limit) queryParams.set('limit', filters.limit.toString());
|
if (filters?.limit) queryParams.set('limit', filters.limit.toString());
|
||||||
if (filters?.offset) queryParams.set('offset', filters.offset.toString());
|
if (filters?.offset) queryParams.set('offset', filters.offset.toString());
|
||||||
|
|
||||||
|
// Build where clause for filtering using correct field names from NocoDB
|
||||||
|
const whereConditions: string[] = [];
|
||||||
|
|
||||||
|
if (filters?.start_date && filters?.end_date) {
|
||||||
|
// Date range filtering using gte and lte (btw didn't work)
|
||||||
|
whereConditions.push(`(start_datetime,gte,${filters.start_date})`);
|
||||||
|
whereConditions.push(`(start_datetime,lte,${filters.end_date})`);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (filters?.event_type) {
|
||||||
|
whereConditions.push(`(event_type,eq,${filters.event_type})`);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (filters?.visibility) {
|
||||||
|
whereConditions.push(`(visibility,eq,${filters.visibility})`);
|
||||||
|
} else if (filters?.user_role) {
|
||||||
|
// Role-based visibility filtering
|
||||||
|
if (filters.user_role === 'user') {
|
||||||
|
whereConditions.push(`(visibility,eq,public)`);
|
||||||
|
} else if (filters.user_role === 'board') {
|
||||||
|
// Board members can see public and board-only events
|
||||||
|
whereConditions.push(`~or((visibility,eq,public),(visibility,eq,board-only))`);
|
||||||
|
}
|
||||||
|
// Admin sees all events (no filter)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (filters?.status) {
|
||||||
|
whereConditions.push(`(status,eq,${filters.status})`);
|
||||||
|
} else {
|
||||||
|
// Default to active events only
|
||||||
|
whereConditions.push(`(status,eq,active)`);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (filters?.search) {
|
||||||
|
// Search in title or description
|
||||||
|
whereConditions.push(`~or((title,like,%${filters.search}%),(description,like,%${filters.search}%))`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Combine conditions with ~and if multiple conditions exist
|
||||||
|
if (whereConditions.length > 0) {
|
||||||
|
const whereClause = whereConditions.length === 1
|
||||||
|
? whereConditions[0]
|
||||||
|
: `~and(${whereConditions.join(',')})`;
|
||||||
|
queryParams.set('where', whereClause);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sort by start date
|
||||||
|
queryParams.set('sort', 'start_datetime');
|
||||||
|
|
||||||
const url = `${baseUrl}/api/v2/tables/${eventsTableId}/records?${queryParams.toString()}`;
|
const url = `${baseUrl}/api/v2/tables/${eventsTableId}/records?${queryParams.toString()}`;
|
||||||
|
|
||||||
console.log('[nocodb-events] 🔍 DEBUG: Attempting to fetch events...');
|
|
||||||
console.log('[nocodb-events] 📋 Table ID:', eventsTableId);
|
|
||||||
console.log('[nocodb-events] 🌐 Full URL:', url);
|
|
||||||
console.log('[nocodb-events] 🔑 Token (first 10 chars):', token?.substring(0, 10) + '...');
|
|
||||||
|
|
||||||
try {
|
|
||||||
const response = await $fetch(url, {
|
const response = await $fetch(url, {
|
||||||
method: 'GET',
|
method: 'GET',
|
||||||
headers
|
headers
|
||||||
});
|
});
|
||||||
|
|
||||||
console.log('[nocodb-events] ✅ SUCCESS! Got response');
|
|
||||||
console.log('[nocodb-events] 📊 Response type:', typeof response);
|
|
||||||
console.log('[nocodb-events] 📝 Response keys:', Object.keys(response || {}));
|
|
||||||
|
|
||||||
if (response && typeof response === 'object') {
|
|
||||||
const responseObj = response as any;
|
|
||||||
if (responseObj.list && Array.isArray(responseObj.list)) {
|
|
||||||
console.log('[nocodb-events] 📈 Records found:', responseObj.list.length);
|
|
||||||
if (responseObj.list.length > 0) {
|
|
||||||
console.log('[nocodb-events] 🔍 First record keys (FIELD NAMES):', Object.keys(responseObj.list[0]));
|
|
||||||
console.log('[nocodb-events] 📄 Sample record:', JSON.stringify(responseObj.list[0], null, 2));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return response;
|
return response;
|
||||||
} catch (error: any) {
|
|
||||||
console.error('[nocodb-events] ❌ FAILED with error:', error);
|
|
||||||
console.error('[nocodb-events] 🔍 Error details:', {
|
|
||||||
message: error?.message,
|
|
||||||
status: error?.status,
|
|
||||||
statusCode: error?.statusCode,
|
|
||||||
statusMessage: error?.statusMessage,
|
|
||||||
data: error?.data
|
|
||||||
});
|
|
||||||
|
|
||||||
// Re-throw the error so the calling code can handle it
|
|
||||||
throw error;
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -272,7 +287,15 @@ export function createNocoDBEventsClient() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get user's RSVPs for these events
|
// Get user's RSVPs for these events
|
||||||
const eventIds = events.list.map((e: Event) => e.id);
|
// Fix: Use 'Id' (capital I) as that's the actual field name from NocoDB
|
||||||
|
const eventIds = events.list.map((e: any) => e.Id);
|
||||||
|
|
||||||
|
// Skip RSVP lookup if no valid event IDs
|
||||||
|
if (!eventIds.length || eventIds.some(id => !id)) {
|
||||||
|
console.log('[nocodb-events] ⚠️ No valid event IDs found, skipping RSVP lookup');
|
||||||
|
return { list: events.list, PageInfo: events.PageInfo };
|
||||||
|
}
|
||||||
|
|
||||||
const rsvpQueryParams = new URLSearchParams();
|
const rsvpQueryParams = new URLSearchParams();
|
||||||
const eventIdConditions = eventIds.map(id => `(event_id,eq,${id})`).join(',');
|
const eventIdConditions = eventIds.map(id => `(event_id,eq,${id})`).join(',');
|
||||||
rsvpQueryParams.set('where', `~and((member_id,eq,${memberId}),~or(${eventIdConditions}))`);
|
rsvpQueryParams.set('where', `~and((member_id,eq,${memberId}),~or(${eventIdConditions}))`);
|
||||||
|
|
@ -293,9 +316,10 @@ export function createNocoDBEventsClient() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add RSVP information to events
|
// Add RSVP information to events
|
||||||
const eventsWithRSVP = events.list.map((event: Event) => ({
|
// Fix: Use 'Id' (capital I) as that's the actual field name from NocoDB
|
||||||
|
const eventsWithRSVP = events.list.map((event: any) => ({
|
||||||
...event,
|
...event,
|
||||||
user_rsvp: rsvpMap.get(event.id) || null
|
user_rsvp: rsvpMap.get(event.Id) || null
|
||||||
}));
|
}));
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|
@ -333,8 +357,9 @@ export function createNocoDBEventsClient() {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Utility function to transform Event data for FullCalendar
|
* Utility function to transform Event data for FullCalendar
|
||||||
|
* Updated to use correct field names from NocoDB (Id instead of id)
|
||||||
*/
|
*/
|
||||||
export function transformEventForCalendar(event: Event): any {
|
export function transformEventForCalendar(event: any): any {
|
||||||
const eventTypeColors = {
|
const eventTypeColors = {
|
||||||
'meeting': { bg: '#2196f3', border: '#1976d2' },
|
'meeting': { bg: '#2196f3', border: '#1976d2' },
|
||||||
'social': { bg: '#4caf50', border: '#388e3c' },
|
'social': { bg: '#4caf50', border: '#388e3c' },
|
||||||
|
|
@ -347,8 +372,8 @@ export function transformEventForCalendar(event: Event): any {
|
||||||
{ bg: '#757575', border: '#424242' };
|
{ bg: '#757575', border: '#424242' };
|
||||||
|
|
||||||
return {
|
return {
|
||||||
id: event.id,
|
id: event.Id, // Fix: Use 'Id' (capital I) from NocoDB
|
||||||
title: event.title,
|
title: event.title || 'Untitled Event',
|
||||||
start: event.start_datetime,
|
start: event.start_datetime,
|
||||||
end: event.end_datetime,
|
end: event.end_datetime,
|
||||||
backgroundColor: colors.bg,
|
backgroundColor: colors.bg,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue