Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 10 additions & 2 deletions src/services/ProductStripeService.js
Original file line number Diff line number Diff line change
Expand Up @@ -152,9 +152,13 @@ export class ProductStripeService {
if (Array.isArray(updates.variants)) {
const incomingVariants = updates.variants
const existingVariants = Array.isArray(existingProduct.variants) ? existingProduct.variants : []
const existingVariantsMap = new Map()
for (const ev of existingVariants) {
if (ev.id) existingVariantsMap.set(ev.id, ev)
}

const results = await Promise.all(incomingVariants.map(async (v) => {
const prior = v.id ? existingVariants.find(ev => ev.id === v.id) : undefined
const prior = v.id ? existingVariantsMap.get(v.id) : undefined
const wantsCustom = !!v.hasCustomPrice && typeof v.price === 'number' && v.price > 0

if (wantsCustom) {
Expand Down Expand Up @@ -200,9 +204,13 @@ export class ProductStripeService {
if (Array.isArray(updates.variants2)) {
const incomingVariants = updates.variants2
const existingVariants = Array.isArray(existingProduct.variants2) ? existingProduct.variants2 : []
const existingVariantsMap = new Map()
for (const ev of existingVariants) {
if (ev.id) existingVariantsMap.set(ev.id, ev)
}

const results = await Promise.all(incomingVariants.map(async (v) => {
const prior = v.id ? existingVariants.find(ev => ev.id === v.id) : undefined
const prior = v.id ? existingVariantsMap.get(v.id) : undefined
const wantsCustom = !!v.hasCustomPrice && typeof v.price === 'number' && v.price > 0

if (wantsCustom) {
Expand Down
58 changes: 58 additions & 0 deletions tests/services/ProductStripeService.perf.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import { describe, it, expect } from 'vitest'
import { ProductStripeService } from '../../src/services/ProductStripeService.js'

describe('ProductStripeService Performance', () => {
it('measures updateProductVariants performance with many variants', async () => {
const mockStripeService = {
createPrice: async (data) => ({ id: `price_${Math.random()}` }),
archivePrice: async (id) => {}
}
const service = new ProductStripeService(mockStripeService)

// Generate large number of variants
const numVariants = 15000;
const existingVariants = []
const incomingVariants = []

for (let i = 0; i < numVariants; i++) {
existingVariants.push({
id: `var_${i}`,
name: `Variant ${i}`,
stripePriceId: `price_${i}`,
hasCustomPrice: true,
price: 10 + i
})

// Some with same price, some with different price
incomingVariants.push({
id: `var_${i}`,
name: `Variant ${i}`,
hasCustomPrice: true,
price: i % 2 === 0 ? 10 + i : 20 + i // half same, half different
})
}

const existingProduct = {
stripeProductId: 'prod_123',
stripePriceId: 'base_price',
currency: 'usd',
name: 'Test Product',
variants: existingVariants,
variants2: existingVariants // Duplicate for variants2 as well
}

const updates = {
variants: incomingVariants,
variants2: incomingVariants
}

const start = performance.now()
await service.updateProductVariants(existingProduct, updates, mockStripeService)
const end = performance.now()

const duration = end - start
console.log(`Update Product Variants (${numVariants} variants x 2 groups): ${duration.toFixed(2)}ms`)

expect(duration).toBeDefined()
})
})