mirror of
https://github.com/pacnpal/thrilltrack-explorer.git
synced 2025-12-22 10:31:13 -05:00
Refactor: Implement multi-stage generation
This commit is contained in:
@@ -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,
|
||||||
const { data, error } = await supabase.functions.invoke('seed-test-data', {
|
parks: 0,
|
||||||
body: {
|
rides: 0,
|
||||||
preset,
|
rideModels: 0,
|
||||||
fieldDensity,
|
photos: 0,
|
||||||
entityTypes: selectedEntityTypes,
|
totalPhotoItems: 0,
|
||||||
...options
|
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);
|
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);
|
||||||
|
|||||||
@@ -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
|
|
||||||
const selectedCompanyTypes = companyTypes.filter(compType =>
|
// First, determine which company types are selected
|
||||||
entityTypes.includes(pluralizeCompanyType(compType))
|
const selectedCompanyTypes = companyTypes.filter(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' } }
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user