Fix park submission locations

Implement Phase 1 of the JSONB violation fix by creating the `park_submission_locations` table. This includes migrating existing data from `park_submissions.temp_location_data` and updating relevant code to read and write to the new relational table. The `temp_location_data` column will be dropped after data migration.
This commit is contained in:
gpt-engineer-app[bot]
2025-11-06 15:45:12 +00:00
parent 1a4e30674f
commit 5b0ac813e2
8 changed files with 379 additions and 124 deletions

View File

@@ -362,22 +362,11 @@ async function submitCompositeCreation(
images: primaryImages as unknown as Json
};
// Convert location object to temp_location_data for parks
// Store location reference for park submissions (will be created in relational table)
if (uploadedPrimary.type === 'park' && uploadedPrimary.data.location) {
primaryData.temp_location_data = {
name: uploadedPrimary.data.location.name,
street_address: uploadedPrimary.data.location.street_address || null,
city: uploadedPrimary.data.location.city || null,
state_province: uploadedPrimary.data.location.state_province || null,
country: uploadedPrimary.data.location.country,
latitude: uploadedPrimary.data.location.latitude,
longitude: uploadedPrimary.data.location.longitude,
timezone: uploadedPrimary.data.location.timezone || null,
postal_code: uploadedPrimary.data.location.postal_code || null,
display_name: uploadedPrimary.data.location.display_name
};
primaryData._temp_location = uploadedPrimary.data.location;
delete primaryData.location; // Remove the original location object
console.log('[submitCompositeCreation] Converted location to temp_location_data:', primaryData.temp_location_data);
console.log('[submitCompositeCreation] Stored location for relational insert:', primaryData._temp_location);
}
// Map temporary IDs to order indices for foreign keys
@@ -725,7 +714,7 @@ export async function submitParkCreation(
name: data.name,
hasLocation: !!data.location,
hasLocationId: !!data.location_id,
temp_location_data: tempLocationData
hasLocationData: !!tempLocationData
});
const { data: parkSubmission, error: parkSubmissionError } = await supabase
@@ -745,7 +734,6 @@ export async function submitParkCreation(
operator_id: data.operator_id || null,
property_owner_id: data.property_owner_id || null,
location_id: data.location_id || null,
temp_location_data: tempLocationData,
banner_image_url: bannerImage?.url || data.banner_image_url || null,
banner_image_id: bannerImage?.cloudflare_id || data.banner_image_id || null,
card_image_url: cardImage?.url || data.card_image_url || null,
@@ -756,6 +744,26 @@ export async function submitParkCreation(
if (parkSubmissionError) throw parkSubmissionError;
// Create location in relational table if provided
if (tempLocationData) {
const { error: locationError } = await supabase
.from('park_submission_locations' as any)
.insert({
park_submission_id: (parkSubmission as any).id,
...tempLocationData
} as any);
if (locationError) {
console.error('[submitParkCreation] Failed to create location:', locationError);
throw new Error(`Failed to save location data: ${locationError.message}`);
}
console.info('[submitParkCreation] Created park_submission_location', {
parkSubmissionId: (parkSubmission as any).id,
locationName: tempLocationData.name
});
}
// Create submission_items record linking to park_submissions
const { error: itemError } = await supabase
.from('submission_items')
@@ -934,7 +942,6 @@ export async function submitParkUpdate(
operator_id: changedFields.operator_id !== undefined ? changedFields.operator_id : existingPark.operator_id,
property_owner_id: changedFields.property_owner_id !== undefined ? changedFields.property_owner_id : existingPark.property_owner_id,
location_id: changedFields.location_id !== undefined ? changedFields.location_id : existingPark.location_id,
temp_location_data: tempLocationData,
banner_image_url: changedFields.banner_image_url !== undefined ? changedFields.banner_image_url : existingPark.banner_image_url,
banner_image_id: changedFields.banner_image_id !== undefined ? changedFields.banner_image_id : existingPark.banner_image_id,
card_image_url: changedFields.card_image_url !== undefined ? changedFields.card_image_url : existingPark.card_image_url,
@@ -945,6 +952,26 @@ export async function submitParkUpdate(
if (parkSubmissionError) throw parkSubmissionError;
// Create location in relational table if provided
if (tempLocationData) {
const { error: locationError } = await supabase
.from('park_submission_locations' as any)
.insert({
park_submission_id: (parkSubmission as any).id,
...tempLocationData
} as any);
if (locationError) {
console.error('[submitParkEdit] Failed to create location:', locationError);
throw new Error(`Failed to save location data: ${locationError.message}`);
}
console.info('[submitParkEdit] Created park_submission_location', {
parkSubmissionId: (parkSubmission as any).id,
locationName: tempLocationData.name
});
}
// ✅ Create submission_items referencing park_submission (no JSON data)
const { error: itemError } = await supabase
.from('submission_items')