Add New Wallet Adapter in Wallet Service
Adding New Wallet Providers
The system is designed to be provider-agnostic through the adapter pattern. To add a new wallet provider, follow these steps:
1. Create a New Adapter
Create a new adapter file in src/adapters/
(e.g., newprovider.adapter.ts
):
import { Injectable } from '@nestjs/common';
import { IWalletAdapter, IWalletAdapterWithOtp } from './interfaces/wallet-adapter.interface';
import { OnboardUserDto } from '../dto/onboard-user.dto';
import { UploadVcDto } from '../dto/upload-vc.dto';
import { WatchVcDto } from '../dto/watch-vc.dto';
import { WatchCallbackDto } from '../dto/watch-callback.dto';
@Injectable()
export class NewProviderAdapter implements IWalletAdapter {
private readonly apiBaseUrl: string;
private readonly apiKey: string;
constructor() {
this.apiBaseUrl = process.env.NEW_PROVIDER_API_BASE || '';
this.apiKey = process.env.NEW_PROVIDER_API_KEY || '';
}
async onboardUser(data: OnboardUserDto) {
// Implement user onboarding logic
// Make API calls to the new provider
// Transform responses to match the interface
}
async getAllVCs(userId: string, token: string) {
// Implement VC listing logic
}
async getVCById(userId: string, vcId: string, token: string) {
// Implement VC retrieval logic
}
async uploadVCFromQR(userId: string, qrData: string, token: string) {
// Implement VC upload logic
}
async login(data: any) {
// Implement login logic
}
// Optional: Implement OTP methods if supported
async verifyLogin?(data: any) {
// Implement OTP verification
}
async resendOtp?(data: any) {
// Implement OTP resend
}
// Optional: Implement watching methods if supported
async watchVC?(data: WatchVcDto) {
// Implement VC watching
}
async processCallback?(data: WatchCallbackDto) {
// Implement callback processing
}
}
2. Update the Adapter Factory
Modify src/adapters/adapter.factory.ts
:
import { DhiwayAdapter } from './dhiway.adapter';
import { NewProviderAdapter } from './newprovider.adapter';
export function createWalletAdapter(): IWalletAdapter {
const provider = process.env.WALLET_PROVIDER || 'dhiway';
switch (provider) {
case 'dhiway':
return new DhiwayAdapter();
case 'newprovider':
return new NewProviderAdapter();
default:
throw new Error(`Unsupported wallet provider: ${provider}`);
}
}
3. Update Environment Variables
Add new provider configuration to .env.example
:
# New Provider Configuration
NEW_PROVIDER_API_BASE=https://api.newprovider.com
NEW_PROVIDER_API_KEY=your-new-provider-api-key
4. Update the Wallet Module
Modify src/wallet/wallet.module.ts
:
import { NewProviderAdapter } from '../adapters/newprovider.adapter';
@Module({
// ... existing imports
providers: [
WalletService,
WalletVCService,
WalletVCWatcherService,
WatcherCronService,
{
provide: 'WALLET_ADAPTER',
useFactory: createWalletAdapter,
},
DhiwayAdapter,
NewProviderAdapter, // Add new adapter
],
// ... rest of module
})
export class WalletModule {}
5. Update Configuration
Set the new provider in your environment:
WALLET_PROVIDER=newprovider
Last updated