Skip to content

Fix: Integrasi Artikel CMS OpenKab ke Widget Artikel Terbaru dan Halaman Publik Daftar Artikel - #1269

Merged
analisopendesa merged 3 commits into
rilis-devfrom
1268-artikel-fe-kab
Aug 26, 2026
Merged

Fix: Integrasi Artikel CMS OpenKab ke Widget Artikel Terbaru dan Halaman Publik Daftar Artikel#1269
analisopendesa merged 3 commits into
rilis-devfrom
1268-artikel-fe-kab

Conversation

@habibie11

Copy link
Copy Markdown
Contributor

issue # #1268

🎯 Deskripsi

Pull request ini mengintegrasikan artikel yang dibuat melalui CMS OpenKab (/cms/articles / tabel articles) ke dalam antarmuka publik, yaitu:

  1. Widget Artikel Terbaru di Beranda (/): Menampilkan gabungan artikel terbaru baik dari CMS lokal OpenKab maupun dari API upstream OpenSID secara otomatis dan terurut berdasarkan tanggal publikasi terbaru.
  2. Halaman Publik Daftar Artikel (/artikel-opensid): Menampilkan daftar artikel gabungan lengkap dengan dukungan pencarian (search), penanda sumber artikel (badge OpenKab), dan paginasi (LengthAwarePaginator).
  3. Penyelarasan Halaman Detail Artikel CMS (/a/{slug}): Mempercantik antarmuka detail artikel CMS lokal agar konsisten dengan artikel publik (memiliki gambar utama, metadata kategori, tanggal rilis, dan tombol kembali ke daftar artikel).

Sebelumnya, widget Beranda dan halaman daftar artikel hanya mengambil data dari API Database Gabungan (API_DATABASE_GABUNGAN_HOST/api/v1/artikel/...), sehingga artikel lokal yang ditulis oleh pengelola CMS OpenKab tidak muncul pada halaman depan maupun daftar berita publik.

Dengan PR ini, arsitektur data artikel di OpenKab telah disatukan pada layer ArtikelService dengan mekanisme caching dan cache invalidation otomatis, serta graceful fallback jika API upstream sedang tidak dapat diakses.


🛠️ Perubahan yang Dilakukan

1. app/Services/ArtikelService.php

Feature — Penyatuan Data Artikel Lokal CMS dan Upstream API:

  • Menambahkan method getLocalArticles() untuk mengambil artikel CMS lokal yang aktif/terbit (state = 1 dan published_at <= now()) serta memetakan atributnya ke struktur objek standar (id, judul, isi, gambar, kategori_nama, tgl_upload, source, detail_url).
  • Menambahkan method getCombinedArticles() untuk menggabungkan artikel lokal dan artikel upstream API dengan pengurutan berdasarkan tanggal terbaru (tgl_upload descending).
  • Menambahkan method getArtikelTerbaru(int $limit = 6) untuk menyuplai data widget beranda.
  • Membungkus panggilan API dengan penanganan error (try-catch) agar jika API eksternal mengalami kendala, artikel CMS lokal tetap dapat diakses dengan cepat dan andal.
+    public function getLocalArticles(array $filters = []): Collection
+    {
+        $query = Article::with('category')
+            ->where('state', Article::PUBLISH)
+            ->where('published_at', '<=', now());
+        ...
+    }
+
+    public function getCombinedArticles(array $filters = []): Collection
+    {
+        $localArticles = $this->getLocalArticles($filters);
+        $apiArticles = $this->artikel($filters);
+        return $localArticles->concat($apiArticles)->sortByDesc('tgl_upload')->values();
+    }

2. routes/web.php & app/Http/Controllers/Web/ArtikelController.php

Feature & Fix — Endpoint JSON Artikel Terbaru, Paginasi Gabungan, dan Fallback Detail:

  • Mendaftarkan route publik Route::get('artikel/terbaru', [ArtikelController::class, 'terbaru'])->name('web.artikel.terbaru').
  • Memperbarui ArtikelController::index() untuk merender data gabungan dengan paginasi Laravel (LengthAwarePaginator).
  • Menambahkan method ArtikelController::terbaru() yang mengembalikan JSON data artikel terbaru untuk kebutuhan AJAX widget beranda.
  • Memperbarui ArtikelController::show($id) dengan fallback redirect ke route('article', $localArticle->slug) jika $id yang diakses adalah ID/slug artikel CMS lokal.
+    Route::get('artikel/terbaru', [ArtikelController::class, 'terbaru'])->name('web.artikel.terbaru');

3. app/Http/Controllers/CMS/ArticleController.php

Fix — Cache Invalidation Otomatis:

  • Memanggil (new ArtikelService)->clearAllCache() saat artikel CMS disimpan (store), diperbarui (update), atau dihapus (destroy) agar data di frontend langsung terbarui tanpa menunggu kedaluwarsa TTL cache.

4. resources/views/web/partials/artikel_terbaru.blade.php

Refactor — Mengarahkan Permintaan AJAX ke Endpoint Internal:

  • Mengubah URL AJAX dari yang sebelumnya memanggil endpoint eksternal secara langsung di browser klien menjadi memanggil endpoint internal route('web.artikel.terbaru').
  • Menyesuaikan pembacaan respons JSON dengan atribut standar dan tautan dinamis detail_url serta lencana sumber (OpenKab).

5. resources/views/web/artikel/index.blade.php & resources/views/web/article.blade.php

UI/UX — Navigasi Dinamis, Lencana Sumber, dan Tampilan Detail:

  • Menggunakan $article->detail_url pada tombol "Selengkapnya" pada daftar artikel (web.artikel.index).
  • Menampilkan lencana sumber <span class="badge bg-success">OpenKab</span> untuk memudahkan identifikasi artikel CMS.
  • Menambahkan kontrol paginasi standar Bootstrap 5 ($articles->links('pagination::bootstrap-5')).
  • Mempercantik halaman detail artikel CMS (web.article) dengan gambar utama, metadata kategori, tanggal rilis, dan tombol kembali ke daftar artikel.

6. tests/Feature/ArtikelWebTest.php

Test — Penambahan dan Pembaruan Test Suite Artikel Web:

  • Menguji aksesibilitas halaman daftar artikel publik (web.artikel.index).
  • Menguji kemunculan artikel CMS OpenKab di daftar artikel publik lengkap dengan verifikasi lencana OpenKab.
  • Menguji endpoint JSON artikel terbaru (web.artikel.terbaru).
  • Menguji fallback redirect halaman detail artikel jika merujuk ke artikel CMS lokal.
  • Menguji penanganan status 404 untuk artikel non-aktif atau tidak ditemukan.

✅ Test Cases yang Diimplementasikan

  • Artikel CMS OpenKab yang berstatus Terbitkan (Publish) dan tanggal publikasinya valid tampil pada halaman daftar artikel publik (/artikel-opensid).
  • Artikel CMS OpenKab terbaru tampil di widget Artikel Terbaru pada Beranda (/).
  • Tombol "Selengkapnya" mengarahkan pengguna ke URL detail yang sesuai (/a/{slug} untuk artikel OpenKab, dan /artikel-opensid/{id} untuk artikel OpenSID).
  • Fitur pencarian artikel pada /artikel-opensid?search=... dapat memfilter artikel CMS lokal dan artikel API.
  • Paginasi pada halaman daftar artikel berfungsi dengan benar.
  • Mengubah atau menambah artikel di CMS otomatis membersihkan cache artikel publik.
  • Seluruh automated test pada ArtikelWebTest.php lolos (pass) tanpa error.

📸 Cara Menjalankan Uji Coba Manual

  1. Jalankan aplikasi OpenKab dan login sebagai admin.
  2. Buka menu Website > Artikel (http://openkab.test/cms/articles) dan buat artikel baru dengan status Terbitkan.
  3. Buka halaman Beranda (http://openkab.test/).
    • Seharusnya: Artikel baru tersebut muncul di bagian Artikel Terbaru.
  4. Buka halaman daftar artikel (http://openkab.test/artikel-opensid).
    • Seharusnya: Artikel CMS muncul dengan lencana OpenKab dan tombol "Selengkapnya".
  5. Klik tombol "Selengkapnya" pada artikel OpenKab tersebut.
    • Seharusnya: Halaman detail artikel terbuka di /a/{slug} dengan tampilan lengkap beserta gambar dan metadata.
  6. Coba gunakan fitur pencarian pada halaman daftar artikel dengan memasukkan kata kunci judul artikel yang baru dibuat.
    • Seharusnya: Hasil pencarian menampilkan artikel yang sesuai.

🤖 Cara Menjalankan Uji Coba Otomatis (Automated Test)

Jalankan perintah berikut di terminal:

php artisan test tests/Feature/ArtikelWebTest.php

Untuk menjalankan seluruh pengujian terkait modul website dan CMS:

php artisan test tests/Feature/PageControllerWebsiteTest.php tests/Feature/ArticleControllerCmsTest.php tests/Feature/CategoryControllerCmsTest.php tests/Feature/XssPreventionTest.php

📸 Screenshot atau Video

image image

⚠️ Catatan Penting

  • Artikel CMS lokal yang berstatus Draft (state = 0) atau yang memiliki tanggal rilis di masa depan (published_at > now()) tidak akan ditampilkan di frontend publik sampai statusnya diterbitkan dan tanggal publikasinya terpenuhi.
  • Mekanisme penggabungan artikel tetap berjalan normal meskipun koneksi ke upstream API Database Gabungan terputus.

@habibie11
habibie11 requested a review from vickyrolanda August 24, 2026 13:27
@github-actions

Copy link
Copy Markdown

🔄 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 #1269

@analisopendesa
analisopendesa merged commit 7c9d96d into rilis-dev Aug 26, 2026
@analisopendesa
analisopendesa deleted the 1268-artikel-fe-kab branch August 26, 2026 20: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.

3 participants