import { sql } from '@vercel/postgres'; import { getUserFromRequest } from '../../../lib/permission-middleware'; 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 { // Get authenticated user const user = await getUserFromRequest(req); if (!user) { return res.status(401).json({ error: 'Authentication required' }); } // Get total cards owned by user const cardsResult = await sql` SELECT COALESCE(SUM(quantity), 0) as total_cards FROM user_cards WHERE user_id = ${user.userId} `; // Get total collections owned by user const collectionsResult = await sql` SELECT COUNT(*) as total_collections FROM collections WHERE user_id = ${user.userId} `; // Get total decks owned by user const decksResult = await sql` SELECT COUNT(*) as total_decks FROM decks WHERE user_id = ${user.userId} `; // Get total value of user's cards const valueResult = await sql` SELECT COALESCE(SUM(cards.market_price * user_cards.quantity), 0) as total_value FROM user_cards JOIN cards ON user_cards.card_id = cards.id WHERE user_cards.user_id = ${user.userId} AND cards.market_price IS NOT NULL `; // Get game breakdown const gameBreakdownResult = await sql` SELECT cards.game, COUNT(DISTINCT cards.id) as unique_cards, COALESCE(SUM(user_cards.quantity), 0) as total_quantity, COALESCE(SUM(cards.market_price * user_cards.quantity), 0) as total_value FROM user_cards JOIN cards ON user_cards.card_id = cards.id WHERE user_cards.user_id = ${user.userId} GROUP BY cards.game ORDER BY total_value DESC `; // Get rarity breakdown const rarityBreakdownResult = await sql` SELECT cards.rarity, COUNT(DISTINCT cards.id) as unique_cards, COALESCE(SUM(user_cards.quantity), 0) as total_quantity, COALESCE(SUM(cards.market_price * user_cards.quantity), 0) as total_value FROM user_cards JOIN cards ON user_cards.card_id = cards.id WHERE user_cards.user_id = ${user.userId} GROUP BY cards.rarity ORDER BY total_value DESC `; // Get recent activity (last 10 cards added) const recentActivityResult = await sql` SELECT cards.name, cards.game, cards.rarity, cards.image_url, cards.market_price, user_cards.quantity, user_cards.created_at FROM user_cards JOIN cards ON user_cards.card_id = cards.id WHERE user_cards.user_id = ${user.userId} ORDER BY user_cards.created_at DESC LIMIT 10 `; const stats = { totalCards: parseInt(cardsResult.rows[0].total_cards) || 0, totalCollections: parseInt(collectionsResult.rows[0].total_collections) || 0, totalDecks: parseInt(decksResult.rows[0].total_decks) || 0, totalValue: parseFloat(valueResult.rows[0].total_value) || 0, gameBreakdown: gameBreakdownResult.rows.map(row => ({ game: row.game, uniqueCards: parseInt(row.unique_cards), totalQuantity: parseInt(row.total_quantity), totalValue: parseFloat(row.total_value) })), rarityBreakdown: rarityBreakdownResult.rows.map(row => ({ rarity: row.rarity, uniqueCards: parseInt(row.unique_cards), totalQuantity: parseInt(row.total_quantity), totalValue: parseFloat(row.total_value) })), recentActivity: recentActivityResult.rows.map(row => ({ name: row.name, game: row.game, rarity: row.rarity, imageUrl: row.image_url, marketPrice: parseFloat(row.market_price) || 0, quantity: parseInt(row.quantity), addedAt: row.created_at })) }; res.status(200).json(stats); } catch (error) { console.error('Stats API error:', error); res.status(500).json({ error: 'Internal server error' }); } }