Files
thrilltrack-explorer/supabase/functions/remove-novu-subscriber/index.ts
gpt-engineer-app[bot] a1280ddd05 Migrate Novu functions to wrapEdgeFunction
Refactor Phase 3 Batch 2–4 Novu-related functions to use the createEdgeFunction wrapper, replacing explicit HTTP servers with edge wrapper, adding standardized logging, tracing, and error handling across subscriber management, topic/notification, and migration/sync functions.
2025-11-11 03:55:02 +00:00

73 lines
2.6 KiB
TypeScript

import { Novu } from "npm:@novu/api@1.6.0";
import { corsHeaders } from '../_shared/cors.ts';
import { edgeLogger } from "../_shared/logger.ts";
import { createEdgeFunction } from '../_shared/edgeFunctionWrapper.ts';
import { validateString } from '../_shared/typeValidation.ts';
export default createEdgeFunction(
{
name: 'remove-novu-subscriber',
requireAuth: false,
corsHeaders: corsHeaders
},
async (req, context) => {
const novuApiKey = Deno.env.get('NOVU_API_KEY');
if (!novuApiKey) {
throw new Error('NOVU_API_KEY is not configured');
}
const novu = new Novu({
secretKey: novuApiKey
});
const { subscriberId, deleteSubscriber = false } = await req.json() as {
subscriberId: string;
deleteSubscriber?: boolean;
};
validateString(subscriberId, 'subscriberId', { requestId: context.requestId });
context.span.setAttribute('action', 'remove_novu_subscriber');
edgeLogger.info('Removing subscriber from users topic', { action: 'remove_novu_subscriber', subscriberId, requestId: context.requestId });
// Remove subscriber from "users" topic
try {
await novu.topics.removeSubscribers('users', {
subscribers: [subscriberId],
});
edgeLogger.info('Successfully removed subscriber from users topic', { action: 'remove_novu_subscriber', subscriberId, requestId: context.requestId });
} catch (topicError: any) {
edgeLogger.error('Failed to remove subscriber from users topic', { action: 'remove_novu_subscriber', subscriberId, error: topicError.message, requestId: context.requestId });
// Continue - we still want to delete the subscriber if requested
}
// Optionally delete the subscriber entirely from Novu
if (deleteSubscriber) {
try {
edgeLogger.info('Deleting subscriber from Novu', { action: 'remove_novu_subscriber', subscriberId, requestId: context.requestId });
await novu.subscribers.delete(subscriberId);
edgeLogger.info('Successfully deleted subscriber from Novu', { action: 'remove_novu_subscriber', subscriberId, requestId: context.requestId });
} catch (deleteError: any) {
edgeLogger.error('Failed to delete subscriber from Novu', { action: 'remove_novu_subscriber', subscriberId, error: deleteError.message, requestId: context.requestId });
throw deleteError;
}
}
return new Response(
JSON.stringify({
success: true,
subscriberId,
removedFromTopic: true,
deleted: deleteSubscriber,
}),
{
headers: {
'Content-Type': 'application/json',
},
status: 200,
}
);
}
);