Backend: List gains name (ILIKE with wildcard escaping, synonym LEFT JOIN, SELECT DISTINCT) and types (ANY cast) params; handler parses ?name= and ?type=, resolves combined-type aliases, validates plain types against validFruitTypes to prevent Postgres enum cast errors; ORDER BY f.name, f.id for stable pagination
Frontend: listFruits gains optional {name, type} params; store adds searchName/searchType state and setSearch action; FruitList.vue wires text input (debounced 300 ms + Enter) and flat type dropdown (17 enum values + 4 aliases per spec §5 order)
Test plan
make test passes (backend handler + repo + frontend + scripts)
Search "Boskop" → only matching fruits shown
Search "boskop" (lowercase) → same results (ILIKE case-insensitive)
Filter "Birnensorten" → only Birnensorten
Filter "Birnen- und Quittensorten" → both Birnensorten and Quittensorten
Combined name + type → intersection
Empty search + no type → all fruits
Search with % or _ in name → treated as literal, not SQL wildcard
Unknown ?type= value → no 500 (graceful empty result)
Typing then navigating away → no spurious fetch after unmount
## Summary
- Backend: `List` gains `name` (ILIKE with wildcard escaping, synonym LEFT JOIN, SELECT DISTINCT) and `types` (ANY cast) params; handler parses `?name=` and `?type=`, resolves combined-type aliases, validates plain types against `validFruitTypes` to prevent Postgres enum cast errors; ORDER BY `f.name, f.id` for stable pagination
- Frontend: `listFruits` gains optional `{name, type}` params; store adds `searchName`/`searchType` state and `setSearch` action; `FruitList.vue` wires text input (debounced 300 ms + Enter) and flat type dropdown (17 enum values + 4 aliases per spec §5 order)
## Test plan
- [ ] `make test` passes (backend handler + repo + frontend + scripts)
- [ ] Search "Boskop" → only matching fruits shown
- [ ] Search "boskop" (lowercase) → same results (ILIKE case-insensitive)
- [ ] Filter "Birnensorten" → only Birnensorten
- [ ] Filter "Birnen- und Quittensorten" → both Birnensorten and Quittensorten
- [ ] Combined name + type → intersection
- [ ] Empty search + no type → all fruits
- [ ] Search with `%` or `_` in name → treated as literal, not SQL wildcard
- [ ] Unknown `?type=` value → no 500 (graceful empty result)
- [ ] Typing then navigating away → no spurious fetch after unmount
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Backend: List repo query gains name (ILIKE with wildcard escaping on
name + synonym LEFT JOIN, SELECT DISTINCT) and types (ANY cast) params;
handler parses ?name= and ?type=, resolves combined-type aliases from
domain.FruitTypeAliases, validates plain types against validFruitTypes
to prevent Postgres enum cast errors. ORDER BY f.name, f.id for stable
pagination.
Frontend: listFruits gains optional {name, type} params; fruitStore adds
searchName/searchType state and setSearch action (resets offset, refetches);
FruitList.vue wires text input (debounced 300 ms + Enter) and flat type
dropdown (17 enum values + 4 aliases per spec §5 order); debounce timer
cleared on unmount.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
julia
merged commit 2525e8b68d into main2026-06-18 10:58:37 +00:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
Listgainsname(ILIKE with wildcard escaping, synonym LEFT JOIN, SELECT DISTINCT) andtypes(ANY cast) params; handler parses?name=and?type=, resolves combined-type aliases, validates plain types againstvalidFruitTypesto prevent Postgres enum cast errors; ORDER BYf.name, f.idfor stable paginationlistFruitsgains optional{name, type}params; store addssearchName/searchTypestate andsetSearchaction;FruitList.vuewires text input (debounced 300 ms + Enter) and flat type dropdown (17 enum values + 4 aliases per spec §5 order)Test plan
make testpasses (backend handler + repo + frontend + scripts)%or_in name → treated as literal, not SQL wildcard?type=value → no 500 (graceful empty result)🤖 Generated with Claude Code
Backend: List repo query gains name (ILIKE with wildcard escaping on name + synonym LEFT JOIN, SELECT DISTINCT) and types (ANY cast) params; handler parses ?name= and ?type=, resolves combined-type aliases from domain.FruitTypeAliases, validates plain types against validFruitTypes to prevent Postgres enum cast errors. ORDER BY f.name, f.id for stable pagination. Frontend: listFruits gains optional {name, type} params; fruitStore adds searchName/searchType state and setSearch action (resets offset, refetches); FruitList.vue wires text input (debounced 300 ms + Enter) and flat type dropdown (17 enum values + 4 aliases per spec §5 order); debounce timer cleared on unmount. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>