diff --git a/src/admin/scripts.rs b/src/admin/scripts.rs index 76a1279..aed2800 100644 --- a/src/admin/scripts.rs +++ b/src/admin/scripts.rs @@ -86,23 +86,38 @@ where // Routes // --------------------------------------------------------------------------- +#[derive(Debug, Deserialize)] +pub(super) struct ListQuery { + pub suffix: Option, +} + /// `GET /admin/scripts` — list all rows. Clients group by trigger family -/// in the UI. +/// in the UI. Optional `?suffix=` filters to scripts whose id +/// ends with `:`. pub(super) async fn list( State(state): State, auth: UserAuth, + axum::extract::Query(query): axum::extract::Query, ) -> Result>, AppError> { auth.require(Permission::ScriptsRead).await?; let backend = state.db_backend; - let sql = adapt_sql( + let mut sql = String::from( "SELECT id, script_type, body, description, created_at, updated_at - FROM scripts - ORDER BY id", - backend, + FROM scripts", ); + if query.suffix.is_some() { + sql.push_str(" WHERE id LIKE ?"); + } + sql.push_str(" ORDER BY id"); + + let sql = adapt_sql(&sql, backend); #[allow(clippy::type_complexity)] - let rows: Vec<(String, String, String, Option, String, String)> = sqlx::query_as(&sql) + let mut q = sqlx::query_as::<_, (String, String, String, Option, String, String)>(&sql); + if let Some(ref suffix) = query.suffix { + q = q.bind(format!("%:{suffix}")); + } + let rows = q .fetch_all(&state.db) .await .map_err(|e| AppError::Internal(format!("failed to list scripts: {e}")))?; diff --git a/web/src/app/dashboard/lexicons/[id]/lexicon-detail.tsx b/web/src/app/dashboard/lexicons/[id]/lexicon-detail.tsx index 53e27a3..025dec7 100644 --- a/web/src/app/dashboard/lexicons/[id]/lexicon-detail.tsx +++ b/web/src/app/dashboard/lexicons/[id]/lexicon-detail.tsx @@ -51,7 +51,7 @@ export default function LexiconDetailPage() { const load = useCallback(() => { // Fire both requests in parallel; the scripts list is best-effort. - getScripts() + getScripts({ suffix: id }) .then(setScripts) .catch(() => setScripts([])); getLexicon(id) diff --git a/web/src/lib/api.ts b/web/src/lib/api.ts index 41996e4..cde1db1 100644 --- a/web/src/lib/api.ts +++ b/web/src/lib/api.ts @@ -799,8 +799,11 @@ export function bulkReindexDeadLetters(body: { } // Scripts (trigger-keyed) -export function getScripts() { - return apiFetch("/admin/scripts") +export function getScripts(opts?: { suffix?: string }) { + const params = new URLSearchParams(); + if (opts?.suffix) params.set("suffix", opts.suffix); + const qs = params.toString(); + return apiFetch(`/admin/scripts${qs ? `?${qs}` : ""}`) } export function getScript(id: string) {