import 'dart:io'; import 'dart:convert'; import 'package:http/http.dart' as http; /// Script untuk menguji integrasi dengan Firefly III API /// Menjalankan beberapa operasi dasar: /// 1. Menguji koneksi ke instance Firefly III /// 2. Menguji autentikasi dengan token /// 3. Mengambil daftar akun /// 4. Mengirim transaksi dummy void main() async { // Konfigurasi - Ganti dengan nilai yang sesuai untuk instance Firefly III Anda const String baseUrl = 'http://192.168.1.100:8080'; // Contoh URL const String accessToken = 'your_access_token_here'; // Contoh token const String sourceAccountId = '1'; // ID akun sumber (revenue) const String destinationAccountId = '2'; // ID akun tujuan (asset) print('=== MENGUJI INTEGRASI FIREFLY III ===\n'); // 1. Menguji koneksi print('1. Menguji koneksi ke Firefly III...'); try { final connectivityResponse = await http.get(Uri.parse('$baseUrl/api/v1/about')); if (connectivityResponse.statusCode == 200) { print(' ✓ Koneksi berhasil'); } else { print(' ✗ Koneksi gagal (Status code: ${connectivityResponse.statusCode})'); return; } } catch (e) { print(' ✗ Koneksi gagal dengan error: $e'); return; } // 2. Menguji autentikasi print('\n2. Menguji autentikasi dengan token...'); try { final authResponse = await http.get( Uri.parse('$baseUrl/api/v1/about/user'), headers: { 'Authorization': 'Bearer $accessToken', 'Accept': 'application/json', }, ); if (authResponse.statusCode == 200) { print(' ✓ Autentikasi berhasil'); } else { print(' ✗ Autentikasi gagal (Status code: ${authResponse.statusCode})'); print(' Response body: ${authResponse.body}'); return; } } catch (e) { print(' ✗ Autentikasi gagal dengan error: $e'); return; } // 3. Mengambil daftar akun print('\n3. Mengambil daftar akun...'); try { final accountsResponse = await http.get( Uri.parse('$baseUrl/api/v1/accounts'), headers: { 'Authorization': 'Bearer $accessToken', 'Accept': 'application/json', }, ); if (accountsResponse.statusCode == 200) { final accountsData = json.decode(accountsResponse.body); if (accountsData is Map && accountsData.containsKey('data')) { final accounts = accountsData['data'] as List; print(' ✓ Berhasil mengambil ${accounts.length} akun'); // Tampilkan 3 akun pertama print(' Contoh akun:'); for (int i = 0; i < accounts.length && i < 3; i++) { final account = accounts[i]; if (account is Map && account.containsKey('id') && account.containsKey('attributes')) { final attributes = account['attributes']; if (attributes is Map && attributes.containsKey('name') && attributes.containsKey('type')) { print(' - ID: ${account['id']}, Nama: ${attributes['name']}, Tipe: ${attributes['type']}'); } } } } else { print(' ✗ Format respons akun tidak sesuai harapan'); return; } } else { print(' ✗ Gagal mengambil akun (Status code: ${accountsResponse.statusCode})'); print(' Response body: ${accountsResponse.body}'); return; } } catch (e) { print(' ✗ Gagal mengambil akun dengan error: $e'); return; } // 4. Mengirim transaksi dummy print('\n4. Mengirim transaksi dummy...'); try { final transactionPayload = jsonEncode({ "transactions": [ { "type": "deposit", "date": "2025-08-21", "amount": "50.00", "description": "Transaksi Dummy via Test Script", "source_id": sourceAccountId, "destination_id": destinationAccountId, } ] }); final transactionResponse = await http.post( Uri.parse('$baseUrl/api/v1/transactions'), headers: { 'Authorization': 'Bearer $accessToken', 'Accept': 'application/json', 'Content-Type': 'application/json', }, body: transactionPayload, ); if (transactionResponse.statusCode == 200 || transactionResponse.statusCode == 201) { print(' ✓ Transaksi berhasil dikirim'); // Coba parse transaction ID try { final transactionData = json.decode(transactionResponse.body); if (transactionData is Map && transactionData.containsKey('data') && transactionData['data'] is List && transactionData['data'].isNotEmpty) { final firstTransaction = transactionData['data'][0]; if (firstTransaction is Map && firstTransaction.containsKey('transaction_id')) { print(' Transaction ID: ${firstTransaction['transaction_id']}'); } else if (firstTransaction is Map && firstTransaction.containsKey('id')) { print(' Transaction ID: ${firstTransaction['id']}'); } } } catch (e) { print(' Tidak dapat mem-parsing transaction ID: $e'); } } else { print(' ✗ Gagal mengirim transaksi (Status code: ${transactionResponse.statusCode})'); print(' Response body: ${transactionResponse.body}'); return; } } catch (e) { print(' ✗ Gagal mengirim transaksi dengan error: $e'); return; } print('\n=== PENGUJIAN SELESAI ==='); print('Semua pengujian berhasil! Integrasi dengan Firefly III berfungsi dengan baik.'); }