Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion src/app.module.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Module } from '@nestjs/common';
import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';

Check warning on line 1 in src/app.module.ts

View workflow job for this annotation

GitHub Actions / build

'MiddlewareConsumer' is defined but never used

Check warning on line 1 in src/app.module.ts

View workflow job for this annotation

GitHub Actions / build

'NestModule' is defined but never used
import { ConfigModule } from '@nestjs/config';
import { EdvModule } from './edv/edv.module';
import { AllExceptionsFilter } from './utils/utils';
Expand All @@ -9,6 +9,10 @@
import { PresentationModule } from './presentation/presentation.module';
import { TxSendModuleModule } from './tx-send-module/tx-send-module.module';
import { StatusModule } from './status/status.module';
import { CreditManagerModule } from './credit-manager/credit-manager.module';
import { LogModule } from './log/log.module';
import { AppLoggerMiddleware } from './utils/interceptor/http-interceptor';

Check warning on line 14 in src/app.module.ts

View workflow job for this annotation

GitHub Actions / build

'AppLoggerMiddleware' is defined but never used
import { UsageModule } from './usage/usage.module';
@Module({
imports: [
ConfigModule.forRoot({
Expand All @@ -22,6 +26,9 @@
PresentationModule,
TxSendModuleModule,
StatusModule,
CreditManagerModule,
LogModule,
UsageModule,
],
controllers: [],
providers: [{ provide: APP_FILTER, useClass: AllExceptionsFilter }],
Expand Down
3 changes: 2 additions & 1 deletion src/credential/controllers/credential.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,9 @@ import { Credential } from '../schemas/credntial.schema';
import { GetCredentialList } from '../dto/fetch-credential.dto';
import { RegisterCredentialStatusDto } from '../dto/register-credential.dto';
import { TxnHash } from 'src/did/dto/create-did.dto';
import { ReduceCreditGuard } from 'src/credit-manager/gaurd/reduce-credit.gaurd';
@ApiBearerAuth('Authorization')
@UseGuards(AuthGuard('jwt'))
@UseGuards(AuthGuard('jwt'), ReduceCreditGuard)
@Controller('credential')
@ApiTags('Credential')
export class CredentialController {
Expand Down
6 changes: 6 additions & 0 deletions src/credential/credential.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ import { StatusModule } from 'src/status/status.module';
import { StatusService } from 'src/status/status.service';
import { TxnStatusRepository } from 'src/status/repository/status.repository';
import { statusProviders } from 'src/status/providers/registration-status.provider';
import { CreditManagerModule } from 'src/credit-manager/credit-manager.module';
import { AppLoggerMiddleware } from 'src/utils/interceptor/http-interceptor';
import { LogModule } from 'src/log/log.module';

@Module({
imports: [
Expand All @@ -29,6 +32,8 @@ import { statusProviders } from 'src/status/providers/registration-status.provid
DidModule,
TxSendModuleModule,
StatusModule,
CreditManagerModule,
LogModule,
],
controllers: [CredentialController],
providers: [
Expand All @@ -53,5 +58,6 @@ export class CredentialModule implements NestModule {
{ path: 'credential/:credentialId', method: RequestMethod.GET },
)
.forRoutes(CredentialController);
consumer.apply(AppLoggerMiddleware).forRoutes(CredentialController);
}
}
20 changes: 20 additions & 0 deletions src/credit-manager/controllers/credit-manager.controller.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { Test, TestingModule } from '@nestjs/testing';
import { CreditManagerController } from './credit-manager.controller';
import { CreditService } from '../services/credit-manager.service';

describe('CreditManagerController', () => {
let controller: CreditManagerController;

beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
controllers: [CreditManagerController],
providers: [CreditService],
}).compile();

controller = module.get<CreditManagerController>(CreditManagerController);
});

it('should be defined', () => {
expect(controller).toBeDefined();
});
});
143 changes: 143 additions & 0 deletions src/credit-manager/controllers/credit-manager.controller.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
import {
Controller,
Get,
Post,
Param,
UseFilters,
UseGuards,
Logger,
Req,
Body,

Check warning on line 10 in src/credit-manager/controllers/credit-manager.controller.ts

View workflow job for this annotation

GitHub Actions / build

'Body' is defined but never used
} from '@nestjs/common';
import { CreditService } from '../services/credit-manager.service';
// import { AllExceptionsFilter } from '../../../utility/exception.filter';
import {
ApiBadRequestResponse,
ApiBearerAuth,
ApiCreatedResponse,
ApiNotFoundResponse,
ApiOkResponse,
ApiTags,
ApiUnauthorizedResponse,
} from '@nestjs/swagger';
// import { CustomAuthGuard } from 'src/auth/auth.guard';
// import { CreditAuthGuard } from 'src/auth/credit-token.guard';
import {
createCreditResponse,
ActivateCredtiResponse,
} from '../dto/create-credit-manager.dto';
import { AllExceptionsFilter } from 'src/utils/utils';
import {
CreditError,
CreditNotFoundError,
CreditUnAuthorizeError,
} from '../dto/error-credit.dto';
import { AuthGuard } from '@nestjs/passport';
import { CreditAuthGuard } from '../gaurd/credit-token.gaurd';

@UseFilters(AllExceptionsFilter)
@ApiTags('Credit')
@Controller('credit')
export class CreditManagerController {
constructor(private readonly creditManagerService: CreditService) {}
@ApiBearerAuth('Authorization')
@UseGuards(CreditAuthGuard)
@ApiCreatedResponse({
description: 'Credit detail is added successfully',
type: createCreditResponse,
})
@ApiBadRequestResponse({
description: 'Unable to add credit detail',
type: CreditError,
})
@ApiNotFoundResponse({
description: 'Missing',
type: CreditNotFoundError,
})
@ApiUnauthorizedResponse({
description: 'Authorization token is invalid or expired.',
type: CreditUnAuthorizeError,
})
@Post()
AddNewCreditDetail(@Req() req) {
Logger.log(
'AddNewCreditDetail() method to add credit detail',
'CreditManagerController',
);
return this.creditManagerService.addCreditDetail(req.creditDetail);
}
@ApiBearerAuth('Authorization')
@UseGuards(AuthGuard('jwt'))
@ApiOkResponse({
description: 'Credit is activated successfully',
type: ActivateCredtiResponse,
})
@ApiBadRequestResponse({
description: 'Unable to activate credit detail',
type: CreditError,
})
@ApiNotFoundResponse({
description: 'Authorization token is invalid or expired.',
type: CreditNotFoundError,
})
@ApiUnauthorizedResponse({
description: 'Authorization token is invalid or expired.',
type: CreditUnAuthorizeError,
})
@Post(':creditId/activate')
activateCredit(@Param('creditId') creditId: string) {
Logger.log(
'activateCredit() method to activate existing credit detail',
'CreditManagerController',
);
return this.creditManagerService.activateCredit(creditId);
}
@ApiBearerAuth('Authorization')
@UseGuards(AuthGuard('jwt'))
@ApiOkResponse({
description: 'Fetched all credit detail',
type: createCreditResponse,
})
@ApiBadRequestResponse({
description: 'Unable to fetch credit detail',
type: CreditError,
})
@ApiUnauthorizedResponse({
description: 'Authorization token is invalid or expired.',
type: CreditUnAuthorizeError,
})
@Get()
fetchCreditDetails() {
Logger.log(
'fetchCreditDetails() method to fetch all credit detail',
'CreditManagerController',
);
return this.creditManagerService.fetchCreditDetails();
}
@ApiBearerAuth('Authorization')
@UseGuards(AuthGuard('jwt'))
@ApiOkResponse({
description: 'The details of the credit have been successfully fetched.',
type: ActivateCredtiResponse,
})
@ApiBadRequestResponse({
description: 'Unable to fetch particular credit detail',
type: CreditError,
})
@ApiUnauthorizedResponse({
description: 'Authorization token is invalid or expired.',
type: CreditUnAuthorizeError,
})
@Get(':creditId')
fetchParticularCreditDetail(@Param('creditId') creditId: string, @Req() req) {
Logger.log(
'fetchParticularCreditDetail() method to fetch particular credit detail',
'CreditManagerController',
);
const appId = req.user.appId;
return this.creditManagerService.fetchParticularCreditDetail(
creditId,
appId,
);
}
}
36 changes: 36 additions & 0 deletions src/credit-manager/credit-manager.module.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
import { CreditManagerController } from './controllers/credit-manager.controller';
import { creditSchemaProviders } from './schema/credit.provider';
import { CreditService } from './services/credit-manager.service';
import { CreditManagerRepository } from './repository/credit-manager.repository';
import { JwtService } from '@nestjs/jwt';
import { databaseProviders } from 'src/mongoose/tenant-mongoose-connections';
import { CreditManagerService } from './managers/credit-manager.service';
import { ApiCreditService } from './services/api-credit.service';
import { StorageCreditService } from './services/storage-credit.service';
import { AttestationCreditService } from './services/attestation-credit.service';
import { WhitelistSSICorsMiddleware } from 'src/utils/middleware/cors.middleware';

@Module({
imports: [],
controllers: [CreditManagerController],
providers: [
CreditService,
...databaseProviders,
...creditSchemaProviders,
CreditManagerRepository,
JwtService,
CreditManagerService,
ApiCreditService,
StorageCreditService,
AttestationCreditService,
],
exports: [CreditService, CreditManagerRepository, CreditManagerService],
})
export class CreditManagerModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(WhitelistSSICorsMiddleware)
.forRoutes(CreditManagerController);
}
}
98 changes: 98 additions & 0 deletions src/credit-manager/dto/create-credit-manager.dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
import { ApiProperty } from '@nestjs/swagger';
import { IsNumber, IsString, Min } from 'class-validator';
import { Status } from '../schema/credit-manager.schema';
export enum ValidityPeriodUnit {
DAYS = 'DAYS',
WEEK = 'WEEK',
MONTH = 'MONTH',
YEAR = 'YEAR',
}
export class CreateCreditManagerDto {
@ApiProperty({
name: 'credit',
description: 'Number of credits available',
example: 1000,
})
@IsNumber()
@Min(10)
totalCredits: number;
validityDuration: number;
validityDurationUnit: ValidityPeriodUnit;
serviceId: string;
creditDenom: string;
}

export class createCreditResponse {
@ApiProperty({
name: 'totalCredits',
description: 'Total available credit',
example: 1000,
})
@IsNumber()
totalCredits: number;
@ApiProperty({
name: 'used',
description: 'Total number of credit used till now',
example: 0,
})
@IsNumber()
used: number;
@ApiProperty({
name: 'validityDuration',
description:
'The number of days the credit is valid from the date of activation',
example: 60,
})
@IsNumber()
validityDuration: number;
@ApiProperty({
name: 'status',
description:
'The current status of the credit detail. Indicates whether the credit is active or inactive.',
enum: Status,
example: Status.INACTIVE,
})
@IsString()
status: string;
@ApiProperty({
name: '_id',
description: 'Unique identifier of credit detail',
example: '66e0407bc7f8a92162d1e824',
})
@IsString()
_id: string;
@ApiProperty({
name: 'createdAt',
description: 'Time at which document is added',
example: '2024-09-10T12:50:03.984Z',
})
@IsString()
createdAt: string;
@ApiProperty({
name: 'updatedAt',
description: 'Time at which document last updated',
example: '2024-09-10T12:50:03.984Z',
})
@IsString()
updatedAt: string;
}

export class ActivateCredtiResponse extends createCreditResponse {
@ApiProperty({
name: 'status',
description:
'The current status of the credit detail. Indicates whether the credit is active or inactive.',
enum: Status,
example: Status.ACTIVE,
})
@IsString()
status: string;
@ApiProperty({
name: 'expiresAt',
description:
'The date and time when the credit expires. After this timestamp, the credit is no longer valid.',
example: '2024-11-10T12:50:03.984Z',
})
@IsString()
expiresAt: string;
}
Loading
Loading