feat: Implement dynamic join solution

This commit is contained in:
gpt-engineer-app[bot]
2025-11-03 16:20:28 +00:00
parent 9ae4a7b743
commit c68b88de86
4 changed files with 152 additions and 70 deletions

View File

@@ -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