mirror of
https://github.com/pacnpal/thrilltrack-explorer.git
synced 2025-12-24 06:51:13 -05:00
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:
@@ -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')
|
||||
|
||||
@@ -81,12 +81,21 @@ export async function fetchSubmissionItems(submissionId: string): Promise<Submis
|
||||
switch (item.item_type) {
|
||||
case 'park': {
|
||||
const parkSub = (item as any).park_submission;
|
||||
// Fetch location from park_submission_locations if available
|
||||
let locationData = null;
|
||||
if (parkSub?.id) {
|
||||
const { data } = await supabase
|
||||
.from('park_submission_locations')
|
||||
.select('*')
|
||||
.eq('park_submission_id', parkSub.id)
|
||||
.maybeSingle();
|
||||
locationData = data;
|
||||
}
|
||||
|
||||
item_data = {
|
||||
...parkSub,
|
||||
// Transform temp_location_data → location for form compatibility
|
||||
location: parkSub.temp_location_data || undefined,
|
||||
// Remove temp_location_data to avoid confusion
|
||||
temp_location_data: undefined
|
||||
// Transform park_submission_location → location for form compatibility
|
||||
location: locationData || undefined
|
||||
};
|
||||
break;
|
||||
}
|
||||
@@ -273,8 +282,6 @@ export async function updateSubmissionItem(
|
||||
const parkData = item_data as any;
|
||||
const updateData: any = {
|
||||
...parkData,
|
||||
// Transform location → temp_location_data for storage
|
||||
temp_location_data: parkData.location || null,
|
||||
updated_at: new Date().toISOString()
|
||||
};
|
||||
|
||||
@@ -289,34 +296,57 @@ export async function updateSubmissionItem(
|
||||
console.info('[Submission Flow] Saving park data', {
|
||||
itemId,
|
||||
parkSubmissionId: item.park_submission_id,
|
||||
hasLocation: !!updateData.temp_location_data,
|
||||
locationData: updateData.temp_location_data,
|
||||
hasLocation: !!parkData.location,
|
||||
fields: Object.keys(updateData),
|
||||
timestamp: new Date().toISOString()
|
||||
});
|
||||
|
||||
const { error: updateError } = await supabase
|
||||
.from('park_submissions')
|
||||
// Update park_submissions
|
||||
const { error: parkError } = await supabase
|
||||
.from('park_submissions' as any)
|
||||
.update(updateData)
|
||||
.eq('id', item.park_submission_id);
|
||||
|
||||
if (updateError) {
|
||||
handleError(updateError, {
|
||||
action: 'Update Park Submission Data',
|
||||
metadata: {
|
||||
itemId,
|
||||
parkSubmissionId: item.park_submission_id,
|
||||
updateFields: Object.keys(updateData)
|
||||
}
|
||||
});
|
||||
throw updateError;
|
||||
if (parkError) {
|
||||
console.error('[Submission Flow] Park update failed:', parkError);
|
||||
throw parkError;
|
||||
}
|
||||
|
||||
console.info('[Submission Flow] Park data saved successfully', {
|
||||
itemId,
|
||||
parkSubmissionId: item.park_submission_id,
|
||||
timestamp: new Date().toISOString()
|
||||
});
|
||||
|
||||
// Update or insert location if provided
|
||||
if (parkData.location) {
|
||||
const locationData = {
|
||||
park_submission_id: item.park_submission_id,
|
||||
name: parkData.location.name,
|
||||
street_address: parkData.location.street_address || null,
|
||||
city: parkData.location.city || null,
|
||||
state_province: parkData.location.state_province || null,
|
||||
country: parkData.location.country,
|
||||
postal_code: parkData.location.postal_code || null,
|
||||
latitude: parkData.location.latitude,
|
||||
longitude: parkData.location.longitude,
|
||||
timezone: parkData.location.timezone || null,
|
||||
display_name: parkData.location.display_name || null
|
||||
};
|
||||
|
||||
// Try to update first, if no rows affected, insert
|
||||
const { error: locationError } = await supabase
|
||||
.from('park_submission_locations' as any)
|
||||
.upsert(locationData, {
|
||||
onConflict: 'park_submission_id'
|
||||
});
|
||||
|
||||
if (locationError) {
|
||||
console.error('[Submission Flow] Location upsert failed:', locationError);
|
||||
throw locationError;
|
||||
}
|
||||
|
||||
console.info('[Submission Flow] Location saved', {
|
||||
parkSubmissionId: item.park_submission_id,
|
||||
locationName: locationData.name
|
||||
});
|
||||
}
|
||||
|
||||
console.info('[Submission Flow] Park data saved successfully');
|
||||
break;
|
||||
}
|
||||
case 'ride': {
|
||||
|
||||
Reference in New Issue
Block a user