Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

10 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Daftar Isi

Panduan Cepat

import { PropanaService, PropanaDisplayService, InputUtil } from './src';

async function main() {
  const service = new PropanaService();

  try {
    // Login dengan kredensial agen
    await service.login('PRID119932', '08XXXXXXXXX');
    
    // Minta kode OTP
    await service.requestOTP();
    
    // Verifikasi OTP
    const otp = await InputUtil.getUserInput('Masukkan kode OTP: ');
    await service.verifyOTP(otp);
    
    // Membuat koneksi dan inisialisasi sesi
    await service.establishConnection();
    await service.initializeSession();

    // Dapatkan daftar produk dan tampilkan
    const products = await service.getProductList();
    PropanaDisplayService.displayProductList(products);

    // Buat pesanan
    const order = await service.orderProduct('TDKG1', '08XXXXXXXXX');
    PropanaDisplayService.displayProductOrderResult(order);

    // Lakukan deposit
    const deposit = await service.deposit(100000);
    PropanaDisplayService.displayDepositResult(deposit);

  } catch (error) {
    console.error('Error:', error.message);
  } finally {
    InputUtil.closeInput();
  }
}

main();

Setup Development

Prasyarat

  • Node.js >= 20.0.0
  • npm atau yarn

Langkah Setup

  1. Clone repositori:
git clone https://github.com/imtaqin/PropanaReload
cd PropanaReload
  1. Install dependensi:
npm install
  1. Build project:
npm run build
  1. Jalankan development server:
npm run dev

Cara Penggunaan

Alur Autentikasi Dasar

import { PropanaService } from 'propana-api-client';

const service = new PropanaService();

// 1. Login
await service.login('ID_AGEN', 'NOMOR_TELEPON');

// 2. Minta OTP
await service.requestOTP();

// 3. Verifikasi OTP
await service.verifyOTP('123456');

// 4. Buat koneksi
await service.establishConnection();

// 5. Inisialisasi sesi
await service.initializeSession();

// Sekarang siap digunakan!

Konfigurasi Custom

import { PropanaService } from 'propana-api-client';

// Menggunakan konfigurasi custom
const customConfig = {
  appKey1: 'app_key_1_custom',
  appKey2: 'app_key_2_custom',
  fcmToken: 'fcm_token_custom'
};

const service = new PropanaService(customConfig);

Mengelola Sesi

// Simpan sesi untuk penggunaan selanjutnya
await service.saveSession();

// Muat sesi yang tersimpan
const sessionLoaded = await service.loadSession();

if (sessionLoaded) {
  console.log('Sesi berhasil dimuat');
} else {
  console.log('Tidak ada sesi tersimpan');
}

// Hapus sesi
await service.clearSession();

Referensi API

PropanaService

Constructor

constructor(config?: PropanaConfig)

Membuat instance baru dari Propana API client.

Parameter:

  • config (opsional): Objek konfigurasi dengan API keys dan FCM token

Method Autentikasi

login(agentId: string, phoneNumber: string): Promise<ApiResponse>

Memulai proses login dengan kredensial agen.

Parameter:

  • agentId: String identifikasi agen (contoh: 'PRID119932')
  • phoneNumber: Nomor telepon untuk autentikasi (contoh: '08123456789')

Return: Promise<ApiResponse>

Contoh:

await service.login('PRID119932', '08123456789');
requestOTP(): Promise<ApiResponse>

Meminta kode OTP untuk dikirim ke nomor telepon terdaftar.

Return: Promise<ApiResponse>

verifyOTP(otp: string): Promise<ApiResponse>

Memverifikasi kode OTP yang diterima via SMS.

Parameter:

  • otp: Kode OTP 6 digit yang diterima

Return: Promise<ApiResponse>

establishConnection(): Promise<boolean>

Membuat koneksi dengan server setelah verifikasi OTP berhasil.

Return: Promise<boolean>

initializeSession(): Promise<boolean>

Inisialisasi sesi untuk penggunaan API.

Return: Promise<boolean>

Method Transaksi

getProductList(): Promise<ApiResponse>

Mendapatkan daftar produk yang tersedia.

Return: Promise<ApiResponse>

Contoh:

const products = await service.getProductList();
PropanaDisplayService.displayProductList(products);
orderProduct(productCode: string, destination: string, amount?: string): Promise<ApiResponse>

Membuat pesanan produk.

Parameter:

  • productCode: Kode produk (contoh: 'TDKG1')
  • destination: Nomor tujuan
  • amount (opsional): Jumlah/nominal

Return: Promise<ApiResponse>

Contoh:

const order = await service.orderProduct('TDKG1', '08123456789');
deposit(amount: number): Promise<ApiResponse>

Memproses permintaan deposit.

Parameter:

  • amount: Jumlah deposit dalam Rupiah

Return: Promise<ApiResponse>

Contoh:

const deposit = await service.deposit(100000);
PropanaDisplayService.displayDepositResult(deposit);

Method Utilitas

getSessionState(): SessionState

Mendapatkan status sesi saat ini.

Return: SessionState ('INITIAL' | 'LOGGED_IN' | 'OTP_SENT' | 'VERIFIED' | 'CONNECTED' | 'READY')

getAgentInfo(): AgentInfo

Mendapatkan informasi agen yang sedang login.

Return: AgentInfo

saveSession(): Promise<void>

Menyimpan sesi ke file untuk penggunaan selanjutnya.

loadSession(): Promise<boolean>

Memuat sesi yang tersimpan sebelumnya.

clearSession(): Promise<void>

Menghapus data sesi saat ini.

PropanaDisplayService

Service untuk menampilkan hasil API dalam format yang mudah dibaca.

Method Statis

displayProductList(result: ApiResponse): void

Menampilkan daftar produk dalam format tabel.

displayProductOrderResult(result: ApiResponse): void

Menampilkan hasil pesanan produk.

displayDepositResult(result: ApiResponse): void

Menampilkan hasil deposit dengan detail bank transfer.

displayAgentInfo(agentInfo: AgentInfo): void

Menampilkan informasi agen.

formatCurrency(amount: string | number): string

Format angka menjadi mata uang Rupiah.

InputUtil

Utility untuk input dari terminal.

getUserInput(prompt: string): Promise<string>

Mendapatkan input dari user via terminal.

closeInput(): void

Menutup interface input.

Konfigurasi

Environment Variables

Variable Deskripsi Wajib Default
APP_KEY1 Kunci aplikasi utama Ya -
APP_KEY2 Kunci aplikasi kedua Ya -
FCM_TOKEN Token Firebase Cloud Messaging Ya -
NODE_ENV Environment mode Tidak development
DEBUG Mode debug Tidak false

Konfigurasi Device

export const DEFAULT_DEVICE_INFO = {
  deviceId: 'a2fc143605ca913f',
  model: 'SAMSUNG',
  androidId: '34475820',
  versionCode: '1252',
  appVersion: '510',
  sdkVersion: '10'
};

Contoh Penggunaan

Contoh Lengkap dengan Error Handling

import { 
  PropanaService, 
  PropanaDisplayService, 
  InputUtil 
} from 'propana-api-client';

async function processTransaction() {
  const service = new PropanaService();
  
  try {
    console.log('πŸ” Memulai proses login...');
    
    // Input kredensial
    const agentId = await InputUtil.getUserInput('Masukkan ID Agen: ');
    const phoneNumber = await InputUtil.getUserInput('Masukkan Nomor HP: ');
    
    // Login
    await service.login(agentId, phoneNumber);
    console.log('βœ… Login berhasil');
    
    // Minta OTP
    await service.requestOTP();
    console.log('πŸ“± OTP telah dikirim');
    
    // Verifikasi OTP
    const otp = await InputUtil.getUserInput('Masukkan kode OTP: ');
    await service.verifyOTP(otp);
    console.log('βœ… OTP terverifikasi');
    
    // Setup koneksi
    await service.establishConnection();
    await service.initializeSession();
    console.log('πŸ”— Sesi siap digunakan');
    
    // Tampilkan menu
    console.log('\n=== MENU TRANSAKSI ===');
    console.log('1. Lihat Daftar Produk');
    console.log('2. Beli Produk');
    console.log('3. Deposit');
    
    const choice = await InputUtil.getUserInput('Pilih menu (1-3): ');
    
    switch (choice) {
      case '1':
        const products = await service.getProductList();
        PropanaDisplayService.displayProductList(products);
        break;
        
      case '2':
        const productCode = await InputUtil.getUserInput('Masukkan kode produk: ');
        const destination = await InputUtil.getUserInput('Masukkan nomor tujuan: ');
        
        const order = await service.orderProduct(productCode, destination);
        PropanaDisplayService.displayProductOrderResult(order);
        break;
        
      case '3':
        const amountStr = await InputUtil.getUserInput('Masukkan jumlah deposit: ');
        const amount = parseInt(amountStr);
        
        if (isNaN(amount) || amount <= 0) {
          throw new Error('Jumlah deposit tidak valid');
        }
        
        const deposit = await service.deposit(amount);
        PropanaDisplayService.displayDepositResult(deposit);
        break;
        
      default:
        console.log('Pilihan tidak valid');
    }
    
    // Simpan sesi
    await service.saveSession();
    console.log('πŸ’Ύ Sesi tersimpan');
    
  } catch (error) {
    console.error('❌ Error:', error.message);
    
    if (error.message.includes('OTP')) {
      console.log('πŸ’‘ Pastikan kode OTP benar dan belum kadaluarsa');
    } else if (error.message.includes('login')) {
      console.log('πŸ’‘ Periksa kembali ID Agen dan nomor HP');
    }
  } finally {
    InputUtil.closeInput();
  }
}

processTransaction();

Contoh Penggunaan dengan Session Management

async function resumeOrStartSession() {
  const service = new PropanaService();
  
  // Coba muat sesi yang tersimpan
  const sessionLoaded = await service.loadSession();
  
  if (sessionLoaded && service.getSessionState() === 'READY') {
    console.log('πŸ“‚ Menggunakan sesi tersimpan');
    
    // Langsung gunakan API
    const products = await service.getProductList();
    PropanaDisplayService.displayProductList(products);
    
  } else {
    console.log('πŸ” Memulai sesi baru');
    
    // Proses login lengkap
    await service.login('PRID119932', '08123456789');
    await service.requestOTP();
    
    const otp = await InputUtil.getUserInput('Masukkan OTP: ');
    await service.verifyOTP(otp);
    
    await service.establishConnection();
    await service.initializeSession();
    
    await service.saveSession();
  }
}

Penanganan Error

Jenis Error Umum

try {
  await service.login('INVALID_ID', '08123456789');
} catch (error) {
  if (error.message.includes('login failed')) {
    console.log('ID Agen atau nomor HP salah');
  } else if (error.message.includes('network')) {
    console.log('Periksa koneksi internet');
  } else {
    console.log('Error tidak diketahui:', error.message);
  }
}

Error Handling Best Practices

async function robustTransaction() {
  const service = new PropanaService();
  let retryCount = 0;
  const maxRetries = 3;
  
  while (retryCount < maxRetries) {
    try {
      await service.login('PRID119932', '08123456789');
      break; // Berhasil, keluar dari loop
      
    } catch (error) {
      retryCount++;
      
      if (retryCount >= maxRetries) {
        throw new Error(`Login gagal setelah ${maxRetries} percobaan: ${error.message}`);
      }
      
      console.log(`Percobaan ${retryCount} gagal, mencoba lagi...`);
      await new Promise(resolve => setTimeout(resolve, 2000)); // Tunggu 2 detik
    }
  }
}

Troubleshooting

Masalah Umum

1. FCM Token Error

Error: FCM token invalid

Solusi: Pastikan FCM_TOKEN di file .env valid dan tidak kadaluarsa.

2. Session Expired

Error: Session expired

Solusi: Hapus sesi dan login ulang:

await service.clearSession();
// Lakukan login ulang

3. Network Error

Error: Network request failed

Solusi: Periksa koneksi internet dan pastikan server dapat diakses.

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages