diff --git a/src/lib/utils/supabase/admin.ts b/src/lib/utils/supabase/admin.ts index 563b9d2..79725be 100644 --- a/src/lib/utils/supabase/admin.ts +++ b/src/lib/utils/supabase/admin.ts @@ -409,6 +409,40 @@ const getUserCredits = async (userId: string) => { return creditData.credits_remaining; }; +type ProductWithPrices = Product & { + prices: Price[]; + actualPrice?: number; +}; + +const getActiveProductsWithPrices = async (limit = 10, offset = 0) => { + const { + data: products, + error, + count + } = await supabaseAdmin + .from('products') + .select('*, prices(*)', { count: 'exact' }) + .eq('active', true) + .order('name', { ascending: true }) + .range(offset, offset + limit - 1); + + if (error) { + throw new Error(`Error fetching products: ${error.message}`); + } + + const typedProducts: ProductWithPrices[] = products; + + for (const product of typedProducts) { + if (product.prices && product.prices.length > 0) { + // Assuming the default price is the first one + const defaultPrice = product.prices[0]; + product.actualPrice = defaultPrice.unit_amount! / 100; + } + } + + return { products: typedProducts, count }; // Return products and total count +}; + export { upsertProductRecord, upsertPriceRecord, @@ -420,5 +454,6 @@ export { hasProductAccess, addCredits, deductCredits, - getUserCredits + getUserCredits, + getActiveProductsWithPrices }; diff --git a/src/routes/products/+page.svelte b/src/routes/products/+page.svelte index ad1edd7..18feb8c 100644 --- a/src/routes/products/+page.svelte +++ b/src/routes/products/+page.svelte @@ -6,12 +6,11 @@ let enablePagination = false; onMount(async () => { - const response = await fetch('/products'); + const response = await fetch('/products?limit=20&offset=0'); const responseJson = await response.json(); - products = responseJson.data; - if (responseJson.has_more) { - enablePagination = true; - } + products = responseJson.products; + var count = responseJson.count; + // enablePagination needs to be set to true if there are more than 20 products }); diff --git a/src/routes/products/+server.ts b/src/routes/products/+server.ts index 5668d47..f3e2530 100644 --- a/src/routes/products/+server.ts +++ b/src/routes/products/+server.ts @@ -1,21 +1,19 @@ import { json } from '@sveltejs/kit'; -import { stripe as stripeClient } from '$lib/utils/stripe'; - -export const GET = async () => { - const products = await stripeClient.products.list({ - limit: 100 - }); +import { getActiveProductsWithPrices } from '$lib/utils/supabase/admin'; +export const GET = async ({ url }) => { try { - // Get the price for each product - for (const product of products.data) { - const price = await stripeClient.prices.retrieve(product.default_price as string); - if (price) { - product.actualPrice = price.unit_amount / 100; - } - } + const limitParam = url.searchParams.get('limit'); + const offsetParam = url.searchParams.get('offset'); + + const limit = limitParam ? parseInt(limitParam, 10) : 10; + const offset = offsetParam ? parseInt(offsetParam, 10) : 0; + + const { products, count } = await getActiveProductsWithPrices(limit, offset); + + return json({ products, count }); } catch (error) { console.error(error); + return json({ error: error.message }, { status: 500 }); } - return json(products); };