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 `
Purchase price
$${inv.purchasePrice}
Market price
$${inv.sku?.marketPrice}
Gain / loss
${GainLoss(inv.purchasePrice, inv.sku?.marketPrice)}
`;
});
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);
};