@@ -10,10 +10,13 @@ import { CreditService } from '../services/credit-manager.service';
1010
1111@Injectable ( )
1212export class ReduceCreditGuard implements CanActivate {
13+ private readonly exemptedOrigin = 'https://entity.dashboard.hypersign.id' ;
14+ // private readonly exemptedOrigin = 'http://localhost:9001';
15+
1316 constructor (
1417 private readonly creditManagerService : CreditManagerService ,
1518 private readonly creditService : CreditService ,
16- ) { }
19+ ) { }
1720
1821 async canActivate ( context : ExecutionContext ) : Promise < boolean > {
1922 const req = context . switchToHttp ( ) . getRequest ( ) ;
@@ -33,29 +36,100 @@ export class ReduceCreditGuard implements CanActivate {
3336 res . status ( 403 ) . json ( { error : 'Insufficient credits or no active plan' } ) ;
3437 return false ;
3538 }
36- // let remainingCreditsNeeded = creditDetails?.creditAmountRequired || 0;
37- // let remainingHIDNeeded = creditDetails?.attestationCost || '0';
38- // Request is processed successfully, deduct credits
39- /**
40- * To Do
41- * handle the case where active plan has some credit but not equal to credit required. and user has some valid inactive plan
42- */
4339 res . on ( 'finish' , async ( ) => {
44- if ( res . statusCode >= 200 && res . statusCode < 300 ) {
40+ if ( res . statusCode >= 200 && res . statusCode < 400 ) {
4541 Logger . log (
4642 'Request successful. Deducting credits now...' ,
4743 'ReduceCreditGuard' ,
4844 ) ;
45+ const origin = req . headers . origin || req . headers . referer || '' ;
46+ if ( req . method === 'GET' && origin ?. startsWith ( this . exemptedOrigin ) ) {
47+ Logger . log (
48+ `Skipping credit deduction for ${ req . method } request from ${ origin } ` ,
49+ 'ReduceCreditGuard' ,
50+ ) ;
51+ return ;
52+ }
4953 try {
50- await this . creditService . updateCreditDetail (
51- { _id : activeCredit . _id } ,
52- {
53- $inc : {
54- used : creditDetails . creditAmountRequired ,
55- [ `credit.used` ] : Number ( creditDetails . attestationCost . hidCost ) ,
56- } ,
57- } ,
54+ let remainingCreditsNeeded = creditDetails . creditAmountRequired ;
55+ let remainingHIDNeeded = Number (
56+ creditDetails . attestationCost . hidCost ,
5857 ) ;
58+ const availableCredits =
59+ activeCredit . totalCredits - activeCredit . used ;
60+ const availableHID =
61+ Number ( activeCredit . credit . amount ) - activeCredit . credit . used ;
62+ if (
63+ availableCredits < remainingCreditsNeeded ||
64+ availableHID < remainingHIDNeeded
65+ ) {
66+ const deductedCredits = Math . min (
67+ remainingCreditsNeeded ,
68+ availableCredits ,
69+ ) ;
70+ const deductedHID = Math . min ( remainingHIDNeeded , availableHID ) ;
71+ remainingCreditsNeeded -= deductedCredits ;
72+ remainingHIDNeeded -= deductedHID ;
73+
74+ if ( remainingCreditsNeeded > 0 ) {
75+ const inactiveCreditPlan =
76+ await this . creditService . getNextAvailableCredit (
77+ `${ remainingHIDNeeded } ` ,
78+ ) ;
79+ if ( inactiveCreditPlan ) {
80+ Logger . log (
81+ `Activating new credit plan: ${ inactiveCreditPlan . _id } ` ,
82+ 'ReduceCreditGuard' ,
83+ ) ;
84+ await this . creditService . activateCredit ( inactiveCreditPlan . _id ) ;
85+ await this . creditService . updateCreditDetail (
86+ { _id : activeCredit . _id } ,
87+ {
88+ $inc : {
89+ used : deductedCredits ,
90+ [ `credit.used` ] : deductedHID ,
91+ } ,
92+ status : 'Inactive' ,
93+ } ,
94+ ) ;
95+ Logger . log (
96+ `Deducted ${ deductedCredits } credits and ${ deductedHID } HID from active plan` ,
97+ 'ReduceCreditGuard' ,
98+ ) ;
99+ await this . creditService . updateCreditDetail (
100+ { _id : inactiveCreditPlan . _id } ,
101+ {
102+ $inc : {
103+ used : remainingCreditsNeeded ,
104+ [ `credit.used` ] : remainingHIDNeeded ,
105+ } ,
106+ } ,
107+ ) ;
108+ Logger . log (
109+ `Deducted remaining ${ remainingCreditsNeeded } credits from new plan` ,
110+ 'ReduceCreditGuard' ,
111+ ) ;
112+ remainingCreditsNeeded = 0 ;
113+ } else {
114+ Logger . error (
115+ 'No inactive credit plan available to activate.' ,
116+ 'ReduceCreditGuard' ,
117+ ) ;
118+ }
119+ }
120+ } else {
121+ await this . creditService . updateCreditDetail (
122+ { _id : activeCredit . _id } ,
123+ {
124+ $inc : {
125+ used : creditDetails . creditAmountRequired ,
126+ [ `credit.used` ] : Number (
127+ creditDetails . attestationCost . hidCost ,
128+ ) ,
129+ } ,
130+ } ,
131+ ) ;
132+ }
59133 Logger . log ( 'Credits deducted successfully' , 'ReduceCreditGuard' ) ;
60134 } catch ( error ) {
61135 Logger . error (
0 commit comments