mirror of
https://github.com/pacnpal/thrilltrack-explorer.git
synced 2025-12-23 21:51:17 -05:00
feat: Implement dynamic join solution
This commit is contained in:
@@ -41,34 +41,87 @@ export const SubmissionItemsList = memo(function SubmissionItemsList({
|
||||
}
|
||||
setError(null);
|
||||
|
||||
// Fetch submission items with relational data
|
||||
// Fetch submission items with entity data
|
||||
// Note: entity_data is pre-loaded from the view, but we need to fetch from raw table
|
||||
// when this component is used standalone
|
||||
const { data: itemsData, error: itemsError } = await supabase
|
||||
.from('submission_items')
|
||||
.select(`
|
||||
*,
|
||||
park_submission:park_submissions!item_data_id(*),
|
||||
ride_submission:ride_submissions!item_data_id(*)
|
||||
`)
|
||||
.select('*')
|
||||
.eq('submission_id', submissionId)
|
||||
.order('order_index');
|
||||
|
||||
if (itemsError) throw itemsError;
|
||||
|
||||
// Transform to include item_data
|
||||
const transformedItems = itemsData?.map(item => {
|
||||
let itemData = {};
|
||||
switch (item.item_type) {
|
||||
case 'park':
|
||||
itemData = item.park_submission || {};
|
||||
break;
|
||||
case 'ride':
|
||||
itemData = item.ride_submission || {};
|
||||
break;
|
||||
default:
|
||||
itemData = {};
|
||||
}
|
||||
return { ...item, item_data: itemData };
|
||||
}) || [];
|
||||
// Fetch entity data for each item based on item_type
|
||||
const transformedItems = await Promise.all(
|
||||
(itemsData || []).map(async (item) => {
|
||||
if (!item.item_data_id) {
|
||||
return { ...item, item_data: {}, entity_data: null };
|
||||
}
|
||||
|
||||
try {
|
||||
let entityData = null;
|
||||
|
||||
// Fetch from appropriate table based on item_type
|
||||
switch (item.item_type) {
|
||||
case 'park': {
|
||||
const { data } = await supabase
|
||||
.from('park_submissions')
|
||||
.select('*')
|
||||
.eq('id', item.item_data_id)
|
||||
.maybeSingle();
|
||||
entityData = data;
|
||||
break;
|
||||
}
|
||||
case 'ride': {
|
||||
const { data } = await supabase
|
||||
.from('ride_submissions')
|
||||
.select('*')
|
||||
.eq('id', item.item_data_id)
|
||||
.maybeSingle();
|
||||
entityData = data;
|
||||
break;
|
||||
}
|
||||
case 'manufacturer':
|
||||
case 'operator':
|
||||
case 'designer':
|
||||
case 'property_owner': {
|
||||
const { data } = await supabase
|
||||
.from('company_submissions')
|
||||
.select('*')
|
||||
.eq('id', item.item_data_id)
|
||||
.maybeSingle();
|
||||
entityData = data;
|
||||
break;
|
||||
}
|
||||
case 'photo': {
|
||||
const { data } = await supabase
|
||||
.from('photo_submissions')
|
||||
.select('*')
|
||||
.eq('id', item.item_data_id)
|
||||
.maybeSingle();
|
||||
entityData = data;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
entityData = null;
|
||||
}
|
||||
|
||||
return {
|
||||
...item,
|
||||
item_data: entityData || {},
|
||||
entity_data: entityData
|
||||
};
|
||||
} catch (err) {
|
||||
logger.warn('Failed to fetch entity data for item', {
|
||||
itemId: item.id,
|
||||
itemType: item.item_type,
|
||||
error: getErrorMessage(err)
|
||||
});
|
||||
return { ...item, item_data: {}, entity_data: null };
|
||||
}
|
||||
})
|
||||
);
|
||||
|
||||
// Check for photo submissions (using array query to avoid 406)
|
||||
const { data: photoData, error: photoError } = await supabase
|
||||
|
||||
Reference in New Issue
Block a user