diff --git a/src/db/schema.ts b/src/db/schema.ts
index c19a5fd..7407e14 100644
--- a/src/db/schema.ts
+++ b/src/db/schema.ts
@@ -131,6 +131,7 @@ export const inventory = pokeSchema.table('inventory',{
catalogName: varchar({ length: 100 }),
cardId: integer().notNull(),
condition: varchar({ length: 255 }).notNull(),
+ variant: varchar({ length: 100 }).default('Normal'),
quantity: integer(),
purchasePrice: decimal({ precision: 10, scale: 2 }),
note: varchar({ length:255 }),
diff --git a/src/pages/api/inventory.ts b/src/pages/api/inventory.ts
index 4a55960..4ce4901 100644
--- a/src/pages/api/inventory.ts
+++ b/src/pages/api/inventory.ts
@@ -2,7 +2,7 @@ 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 } from 'drizzle-orm';
+import { eq, and, sql } from 'drizzle-orm';
const GainLoss = (purchasePrice: any, marketPrice: any) => {
if (!purchasePrice || !marketPrice) return '
N/A
';
@@ -20,6 +20,7 @@ const inventories = await db
inventoryId: inventory.inventoryId,
cardId: inventory.cardId,
condition: inventory.condition,
+ variant: inventory.variant,
quantity: inventory.quantity,
purchasePrice: inventory.purchasePrice,
note: inventory.note,
@@ -35,7 +36,11 @@ const inventories = await db
skus,
and(
eq(cards.productId, skus.productId),
- eq(inventory.condition, skus.condition)
+ eq(inventory.condition, skus.condition),
+ eq(
+ sql`COALESCE(${inventory.variant}, 'Normal')`,
+ skus.variant
+ )
)
)
.where(and(
@@ -49,7 +54,7 @@ const inventories = await db
const purchasePriceDisplay = inv.purchasePrice ? `$${Number(inv.purchasePrice).toFixed(2)}` : '—';
return `
- {
+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,
@@ -147,11 +153,12 @@ export const POST: APIRoute = async ({ request, locals }) => {
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, purchasePrice, quantity, note, catalogName);
+ await addToInventory(userId!, cardId, condition, variant, purchasePrice, quantity, note, catalogName);
break;
case 'remove':
diff --git a/src/pages/partials/card-modal.astro b/src/pages/partials/card-modal.astro
index 23e13bd..b4f3437 100644
--- a/src/pages/partials/card-modal.astro
+++ b/src/pages/partials/card-modal.astro
@@ -181,6 +181,9 @@ for (const price of card?.prices ?? []) {
}
}
+// ── Derive distinct variants available for this card ─────────────────────
+const availableVariants = [...new Set(cardSkus.map(s => s.variant))].sort();
+
const ebaySearchUrl = (card: any) => {
return `https://www.ebay.com/sch/i.html?_nkw=${encodeURIComponent(card?.productUrlName)}+${encodeURIComponent(card?.set?.setUrlName)}+${encodeURIComponent(card?.number)}&LH_Sold=1&Graded=No&_dcat=183454`;
};
@@ -360,13 +363,13 @@ const altSearchUrl = (card: any) => {
})}
{hasAccess && (
-
+
Add {card?.productName} to inventory