123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- import prisma from '@/lib/prisma'
- import LemonSqueezy from '@lemonsqueezy/lemonsqueezy.js'
- const ls = new LemonSqueezy(process.env.LEMON_SQUEEZY_API_KEY as string)
- export const dynamic = 'force-dynamic' // Don't cache API results
- async function getPlans() {
- const params = { include: ['product'] as Array<'product' | 'files'>, perPage: 50 }
- let hasNextPage = true;
- let page = 1;
- let variants = [] as {}[]
- let products = [] as Record<string, any>
- while (hasNextPage) {
- const resp = await ls.getVariants(params);
-
- variants = variants.concat(resp['data'])
- products = products.concat(resp['included'])
- if (resp['meta']['page']['lastPage'] > page) {
- page += 1
- params['page'] = page
- } else {
- hasNextPage = false
- }
- }
- // Nest products inside variants
- const prods = {};
- for (let i = 0; i < products.length; i++) {
- prods[products[i]['id']] = products[i]['attributes']
- }
- for (let i = 0; i < variants.length; i++) {
- variants[i]['product'] = prods[variants[i]['attributes']['product_id']]
- }
- // Save locally
- let variantId,
- variant,
- product,
- productId
- for (let i = 0; i < variants.length; i++) {
- variant = variants[i]
- if ( !variant['attributes']['is_subscription'] ) {
- console.log('Not a subscription')
- continue
- }
- if ( String(variant['product']['store_id']) !== process.env.LEMON_SQUEEZY_STORE_ID ) {
- console.log(`Store ID ${variant['product']['store_id']} does not match (${process.env.LEMON_SQUEEZY_STORE_ID})`)
- continue
- }
- variantId = parseInt(variant['id'])
- product = variant['product']
- productId = parseInt(variant['attributes']['product_id'])
- // Get variant's Price objects
- let prices = await ls.getPrices({ variantId: variantId, perPage: 100 })
- // The first object is the latest/current price
- let variant_price = prices['data'][0]['attributes']['unit_price']
- variant = variant['attributes']
- const updateData = {
- productId: productId,
- name: product['name'],
- variantName: variant['name'],
- status: variant['status'],
- sort: variant['sort'],
- description: variant['description'],
- price: variant_price, // display price in the app matches current Price object in LS
- interval: variant['interval'],
- intervalCount: variant['interval_count'],
- }
- const createData = { ...updateData, variantId}
- try {
- await prisma.plan.upsert({
- where: {
- variantId: variantId
- },
- update: updateData,
- create: createData
- })
- } catch (error) {
- console.log(variant)
- console.log(error)
- }
- }
- }
- export default async function Page() {
- await getPlans()
-
- return (
- <p>
- Done!
- </p>
- )
- }
|