mirror of
https://github.com/pacnpal/thrilltrack-explorer.git
synced 2025-12-24 06:51:13 -05:00
Refactor submission data handling
This commit is contained in:
@@ -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}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user