🔧 Fixed SQL Syntax Errors in Favorites API

- 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.
This commit is contained in:
Randall Stillwell 2025-07-25 23:06:16 -05:00
parent faab506b25
commit 34b16e972f
3 changed files with 44 additions and 15 deletions

View file

@ -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);
}

View file

@ -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

View file

@ -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) {