nawasara / search
Cross-domain search orchestrator for the Nawasara command palette (⌘K). Discovers per-package search providers and aggregates results behind one permission-aware endpoint.
Requires
- php: ^8.1
- illuminate/support: ^10.0|^12.0
- nawasara/ui: *
- spatie/laravel-permission: ^6.0
Requires (Dev)
None
Suggests
None
Provides
None
Conflicts
None
Replaces
None
README
Orkestrator pencarian lintas-domain untuk command palette (⌘K) Nawasara. Mengumpulkan provider dari paket-paket data, menyaringnya menurut izin pengguna, lalu menjalankannya pada setiap kueri.
Status v0.1.0
| Fitur | Status |
|---|---|
Kontrak SearchProvider |
✅ siap |
| Penemuan provider lewat container binding | ✅ siap |
| Penyaringan izin sebelum provider dijalankan | ✅ siap |
| Endpoint pencarian untuk palette | ✅ siap |
| Pengurutan relevansi lintas-domain | ⏳ menyusul |
| Indeks pencarian terpisah (bukan kueri langsung) | ⏳ menyusul |
Cara kerja
Paket ini tidak menyimpan data apa pun. Ia hanya perantara: setiap paket
data mendaftarkan providernya sendiri, dan SearchManager yang menjalankan
semuanya lalu menggabungkan hasilnya.
Pola ini mengikuti WorkspaceManager pada nawasara/ui — paket baru cukup
mendaftarkan diri, tanpa menyentuh kode di sini.
Menambahkan provider dari paket lain
Buat kelas yang memenuhi Nawasara\Search\Contracts\SearchProvider:
namespace Nawasara\Registry\Search; use Nawasara\Search\Contracts\SearchProvider; class OpdSearchProvider implements SearchProvider { public function key(): string { return 'opd'; } public function label(): string { return 'OPD'; } // null berarti terlihat oleh siapa pun yang sudah masuk. public function permission(): ?string { return 'registry.opd.view'; } public function search(string $term, int $limit): array { return Opd::where('name', 'like', "%{$term}%") ->limit($limit) ->get() ->map(fn ($o) => [ 'label' => $o->name, 'sublabel' => $o->code, 'url' => route('nawasara-registry.opd.show', $o), ]) ->all(); } }
Lalu daftarkan di ServiceProvider paket Anda lewat binding
nawasara.search-providers.
⚠️ search() dijalankan pada SETIAP ketikan
Palette memanggilnya dengan debounce, tetapi tetap sinkron dan tetap sering. Sebuah provider yang lambat memperlambat seluruh palette, bukan hanya kelompoknya sendiri.
Karena itu:
- Cari pada kolom ber-indeks.
LIKE %term%pada kolom tanpa indeks akan memindai seluruh tabel setiap kali orang mengetik. - Hormati
$limit. Ia batas keras, bukan saran. - Jangan memuat relasi yang tidak dipakai hasilnya.
Izin diperiksa SEBELUM provider dijalankan
SearchManager memeriksa permission() lebih dulu dan melewati provider yang
tidak boleh dilihat pengguna — kueri-nya tidak pernah berjalan.
Itu bukan sekadar penghematan: hasil pencarian membocorkan keberadaan data meski isinya tidak ditampilkan. Seseorang yang mengetik nama dan melihat "1 hasil di OPD" sudah tahu data itu ada.
Jangan mengandalkan penyaringan di dalam search() sendiri — penyaringan di
sana mudah terlewat saat kueri-nya diubah kelak.
Roadmap
- Pengurutan relevansi lintas-domain (sekarang dikelompokkan per provider)
- Indeks pencarian terpisah untuk tabel besar
- Riwayat pencarian per pengguna
Author
Pringgo J. Saputro — Dinas Kominfo Kabupaten Ponorogo
License
MIT