fix(products): migrate catalog page from supabase to Drizzle + fix brands→tenants
Deploy to route.crispygoat.com / deploy (push) Successful in 5m12s

The products list page at /admin/products still queried the legacy Supabase
mock client, which returns an empty array. Combined with the SaaS schema
renaming brands → tenants, the platform admin's brand picker for new
products was silently failing (getBrands SELECTed from a non-existent
'brands' table), making 'Add Product to catalog' look like a no-op.

- src/app/admin/products/page.tsx: replace supabase.from('products') with
  a Drizzle query using withPlatformAdmin (cross-tenant) or
  withTenant(brandId, ...) (scoped). Map new columns back to the legacy
  Product shape the existing UI consumes:
    * price_cents (integer) → price (dollars)
    * tenant_id → brand_id
    * product_images LEFT JOIN for first image per product
    * default type='pickup', is_taxable=false (columns not in SaaS schema)
- src/actions/admin/users.ts (getBrands): query tenants table instead of
  the legacy brands table.

Verified locally against the seeded dev DB: 8 products across 2 tenants
now render in the catalog, and the brand picker populates with both
tenants for platform admins.
This commit is contained in:
2026-06-07 07:37:48 +00:00
parent 03cf2f446f
commit bb464bda65
2 changed files with 92 additions and 26 deletions
+3 -1
View File
@@ -362,8 +362,10 @@ export async function getBrands(): Promise<{ brands: { id: string; name: string
return { brands: mockBrands.map((b) => ({ id: b.id, name: b.name })), error: null };
}
try {
// The SaaS rebuild renamed `brands` → `tenants` (see db/schema/tenants.ts).
// Sort by name so the platform admin's brand picker stays stable.
const { rows } = await query<{ id: string; name: string }>(
`SELECT id, name FROM brands ORDER BY name`,
`SELECT id, name FROM tenants ORDER BY name`,
);
return { brands: rows, error: null };
} catch (err) {