// Refresh the authenticated member's cached nextBillingDate from Helcim. // The account page calls this only when the stored date is stale (missing, // past, or within ~24h). On success, writes the fresh date back to the member // record so subsequent loads can render instantly from /api/auth/member. // // On Helcim errors, returns { subscription: null, error: 'unavailable' } (HTTP 200) // so the client can fall back to the cached value (if any) without crashing. import { requireAuth } from '../../utils/auth.js' import { getHelcimSubscription } from '../../utils/helcim.js' import Member from '../../models/member.js' import { connectDB } from '../../utils/mongoose.js' export default defineEventHandler(async (event) => { const member = await requireAuth(event) if (!member.helcimSubscriptionId) { return { subscription: null } } try { const response = await getHelcimSubscription(member.helcimSubscriptionId) const data = response?.data const subscription = Array.isArray(data) ? data[0] : (data && typeof data === 'object' ? data : response) // Helcim's GET /subscriptions/:id returns `dateBilling` (YYYY-MM-DD). // POST /subscriptions responses have sometimes been seen with `nextBillingDate`; // accept both so the refresh works regardless of shape. const nextBillingDate = subscription?.dateBilling || subscription?.nextBillingDate || null if (nextBillingDate) { const parsed = new Date(nextBillingDate) if (!Number.isNaN(parsed.getTime())) { await connectDB() await Member.findByIdAndUpdate( member._id, { $set: { nextBillingDate: parsed } }, { runValidators: false } ) } } return { subscription: subscription ? { id: String(subscription.id ?? ''), status: subscription.status || '', nextBillingDate: nextBillingDate || '', } : null, } } catch (error) { console.error('[subscription.get] Helcim lookup failed', { helcimSubscriptionId: member.helcimSubscriptionId, error: error?.message || error, }) return { subscription: null, error: 'unavailable' } } })