deckhearth/pages/api/cards/batch-ownership.js

51 lines
1.4 KiB
JavaScript
Raw Normal View History

import { sql } from '../../../lib/sql.js';
import { getUserFromRequest } from '../../../lib/permission-middleware';
export default async function handler(req, res) {
if (req.method !== 'POST') {
return res.status(405).json({ error: 'Method not allowed' });
}
try {
const user = await getUserFromRequest(req);
if (!user) {
return res.status(401).json({ error: 'Authentication required' });
}
const { cardIds } = req.body || {};
if (!Array.isArray(cardIds) || cardIds.length === 0) {
return res.status(400).json({ error: 'cardIds must be a non-empty array' });
}
if (cardIds.length > 100) {
return res.status(400).json({ error: 'cardIds cannot exceed 100 items' });
}
const valid = cardIds.every(
(id) => Number.isInteger(id) && id > 0
);
if (!valid) {
return res.status(400).json({ error: 'All cardIds must be positive integers' });
}
const result = await sql`
SELECT card_id, SUM(quantity)::int AS total_quantity
FROM user_cards
WHERE user_id = ${user.userId}
AND card_id = ANY(${cardIds})
GROUP BY card_id
`;
const ownership = {};
for (const row of result.rows) {
ownership[row.card_id] = row.total_quantity;
}
return res.status(200).json({ ownership });
} catch (error) {
console.error('[POST /api/cards/batch-ownership]', error);
return res.status(500).json({ error: 'Internal server error' });
}
}