diff --git a/src/lib/entitySubmissionHelpers.ts b/src/lib/entitySubmissionHelpers.ts index d22fd1fd..371d62a2 100644 --- a/src/lib/entitySubmissionHelpers.ts +++ b/src/lib/entitySubmissionHelpers.ts @@ -205,7 +205,7 @@ export async function submitParkCreation( content: { action: 'create' }, - status: 'pending' + status: 'pending' as const }) .select() .single(); @@ -223,7 +223,7 @@ export async function submitParkCreation( ...extractChangedFields(data, {}), images: processedImages as unknown as Json }, - status: 'pending', + status: 'pending' as const, order_index: 0 }); @@ -297,7 +297,7 @@ export async function submitParkUpdate( action: 'edit', park_id: parkId }, - status: 'pending' + status: 'pending' as const }) .select() .single(); @@ -317,7 +317,7 @@ export async function submitParkUpdate( images: processedImages as unknown as Json }, original_data: JSON.parse(JSON.stringify(existingPark)), - status: 'pending', + status: 'pending' as const, order_index: 0 }); @@ -377,7 +377,7 @@ export async function submitRideCreation( content: { action: 'create' }, - status: 'pending' + status: 'pending' as const }) .select() .single(); @@ -395,7 +395,7 @@ export async function submitRideCreation( ...extractChangedFields(data, {}), images: processedImages as unknown as Json }, - status: 'pending', + status: 'pending' as const, order_index: 0 }); @@ -469,7 +469,7 @@ export async function submitRideUpdate( action: 'edit', ride_id: rideId }, - status: 'pending' + status: 'pending' as const }) .select() .single(); @@ -489,7 +489,7 @@ export async function submitRideUpdate( images: processedImages as unknown as Json }, original_data: JSON.parse(JSON.stringify(existingRide)), - status: 'pending', + status: 'pending' as const, order_index: 0 }); @@ -546,7 +546,7 @@ export async function submitRideModelCreation( content: { action: 'create' }, - status: 'pending' + status: 'pending' as const }) .select() .single(); @@ -564,7 +564,7 @@ export async function submitRideModelCreation( ...extractChangedFields(data, {}), images: processedImages as unknown as Json }, - status: 'pending', + status: 'pending' as const, order_index: 0 }); @@ -624,7 +624,7 @@ export async function submitRideModelUpdate( action: 'edit', ride_model_id: rideModelId }, - status: 'pending' + status: 'pending' as const }) .select() .single(); @@ -644,7 +644,7 @@ export async function submitRideModelUpdate( images: processedImages as unknown as Json }, original_data: JSON.parse(JSON.stringify(existingModel)), - status: 'pending', + status: 'pending' as const, order_index: 0 }); @@ -683,7 +683,7 @@ export async function submitManufacturerCreation( user_id: userId, submission_type: 'manufacturer', content: { action: 'create' }, - status: 'pending' + status: 'pending' as const }) .select() .single(); @@ -701,7 +701,7 @@ export async function submitManufacturerCreation( company_type: 'manufacturer', images: processedImages as unknown as Json }, - status: 'pending', + status: 'pending' as const, order_index: 0 }); @@ -746,7 +746,7 @@ export async function submitManufacturerUpdate( user_id: userId, submission_type: 'manufacturer', content: { action: 'edit', company_id: companyId }, - status: 'pending' + status: 'pending' as const }) .select() .single(); @@ -766,7 +766,7 @@ export async function submitManufacturerUpdate( images: processedImages as unknown as Json }, original_data: JSON.parse(JSON.stringify(existingCompany)), - status: 'pending', + status: 'pending' as const, order_index: 0 }); @@ -800,7 +800,7 @@ export async function submitDesignerCreation( user_id: userId, submission_type: 'designer', content: { action: 'create' }, - status: 'pending' + status: 'pending' as const }) .select() .single(); @@ -818,7 +818,7 @@ export async function submitDesignerCreation( company_type: 'designer', images: processedImages as unknown as Json }, - status: 'pending', + status: 'pending' as const, order_index: 0 }); @@ -863,7 +863,7 @@ export async function submitDesignerUpdate( user_id: userId, submission_type: 'designer', content: { action: 'edit', company_id: companyId }, - status: 'pending' + status: 'pending' as const }) .select() .single(); @@ -883,7 +883,7 @@ export async function submitDesignerUpdate( images: processedImages as unknown as Json }, original_data: JSON.parse(JSON.stringify(existingCompany)), - status: 'pending', + status: 'pending' as const, order_index: 0 }); @@ -917,7 +917,7 @@ export async function submitOperatorCreation( user_id: userId, submission_type: 'operator', content: { action: 'create' }, - status: 'pending' + status: 'pending' as const }) .select() .single(); @@ -935,7 +935,7 @@ export async function submitOperatorCreation( company_type: 'operator', images: processedImages as unknown as Json }, - status: 'pending', + status: 'pending' as const, order_index: 0 }); @@ -980,7 +980,7 @@ export async function submitOperatorUpdate( user_id: userId, submission_type: 'operator', content: { action: 'edit', company_id: companyId }, - status: 'pending' + status: 'pending' as const }) .select() .single(); @@ -1000,7 +1000,7 @@ export async function submitOperatorUpdate( images: processedImages as unknown as Json }, original_data: JSON.parse(JSON.stringify(existingCompany)), - status: 'pending', + status: 'pending' as const, order_index: 0 }); @@ -1034,7 +1034,7 @@ export async function submitPropertyOwnerCreation( user_id: userId, submission_type: 'property_owner', content: { action: 'create' }, - status: 'pending' + status: 'pending' as const }) .select() .single(); @@ -1052,7 +1052,7 @@ export async function submitPropertyOwnerCreation( company_type: 'property_owner', images: processedImages as unknown as Json }, - status: 'pending', + status: 'pending' as const, order_index: 0 }); @@ -1097,7 +1097,7 @@ export async function submitPropertyOwnerUpdate( user_id: userId, submission_type: 'property_owner', content: { action: 'edit', company_id: companyId }, - status: 'pending' + status: 'pending' as const }) .select() .single(); @@ -1117,7 +1117,7 @@ export async function submitPropertyOwnerUpdate( images: processedImages as unknown as Json }, original_data: JSON.parse(JSON.stringify(existingCompany)), - status: 'pending', + status: 'pending' as const, order_index: 0 }); @@ -1265,7 +1265,7 @@ export async function submitTimelineEventUpdate( action_type: 'edit', item_data: itemData, original_data: originalEvent, - status: 'pending', + status: 'pending' as const, order_index: 0, } ] as unknown as Json[], diff --git a/src/lib/submissionItemsService.ts b/src/lib/submissionItemsService.ts index dde06194..e3694f1d 100644 --- a/src/lib/submissionItemsService.ts +++ b/src/lib/submissionItemsService.ts @@ -12,7 +12,7 @@ export interface SubmissionItemWithDeps { item_data: any; // Complex nested structure - will be typed properly in Phase 5 original_data: any; // Complex nested structure - will be typed properly in Phase 5 action_type?: 'create' | 'edit' | 'delete'; - status: 'pending' | 'approved' | 'rejected'; + status: 'pending' | 'approved' | 'rejected' | 'flagged' | 'skipped'; // Matches ReviewStatus from statuses.ts depends_on: string | null; order_index: number; approved_entity_id: string | null; @@ -211,7 +211,7 @@ export async function approveSubmissionItems( // Update item status await updateSubmissionItem(item.id, { - status: 'approved', + status: 'approved' as const, approved_entity_id: entityId, }); @@ -240,7 +240,7 @@ export async function approveSubmissionItems( // Update item with error status await updateSubmissionItem(item.id, { - status: 'rejected', + status: 'rejected' as const, rejection_reason: `Failed to create entity: ${errorMsg}`, }); @@ -890,7 +890,7 @@ export async function resetRejectedItemsToPending( const { error: itemsError } = await supabase .from('submission_items') .update({ - status: 'pending', + status: 'pending' as const, rejection_reason: null, updated_at: new Date().toISOString() }) @@ -905,7 +905,7 @@ export async function resetRejectedItemsToPending( const { error: submissionError } = await supabase .from('content_submissions') .update({ - status: 'pending', + status: 'pending' as const, reviewed_at: null, reviewer_id: null, reviewer_notes: null, @@ -950,7 +950,7 @@ export async function rejectSubmissionItems( const { error } = await supabase .from('submission_items') .update({ - status: 'rejected', + status: 'rejected' as const, rejection_reason: reason, updated_at: new Date().toISOString(), }) @@ -1156,7 +1156,7 @@ export async function escalateSubmission( const { error } = await supabase .from('content_submissions') .update({ - status: 'pending', + status: 'pending' as const, escalation_reason: reason, escalated_by: userId, reviewer_notes: `Escalated: ${reason}`, diff --git a/supabase/functions/process-selective-approval/index.ts b/supabase/functions/process-selective-approval/index.ts index ca0c68a8..e3f7aa97 100644 --- a/supabase/functions/process-selective-approval/index.ts +++ b/supabase/functions/process-selective-approval/index.ts @@ -3,7 +3,7 @@ import { serve } from "https://deno.land/std@0.190.0/http/server.ts"; import { createClient } from "https://esm.sh/@supabase/supabase-js@2.57.4"; import { validateEntityData, validateEntityDataStrict } from "./validation.ts"; import { createErrorResponse } from "../_shared/errorSanitizer.ts"; -import { edgeLogger } from "../_shared/logger.ts"; +import { edgeLogger, startRequest, endRequest } from "../_shared/logger.ts"; const corsHeaders = { 'Access-Control-Allow-Origin': '*', @@ -47,17 +47,33 @@ const RIDE_MODEL_FIELDS = [ ]; serve(async (req) => { + const tracking = startRequest(); // Start request tracking + if (req.method === 'OPTIONS') { return new Response(null, { headers: corsHeaders }); } try { + edgeLogger.info('Processing selective approval request', { + requestId: tracking.requestId, + traceId: tracking.traceId + }); + // Verify authentication first with a client that respects RLS const authHeader = req.headers.get('Authorization'); if (!authHeader) { + const duration = endRequest(tracking); + edgeLogger.warn('Authentication missing', { requestId: tracking.requestId, duration }); return new Response( - JSON.stringify({ error: 'Authentication required. Please log in.' }), - { status: 401, headers: { ...corsHeaders, 'Content-Type': 'application/json' } } + JSON.stringify({ error: 'Authentication required. Please log in.', requestId: tracking.requestId }), + { + status: 401, + headers: { + ...corsHeaders, + 'Content-Type': 'application/json', + 'X-Request-ID': tracking.requestId + } + } ); }