Persist nextBillingDate on subscription create/update; unset on cancel or downgrade to free. Account page displays the cached date and lazily refreshes from Helcim when the cached value is within 24h of now (or missing).
56 lines
1.9 KiB
JavaScript
56 lines
1.9 KiB
JavaScript
// 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 subscription = Array.isArray(response)
|
|
? response[0]
|
|
: (response?.data?.[0] || response)
|
|
|
|
const nextBillingDate = 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' }
|
|
}
|
|
})
|