Skip to content

Conversation

@hasanlq69
Copy link

@hasanlq69 hasanlq69 commented Sep 22, 2025

Pull Request untuk Issue Penambahan fitur Logi Aktivitas #1324

Dokumentasi Fitur Log Aktivitas OpenDK

Overview

Fitur Log Aktivitas OpenDK menggunakan package Spatie Activity Log untuk mencatat semua aktivitas pengguna dalam sistem. Fitur ini memungkinkan administrator untuk memantau dan melacak semua perubahan yang terjadi dalam aplikasi.

Fitur Utama

  • Tabel Interaktif: Menampilkan semua log aktivitas dengan fitur pencarian, filter, dan pagination.
  • Pencatatan Otomatis: Model User secara otomatis mencatat perubahan (create, update, delete).
  • Pencatatan Manual Lengkap: Mencatat aktivitas penting seperti Login, Logout, perubahan pengaturan, dan update profil.
  • Detail Aktivitas: Modal detail menampilkan informasi lengkap termasuk IP Address, User Agent, dan detail perubahan data (jika ada).

Implementasi Teknis

Best Practice Pencatatan Log

Struktur ideal untuk mencatat log secara manual adalah sebagai berikut:

activity()
    ->causedBy(auth()->user())  // Siapa yang melakukan (Pengguna)
    ->performedOn($model)       // Apa yang diubah (Subject)
    ->event('updated')          // Aksi apa (Event)
    ->withProperties($data)   // Data tambahan (opsional)
    ->log('Deskripsi...');       // Deskripsi aktivitas

Contoh Implementasi di Controller

LoginController (authenticated & logout)

// Login Berhasil
activity()
    ->causedBy($user)
    ->performedOn($user)
    ->event('login')
    ->log('Pengguna berhasil masuk ke sistem');

// Logout
activity()
    ->causedBy(auth()->user())
    ->performedOn(auth()->user())
    ->event('logout')
    ->log('Pengguna keluar dari sistem');

UserController (store & update)

// Membuat Pengguna
activity()
    ->causedBy(auth()->user())
    ->performedOn($user)
    ->event('created')
    ->withProperties(['roles' => $roles])
    ->log("Membuat pengguna baru: {$user->name}");

// Mengubah Pengguna
activity()
    ->causedBy(auth()->user())
    ->performedOn($user)
    ->event('updated')
    ->withProperties(['roles' => $roles])
    ->log("Mengubah data pengguna: {$user->name}");

Frontend

Urutan Pemuatan Script

Untuk menghindari error JavaScript, semua script custom untuk halaman ini harus dimuat di dalam @push('scripts') agar dieksekusi setelah jQuery dan DataTables siap.

{{-- di activity-logs.blade.php --}}

@push('scripts')
<script>
    $(document).ready(function() {
        // Kode DataTables di sini
    });
</script>
@endpush

Modal Detail

Modal detail akan menampilkan data dari server, termasuk ip_address dan user_agent yang diambil dari kolom properties pada log.

Troubleshooting

Berikut adalah beberapa masalah umum yang mungkin terjadi dan solusinya.

  1. Masalah: Tabel log aktivitas kosong dan di console muncul error Uncaught TypeError: $ is not a function.

    • Penyebab: Script DataTables dieksekusi sebelum library jQuery selesai dimuat.
    • Solusi: Pindahkan semua kode JavaScript ke dalam @push('scripts') di file view Blade.
  2. Masalah: Kolom Event atau Subject menampilkan N/A.

    • Penyebab: Saat mencatat log, metode event() atau performedOn() tidak dipanggil.
    • Solusi: Pastikan semua panggilan activity() menyertakan ->event('nama_event') dan ->performedOn($model) jika relevan.
  3. Masalah: Saat klik tombol "Detail", muncul error Cannot read properties of undefined (reading 'ip_address').

    • Penyebab: Log lama tidak memiliki properties atau tidak berisi ip_address. Kode JavaScript mencoba membaca properti dari objek yang undefined.
    • Solusi: Buat kode JavaScript lebih defensif dengan menambahkan pengecekan: var properties = response.properties || {};.
  4. Masalah: Di console muncul error CORS saat mencoba memuat file Indonesian.json dari CDN.

    • Penyebab: Server CDN tidak mengizinkan request dari domain lokal Anda (opendk.test).
    • Solusi: Unduh file Indonesian.json dan simpan secara lokal di dalam direktori public/, lalu ubah URL di konfigurasi DataTables untuk menunjuk ke file lokal tersebut.

API Endpoints

Get Activity Logs Data

  • URL: GET /setting/info-sistem/activity-logs/data
  • Parameters:
    • action (optional) - Filter by event type
    • user_id (optional) - Filter by user
    • date_from (optional) - Start date filter
    • date_to (optional) - End date filter

Get Activity Log Detail

  • URL: GET /setting/info-sistem/activity-logs/detail/{id}
  • Response: JSON dengan detail lengkap log

Maintenance

Performance Considerations

  1. Indexing: Tabel sudah memiliki index pada kolom penting
  2. Cleanup: Rutin hapus log lama untuk menjaga performa
  3. Selective Logging: Hanya log field yang penting
  4. Batch Operations: Gunakan batch UUID untuk operasi massal

Security

Permission Control

  • Hanya user dengan role super-admin atau administrator-website yang bisa akses
  • Middleware protection pada semua route

Data Privacy

  • Password tidak pernah di-log
  • Sensitive data bisa dikecualikan dari logging
  • IP address dan user agent dicatat untuk audit trail

Troubleshooting

Common Issues

  1. Log tidak muncul

    • Pastikan model menggunakan LogsActivity trait
    • Check getActivitylogOptions() configuration
    • Verify database connection
  2. Performance lambat

    • Cleanup log lama secara berkala
    • Check database indexes
    • Optimize query filters
  3. Memory issues

    • Batasi jumlah data yang di-load
    • Gunakan pagination
    • Cleanup properties yang tidak perlu

Future Enhancements

  1. Export Functionality: Export log ke Excel/PDF
  2. Real-time Notifications: Notifikasi real-time untuk aktivitas penting
  3. Advanced Filtering: Filter berdasarkan IP, user agent, dll
  4. Dashboard Analytics: Grafik dan statistik aktivitas
  5. Automated Cleanup: Cron job untuk cleanup otomatis

Testing

Manual Testing

// Test basic logging
activity()->log('Test message');

// Test with user
activity()
    ->causedBy(auth()->user())
    ->log('Test with user');

// Test model changes
$user = User::first();
$user->name = 'Updated Name';
$user->save(); // Should automatically log

Verification

  1. Check database: SELECT * FROM activity_log ORDER BY created_at DESC LIMIT 10;
  2. Access web interface: http://localhost:8000/setting/info-sistem
  3. Test filters and search functionality
  4. Verify modal detail works correctly

@vickyrolanda
Copy link
Contributor

mas @hasanlq69 silahkan perbaiki PR dengan menghapus file-file yang tidak diperlukan untuk masuk ke repo.
ada banyak file yang tidak diperlukan termasuk git ignore.

@vickyrolanda
Copy link
Contributor

mas @hasanlq69 masih ditemukan error saat kondisi masuk dengan user & password salah :
sleekshot

@vickyrolanda vickyrolanda changed the base branch from master to dev October 13, 2025 19:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants