diff --git a/src/integrations/supabase/types.ts b/src/integrations/supabase/types.ts index d368cc97..dd8e0573 100644 --- a/src/integrations/supabase/types.ts +++ b/src/integrations/supabase/types.ts @@ -2399,6 +2399,7 @@ export type Database = { } submission_items: { Row: { + action_type: string | null approved_entity_id: string | null created_at: string depends_on: string | null @@ -2413,6 +2414,7 @@ export type Database = { updated_at: string } Insert: { + action_type?: string | null approved_entity_id?: string | null created_at?: string depends_on?: string | null @@ -2427,6 +2429,7 @@ export type Database = { updated_at?: string } Update: { + action_type?: string | null approved_entity_id?: string | null created_at?: string depends_on?: string | null diff --git a/src/lib/submissionChangeDetection.ts b/src/lib/submissionChangeDetection.ts index 50addf49..e7d012a5 100644 --- a/src/lib/submissionChangeDetection.ts +++ b/src/lib/submissionChangeDetection.ts @@ -133,17 +133,22 @@ async function detectPhotoChanges(submissionId: string): Promise * Detects what changed between original_data and item_data */ export async function detectChanges( - item: { item_data?: any; original_data?: any; item_type: string }, + item: { item_data?: any; original_data?: any; item_type: string; action_type?: string }, submissionId?: string ): Promise { const itemData = item.item_data || {}; const originalData = item.original_data || {}; - // Determine action type - special handling for photo_delete + // Determine action type - prioritize explicit action_type field to preserve submission intent let action: 'create' | 'edit' | 'delete' = 'edit'; + if (item.item_type === 'photo_delete' || itemData.action === 'delete' || itemData.deleted) { action = 'delete'; + } else if (item.action_type) { + // Use explicit action_type if set (preserves original submission intent even after moderator edits) + action = item.action_type as 'create' | 'edit' | 'delete'; } else if (!originalData || Object.keys(originalData).length === 0) { + // Fall back to inference for backwards compatibility action = 'create'; } diff --git a/src/lib/submissionItemsService.ts b/src/lib/submissionItemsService.ts index 5435cb3f..8dfdd42f 100644 --- a/src/lib/submissionItemsService.ts +++ b/src/lib/submissionItemsService.ts @@ -6,6 +6,7 @@ export interface SubmissionItemWithDeps { item_type: string; item_data: any; original_data: any; + action_type?: 'create' | 'edit' | 'delete'; status: 'pending' | 'approved' | 'rejected'; depends_on: string | null; order_index: number; @@ -1050,6 +1051,10 @@ export async function editSubmissionItem( // Preserve original_data if not already set const originalData = currentItem.original_data || currentItem.item_data; + // Determine original action type - preserve submission intent + const originalAction = currentItem.action_type || + (currentItem.original_data && Object.keys(currentItem.original_data).length > 0) ? 'edit' : 'create'; + if (isModerator) { // Moderators can edit directly const { error: updateError } = await supabase @@ -1057,6 +1062,7 @@ export async function editSubmissionItem( .update({ item_data: newData, original_data: originalData, + action_type: originalAction, // Preserve original submission intent updated_at: new Date().toISOString(), }) .eq('id', itemId); @@ -1083,6 +1089,7 @@ export async function editSubmissionItem( .update({ item_data: newData, original_data: originalData, + action_type: originalAction, // Preserve original submission intent updated_at: new Date().toISOString(), }) .eq('id', itemId); diff --git a/supabase/migrations/20251013182948_4e9710fc-7ef6-4278-9cb7-ecec66eac4b3.sql b/supabase/migrations/20251013182948_4e9710fc-7ef6-4278-9cb7-ecec66eac4b3.sql new file mode 100644 index 00000000..f19677c4 --- /dev/null +++ b/supabase/migrations/20251013182948_4e9710fc-7ef6-4278-9cb7-ecec66eac4b3.sql @@ -0,0 +1,21 @@ +-- Add action_type column to submission_items to preserve original submission intent +ALTER TABLE submission_items +ADD COLUMN IF NOT EXISTS action_type text DEFAULT 'create'; + +-- Add check constraint to ensure valid values +ALTER TABLE submission_items +ADD CONSTRAINT submission_items_action_type_check +CHECK (action_type IN ('create', 'edit', 'delete')); + +-- Create index for better query performance +CREATE INDEX IF NOT EXISTS idx_submission_items_action_type +ON submission_items(action_type); + +-- Backfill existing records based on original_data presence +UPDATE submission_items +SET action_type = CASE + WHEN item_type = 'photo_delete' THEN 'delete' + WHEN original_data IS NULL OR original_data::text = '{}' THEN 'create' + ELSE 'edit' +END +WHERE action_type IS NULL; \ No newline at end of file