Refactor submission data handling

This commit is contained in:
gpt-engineer-app[bot]
2025-11-03 14:09:16 +00:00
parent db8029f573
commit 8d6cf9ceb5
4 changed files with 259 additions and 19 deletions

View File

@@ -127,8 +127,7 @@ export function ItemReviewCard({ item, onEdit, onStatusChange, submissionId }: I
<ValidationSummary
item={{
item_type: item.item_type,
// eslint-disable-next-line @typescript-eslint/no-explicit-any
item_data: item.item_data as any,
item_data: item.item_data as import('@/types/moderation').SubmissionItemData,
id: item.id,
}}
onValidationChange={handleValidationChange}

View File

@@ -53,21 +53,52 @@ export interface ConflictCheckResult {
/**
* Fetch all items for a submission with their dependencies
* Now joins with relational tables instead of using JSONB
*/
export async function fetchSubmissionItems(submissionId: string): Promise<SubmissionItemWithDeps[]> {
const { data, error } = await supabase
.from('submission_items')
.select('*')
.select(`
*,
park_submission:park_submissions!item_data_id(*),
ride_submission:ride_submissions!item_data_id(*),
photo_submission:photo_submissions!item_data_id(
*,
photo_items:photo_submission_items(*)
)
`)
.eq('submission_id', submissionId)
.order('order_index', { ascending: true });
if (error) throw error;
// Cast the data to the correct type
return (data || []).map(item => ({
...item,
status: item.status as 'pending' | 'approved' | 'rejected',
})) as SubmissionItemWithDeps[];
// Transform data to include relational data as item_data
return (data || []).map(item => {
let item_data: unknown;
switch (item.item_type) {
case 'park':
item_data = (item as any).park_submission;
break;
case 'ride':
item_data = (item as any).ride_submission;
break;
case 'photo':
item_data = {
...(item as any).photo_submission,
photos: (item as any).photo_submission?.photo_items || []
};
break;
default:
item_data = null;
}
return {
...item,
item_data,
status: item.status as 'pending' | 'approved' | 'rejected',
};
}) as SubmissionItemWithDeps[];
}
/**
@@ -167,23 +198,18 @@ export async function detectDependencyConflicts(
/**
* Update individual submission item status
* Note: item_data and original_data are read-only (managed via relational tables)
*/
export async function updateSubmissionItem(
itemId: string,
updates: Partial<SubmissionItemWithDeps>
): Promise<void> {
// Cast unknown to Json for Supabase compatibility
const supabaseUpdates = {
...updates,
// eslint-disable-next-line @typescript-eslint/no-explicit-any
item_data: updates.item_data !== undefined ? updates.item_data as any : undefined,
// eslint-disable-next-line @typescript-eslint/no-explicit-any
original_data: updates.original_data !== undefined ? updates.original_data as any : undefined,
};
// Remove item_data and original_data from updates (managed via relational tables)
const { item_data, original_data, ...cleanUpdates } = updates;
const { error } = await supabase
.from('submission_items')
.update(supabaseUpdates)
.update(cleanUpdates)
.eq('id', itemId);
if (error) throw error;