Refactor: Implement multi-stage generation

This commit is contained in:
gpt-engineer-app[bot]
2025-10-10 18:07:54 +00:00
parent a7dec173df
commit 93e908aef7
2 changed files with 75 additions and 48 deletions

View File

@@ -78,36 +78,62 @@ export function TestDataGenerator() {
setResults(null); setResults(null);
try { try {
console.log('=== TEST DATA GENERATOR DEBUG ==='); const stages = ['companies', 'parks', 'rides', 'photos'] as const;
console.log('Selected entity types:', selectedEntityTypes); const allResults = {
console.log('Preset:', preset); operators: 0,
console.log('Field density:', fieldDensity); property_owners: 0,
console.log('==================================='); manufacturers: 0,
designers: 0,
parks: 0,
rides: 0,
rideModels: 0,
photos: 0,
totalPhotoItems: 0,
conflicts: 0,
versionChains: 0
};
const { data, error } = await supabase.functions.invoke('seed-test-data', { for (let i = 0; i < stages.length; i++) {
body: { const stage = stages[i];
preset,
fieldDensity,
entityTypes: selectedEntityTypes,
...options
}
});
if (error) throw error; toast({
title: `Stage ${i + 1}/${stages.length}`,
description: `Generating ${stage}...`,
});
setResults(data); const { data, error } = await supabase.functions.invoke('seed-test-data', {
await loadStats(); 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({ toast({
title: 'Test Data Generated', title: "Test data generated",
description: `Successfully created test data in ${data.time}s` description: `Successfully completed all stages`,
}); });
await loadStats();
} catch (error) { } catch (error) {
console.error('Generation error:', error); console.error('Generation error:', error);
toast({ toast({
title: 'Generation Failed', title: "Generation failed",
description: error.message, description: error.message || "Failed to generate test data",
variant: 'destructive' variant: "destructive",
}); });
} finally { } finally {
setLoading(false); setLoading(false);

View File

@@ -14,6 +14,7 @@ interface SeedOptions {
includeVersionChains?: boolean; includeVersionChains?: boolean;
includeEscalated?: boolean; includeEscalated?: boolean;
includeExpiredLocks?: boolean; includeExpiredLocks?: boolean;
stage?: 'companies' | 'parks' | 'rides' | 'photos';
} }
interface SeedPlan { interface SeedPlan {
@@ -171,7 +172,8 @@ Deno.serve(async (req) => {
includeConflicts = false, includeConflicts = false,
includeVersionChains = false, includeVersionChains = false,
includeEscalated = false, includeEscalated = false,
includeExpiredLocks = false includeExpiredLocks = false,
stage
}: SeedOptions = await req.json(); }: SeedOptions = await req.json();
console.info('=== SEED DATA GENERATION DEBUG ==='); console.info('=== SEED DATA GENERATION DEBUG ===');
@@ -360,22 +362,23 @@ Deno.serve(async (req) => {
}; };
// Create companies FIRST so parks can reference operators/owners // Create companies FIRST so parks can reference operators/owners
console.info('=== COMPANY GENERATION CHECK ==='); if (!stage || stage === 'companies') {
console.info('Entity types array:', JSON.stringify(entityTypes)); console.info('=== COMPANY GENERATION CHECK ===');
console.info('Plan calls for companies:', plan.companies); console.info('Entity types array:', JSON.stringify(entityTypes));
console.info('Plan calls for companies:', plan.companies);
const companyTypes = ['manufacturer', 'operator', 'designer', 'property_owner']; const companyTypes = ['manufacturer', 'operator', 'designer', 'property_owner'];
// First, determine which company types are selected // First, determine which company types are selected
const selectedCompanyTypes = companyTypes.filter(compType => const selectedCompanyTypes = companyTypes.filter(compType =>
entityTypes.includes(pluralizeCompanyType(compType)) entityTypes.includes(pluralizeCompanyType(compType))
); );
console.info(`✓ Selected company types (${selectedCompanyTypes.length}):`, selectedCompanyTypes); console.info(`✓ Selected company types (${selectedCompanyTypes.length}):`, selectedCompanyTypes);
let companiesCreatedTotal = 0; let companiesCreatedTotal = 0;
for (let typeIndex = 0; typeIndex < selectedCompanyTypes.length; typeIndex++) { for (let typeIndex = 0; typeIndex < selectedCompanyTypes.length; typeIndex++) {
const compType = selectedCompanyTypes[typeIndex]; const compType = selectedCompanyTypes[typeIndex];
const pluralType = pluralizeCompanyType(compType); const pluralType = pluralizeCompanyType(compType);
@@ -440,13 +443,10 @@ Deno.serve(async (req) => {
companiesCreatedTotal++; companiesCreatedTotal++;
} }
} }
}
// Create parks // Create parks
console.log(`\n=== PARK GENERATION ===`); if ((!stage || stage === 'parks') && entityTypes.includes('parks')) {
console.log(`entityTypes includes parks: ${entityTypes.includes('parks')}`);
console.log(`plan.parks: ${plan.parks}`);
if (entityTypes.includes('parks')) {
for (let i = 0; i < plan.parks; i++) { for (let i = 0; i < plan.parks; i++) {
console.log(` Creating park ${i + 1}/${plan.parks}`); console.log(` Creating park ${i + 1}/${plan.parks}`);
const level = getPopulationLevel(fieldDensity, i); const level = getPopulationLevel(fieldDensity, i);
@@ -543,7 +543,7 @@ Deno.serve(async (req) => {
// Create rides // 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++) { for (let i = 0; i < plan.rides; i++) {
const level = getPopulationLevel(fieldDensity, i); const level = getPopulationLevel(fieldDensity, i);
const shouldConflict = includeConflicts && createdRideSlugs.length > 0 && Math.random() < 0.15; const shouldConflict = includeConflicts && createdRideSlugs.length > 0 && Math.random() < 0.15;
@@ -674,7 +674,7 @@ Deno.serve(async (req) => {
} }
// Create ride models // 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++) { for (let i = 0; i < plan.rideModels; i++) {
const level = getPopulationLevel(fieldDensity, i); const level = getPopulationLevel(fieldDensity, i);
const { data: mfgData } = await supabase.from('companies').select('id').eq('slug', randomItem(createdCompanies.manufacturer)).maybeSingle(); 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 // 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: 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)); 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({ JSON.stringify({
success: true, success: true,
summary, summary,
time: (executionTime / 1000).toFixed(2) time: (executionTime / 1000).toFixed(2),
stage: stage || 'all'
}), }),
{ headers: { ...corsHeaders, 'Content-Type': 'application/json' } } { headers: { ...corsHeaders, 'Content-Type': 'application/json' } }
); );