import { sql } from '@vercel/postgres'; import { getUserFromRequest } from '../../../../lib/permission-middleware'; import { isValidSlug } from '../../../../lib/slug-utils'; export default async function handler(req, res) { if (req.method !== 'GET') { return res.status(405).json({ error: 'Method not allowed' }); } try { const { identifier } = req.query; // Get authenticated user const user = await getUserFromRequest(req); if (!user) { return res.status(401).json({ error: 'Authentication required' }); } if (!identifier) { return res.status(400).json({ error: 'Collection identifier is required' }); } // Determine if identifier is a slug or numeric ID const isSlug = isValidSlug(identifier) || isNaN(parseInt(identifier)); // Verify user has access to this collection let collectionResult; try { if (isSlug) { collectionResult = await sql` SELECT c.*, cp.role as user_role FROM collections c LEFT JOIN collection_permissions cp ON c.id = cp.collection_id AND cp.user_id = ${user.userId} AND cp.status = 'active' WHERE c.slug = ${identifier} AND ( c.user_id = ${user.userId} OR cp.id IS NOT NULL OR c.is_public = true ) `; } else { const numericId = parseInt(identifier); collectionResult = await sql` SELECT c.*, cp.role as user_role FROM collections c LEFT JOIN collection_permissions cp ON c.id = cp.collection_id AND cp.user_id = ${user.userId} AND cp.status = 'active' WHERE c.id = ${numericId} AND ( c.user_id = ${user.userId} OR cp.id IS NOT NULL OR c.is_public = true ) `; } } catch (sqlError) { console.error('🔍 SQL Error:', sqlError); return res.status(500).json({ error: 'Database query failed' }); } if (!collectionResult || !collectionResult.rows || collectionResult.rows.length === 0) { return res.status(404).json({ error: 'Collection not found or access denied' }); } const collection = collectionResult.rows[0]; // Add debugging and validation if (!collection || !collection.id) { console.error('Collection data invalid:', { collection, identifier, isSlug }); return res.status(500).json({ error: 'Collection data invalid' }); } // Get the top 5 rarest cards from the collection const thumbnailsResult = await sql` SELECT cards.id, cards.name, cards.rarity, cards.image_url, cards.stock_image_url, cards.market_price, cards.game, cards.set_name, cc.quantity FROM collection_cards cc JOIN cards ON cc.card_id = cards.id WHERE cc.collection_id = ${collection.id} AND (cards.image_url IS NOT NULL OR cards.stock_image_url IS NOT NULL) ORDER BY CASE cards.rarity WHEN 'mythic' THEN 8 WHEN 'legendary' THEN 7 WHEN 'rare' THEN 6 WHEN 'uncommon' THEN 5 WHEN 'common' THEN 4 WHEN 'special' THEN 3 WHEN 'promo' THEN 2 WHEN 'token' THEN 1 ELSE 0 END DESC, cards.market_price DESC NULLS LAST, cards.name ASC LIMIT 5 `; // Handle the result properly based on its structure let thumbnailsArray; if (Array.isArray(thumbnailsResult)) { thumbnailsArray = thumbnailsResult; } else if (thumbnailsResult && thumbnailsResult.rows && Array.isArray(thumbnailsResult.rows)) { thumbnailsArray = thumbnailsResult.rows; } else { thumbnailsArray = []; } const thumbnails = thumbnailsArray.map(card => ({ id: card.id, name: card.name, rarity: card.rarity, image_url: card.image_url, stock_image_url: card.stock_image_url, market_price: parseFloat(card.market_price) || 0, game: card.game, set_name: card.set_name, quantity: parseInt(card.quantity) || 1 })); res.status(200).json({ thumbnails }); } catch (error) { console.error('Error fetching collection thumbnails:', error); res.status(500).json({ error: 'Internal server error' }); } }