Refactor: Enforce submission queue for all edits

This commit is contained in:
gpt-engineer-app[bot]
2025-10-02 14:46:49 +00:00
parent 078026f641
commit 36603cdb80
3 changed files with 198 additions and 134 deletions

View File

@@ -251,6 +251,35 @@ function topologicalSort(items: SubmissionItemWithDeps[]): SubmissionItemWithDep
return sorted;
}
/**
* Extract image URLs from ImageAssignments structure
*/
function extractImageAssignments(images: any) {
if (!images || !images.uploaded || !Array.isArray(images.uploaded)) {
return {
banner_image_url: null,
banner_image_id: null,
card_image_url: null,
card_image_id: null,
};
}
const bannerImage = images.banner_assignment !== null && images.banner_assignment !== undefined
? images.uploaded[images.banner_assignment]
: null;
const cardImage = images.card_assignment !== null && images.card_assignment !== undefined
? images.uploaded[images.card_assignment]
: null;
return {
banner_image_url: bannerImage?.url || null,
banner_image_id: bannerImage?.cloudflare_id || null,
card_image_url: cardImage?.url || null,
card_image_id: cardImage?.cloudflare_id || null,
};
}
/**
* Helper functions to create entities with dependency resolution
*/
@@ -258,18 +287,61 @@ async function createPark(data: any, dependencyMap: Map<string, string>): Promis
const { transformParkData, validateSubmissionData } = await import('./entityTransformers');
const { ensureUniqueSlug } = await import('./slugUtils');
// Validate input data
validateSubmissionData(data, 'Park');
// Check if this is an edit (has park_id)
const isEdit = !!data.park_id;
// Resolve dependencies
if (isEdit) {
// Handle park edit
const resolvedData = resolveDependencies(data, dependencyMap);
// Extract image assignments from ImageAssignments structure
const imageData = extractImageAssignments(resolvedData.images);
// Update the park
const updateData: any = {
name: resolvedData.name,
slug: resolvedData.slug,
description: resolvedData.description || null,
park_type: resolvedData.park_type,
status: resolvedData.status,
opening_date: resolvedData.opening_date || null,
closing_date: resolvedData.closing_date || null,
website_url: resolvedData.website_url || null,
phone: resolvedData.phone || null,
email: resolvedData.email || null,
operator_id: resolvedData.operator_id || null,
property_owner_id: resolvedData.property_owner_id || null,
location_id: resolvedData.location_id || null,
...imageData,
updated_at: new Date().toISOString()
};
const { error } = await supabase
.from('parks')
.update(updateData)
.eq('id', data.park_id);
if (error) {
console.error('Error updating park:', error);
throw new Error(`Database error: ${error.message}`);
}
return data.park_id;
}
// Handle park creation
validateSubmissionData(data, 'Park');
const resolvedData = resolveDependencies(data, dependencyMap);
// Ensure unique slug
const uniqueSlug = await ensureUniqueSlug(resolvedData.slug, 'parks');
resolvedData.slug = uniqueSlug;
// Extract image assignments
const imageData = extractImageAssignments(resolvedData.images);
// Transform to database format
const parkData = transformParkData(resolvedData);
const parkData = { ...transformParkData(resolvedData), ...imageData };
// Insert into database
const { data: park, error } = await supabase
@@ -290,25 +362,75 @@ async function createRide(data: any, dependencyMap: Map<string, string>): Promis
const { transformRideData, validateSubmissionData } = await import('./entityTransformers');
const { ensureUniqueSlug } = await import('./slugUtils');
// Validate input data
validateSubmissionData(data, 'Ride');
// Check if this is an edit (has ride_id)
const isEdit = !!data.ride_id;
// Resolve dependencies
if (isEdit) {
// Handle ride edit
const resolvedData = resolveDependencies(data, dependencyMap);
// Extract image assignments from ImageAssignments structure
const imageData = extractImageAssignments(resolvedData.images);
// Update the ride
const updateData: any = {
name: resolvedData.name,
slug: resolvedData.slug,
description: resolvedData.description,
category: resolvedData.category,
ride_sub_type: resolvedData.ride_sub_type,
status: resolvedData.status,
opening_date: resolvedData.opening_date,
closing_date: resolvedData.closing_date,
height_requirement: resolvedData.height_requirement,
age_requirement: resolvedData.age_requirement,
capacity_per_hour: resolvedData.capacity_per_hour,
duration_seconds: resolvedData.duration_seconds,
max_speed_kmh: resolvedData.max_speed_kmh,
max_height_meters: resolvedData.max_height_meters,
length_meters: resolvedData.length_meters,
inversions: resolvedData.inversions,
coaster_type: resolvedData.coaster_type,
seating_type: resolvedData.seating_type,
intensity_level: resolvedData.intensity_level,
drop_height_meters: resolvedData.drop_height_meters,
max_g_force: resolvedData.max_g_force,
manufacturer_id: resolvedData.manufacturer_id,
ride_model_id: resolvedData.ride_model_id,
...imageData,
updated_at: new Date().toISOString()
};
const { error } = await supabase
.from('rides')
.update(updateData)
.eq('id', data.ride_id);
if (error) {
console.error('Error updating ride:', error);
throw new Error(`Database error: ${error.message}`);
}
return data.ride_id;
}
// Handle ride creation
validateSubmissionData(data, 'Ride');
const resolvedData = resolveDependencies(data, dependencyMap);
// Validate park_id is present (required for rides)
if (!resolvedData.park_id) {
throw new Error('Ride must be associated with a park');
}
// Ensure unique slug
const uniqueSlug = await ensureUniqueSlug(resolvedData.slug, 'rides');
resolvedData.slug = uniqueSlug;
// Transform to database format
const rideData = transformRideData(resolvedData);
// Extract image assignments
const imageData = extractImageAssignments(resolvedData.images);
// Transform to database format
const rideData = { ...transformRideData(resolvedData), ...imageData };
// Insert into database
const { data: ride, error } = await supabase
.from('rides')
.insert(rideData)
@@ -331,20 +453,54 @@ async function createCompany(
const { transformCompanyData, validateSubmissionData } = await import('./entityTransformers');
const { ensureUniqueSlug } = await import('./slugUtils');
// Validate input data
validateSubmissionData(data, 'Company');
// Check if this is an edit (has company_id)
const isEdit = !!data.id;
// Resolve dependencies
if (isEdit) {
// Handle company edit
const resolvedData = resolveDependencies(data, dependencyMap);
// Extract image assignments from ImageAssignments structure
const imageData = extractImageAssignments(resolvedData.images);
// Update the company
const updateData: any = {
name: resolvedData.name,
slug: resolvedData.slug,
description: resolvedData.description || null,
website_url: resolvedData.website_url || null,
founded_year: resolvedData.founded_year || null,
headquarters_location: resolvedData.headquarters_location || null,
...imageData,
updated_at: new Date().toISOString()
};
const { error } = await supabase
.from('companies')
.update(updateData)
.eq('id', data.id);
if (error) {
console.error('Error updating company:', error);
throw new Error(`Database error: ${error.message}`);
}
return data.id;
}
// Handle company creation
validateSubmissionData(data, 'Company');
const resolvedData = resolveDependencies(data, dependencyMap);
// Ensure unique slug
const uniqueSlug = await ensureUniqueSlug(resolvedData.slug, 'companies');
resolvedData.slug = uniqueSlug;
// Transform to database format
const companyData = transformCompanyData(resolvedData, companyType as any);
// Extract image assignments
const imageData = extractImageAssignments(resolvedData.images);
// Transform to database format
const companyData = { ...transformCompanyData(resolvedData, companyType as any), ...imageData };
// Insert into database
const { data: company, error } = await supabase
.from('companies')
.insert(companyData)