import { getPayload } from 'payload' import config from '@payload-config' import { NextResponse } from 'next/server' import { getAllMedusaProducts } from '@/lib/medusa' /** * Batch Sync Selected Products * POST /api/sync/batch-medusa * Body: { ids: string[], collection: 'products' | 'preorder-products', forceUpdate?: boolean } */ export async function POST(request: Request) { try { const body = await request.json() const { ids, collection, forceUpdate = false } = body if (!ids || !Array.isArray(ids) || ids.length === 0) { return NextResponse.json( { success: false, error: 'No product IDs provided' }, { status: 400 }, ) } if (!collection || !['products', 'preorder-products'].includes(collection)) { return NextResponse.json( { success: false, error: 'Invalid collection' }, { status: 400 }, ) } const payload = await getPayload({ config }) // Get all Medusa products once const medusaProducts = await getAllMedusaProducts() const medusaProductMap = new Map(medusaProducts.map(p => [p.id, p])) const results = { total: ids.length, success: 0, failed: 0, skipped: 0, details: [] as any[], } // Sync each selected product for (const id of ids) { try { const product = await payload.findByID({ collection: collection as 'products' | 'preorder-products', id, }) if (!product || !product.medusaId) { results.skipped++ results.details.push({ id, title: product?.title || 'Unknown', status: 'skipped', reason: 'No Medusa ID', }) continue } const medusaProduct = medusaProductMap.get(product.medusaId) if (!medusaProduct) { results.failed++ results.details.push({ id, medusaId: product.medusaId, title: product.title, status: 'failed', error: 'Product not found in Medusa', }) continue } // Update basic fields from Medusa const updateData: any = { lastSyncedAt: new Date().toISOString(), } if (forceUpdate || !product.title) updateData.title = medusaProduct.title if (forceUpdate || !product.thumbnail) updateData.thumbnail = medusaProduct.thumbnail await payload.update({ collection: collection as 'products' | 'preorder-products', id, data: updateData, }) results.success++ results.details.push({ id, medusaId: product.medusaId, title: product.title, status: 'success', }) } catch (error) { results.failed++ results.details.push({ id, status: 'failed', error: error instanceof Error ? error.message : 'Unknown error', }) } } return NextResponse.json({ success: true, message: `Batch sync completed: ${results.success} success, ${results.failed} failed, ${results.skipped} skipped`, results, }) } catch (error) { console.error('[batch-sync-medusa] Error:', error) return NextResponse.json( { success: false, error: error instanceof Error ? error.message : 'Unknown error', }, { status: 500 }, ) } }