fix: replace member.save() with atomic update in cancel-subscription
This commit is contained in:
parent
d4d9629d83
commit
bbe94f0efb
1 changed files with 20 additions and 39 deletions
|
|
@ -1,49 +1,22 @@
|
||||||
// Cancel member subscription
|
// Cancel member subscription
|
||||||
import jwt from "jsonwebtoken";
|
|
||||||
import Member from "../../models/member.js";
|
|
||||||
import { connectDB } from "../../utils/mongoose.js";
|
import { connectDB } from "../../utils/mongoose.js";
|
||||||
|
import Member from "../../models/member.js";
|
||||||
|
|
||||||
const HELCIM_API_BASE = "https://api.helcim.com/v2";
|
const HELCIM_API_BASE = "https://api.helcim.com/v2";
|
||||||
|
|
||||||
export default defineEventHandler(async (event) => {
|
export default defineEventHandler(async (event) => {
|
||||||
try {
|
try {
|
||||||
|
const member = await requireAuth(event);
|
||||||
await connectDB();
|
await connectDB();
|
||||||
const config = useRuntimeConfig(event);
|
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, config.jwtSecret);
|
|
||||||
} 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 already on free tier, nothing to cancel
|
||||||
if (member.contributionTier === "0" || !member.helcimSubscriptionId) {
|
if (member.contributionTier === "0" || !member.helcimSubscriptionId) {
|
||||||
return {
|
return {
|
||||||
success: true,
|
success: true,
|
||||||
message: "No active subscription to cancel",
|
message: "No active subscription to cancel",
|
||||||
member,
|
status: member.status,
|
||||||
|
contributionTier: member.contributionTier,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -77,18 +50,26 @@ export default defineEventHandler(async (event) => {
|
||||||
// Continue anyway - we'll update the member record
|
// Continue anyway - we'll update the member record
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update member status
|
// Update member status — pending_payment (not cancelled) so member can re-subscribe
|
||||||
member.status = "cancelled";
|
await Member.findByIdAndUpdate(
|
||||||
member.contributionTier = "0";
|
member._id,
|
||||||
member.helcimSubscriptionId = null;
|
{
|
||||||
member.paymentMethod = "none";
|
$set: {
|
||||||
member.subscriptionEndDate = new Date();
|
status: 'pending_payment',
|
||||||
await member.save();
|
contributionTier: '0',
|
||||||
|
helcimSubscriptionId: null,
|
||||||
|
paymentMethod: 'none',
|
||||||
|
subscriptionEndDate: new Date(),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{ runValidators: false }
|
||||||
|
);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
success: true,
|
success: true,
|
||||||
message: "Subscription cancelled successfully",
|
message: "Subscription cancelled successfully",
|
||||||
member,
|
status: 'pending_payment',
|
||||||
|
contributionTier: '0',
|
||||||
};
|
};
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Error cancelling subscription:", error);
|
console.error("Error cancelling subscription:", error);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue