From 34b16e972ff37b9bd12e3a39fd895f27735b2d78 Mon Sep 17 00:00:00 2001 From: Randall Stillwell Date: Fri, 25 Jul 2025 23:06:16 -0500 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=A7=20Fixed=20SQL=20Syntax=20Errors=20?= =?UTF-8?q?in=20Favorites=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Separated conditional SQL queries to avoid template literal issues - Added proper error handling in CollaboratorFacepile component - Added error handling for favorites functionality - Improved fallback states for failed API calls This resolves the 'syntax error at or near AND' and '' parameter errors. --- components/CollaboratorFacepile.js | 4 +++ pages/api/favorites.js | 47 ++++++++++++++++++++---------- pages/collection/[id].js | 8 +++++ 3 files changed, 44 insertions(+), 15 deletions(-) diff --git a/components/CollaboratorFacepile.js b/components/CollaboratorFacepile.js index 5439c61..a89fb75 100644 --- a/components/CollaboratorFacepile.js +++ b/components/CollaboratorFacepile.js @@ -21,9 +21,13 @@ export default function CollaboratorFacepile({ collectionId, creatorEmail }) { if (response.ok) { const data = await response.json(); setCollaborators(data.permissions || []); + } else { + console.error('Failed to fetch collaborators:', response.status); + setCollaborators([]); // Fallback to empty array } } catch (error) { console.error('Error fetching collaborators:', error); + setCollaborators([]); // Fallback to empty array } finally { setLoading(false); } diff --git a/pages/api/favorites.js b/pages/api/favorites.js index c941fa8..5f9eec2 100644 --- a/pages/api/favorites.js +++ b/pages/api/favorites.js @@ -33,21 +33,38 @@ export default async function handler(req, res) { // Get user's favorites const { type } = req.query; // Optional filter by type - const result = await sql` - SELECT uf.*, - CASE - WHEN uf.item_type = 'collection' THEN c.name - WHEN uf.item_type = 'card' THEN cards.name - WHEN uf.item_type = 'deck' THEN d.name - END as item_name - FROM user_favorites uf - LEFT JOIN collections c ON uf.item_type = 'collection' AND uf.item_id = c.id - LEFT JOIN cards ON uf.item_type = 'card' AND uf.item_id = cards.id - LEFT JOIN decks d ON uf.item_type = 'deck' AND uf.item_id = d.id - WHERE uf.user_id = ${user.userId} - ${type ? sql`AND uf.item_type = ${type}` : sql``} - ORDER BY uf.created_at DESC - `; + let result; + if (type) { + result = await sql` + SELECT uf.*, + CASE + WHEN uf.item_type = 'collection' THEN c.name + WHEN uf.item_type = 'card' THEN cards.name + WHEN uf.item_type = 'deck' THEN d.name + END as item_name + FROM user_favorites uf + LEFT JOIN collections c ON uf.item_type = 'collection' AND uf.item_id = c.id + LEFT JOIN cards ON uf.item_type = 'card' AND uf.item_id = cards.id + LEFT JOIN decks d ON uf.item_type = 'deck' AND uf.item_id = d.id + WHERE uf.user_id = ${user.userId} AND uf.item_type = ${type} + ORDER BY uf.created_at DESC + `; + } else { + result = await sql` + SELECT uf.*, + CASE + WHEN uf.item_type = 'collection' THEN c.name + WHEN uf.item_type = 'card' THEN cards.name + WHEN uf.item_type = 'deck' THEN d.name + END as item_name + FROM user_favorites uf + LEFT JOIN collections c ON uf.item_type = 'collection' AND uf.item_id = c.id + LEFT JOIN cards ON uf.item_type = 'card' AND uf.item_id = cards.id + LEFT JOIN decks d ON uf.item_type = 'deck' AND uf.item_id = d.id + WHERE uf.user_id = ${user.userId} + ORDER BY uf.created_at DESC + `; + } res.status(200).json({ favorites: result.rows diff --git a/pages/collection/[id].js b/pages/collection/[id].js index fa8f695..082d164 100644 --- a/pages/collection/[id].js +++ b/pages/collection/[id].js @@ -77,9 +77,13 @@ export default function CollectionView() { const data = await response.json(); const isFav = data.favorites.some(fav => fav.item_id === parseInt(id)); setIsFavorited(isFav); + } else { + console.error('Failed to check favorites:', response.status); + // Keep default false state } } catch (error) { console.error('Error checking favorites:', error); + // Keep default false state } }; @@ -146,6 +150,8 @@ export default function CollectionView() { if (response.ok) { setIsFavorited(false); + } else { + console.error('Failed to remove favorite:', response.status); } } else { // Add to favorites @@ -163,6 +169,8 @@ export default function CollectionView() { if (response.ok) { setIsFavorited(true); + } else { + console.error('Failed to add favorite:', response.status); } } } catch (error) {