From ba6bb8a317288944784cda3856cd64b669b3d715 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Mon, 3 Nov 2025 19:16:06 +0000 Subject: [PATCH] Fix edge function console statements --- .../admin/editors/CoasterStatsEditor.tsx | 6 +- .../admin/editors/FormerNamesEditor.tsx | 2 +- .../admin/editors/TechnicalSpecsEditor.tsx | 6 +- src/components/auth/TurnstileCaptcha.tsx | 2 +- src/components/error/AdminErrorBoundary.tsx | 8 ++- .../process-scheduled-deletions/index.ts | 36 +++++----- .../process-selective-approval/index.ts | 70 +++++++++---------- .../functions/remove-novu-subscriber/index.ts | 16 ++--- .../functions/update-novu-subscriber/index.ts | 8 +-- 9 files changed, 78 insertions(+), 76 deletions(-) diff --git a/src/components/admin/editors/CoasterStatsEditor.tsx b/src/components/admin/editors/CoasterStatsEditor.tsx index 79d818fc..b84c3a48 100644 --- a/src/components/admin/editors/CoasterStatsEditor.tsx +++ b/src/components/admin/editors/CoasterStatsEditor.tsx @@ -86,14 +86,14 @@ export function CoasterStatsEditor({ onChange(newStats.map((stat, i) => ({ ...stat, display_order: i }))); }; - const updateStat = (index: number, field: keyof CoasterStat, value: any) => { + const updateStat = (index: number, field: keyof CoasterStat, value: string | number | boolean | null | undefined) => { const newStats = [...stats]; // Ensure unit is metric when updating unit field - if (field === 'unit' && value) { + if (field === 'unit' && value && typeof value === 'string') { try { validateMetricUnit(value, 'Unit'); - newStats[index] = { ...newStats[index], [field]: value }; + newStats[index] = { ...newStats[index], unit: value }; // Clear error for this index setUnitErrors(prev => { const updated = { ...prev }; diff --git a/src/components/admin/editors/FormerNamesEditor.tsx b/src/components/admin/editors/FormerNamesEditor.tsx index c10c7fef..e1d77706 100644 --- a/src/components/admin/editors/FormerNamesEditor.tsx +++ b/src/components/admin/editors/FormerNamesEditor.tsx @@ -40,7 +40,7 @@ export function FormerNamesEditor({ names, onChange, currentName }: FormerNamesE onChange(newNames.map((name, i) => ({ ...name, order_index: i }))); }; - const updateName = (index: number, field: keyof FormerName, value: any) => { + const updateName = (index: number, field: keyof FormerName, value: string | number | Date | null | undefined) => { const newNames = [...names]; newNames[index] = { ...newNames[index], [field]: value }; onChange(newNames); diff --git a/src/components/admin/editors/TechnicalSpecsEditor.tsx b/src/components/admin/editors/TechnicalSpecsEditor.tsx index ba60a223..d143c58c 100644 --- a/src/components/admin/editors/TechnicalSpecsEditor.tsx +++ b/src/components/admin/editors/TechnicalSpecsEditor.tsx @@ -64,14 +64,14 @@ export function TechnicalSpecsEditor({ onChange(newSpecs.map((spec, i) => ({ ...spec, display_order: i }))); }; - const updateSpec = (index: number, field: keyof TechnicalSpec, value: any) => { + const updateSpec = (index: number, field: keyof TechnicalSpec, value: string | number | boolean | null | undefined) => { const newSpecs = [...specs]; // Ensure unit is metric when updating unit field - if (field === 'unit' && value) { + if (field === 'unit' && value && typeof value === 'string') { try { validateMetricUnit(value, 'Unit'); - newSpecs[index] = { ...newSpecs[index], [field]: value }; + newSpecs[index] = { ...newSpecs[index], unit: value }; // Clear error for this index setUnitErrors(prev => { const updated = { ...prev }; diff --git a/src/components/auth/TurnstileCaptcha.tsx b/src/components/auth/TurnstileCaptcha.tsx index f3735b59..bc67abfe 100644 --- a/src/components/auth/TurnstileCaptcha.tsx +++ b/src/components/auth/TurnstileCaptcha.tsx @@ -26,7 +26,7 @@ export function TurnstileCaptcha({ const [error, setError] = useState(null); const [loading, setLoading] = useState(true); const [key, setKey] = useState(0); - const turnstileRef = useRef(null); + const turnstileRef = useRef(null); const handleSuccess = (token: string) => { setError(null); diff --git a/src/components/error/AdminErrorBoundary.tsx b/src/components/error/AdminErrorBoundary.tsx index bed5dcbd..c7c1f446 100644 --- a/src/components/error/AdminErrorBoundary.tsx +++ b/src/components/error/AdminErrorBoundary.tsx @@ -11,9 +11,11 @@ interface AdminErrorBoundaryProps { section?: string; // e.g., "Moderation", "Users", "Settings" } +type ErrorWithId = Error & { errorId: string }; + interface AdminErrorBoundaryState { hasError: boolean; - error: Error | null; + error: ErrorWithId | null; errorInfo: ErrorInfo | null; } @@ -43,7 +45,7 @@ export class AdminErrorBoundary extends Component { return { hasError: true, - error, + error: error as ErrorWithId, }; } @@ -60,7 +62,7 @@ export class AdminErrorBoundary extends Component { diff --git a/supabase/functions/process-scheduled-deletions/index.ts b/supabase/functions/process-scheduled-deletions/index.ts index 1c25fd83..bf889e34 100644 --- a/supabase/functions/process-scheduled-deletions/index.ts +++ b/supabase/functions/process-scheduled-deletions/index.ts @@ -1,6 +1,6 @@ import { serve } from 'https://deno.land/std@0.168.0/http/server.ts'; import { createClient } from 'https://esm.sh/@supabase/supabase-js@2'; -import { startRequest, endRequest } from "../_shared/logger.ts"; +import { edgeLogger, startRequest, endRequest } from "../_shared/logger.ts"; const corsHeaders = { 'Access-Control-Allow-Origin': '*', @@ -21,7 +21,7 @@ serve(async (req) => { Deno.env.get('SUPABASE_SERVICE_ROLE_KEY') ?? '' ); - console.log('Processing scheduled account deletions...', { requestId: tracking.requestId }); + edgeLogger.info('Processing scheduled account deletions', { action: 'scheduled_deletions', requestId: tracking.requestId }); // Find confirmed deletion requests that are past their scheduled date const { data: pendingDeletions, error: fetchError } = await supabaseAdmin @@ -35,7 +35,7 @@ serve(async (req) => { } if (!pendingDeletions || pendingDeletions.length === 0) { - console.log('No deletions to process'); + edgeLogger.info('No deletions to process', { action: 'scheduled_deletions', requestId: tracking.requestId }); endRequest(tracking, 200); @@ -57,14 +57,14 @@ serve(async (req) => { ); } - console.log(`Found ${pendingDeletions.length} deletion(s) to process`); + edgeLogger.info('Found deletions to process', { action: 'scheduled_deletions', count: pendingDeletions.length, requestId: tracking.requestId }); let successCount = 0; let errorCount = 0; for (const deletion of pendingDeletions) { try { - console.log(`Processing deletion for user: ${deletion.user_id}`); + edgeLogger.info('Processing deletion for user', { action: 'scheduled_deletions', userId: deletion.user_id }); // Get user email for confirmation email const { data: userData } = await supabaseAdmin.auth.admin.getUserById(deletion.user_id); @@ -100,7 +100,7 @@ serve(async (req) => { if (cloudflareAccountId && cloudflareApiToken) { try { - console.log(`Deleting avatar image: ${profile.avatar_image_id}`); + edgeLogger.info('Deleting avatar image', { action: 'scheduled_deletions', avatarId: profile.avatar_image_id }); const deleteResponse = await fetch( `https://api.cloudflare.com/client/v4/accounts/${cloudflareAccountId}/images/v1/${profile.avatar_image_id}`, { @@ -112,12 +112,12 @@ serve(async (req) => { ); if (!deleteResponse.ok) { - console.error('Failed to delete avatar from Cloudflare:', await deleteResponse.text()); + edgeLogger.error('Failed to delete avatar from Cloudflare', { action: 'scheduled_deletions', error: await deleteResponse.text() }); } else { - console.log('Avatar deleted from Cloudflare successfully'); + edgeLogger.info('Avatar deleted from Cloudflare successfully', { action: 'scheduled_deletions' }); } } catch (avatarError) { - console.error('Error deleting avatar from Cloudflare:', avatarError); + edgeLogger.error('Error deleting avatar from Cloudflare', { action: 'scheduled_deletions', error: avatarError }); } } } @@ -130,7 +130,7 @@ serve(async (req) => { // Remove from Novu before deleting auth user try { - console.log(`Removing Novu subscriber: ${deletion.user_id}`); + edgeLogger.info('Removing Novu subscriber', { action: 'scheduled_deletions', userId: deletion.user_id }); const { error: novuError } = await supabaseAdmin.functions.invoke( 'remove-novu-subscriber', @@ -143,13 +143,13 @@ serve(async (req) => { ); if (novuError) { - console.error('Failed to remove Novu subscriber:', novuError); + edgeLogger.error('Failed to remove Novu subscriber', { action: 'scheduled_deletions', error: novuError }); } else { - console.log('Novu subscriber removed successfully'); + edgeLogger.info('Novu subscriber removed successfully', { action: 'scheduled_deletions' }); } } catch (novuError) { // Non-blocking - log but continue with deletion - console.error('Error removing Novu subscriber:', novuError); + edgeLogger.error('Error removing Novu subscriber', { action: 'scheduled_deletions', error: novuError }); } // Update deletion request status @@ -190,20 +190,20 @@ serve(async (req) => { }), }); } catch (emailError) { - console.error('Failed to send confirmation email:', emailError); + edgeLogger.error('Failed to send confirmation email', { action: 'scheduled_deletions', error: emailError }); } } } successCount++; - console.log(`Successfully deleted account for user: ${deletion.user_id}`); + edgeLogger.info('Successfully deleted account for user', { action: 'scheduled_deletions', userId: deletion.user_id }); } catch (error) { errorCount++; - console.error(`Failed to delete account for user ${deletion.user_id}:`, error); + edgeLogger.error('Failed to delete account for user', { action: 'scheduled_deletions', userId: deletion.user_id, error }); } } - console.log(`Processed ${successCount} deletion(s) successfully, ${errorCount} error(s)`); + edgeLogger.info('Processed deletions', { action: 'scheduled_deletions', successCount, errorCount, requestId: tracking.requestId }); endRequest(tracking, 200); @@ -225,7 +225,7 @@ serve(async (req) => { } ); } catch (error) { - console.error('Error processing scheduled deletions:', error); + edgeLogger.error('Error processing scheduled deletions', { action: 'scheduled_deletions', error: error.message, requestId: tracking.requestId }); endRequest(tracking, 500, error.message); diff --git a/supabase/functions/process-selective-approval/index.ts b/supabase/functions/process-selective-approval/index.ts index af3d05fa..4c15a90b 100644 --- a/supabase/functions/process-selective-approval/index.ts +++ b/supabase/functions/process-selective-approval/index.ts @@ -501,7 +501,7 @@ serve(withRateLimit(async (req) => { }); if (setUserIdError) { - console.error('[APPROVAL] Failed to set user context:', { error: setUserIdError.message }); + edgeLogger.error('Failed to set user context', { action: 'approval_set_context', error: setUserIdError.message, requestId: tracking.requestId }); } // Set submission ID for version tracking @@ -512,7 +512,7 @@ serve(withRateLimit(async (req) => { }); if (setSubmissionIdError) { - console.error('[APPROVAL] Failed to set submission context:', { error: setSubmissionIdError.message }); + edgeLogger.error('Failed to set submission context', { action: 'approval_set_context', error: setSubmissionIdError.message, requestId: tracking.requestId }); } // Resolve dependencies in item data @@ -702,7 +702,7 @@ serve(withRateLimit(async (req) => { .eq('id', submissionId); if (updateError) { - console.error('[APPROVAL] Failed to update submission status:', { error: updateError.message }); + edgeLogger.error('Failed to update submission status', { action: 'approval_update_status', error: updateError.message, requestId: tracking.requestId }); } // Log audit trail for submission action @@ -731,7 +731,7 @@ serve(withRateLimit(async (req) => { }); } catch (auditError) { // Log but don't fail the operation - console.error('[AUDIT] Failed to log admin action:', auditError); + edgeLogger.error('Failed to log admin action', { action: 'approval_audit_log', error: auditError, requestId: tracking.requestId }); } const duration = endRequest(tracking); @@ -754,10 +754,10 @@ serve(withRateLimit(async (req) => { } catch (error: unknown) { const duration = endRequest(tracking); const errorMessage = error instanceof Error ? error.message : 'An unexpected error occurred'; - console.error('[APPROVAL ERROR] Process failed:', { + edgeLogger.error('Approval process failed', { + action: 'approval_process_error', error: errorMessage, userId: authenticatedUserId, - timestamp: new Date().toISOString(), requestId: tracking.requestId, duration }); @@ -1059,7 +1059,7 @@ async function createPark(supabase: any, data: any): Promise { // Check if this is an edit (has park_id) or a new creation if (data.park_id) { - console.log(`Updating existing park ${data.park_id}`); + edgeLogger.info('Updating existing park', { action: 'approval_update_park', parkId: data.park_id }); parkId = data.park_id; delete data.park_id; // Remove ID from update data @@ -1073,7 +1073,7 @@ async function createPark(supabase: any, data: any): Promise { if (error) throw new Error(`Failed to update park: ${error.message}`); } else { - console.log('Creating new park'); + edgeLogger.info('Creating new park', { action: 'approval_create_park' }); const normalizedData = normalizeStatusValue(data); const sanitizedData = sanitizeDateFields(normalizedData); const filteredData = filterDatabaseFields(sanitizedData, PARK_FIELDS); @@ -1089,7 +1089,7 @@ async function createPark(supabase: any, data: any): Promise { // Insert photos into photos table if (uploadedPhotos.length > 0 && submitterId) { - console.log(`Inserting ${uploadedPhotos.length} photos for park ${parkId}`); + edgeLogger.info('Inserting photos for park', { action: 'approval_insert_photos', photoCount: uploadedPhotos.length, parkId }); for (let i = 0; i < uploadedPhotos.length; i++) { const photo = uploadedPhotos[i]; if (photo.cloudflare_id && photo.url) { @@ -1106,7 +1106,7 @@ async function createPark(supabase: any, data: any): Promise { }); if (photoError) { - console.error(`Failed to insert photo ${i}:`, photoError); + edgeLogger.error('Failed to insert photo', { action: 'approval_insert_photo', photoIndex: i, error: photoError.message }); } } } @@ -1160,7 +1160,7 @@ async function createRide(supabase: any, data: any): Promise { // Check if this is an edit (has ride_id) or a new creation if (data.ride_id) { - console.log(`Updating existing ride ${data.ride_id}`); + edgeLogger.info('Updating existing ride', { action: 'approval_update_ride', rideId: data.ride_id }); rideId = data.ride_id; delete data.ride_id; // Remove ID from update data @@ -1176,17 +1176,17 @@ async function createRide(supabase: any, data: any): Promise { // Update park ride counts after successful ride update if (parkId) { - console.log(`Updating ride counts for park ${parkId}`); + edgeLogger.info('Updating ride counts for park', { action: 'approval_update_counts', parkId }); const { error: countError } = await supabase.rpc('update_park_ride_counts', { target_park_id: parkId }); if (countError) { - console.error('Failed to update park counts:', countError); + edgeLogger.error('Failed to update park counts', { action: 'approval_update_counts', error: countError.message, parkId }); } } } else { - console.log('Creating new ride'); + edgeLogger.info('Creating new ride', { action: 'approval_create_ride' }); const normalizedData = normalizeStatusValue(data); const sanitizedData = sanitizeDateFields(normalizedData); const filteredData = filterDatabaseFields(sanitizedData, RIDE_FIELDS); @@ -1201,20 +1201,20 @@ async function createRide(supabase: any, data: any): Promise { // Update park ride counts after successful ride creation if (parkId) { - console.log(`Updating ride counts for park ${parkId}`); + edgeLogger.info('Updating ride counts for park', { action: 'approval_update_counts', parkId }); const { error: countError } = await supabase.rpc('update_park_ride_counts', { target_park_id: parkId }); if (countError) { - console.error('Failed to update park counts:', countError); + edgeLogger.error('Failed to update park counts', { action: 'approval_update_counts', error: countError.message, parkId }); } } } // Insert photos into photos table if (uploadedPhotos.length > 0 && submitterId) { - console.log(`Inserting ${uploadedPhotos.length} photos for ride ${rideId}`); + edgeLogger.info('Inserting photos for ride', { action: 'approval_insert_photos', photoCount: uploadedPhotos.length, rideId }); for (let i = 0; i < uploadedPhotos.length; i++) { const photo = uploadedPhotos[i]; if (photo.cloudflare_id && photo.url) { @@ -1231,7 +1231,7 @@ async function createRide(supabase: any, data: any): Promise { }); if (photoError) { - console.error(`Failed to insert photo ${i}:`, photoError); + edgeLogger.error('Failed to insert photo', { action: 'approval_insert_photo', photoIndex: i, error: photoError.message }); } } } @@ -1239,7 +1239,7 @@ async function createRide(supabase: any, data: any): Promise { // Insert technical specifications if (technicalSpecifications.length > 0) { - console.log(`Inserting ${technicalSpecifications.length} technical specs for ride ${rideId}`); + edgeLogger.info('Inserting technical specs for ride', { action: 'approval_insert_specs', specCount: technicalSpecifications.length, rideId }); const techSpecsToInsert = technicalSpecifications.map((spec: any) => ({ ride_id: rideId, spec_name: spec.spec_name, @@ -1254,13 +1254,13 @@ async function createRide(supabase: any, data: any): Promise { .insert(techSpecsToInsert); if (techSpecError) { - console.error('Failed to insert technical specifications:', techSpecError); + edgeLogger.error('Failed to insert technical specifications', { action: 'approval_insert_specs', error: techSpecError.message, rideId }); } } // Insert coaster statistics if (coasterStatistics.length > 0) { - console.log(`Inserting ${coasterStatistics.length} coaster stats for ride ${rideId}`); + edgeLogger.info('Inserting coaster stats for ride', { action: 'approval_insert_stats', statCount: coasterStatistics.length, rideId }); const statsToInsert = coasterStatistics.map((stat: any) => ({ ride_id: rideId, stat_name: stat.stat_name, @@ -1276,13 +1276,13 @@ async function createRide(supabase: any, data: any): Promise { .insert(statsToInsert); if (statsError) { - console.error('Failed to insert coaster statistics:', statsError); + edgeLogger.error('Failed to insert coaster statistics', { action: 'approval_insert_stats', error: statsError.message, rideId }); } } // Insert name history if (nameHistory.length > 0) { - console.log(`Inserting ${nameHistory.length} former names for ride ${rideId}`); + edgeLogger.info('Inserting name history for ride', { action: 'approval_insert_names', nameCount: nameHistory.length, rideId }); const namesToInsert = nameHistory.map((name: any) => ({ ride_id: rideId, former_name: name.former_name, @@ -1298,7 +1298,7 @@ async function createRide(supabase: any, data: any): Promise { .insert(namesToInsert); if (namesError) { - console.error('Failed to insert name history:', namesError); + edgeLogger.error('Failed to insert name history', { action: 'approval_insert_names', error: namesError.message, rideId }); } } @@ -1332,7 +1332,7 @@ async function createCompany(supabase: any, data: any, companyType: string): Pro const companyId = data.company_id || data.id; if (companyId) { - console.log(`Updating existing company ${companyId}`); + edgeLogger.info('Updating existing company', { action: 'approval_update_company', companyId }); const updateData = sanitizeDateFields({ ...data, company_type: companyType }); delete updateData.company_id; delete updateData.id; // Remove ID from update data @@ -1346,7 +1346,7 @@ async function createCompany(supabase: any, data: any, companyType: string): Pro if (error) throw new Error(`Failed to update company: ${error.message}`); return companyId; } else { - console.log('Creating new company'); + edgeLogger.info('Creating new company', { action: 'approval_create_company' }); const companyData = sanitizeDateFields({ ...data, company_type: companyType }); const filteredData = filterDatabaseFields(companyData, COMPANY_FIELDS); const { data: company, error } = await supabase @@ -1371,7 +1371,7 @@ async function createRideModel(supabase: any, data: any): Promise { // Check if this is an edit (has ride_model_id) or a new creation if (data.ride_model_id) { - console.log(`Updating existing ride model ${data.ride_model_id}`); + edgeLogger.info('Updating existing ride model', { action: 'approval_update_model', rideModelId: data.ride_model_id }); rideModelId = data.ride_model_id; delete data.ride_model_id; // Remove ID from update data @@ -1384,7 +1384,7 @@ async function createRideModel(supabase: any, data: any): Promise { if (error) throw new Error(`Failed to update ride model: ${error.message}`); } else { - console.log('Creating new ride model'); + edgeLogger.info('Creating new ride model', { action: 'approval_create_model' }); // Validate required fields if (!data.manufacturer_id) { @@ -1408,7 +1408,7 @@ async function createRideModel(supabase: any, data: any): Promise { // Insert technical specifications if (technicalSpecifications.length > 0) { - console.log(`Inserting ${technicalSpecifications.length} technical specs for ride model ${rideModelId}`); + edgeLogger.info('Inserting technical specs for ride model', { action: 'approval_insert_model_specs', specCount: technicalSpecifications.length, rideModelId }); const techSpecsToInsert = technicalSpecifications.map((spec: any) => ({ ride_model_id: rideModelId, spec_name: spec.spec_name, @@ -1423,7 +1423,7 @@ async function createRideModel(supabase: any, data: any): Promise { .insert(techSpecsToInsert); if (techSpecError) { - console.error('Failed to insert technical specifications:', techSpecError); + edgeLogger.error('Failed to insert technical specifications', { action: 'approval_insert_model_specs', error: techSpecError.message, rideModelId }); } } @@ -1448,7 +1448,7 @@ async function approvePhotos(supabase: any, data: any, submissionItemId: string) const { error } = await supabase.from('photos').insert(photoData); if (error) { - console.error('Failed to insert photo:', error); + edgeLogger.error('Failed to insert photo', { action: 'approval_insert_photo', error: error.message }); throw new Error(`Failed to insert photo: ${error.message}`); } } @@ -1460,7 +1460,7 @@ function extractImageId(url: string): string { } async function editPhoto(supabase: any, data: any): Promise { - console.log(`Editing photo ${data.photo_id}`); + edgeLogger.info('Editing photo', { action: 'approval_edit_photo', photoId: data.photo_id }); const { error } = await supabase .from('photos') .update({ @@ -1472,7 +1472,7 @@ async function editPhoto(supabase: any, data: any): Promise { } async function deletePhoto(supabase: any, data: any): Promise { - console.log(`Deleting photo ${data.photo_id}`); + edgeLogger.info('Deleting photo', { action: 'approval_delete_photo', photoId: data.photo_id }); const { error } = await supabase .from('photos') .delete() @@ -1493,7 +1493,7 @@ async function createTimelineEvent( const eventId = data.id || data.event_id; if (eventId) { - console.log(`Updating existing timeline event ${eventId}`); + edgeLogger.info('Updating existing timeline event', { action: 'approval_update_timeline', eventId }); // Prepare update data (exclude ID and audit fields) const updateData: any = { @@ -1524,7 +1524,7 @@ async function createTimelineEvent( if (error) throw new Error(`Failed to update timeline event: ${error.message}`); return eventId; } else { - console.log('Creating new timeline event'); + edgeLogger.info('Creating new timeline event', { action: 'approval_create_timeline' }); const eventData = { entity_id: data.entity_id, diff --git a/supabase/functions/remove-novu-subscriber/index.ts b/supabase/functions/remove-novu-subscriber/index.ts index 46529939..1be45579 100644 --- a/supabase/functions/remove-novu-subscriber/index.ts +++ b/supabase/functions/remove-novu-subscriber/index.ts @@ -1,6 +1,6 @@ import { serve } from "https://deno.land/std@0.190.0/http/server.ts"; import { Novu } from "npm:@novu/api@1.6.0"; -import { startRequest, endRequest } from "../_shared/logger.ts"; +import { edgeLogger, startRequest, endRequest } from "../_shared/logger.ts"; const corsHeaders = { 'Access-Control-Allow-Origin': '*', @@ -43,27 +43,27 @@ serve(async (req) => { ); } - console.log('Removing subscriber from "users" topic:', { subscriberId, requestId: tracking.requestId }); + edgeLogger.info('Removing subscriber from users topic', { action: 'remove_novu_subscriber', subscriberId, requestId: tracking.requestId }); // Remove subscriber from "users" topic try { await novu.topics.removeSubscribers('users', { subscribers: [subscriberId], }); - console.log('Successfully removed subscriber from "users" topic', { subscriberId }); + edgeLogger.info('Successfully removed subscriber from users topic', { action: 'remove_novu_subscriber', subscriberId }); } catch (topicError: any) { - console.error('Failed to remove subscriber from "users" topic:', topicError.message, { subscriberId }); + edgeLogger.error('Failed to remove subscriber from users topic', { action: 'remove_novu_subscriber', subscriberId, error: topicError.message }); // Continue - we still want to delete the subscriber if requested } // Optionally delete the subscriber entirely from Novu if (deleteSubscriber) { try { - console.log('Deleting subscriber from Novu:', { subscriberId }); + edgeLogger.info('Deleting subscriber from Novu', { action: 'remove_novu_subscriber', subscriberId }); await novu.subscribers.delete(subscriberId); - console.log('Successfully deleted subscriber from Novu', { subscriberId }); + edgeLogger.info('Successfully deleted subscriber from Novu', { action: 'remove_novu_subscriber', subscriberId }); } catch (deleteError: any) { - console.error('Failed to delete subscriber from Novu:', deleteError.message, { subscriberId }); + edgeLogger.error('Failed to delete subscriber from Novu', { action: 'remove_novu_subscriber', subscriberId, error: deleteError.message }); throw deleteError; } } @@ -89,7 +89,7 @@ serve(async (req) => { ); } catch (error: unknown) { const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred'; - console.error('Error removing Novu subscriber:', errorMessage, { requestId: tracking.requestId }); + edgeLogger.error('Error removing Novu subscriber', { action: 'remove_novu_subscriber', error: errorMessage, requestId: tracking.requestId }); endRequest(tracking, 500, errorMessage); diff --git a/supabase/functions/update-novu-subscriber/index.ts b/supabase/functions/update-novu-subscriber/index.ts index 45a74055..8e7b6158 100644 --- a/supabase/functions/update-novu-subscriber/index.ts +++ b/supabase/functions/update-novu-subscriber/index.ts @@ -1,6 +1,6 @@ import { serve } from "https://deno.land/std@0.168.0/http/server.ts"; import { Novu } from "npm:@novu/api@1.6.0"; -import { startRequest, endRequest } from "../_shared/logger.ts"; +import { edgeLogger, startRequest, endRequest } from "../_shared/logger.ts"; const corsHeaders = { 'Access-Control-Allow-Origin': '*', @@ -35,7 +35,7 @@ serve(async (req) => { data?: Record; }; - console.log('Updating Novu subscriber:', { subscriberId, email, firstName, requestId: tracking.requestId }); + edgeLogger.info('Updating Novu subscriber', { action: 'update_novu_subscriber', subscriberId, email, firstName, requestId: tracking.requestId }); const subscriber = await novu.subscribers.update(subscriberId, { email, @@ -46,7 +46,7 @@ serve(async (req) => { data, }); - console.log('Subscriber updated successfully:', subscriber.data); + edgeLogger.info('Subscriber updated successfully', { action: 'update_novu_subscriber', subscriberId: subscriber.data._id }); endRequest(tracking, 200); @@ -67,7 +67,7 @@ serve(async (req) => { ); } catch (error: unknown) { const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred'; - console.error('Error updating Novu subscriber:', errorMessage); + edgeLogger.error('Error updating Novu subscriber', { action: 'update_novu_subscriber', error: errorMessage, requestId: tracking.requestId }); endRequest(tracking, 500, errorMessage);