import { createClient } from '@supabase/supabase-js'; const SUPABASE_URL = process.env.SUPABASE_URL || 'https://hwithddwaapyhnfwcesj.supabase.co'; const SUPABASE_KEY = process.env.SUPABASE_SERVICE_KEY || 'sb_publishable_fGXkh0bSrAOqSk2jWKAzSg_NJD9YPCv'; const supabase = createClient(SUPABASE_URL, SUPABASE_KEY); export default async function handler(req, res) { try { console.log('Starting migration v2...'); // 1. Fetch products const { data: products, error: pErr } = await supabase .from('products') .select('product_id, data') .in('status', ['edited', 'synced', 'pending']); // Broaden to catch everything shifted if (pErr) throw new pErr; let pCount = 0; if (products && products.length > 0) { const updates = products.map(p => { const oldData = p.data; // Logic: if index 12 is a date/number, it's the old structure. // In the new structure, index 12 is "PM Classification" (string/empty). const valAt12 = oldData[12]; const isOld = typeof valAt12 === 'number' || (typeof valAt12 === 'string' && /^[0-9.]+$/.test(valAt12)); if (isOld && oldData.length < 110) { // Don't shift if already shifted const newData = [...oldData]; newData.splice(12, 0, ''); // Shift pCount++; return supabase.from('products').update({ data: newData }).eq('product_id', p.product_id); } return null; }).filter(Boolean); // Run updates in parallel (limited) or batches if needed, but for 130 rows it's fine await Promise.all(updates); } // 2. History const { data: history, error: hErr } = await supabase.from('products_history').select('*'); if (hErr) throw hErr; let hCount = 0; if (history && history.length > 0) { const hUpdates = history.map(h => { let changed = false; let nOld = h.old_data; let nNew = h.new_data; if (nOld && nOld.length >= 13 && (typeof nOld[12] === 'number' || (typeof nOld[12] === 'string' && /^[0-9.]+$/.test(nOld[12])))) { nOld = [...nOld]; nOld.splice(12, 0, ''); changed = true; } if (nNew && nNew.length >= 13 && (typeof nNew[12] === 'number' || (typeof nNew[12] === 'string' && /^[0-9.]+$/.test(nNew[12])))) { nNew = [...nNew]; nNew.splice(12, 0, ''); changed = true; } if (changed) { hCount++; return supabase.from('products_history').update({ old_data: nOld, new_data: nNew }).eq('id', h.id); } return null; }).filter(Boolean); await Promise.all(hUpdates); } return res.json({ success: true, productsMigrated: pCount, historyMigrated: hCount, message: 'Migration v2 finished.' }); } catch (err) { console.error('Migration error:', err); return res.status(500).json({ error: err.message, stack: err.stack }); } }