Skip to content

Commit 62e2e66

Browse files
authored
Merge pull request #171 from hypersign-protocol/credit/fix
removed credit deduction from get api called from dashboard
2 parents bba84a8 + 9b03112 commit 62e2e66

File tree

3 files changed

+94
-22
lines changed

3 files changed

+94
-22
lines changed

src/credit-manager/gaurd/reduce-credit.gaurd.ts

Lines changed: 91 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,13 @@ import { CreditService } from '../services/credit-manager.service';
1010

1111
@Injectable()
1212
export 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(

src/credit-manager/managers/credit-manager.service.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ export class CreditManagerService {
3232
const creditAmountRequired = apiCost + storageCost + creditCost;
3333

3434
// Fetch user's active plan
35-
let activeCredit = await this.creditService.getActiveCredit(
35+
const activeCredit = await this.creditService.getActiveCredit(
3636
String(hidCost),
3737
);
3838

@@ -46,10 +46,7 @@ export class CreditManagerService {
4646
const availableCredit = await this.creditService.getNextAvailableCredit(
4747
String(attestationCost),
4848
);
49-
if (availableCredit) {
50-
await this.creditService.activateCredit(availableCredit._id.toString());
51-
activeCredit = availableCredit;
52-
} else {
49+
if (!availableCredit) {
5350
throw new BadRequestException([
5451
'No credits found or credit exhausted. Please contact the admin',
5552
]);

src/did/services/did.service.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -810,6 +810,7 @@ export class DidService {
810810
);
811811
}
812812
return {
813+
name: didInfo?.name || '',
813814
did: registerDidData.did,
814815
registrationStatus: registerDidData.registrationStatus,
815816
transactionHash: registerDidData.transactionHash,

0 commit comments

Comments
 (0)