Skip to content

Fix: feeds database gabungan#1618

Open
pandigresik wants to merge 9 commits into
rilis-devfrom
fix/feeds_database_gabungan
Open

Fix: feeds database gabungan#1618
pandigresik wants to merge 9 commits into
rilis-devfrom
fix/feeds_database_gabungan

Conversation

@pandigresik

@pandigresik pandigresik commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Pull Request: Fix berita desa tidak tampil jika menggunakan database gabungan

Deskripsi

Memperbaiki bug halaman Berita Desa yang kosong saat menggunakan mode database gabungan. Masalah terjadi karena logika fetching RSS feeds masih menggunakan query Eloquent langsung ke tabel data_desa lokal, sehingga tidak mendapat data desa ketika mode database gabungan aktif (data berasal dari API). Solusi: memindahkan logika feeds ke DesaService yang sudah mendukung kedua mode (lokal & API) melalui method listDesa(), plus penambahan caching, error handling yang lebih baik, dan unit test.

Perubahan yang dilakukan:

  1. Refactor logika feeds ke service layer: Memindahkan method getFeeds() dari PageController ke DesaService agar bisa memanfaatkan listDesa() yang mendukung database gabungan.
  2. Penambahan caching di getFeeds(): Menambahkan Cache::remember('desa_feeds', 3600, ...) untuk mengurangi pemanggilan RSS feed berulang.
  3. Perbaikan parsing timestamp feed: Mengganti Carbon::parse($item->get_date('U')) dengan Carbon::createFromTimestamp((int) $item->get_date('U')) untuk menghindari salah interpretasi string numerik sebagai format tanggal YmdHis.
  4. Error handling yang lebih baik: Menambahkan try-catch per item feed + per desa + outer catch, logging terstruktur, dan graceful fallback ke array kosong.
  5. Refactor view desa.blade.php: Restrukturasi layout .page-header menggunakan Bootstrap grid, memindahkan CSS inline ke file desa.css, mengganti query langsung DataDesa::orderBy('desa_id')->get() dengan include partial select-desa.
  6. Perbaikan filterFeeds(): Mengganti DataDesa::orderBy('desa_id')->get() dengan (new DesaService())->listDesa() untuk konsistensi.
  7. Penambahan 7 unit test baru: Test untuk exception handling, skip desa tanpa website, empty items, transformasi data, caching, dan mode database gabungan.
  8. Perbaikan test listPathDesa(): Memperbaiki value path di factory dan assertion untuk tipe data JSON column.

Alasan perubahan:

  • Bug database gabungan: getFeeds() di controller menggunakan DataDesa::websiteUrl()->get() yang hanya membaca tabel lokal. Saat database gabungan aktif, data desa tidak ada di tabel lokal → feeds kosong.
  • DRY dan konsistensi: DesaService::listDesa() sudah menangani kedua mode (lokal via Eloquent, gabungan via API). Memindahkan logika feeds ke service layer menghilangkan duplikasi.
  • Performance: Tanpa caching, setiap load halaman Berita Desa memanggil RSS feed semua desa. Caching 1 jam mengurangi beban server dan external feed server.
  • Robustness: Feed item individual yang gagal diproses (misal timestamp tidak valid) tidak lagi menggagalkan seluruh halaman.
  • Maintainability: Unit test yang komprehensif memastikan regression tidak terjadi di masa depan.

Dampak perubahan:

Berita Desa tampil di mode database gabungan: Bug fix utama — feeds sekarang diambil via listDesa() yang mendukung API
Performance meningkat: Caching 1 jam untuk feeds + caching 24 jam untuk list desa
Error handling lebih baik: Feed item gagal tidak merusak seluruh halaman; error tercatat di log
Code lebih maintainable: Logika feeds terpusat di service layer dengan test coverage
UI lebih konsisten: Layout blade menggunakan Bootstrap grid yang rapi dengan CSS terpisah

Masalah Terkait (Related Issue)

Langkah untuk mereproduksi (Steps to Reproduce)

Sebelum perbaikan (masalah):

  1. Aktifkan mode database gabungan di pengaturan (sinkronisasi_database_gabungan = 1)
  2. Buka menu Berita → Berita Desa
  3. ❌ Halaman kosong/tidak ada feed desa yang tampil, meskipun desa memiliki website dan RSS feed aktif

Setelah perbaikan (fix):

  1. Aktifkan mode database gabungan di pengaturan (sinkronisasi_database_gabungan = 1)
  2. Buka menu Berita → Berita Desa
  3. ✅ Feed berita desa tampil sesuai data dari API database gabungan
  4. ✅ Filter berdasarkan desa berfungsi
  5. ✅ Pencarian berita berfungsi

Testing pada fitur lain yang terkait:

  • Filter berita desa ✅ Berfungsi (menggunakan DesaService::listDesa())
  • Halaman Berita Desa (mode non-gabungan) ✅ Berfungsi (menggunakan DataDesa::all())
  • Pencarian berita ✅ Berfungsi
  • Caching feeds ✅ Berfungsi (cache 1 jam, invalidate otomatis)

Daftar Periksa (Checklist)

  • Saya telah mematuhi aturan penulisan script
  • Saya telah mengikuti proses review pull request
  • Saya telah membuat unit test untuk memverifikasi perbaikan (7 test baru + 2 perbaikan test existing)
  • Testing manual telah dilakukan di environment development
  • Tidak ada console error atau warning
  • Code sudah di-review

Teknis Detail

Penjelasan Teknis

Flow sebelum perbaikan (controller):

// PageController::getFeeds()
$all_desa = DataDesa::websiteUrl()->get(); // ❌ Hanya query lokal
// Saat DB gabungan aktif, DataDesa::websiteUrl()->get() kosong

Flow setelah perbaikan (service):

// DesaService::getFeeds()
$allDesa = $this->listDesa() // ✅ Panggil service yang support kedua mode
    ->map(fn($item) => ($item instanceof DataDesa) ? $item : new DataDesa((array) $item))
    ->filter(fn($q) => !empty($q->website));

Perbaikan parsing timestamp:

// Sebelum (gagal untuk string '1710000000' — diinterpretasi sebagai YmdHis):
'date' => \Carbon\Carbon::parse($item->get_date('U')),

// Sesudah (diparse sebagai Unix timestamp):
'date' => \Carbon\Carbon::createFromTimestamp((int) $item->get_date('U')),

Konfigurasi yang berubah

  • Tidak ada perubahan konfigurasi

Dependencies yang ditambahkan

  • Tidak ada dependencies baru

Testing

Manual Testing

  • Buka halaman Berita Desa dengan database gabungan aktif — feeds tampil
  • Buka halaman Berita Desa dengan database gabungan non-aktif — feeds tampil (regression)
  • Filter berdasarkan desa berfungsi di kedua mode
  • Pencarian berita berfungsi
  • Sorting tanggal (Terbaru/Terlama) berfungsi

Breaking Changes

Tidak ada. Method getFeeds() di PageController masih ada (sebagai wrapper delegasi ke DesaService) untuk menjaga backward compatibility, meskipun implementasi lama sudah tidak digunakan.

Migration Guide

Tidak diperlukan.

References

Screenshot

image

@github-actions

github-actions Bot commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

🔄 AI PR Review sedang antri di server...

Proses review akan segera dimulai di background — hasil akan muncul sebagai komentar setelah selesai.
Powered by CrewAI · PR #1618

@pandigresik pandigresik requested a review from vickyrolanda July 8, 2026 01:53
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.

1 participant