ghostguild-org/server/api/members/cancel-subscription.post.js

100 lines
2.6 KiB
JavaScript

// 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",
});
}
});