1- // routes/stripe-webhook.js
21import express from 'express' ;
32import { constructStripeEvent , retrieveSubscription , retrieveCustomer } from '../services/stripeService.js' ;
43import { createGhostMember } from '../services/ghostService.js' ;
4+ import logger from '../config/logger.js' ;
55
66const router = express . Router ( ) ;
77
@@ -11,32 +11,57 @@ router.post(
1111 async ( req , res ) => {
1212 let event ;
1313 try {
14+ logger . info ( 'Incoming Stripe webhook received' ) ;
1415 event = constructStripeEvent ( req . body , req . headers [ 'stripe-signature' ] ) ;
16+ logger . debug ( 'Stripe event constructed successfully' , { eventType : event . type } ) ;
1517 } catch ( err ) {
16- console . error ( 'Webhook signature verification failed:' , err . message ) ;
18+ logger . error ( 'Webhook signature verification failed' , {
19+ error : err . message ,
20+ stack : err . stack
21+ } ) ;
1722 return res . status ( 400 ) . send ( `Webhook Error: ${ err . message } ` ) ;
1823 }
1924
2025 if ( event . type === 'checkout.session.completed' ) {
2126 try {
2227 const session = event . data . object ;
28+ logger . info ( 'Processing checkout.session.completed event' , {
29+ sessionId : session . id ,
30+ customer : session . customer
31+ } ) ;
2332
2433 // Extract info from metadata & customer if available
2534 let email = session . customer_details ?. email ;
2635 let name = session . metadata ?. name ;
2736 let productId = session . metadata ?. productId ;
2837 let plan = session . metadata ?. plan ;
2938
39+ logger . debug ( 'Extracted session metadata' , {
40+ emailPresent : ! ! email ,
41+ namePresent : ! ! name ,
42+ productId,
43+ plan
44+ } ) ;
45+
3046 // If missing, fetch from Stripe (fallback)
3147 if ( ! email || ! name ) {
48+ logger . debug ( 'Missing email or name, fetching customer from Stripe' ) ;
3249 const customer = await retrieveCustomer ( session . customer ) ;
3350 email = email || customer . email ;
3451 name = name || customer . name ;
3552 }
3653
3754 // Always fetch subscription details
55+ logger . debug ( 'Fetching subscription details' ) ;
3856 const subscription = await retrieveSubscription ( session . subscription ) ;
3957
58+ logger . info ( 'Creating Ghost member' , {
59+ email : email ?. substring ( 0 , 3 ) + '...@...' + email ?. split ( '@' ) [ 1 ] ?. substring ( 0 , 3 ) ,
60+ name : name ?. substring ( 0 , 2 ) + '...' ,
61+ productId,
62+ plan
63+ } ) ;
64+
4065 await createGhostMember ( {
4166 email,
4267 name,
@@ -46,14 +71,20 @@ router.post(
4671 plan
4772 } ) ;
4873
49- console . log ( `Ghost member created: ${ email } (${ plan } plan)` ) ;
74+ logger . info ( `Ghost member created: ${ email ?. substring ( 0 , 3 ) } ... (${ plan } plan)` ) ;
5075 } catch ( err ) {
51- console . error ( 'Error syncing with Ghost:' , err ) ;
76+ logger . error ( 'Error syncing with Ghost' , {
77+ error : err . message ,
78+ stack : err . stack ,
79+ eventType : event . type
80+ } ) ;
5281 }
82+ } else {
83+ logger . debug ( 'Unhandled Stripe event type' , { eventType : event . type } ) ;
5384 }
5485
5586 res . status ( 200 ) . end ( ) ;
5687 }
5788) ;
5889
59- export default router ;
90+ export default router ;
0 commit comments