| | import axios from 'axios'; |
| | import { createLogger } from '../../utils/logger'; |
| |
|
| | const logger = createLogger('VirtualNumberService'); |
| |
|
| | export interface Country { |
| | id: string; |
| | name: string; |
| | count: number; |
| | } |
| |
|
| | export interface PriceInfo { |
| | cost: number; |
| | count: number; |
| | rate?: number; |
| | } |
| |
|
| | export interface ServicePrice { |
| | [country: string]: { |
| | [operator: string]: PriceInfo; |
| | }; |
| | } |
| |
|
| | export interface ProductPrices { |
| | [service: string]: { |
| | [country: string]: { |
| | [operator: string]: PriceInfo; |
| | }; |
| | }; |
| | } |
| |
|
| | export interface MaxPrice { |
| | id: number; |
| | product: string; |
| | price: number; |
| | CreatedAt: string; |
| | } |
| |
|
| | export class VirtualNumberService { |
| | private static instance: VirtualNumberService; |
| | private apiKey: string; |
| | private baseUrl: string = 'https://5sim.net/v1'; |
| | |
| | private constructor() { |
| | this.apiKey = process.env.FIVESIM_API_KEY || ''; |
| | if (!this.apiKey) { |
| | logger.error('5sim API key not found in environment variables'); |
| | } |
| | } |
| |
|
| | public static getInstance(): VirtualNumberService { |
| | if (!VirtualNumberService.instance) { |
| | VirtualNumberService.instance = new VirtualNumberService(); |
| | } |
| | return VirtualNumberService.instance; |
| | } |
| |
|
| | |
| | |
| | |
| | async getAvailableCountries(service: string): Promise<Country[]> { |
| | try { |
| | const response = await axios.get(`${this.baseUrl}/guest/countries/${service}`, { |
| | headers: { |
| | 'Authorization': `Bearer ${this.apiKey}`, |
| | 'Accept': 'application/json', |
| | } |
| | }); |
| | |
| | return response.data; |
| | } catch (error: any) { |
| | logger.error(`Error fetching countries for ${service}: ${error.message}`); |
| | throw new Error(`Failed to fetch available countries: ${error.message}`); |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | async getProductPrices(product: string): Promise<ProductPrices> { |
| | try { |
| | const response = await axios.get(`${this.baseUrl}/guest/prices?product=${product}`, { |
| | headers: { |
| | 'Accept': 'application/json', |
| | } |
| | }); |
| | |
| | return response.data; |
| | } catch (error: any) { |
| | logger.error(`Error fetching prices for product ${product}: ${error.message}`); |
| | throw new Error(`Failed to fetch product prices: ${error.message}`); |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | async getPrices(service: string, country: string): Promise<ServicePrice> { |
| | try { |
| | const response = await axios.get(`${this.baseUrl}/guest/prices?product=${service}&country=${country}`, { |
| | headers: { |
| | 'Authorization': `Bearer ${this.apiKey}`, |
| | 'Accept': 'application/json', |
| | } |
| | }); |
| | |
| | return response.data; |
| | } catch (error: any) { |
| | logger.error(`Error fetching prices for ${service} in ${country}: ${error.message}`); |
| | throw new Error(`Failed to fetch prices: ${error.message}`); |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | async purchaseNumber(service: string, country: string, operator: string): Promise<any> { |
| | try { |
| | const response = await axios.get( |
| | `${this.baseUrl}/user/buy/activation/${country}/${operator}/${service}`, |
| | { |
| | headers: { |
| | 'Authorization': `Bearer ${this.apiKey}`, |
| | 'Accept': 'application/json', |
| | } |
| | } |
| | ); |
| | |
| | return response.data; |
| | } catch (error: any) { |
| | logger.error(`Error purchasing number for ${service} in ${country}: ${error.message}`); |
| | throw new Error(`Failed to purchase number: ${error.message}`); |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | async checkSMS(orderId: string | number): Promise<any> { |
| | try { |
| | const response = await axios.get( |
| | `${this.baseUrl}/user/check/${orderId}`, |
| | { |
| | headers: { |
| | 'Authorization': `Bearer ${this.apiKey}`, |
| | 'Accept': 'application/json', |
| | } |
| | } |
| | ); |
| | |
| | return response.data; |
| | } catch (error: any) { |
| | logger.error(`Error checking SMS for order ${orderId}: ${error.message}`); |
| | throw new Error(`Failed to check SMS: ${error.message}`); |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | async getMaxPrices(): Promise<MaxPrice[]> { |
| | try { |
| | const response = await axios.get(`${this.baseUrl}/user/max-prices`, { |
| | headers: { |
| | 'Authorization': `Bearer ${this.apiKey}`, |
| | 'Accept': 'application/json', |
| | } |
| | }); |
| | |
| | return response.data; |
| | } catch (error: any) { |
| | logger.error(`Error fetching max prices: ${error.message}`); |
| | throw new Error(`Failed to fetch max prices: ${error.message}`); |
| | } |
| | } |
| | } |