diff --git a/src/components/admin/TestDataGenerator.tsx b/src/components/admin/TestDataGenerator.tsx index 972890a5..9a87c96e 100644 --- a/src/components/admin/TestDataGenerator.tsx +++ b/src/components/admin/TestDataGenerator.tsx @@ -78,36 +78,62 @@ export function TestDataGenerator() { setResults(null); try { - console.log('=== TEST DATA GENERATOR DEBUG ==='); - console.log('Selected entity types:', selectedEntityTypes); - console.log('Preset:', preset); - console.log('Field density:', fieldDensity); - console.log('==================================='); - - const { data, error } = await supabase.functions.invoke('seed-test-data', { - body: { - preset, - fieldDensity, - entityTypes: selectedEntityTypes, - ...options - } - }); + const stages = ['companies', 'parks', 'rides', 'photos'] as const; + const allResults = { + operators: 0, + property_owners: 0, + manufacturers: 0, + designers: 0, + parks: 0, + rides: 0, + rideModels: 0, + photos: 0, + totalPhotoItems: 0, + conflicts: 0, + versionChains: 0 + }; - if (error) throw error; + for (let i = 0; i < stages.length; i++) { + const stage = stages[i]; + + toast({ + title: `Stage ${i + 1}/${stages.length}`, + description: `Generating ${stage}...`, + }); - setResults(data); - await loadStats(); + const { data, error } = await supabase.functions.invoke('seed-test-data', { + body: { + preset, + fieldDensity, + entityTypes: selectedEntityTypes, + stage, + ...options + } + }); + if (error) throw error; + + // Merge results + Object.keys(data.summary).forEach(key => { + if (allResults[key as keyof typeof allResults] !== undefined) { + allResults[key as keyof typeof allResults] += data.summary[key]; + } + }); + } + + setResults({ summary: allResults }); toast({ - title: 'Test Data Generated', - description: `Successfully created test data in ${data.time}s` + title: "Test data generated", + description: `Successfully completed all stages`, }); + + await loadStats(); } catch (error) { console.error('Generation error:', error); toast({ - title: 'Generation Failed', - description: error.message, - variant: 'destructive' + title: "Generation failed", + description: error.message || "Failed to generate test data", + variant: "destructive", }); } finally { setLoading(false); diff --git a/supabase/functions/seed-test-data/index.ts b/supabase/functions/seed-test-data/index.ts index 497184f3..dfacb82b 100644 --- a/supabase/functions/seed-test-data/index.ts +++ b/supabase/functions/seed-test-data/index.ts @@ -14,6 +14,7 @@ interface SeedOptions { includeVersionChains?: boolean; includeEscalated?: boolean; includeExpiredLocks?: boolean; + stage?: 'companies' | 'parks' | 'rides' | 'photos'; } interface SeedPlan { @@ -171,7 +172,8 @@ Deno.serve(async (req) => { includeConflicts = false, includeVersionChains = false, includeEscalated = false, - includeExpiredLocks = false + includeExpiredLocks = false, + stage }: SeedOptions = await req.json(); console.info('=== SEED DATA GENERATION DEBUG ==='); @@ -360,22 +362,23 @@ Deno.serve(async (req) => { }; // Create companies FIRST so parks can reference operators/owners - console.info('=== COMPANY GENERATION CHECK ==='); - console.info('Entity types array:', JSON.stringify(entityTypes)); - console.info('Plan calls for companies:', plan.companies); - - const companyTypes = ['manufacturer', 'operator', 'designer', 'property_owner']; - - // First, determine which company types are selected - const selectedCompanyTypes = companyTypes.filter(compType => - entityTypes.includes(pluralizeCompanyType(compType)) - ); - - console.info(`✓ Selected company types (${selectedCompanyTypes.length}):`, selectedCompanyTypes); - - let companiesCreatedTotal = 0; - - for (let typeIndex = 0; typeIndex < selectedCompanyTypes.length; typeIndex++) { + if (!stage || stage === 'companies') { + console.info('=== COMPANY GENERATION CHECK ==='); + console.info('Entity types array:', JSON.stringify(entityTypes)); + console.info('Plan calls for companies:', plan.companies); + + const companyTypes = ['manufacturer', 'operator', 'designer', 'property_owner']; + + // First, determine which company types are selected + const selectedCompanyTypes = companyTypes.filter(compType => + entityTypes.includes(pluralizeCompanyType(compType)) + ); + + console.info(`✓ Selected company types (${selectedCompanyTypes.length}):`, selectedCompanyTypes); + + let companiesCreatedTotal = 0; + + for (let typeIndex = 0; typeIndex < selectedCompanyTypes.length; typeIndex++) { const compType = selectedCompanyTypes[typeIndex]; const pluralType = pluralizeCompanyType(compType); @@ -440,13 +443,10 @@ Deno.serve(async (req) => { companiesCreatedTotal++; } } + } // Create parks - console.log(`\n=== PARK GENERATION ===`); - console.log(`entityTypes includes parks: ${entityTypes.includes('parks')}`); - console.log(`plan.parks: ${plan.parks}`); - - if (entityTypes.includes('parks')) { + if ((!stage || stage === 'parks') && entityTypes.includes('parks')) { for (let i = 0; i < plan.parks; i++) { console.log(` Creating park ${i + 1}/${plan.parks}`); const level = getPopulationLevel(fieldDensity, i); @@ -543,7 +543,7 @@ Deno.serve(async (req) => { // Create rides - if (entityTypes.includes('rides') && includeDependencies && createdParks.length > 0) { + if ((!stage || stage === 'rides') && entityTypes.includes('rides') && includeDependencies && createdParks.length > 0) { for (let i = 0; i < plan.rides; i++) { const level = getPopulationLevel(fieldDensity, i); const shouldConflict = includeConflicts && createdRideSlugs.length > 0 && Math.random() < 0.15; @@ -674,7 +674,7 @@ Deno.serve(async (req) => { } // Create ride models - if (entityTypes.includes('ride_models') && includeDependencies && createdSubmissionItems.manufacturer.length > 0) { + if ((!stage || stage === 'rides') && entityTypes.includes('ride_models') && includeDependencies && createdSubmissionItems.manufacturer.length > 0) { for (let i = 0; i < plan.rideModels; i++) { const level = getPopulationLevel(fieldDensity, i); const { data: mfgData } = await supabase.from('companies').select('id').eq('slug', randomItem(createdCompanies.manufacturer)).maybeSingle(); @@ -731,7 +731,7 @@ Deno.serve(async (req) => { } // Create photo submissions - if (entityTypes.includes('photos') && plan.photos > 0) { + if ((!stage || stage === 'photos') && entityTypes.includes('photos') && plan.photos > 0) { const { data: approvedParks } = await supabase.from('parks').select('id').limit(Math.min(20, plan.photos)); const { data: approvedRides } = await supabase.from('rides').select('id, park_id').limit(Math.min(20, plan.photos)); @@ -812,7 +812,8 @@ Deno.serve(async (req) => { JSON.stringify({ success: true, summary, - time: (executionTime / 1000).toFixed(2) + time: (executionTime / 1000).toFixed(2), + stage: stage || 'all' }), { headers: { ...corsHeaders, 'Content-Type': 'application/json' } } );