import type { APIRoute } from 'astro'; import { db } from '../../db/index'; import { inventory } from '../../db/schema'; import { client } from '../../db/typesense'; import { eq } 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}
`; return `
+$${mp-pp}
`; } const getInventory = async (userId:string, cardId:number) => { const inventories = await db.query.inventory.findMany({ where: { userId:userId, cardId:cardId, }, with: { card: true, sku: true, } }); const invHtml = inventories.map(inv => { return `
${inv.condition}
Purchase price
$${inv.purchasePrice}
Market price
$${inv.sku?.marketPrice}
Gain / loss
${GainLoss(inv.purchasePrice, inv.sku?.marketPrice)}
Qty
`; }); return new Response( invHtml.join(''), { status: 200, headers: { 'Content-Type': 'text/html' }, } ); } const addToInventory = async (userId:string, cardId:number, condition:string, purchasePrice:number, quantity:number, note:string, catalogName:string) => { // First add to database const inv = await db.insert(inventory).values({ userId: userId, cardId: cardId, catalogName: catalogName, condition: condition, purchasePrice: purchasePrice, quantity: quantity, note: note, }).returning(); // And then add to Typesense 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) => { // Update in database await db.update(inventory).set({ quantity: quantity, purchasePrice: purchasePrice, note: note, }).where(eq( inventory.inventoryId, inventoryId )); // There is no need to update Typesense for these fields as they are not indexed } export const POST: APIRoute = async ({ request, locals }) => { // Access form data from the request body 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 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, purchasePrice, quantity, note, catalogName); //return await getInventory(cardId); 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: // No action = list inventory for this card return getInventory(userId!, cardId); } // Always return current inventory after a mutation return getInventory(userId!, cardId); };