Search by

nawasara / search

pringgojsnawasara

Cross-domain search orchestrator for the Nawasara command palette (⌘K). Discovers per-package search providers and aggregates results behind one permission-aware endpoint.

Package info

github.com/nawasara/search

pkg:composer/nawasara/search

Statistics

Installs: 303

Dependents: 6

Suggesters: 0

Stars: 0

Open Issues: 0

v0.1.0 2026-06-28 03:34 UTC

This package is auto-updated.

Last update: 2026-08-26 01:39:55 UTC


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