import type { APIRoute } from 'astro'; import { db } from '../../db/index'; import { inventory, skus, cards } from '../../db/schema'; import { client } from '../../db/typesense'; import { eq, and, sql } from 'drizzle-orm'; const GainLoss = (purchasePrice: any, marketPrice: any) => { if (!purchasePrice || !marketPrice) return '
N/A
'; const pp = Number(purchasePrice); const mp = Number(marketPrice); if (pp === mp) return '
-
'; if (pp > mp) return `
-$${(pp - mp).toFixed(2)}
`; return `
+$${(mp - pp).toFixed(2)}
`; } const getInventory = async (userId: string, cardId: number) => { const inventories = await db .select({ inventoryId: inventory.inventoryId, cardId: inventory.cardId, condition: inventory.condition, variant: inventory.variant, quantity: inventory.quantity, purchasePrice: inventory.purchasePrice, note: inventory.note, marketPrice: skus.marketPrice, createdAt: inventory.createdAt, }) .from(inventory) .leftJoin( cards, eq(inventory.cardId, cards.cardId) ) .leftJoin( skus, and( eq(cards.productId, skus.productId), eq(inventory.condition, skus.condition), eq( sql`COALESCE(${inventory.variant}, 'Normal')`, skus.variant ) ) ) .where(and( eq(inventory.userId, userId), eq(inventory.cardId, cardId) )); const invHtml = inventories.map(inv => { const marketPrice = inv.marketPrice ? Number(inv.marketPrice).toFixed(2) : null; const marketPriceDisplay = marketPrice ? `$${marketPrice}` : '—'; const purchasePriceDisplay = inv.purchasePrice ? `$${Number(inv.purchasePrice).toFixed(2)}` : '—'; return `
${inv.condition}
Added: ${inv.createdAt ? new Date(inv.createdAt).toLocaleDateString() : '—'}
Purchase price
${purchasePriceDisplay}
Market price
${marketPriceDisplay}
Gain / loss
${GainLoss(inv.purchasePrice, marketPrice)}
Qty
`; }); return new Response( invHtml.join(''), { status: 200, headers: { 'Content-Type': 'text/html' }, } ); } const addToInventory = async (userId: string, cardId: number, condition: string, variant: string, purchasePrice: number, quantity: number, note: string, catalogName: string) => { const inv = await db.insert(inventory).values({ userId: userId, cardId: cardId, catalogName: catalogName, condition: condition, variant: variant, purchasePrice: purchasePrice, quantity: quantity, note: note, }).returning(); await client.collections('inventories').documents().import(inv.map(i => ({ id: i.inventoryId, userId: i.userId, catalogName: i.catalogName, card_id: i.cardId.toString(), }))); } const removeFromInventory = async (inventoryId: string) => { await db.delete(inventory).where(eq(inventory.inventoryId, inventoryId)); await client.collections('inventories').documents(inventoryId).delete(); } const updateInventory = async (inventoryId: string, quantity: number, purchasePrice: number, note: string) => { await db.update(inventory).set({ quantity: quantity, purchasePrice: purchasePrice, note: note, }).where(eq(inventory.inventoryId, inventoryId)); } export const POST: APIRoute = async ({ request, locals }) => { const formData = await request.formData(); const action = formData.get('action'); const cardId = Number(formData.get('cardId')) || 0; const { userId } = locals.auth(); switch (action) { case 'add': const condition = formData.get('condition')?.toString() || 'Unknown'; const variant = formData.get('variant')?.toString() || 'Normal'; const purchasePrice = Number(formData.get('purchasePrice')) || 0; const quantity = Number(formData.get('quantity')) || 1; const note = formData.get('note')?.toString() || ''; const catalogName = formData.get('catalogName')?.toString() || 'Default'; await addToInventory(userId!, cardId, condition, variant, purchasePrice, quantity, note, catalogName); break; case 'remove': const inventoryId = formData.get('inventoryId')?.toString() || ''; await removeFromInventory(inventoryId); break; case 'update': const invId = formData.get('inventoryId')?.toString() || ''; const qty = Number(formData.get('quantity')) || 1; const price = Number(formData.get('purchasePrice')) || 0; const invNote = formData.get('note')?.toString() || ''; await updateInventory(invId, qty, price, invNote); break; default: return getInventory(userId!, cardId); } return getInventory(userId!, cardId); };