✅ Database & API Fixes: - Fixed collection detail API to use correct column names (card_type, market_price, image_url) - Removed all mock data and fallbacks - Updated field mappings throughout collection detail page - Fixed hero section to use real collection data with proper image support �� Test Users Created: - admin@tcgvault.com / admin123 (Admin) - alice@tcgvault.com / alice123 (User) - bob@tcgvault.com / bob123 (User) 🃏 Sample Cards Added: - Lightning Bolt (MTG) - $2.50 - Black Lotus (MTG) - $25,000 - Pikachu (Pokemon) - $8.50 - Charizard (Pokemon) - $350 - Mickey Mouse (Lorcana) - $45 - Elsa (Lorcana) - $15.75 🔧 Collaboration Features: - Added CollaborationManager to collection detail page - Integrated real user permissions (isOwner check) - Updated hero section with real stats and creator info 🔍 Card Management: - Created cards search API (/api/cards/search) - Implemented quick add functionality in empty state - Real-time card search with dropdown results - Add cards directly to collection with quantity �� Ready for Testing: 1. Login as any user to see only their collections 2. Create collections with real data 3. Add cards using search functionality 4. Invite collaborators via email system 5. Switch users to test collaboration workflow Complete end-to-end testing environment ready! 🚀
48 lines
1.3 KiB
JavaScript
48 lines
1.3 KiB
JavaScript
import { sql } from '@vercel/postgres';
|
|
|
|
export default async function handler(req, res) {
|
|
// Set CORS headers
|
|
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
res.setHeader('Access-Control-Allow-Methods', 'GET, OPTIONS');
|
|
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
|
|
|
|
// Handle preflight requests
|
|
if (req.method === 'OPTIONS') {
|
|
res.status(200).end();
|
|
return;
|
|
}
|
|
|
|
if (req.method !== 'GET') {
|
|
return res.status(405).json({ error: 'Method not allowed' });
|
|
}
|
|
|
|
try {
|
|
const { q = '', limit = 20 } = req.query;
|
|
|
|
let result;
|
|
if (q.trim()) {
|
|
// Search by name
|
|
result = await sql`
|
|
SELECT id, name, set_name, rarity, card_type, image_url, market_price, game
|
|
FROM cards
|
|
WHERE name ILIKE ${`%${q}%`}
|
|
ORDER BY name
|
|
LIMIT ${parseInt(limit)}
|
|
`;
|
|
} else {
|
|
// Return all cards if no search query
|
|
result = await sql`
|
|
SELECT id, name, set_name, rarity, card_type, image_url, market_price, game
|
|
FROM cards
|
|
ORDER BY name
|
|
LIMIT ${parseInt(limit)}
|
|
`;
|
|
}
|
|
|
|
res.status(200).json(result.rows);
|
|
|
|
} catch (error) {
|
|
console.error('Error searching cards:', error);
|
|
res.status(500).json({ error: 'Internal server error' });
|
|
}
|
|
}
|