From c0c5ae6c44b2b4420428b943a99315bb6e44b843 Mon Sep 17 00:00:00 2001 From: Matt Date: Tue, 12 Aug 2025 13:22:41 +0200 Subject: [PATCH] fix(events): Update NocoDB query syntax to match official API documentation - Use btw (between) operator for date ranges instead of gte/lte - Use proper ~or and ~and logical operators for complex conditions - Use like operator with %wildcards% for search functionality - Role-based filtering with correct OR conditions for board visibility - All query syntax now matches official NocoDB v2 API documentation This should resolve the 422 Unprocessable Entity errors by using the correct query parameter format that NocoDB expects. --- server/utils/nocodb-events.ts | 46 +++++++++++++++++++++++++++++++---- 1 file changed, 41 insertions(+), 5 deletions(-) diff --git a/server/utils/nocodb-events.ts b/server/utils/nocodb-events.ts index 5312514..3822e9b 100644 --- a/server/utils/nocodb-events.ts +++ b/server/utils/nocodb-events.ts @@ -62,13 +62,49 @@ export function createNocoDBEventsClient() { if (filters?.limit) queryParams.set('limit', filters.limit.toString()); if (filters?.offset) queryParams.set('offset', filters.offset.toString()); - // Build where clause for filtering using simple NocoDB v2 syntax - // Start with just the status filter to test basic functionality + // Build where clause for filtering using correct NocoDB v2 syntax + const whereConditions: string[] = []; + + if (filters?.start_date && filters?.end_date) { + // Date range filtering using btw (between) operator + whereConditions.push(`(start_datetime,btw,${filters.start_date},${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) { - queryParams.set('where', `(status,eq,${filters.status})`); + whereConditions.push(`(status,eq,${filters.status})`); } else { - // Default to active events only - test this simple query first - queryParams.set('where', `(status,eq,active)`); + // Default to active events only + whereConditions.push(`(status,eq,active)`); + } + + if (filters?.search) { + // Search in title or description using like operator + 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