// Cancel member subscription import jwt from "jsonwebtoken"; import Member from "../../models/member.js"; import { connectDB } from "../../utils/mongoose.js"; const HELCIM_API_BASE = "https://api.helcim.com/v2"; export default defineEventHandler(async (event) => { try { await connectDB(); const config = useRuntimeConfig(event); const token = getCookie(event, "auth-token"); if (!token) { throw createError({ statusCode: 401, statusMessage: "Not authenticated", }); } // Decode JWT token let decoded; try { decoded = jwt.verify(token, process.env.JWT_SECRET); } catch (err) { throw createError({ statusCode: 401, statusMessage: "Invalid or expired token", }); } // Get member const member = await Member.findById(decoded.memberId); if (!member) { throw createError({ statusCode: 404, statusMessage: "Member not found", }); } // If already on free tier, nothing to cancel if (member.contributionTier === "0" || !member.helcimSubscriptionId) { return { success: true, message: "No active subscription to cancel", member, }; } const helcimToken = config.public.helcimToken || process.env.NUXT_PUBLIC_HELCIM_TOKEN; try { // Cancel Helcim subscription const response = await fetch( `${HELCIM_API_BASE}/subscriptions/${member.helcimSubscriptionId}`, { method: "DELETE", headers: { accept: "application/json", "api-token": helcimToken, }, }, ); if (!response.ok) { const errorText = await response.text(); console.error( "Failed to cancel Helcim subscription:", response.status, errorText, ); // Continue anyway - we'll update the member record } } catch (error) { console.error("Error canceling Helcim subscription:", error); // Continue anyway - we'll update the member record } // Update member status member.status = "cancelled"; member.contributionTier = "0"; member.helcimSubscriptionId = null; member.paymentMethod = "none"; member.subscriptionEndDate = new Date(); await member.save(); return { success: true, message: "Subscription cancelled successfully", member, }; } catch (error) { console.error("Error cancelling subscription:", error); throw createError({ statusCode: error.statusCode || 500, statusMessage: error.message || "Failed to cancel subscription", }); } });