@@ -470,25 +470,34 @@ export class ChallengesService {
470470
471471 async generateChallengePayments ( challengeId : string , userId : string ) {
472472 const challenge = await this . getChallenge ( challengeId ) ;
473+ this . logger . log ( `Fetched challenge ${ challengeId } ` ) ;
473474
474475 if ( ! challenge ) {
476+ this . logger . error ( `Challenge not found: ${ challengeId } ` ) ;
475477 throw new Error ( 'Challenge not found!' ) ;
476478 }
477479
480+ this . logger . log ( `Challenge ${ challenge . id } - "${ challenge . name } " with status "${ challenge . status } " retrieved` ) ;
481+
478482 const allowedStatuses = [
479483 ChallengeStatuses . Completed . toLowerCase ( ) ,
480484 ChallengeStatuses . CancelledFailedReview . toLowerCase ( ) ,
481485 ] ;
482486
483487 if ( ! allowedStatuses . includes ( challenge . status . toLowerCase ( ) ) ) {
488+ this . logger . error (
489+ `Challenge ${ challenge . id } isn't in a payable status: ${ challenge . status } ` ,
490+ ) ;
484491 throw new Error ( "Challenge isn't in a payable status!" ) ;
485492 }
486493
487494 // need to read for update (LOCK the rows)
495+ this . logger . log ( `Attempting to acquire lock for challenge ${ challenge . id } ` ) ;
488496 try {
489497 await this . prisma . challenge_lock . create ( {
490498 data : { external_id : challenge . id } ,
491499 } ) ;
500+ this . logger . log ( `Lock acquired for challenge ${ challenge . id } ` ) ;
492501 } catch ( err : any ) {
493502 if ( err . code === 'P2002' ) {
494503 this . logger . log ( `Challenge Lock already acquired for ${ challenge . id } ` ) ;
@@ -497,27 +506,49 @@ export class ChallengesService {
497506 `Challenge Lock already acquired for ${ challenge . id } ` ,
498507 ) ;
499508 }
509+ this . logger . error (
510+ `Failed to acquire lock for challenge ${ challenge . id } ` ,
511+ err . message ?? err ,
512+ ) ;
500513 throw err ;
501514 }
502515
503516 try {
517+ this . logger . log ( `Starting payment creation for challenge ${ challenge . id } ` ) ;
504518 await this . createPayments ( challenge , userId ) ;
519+ this . logger . log ( `Payment creation completed for challenge ${ challenge . id } ` ) ;
505520 } catch ( error ) {
506- if ( error . message . includes ( 'Lock already acquired' ) ) {
521+ this . logger . error (
522+ `Error while creating payments for challenge ${ challenge . id } ` ,
523+ error . message ?? error ,
524+ ) ;
525+ if (
526+ error &&
527+ ( typeof error . message === 'string' ) &&
528+ error . message . includes ( 'Lock already acquired' )
529+ ) {
530+ this . logger . log ( `Conflict detected while creating payments for ${ challenge . id } ` ) ;
507531 throw new ConflictException (
508532 'Another payment operation is in progress.' ,
509533 ) ;
510534 } else {
511535 throw error ;
512536 }
513537 } finally {
514- await this . prisma . challenge_lock
515- . deleteMany ( {
538+ try {
539+ const result = await this . prisma . challenge_lock . deleteMany ( {
516540 where : { external_id : challenge . id } ,
517- } )
518- . catch ( ( ) => {
519- // swallow errors if lock was already released
520541 } ) ;
542+ this . logger . log (
543+ `Released lock for challenge ${ challenge . id } . Rows deleted: ${ result . count } ` ,
544+ ) ;
545+ } catch ( releaseErr ) {
546+ // swallow errors if lock was already released but log for observability
547+ this . logger . error (
548+ `Failed to release lock for challenge ${ challenge . id } ` ,
549+ releaseErr . message ?? releaseErr ,
550+ ) ;
551+ }
521552 }
522553 }
523554}
0 commit comments