--- phase: 20-fab-full-screen-catalog-search plan: 01 subsystem: api, ui tags: [hono, zustand, tanstack-query, drizzle, tags, global-items] requires: - phase: 19-reference-item-model-tags-schema provides: global-items service and route, schema foundation provides: - GET /api/tags endpoint returning all tags - GET /api/global-items route registration in index.ts - UIStore FAB menu and catalog search state slices - useTags hook with 5-min stale cache - useGlobalItems hook with optional tags parameter affects: [20-02-PLAN, phase-21] tech-stack: added: [] patterns: [public-read auth skip for new GET endpoints] key-files: created: - src/server/services/tag.service.ts - src/server/routes/tags.ts - src/client/hooks/useTags.ts - tests/services/tag.service.test.ts - tests/routes/tags.test.ts - drizzle-pg/0002_square_pyro.sql modified: - src/db/schema.ts - src/server/index.ts - src/client/stores/uiStore.ts - src/client/hooks/useGlobalItems.ts key-decisions: - "Created tags table in schema (was missing, needed for GET /api/tags)" - "Tags endpoint is public-read (no auth), consistent with global-items" patterns-established: - "Tag service pattern: select specific columns (id, name) not full row" requirements-completed: [CATFLOW-01, CATFLOW-02] duration: 5min completed: 2026-04-06 --- # Phase 20 Plan 01: Tags API, Route Registration, and UI State Summary **Tags endpoint with alphabetical ordering, global-items route registration, UIStore FAB/catalog-search state, and tag-aware useGlobalItems hook** ## Performance - **Duration:** 5 min - **Started:** 2026-04-06T05:53:35Z - **Completed:** 2026-04-06T05:58:27Z - **Tasks:** 2 - **Files modified:** 10 ## Accomplishments - Created tags table, service, and route with full test coverage (4 tests) - Registered previously unregistered global-items route in index.ts - Added public-read auth skips for both /api/tags and /api/global-items - Extended UIStore with FAB menu state (open/close) and catalog search overlay state (open with mode, close) - Created useTags hook with 5-minute staleTime caching - Updated useGlobalItems hook to accept optional tags array for filtering ## Task Commits Each task was committed atomically: 1. **Task 1 (RED): Tag service and route tests** - `6f07e87` (test) 2. **Task 1 (GREEN): Tags table, service, route, registrations** - `2ec1276` (feat) 3. **Task 2: UIStore extension, useTags hook, useGlobalItems update** - `67facea` (feat) ## Files Created/Modified - `src/db/schema.ts` - Added tags table definition - `drizzle-pg/0002_square_pyro.sql` - Migration for tags table - `src/server/services/tag.service.ts` - getAllTags function (id+name, alphabetical) - `src/server/routes/tags.ts` - GET / handler returning all tags - `src/server/index.ts` - Registered global-items and tags routes, added auth skips - `src/client/stores/uiStore.ts` - Added FAB menu and catalog search state slices - `src/client/hooks/useTags.ts` - Tag fetching hook with staleTime cache - `src/client/hooks/useGlobalItems.ts` - Added optional tags parameter - `tests/services/tag.service.test.ts` - Service-level tests for getAllTags - `tests/routes/tags.test.ts` - Route-level tests for GET /api/tags ## Decisions Made - Created tags table in schema since it was referenced by the plan but didn't exist yet (Rule 3 deviation) - Made both /api/tags and /api/global-items public-read (GET requests skip auth middleware) ## Deviations from Plan ### Auto-fixed Issues **1. [Rule 3 - Blocking] Created missing tags table in schema** - **Found during:** Task 1 (Tag service implementation) - **Issue:** Plan referenced `tags` table from schema.ts but no such table existed in the database schema - **Fix:** Added tags table definition to schema.ts and generated migration (0002_square_pyro.sql) - **Files modified:** src/db/schema.ts, drizzle-pg/0002_square_pyro.sql, drizzle-pg/meta/ - **Verification:** Migration generated successfully, tests pass with PGlite - **Committed in:** 2ec1276 (Task 1 GREEN commit) --- **Total deviations:** 1 auto-fixed (1 blocking) **Impact on plan:** Essential for task completion. Tags table is required by the entire phase. No scope creep. ## Issues Encountered - Pre-existing global-items route test failures (9 of 10 tests fail) due to async/sync mismatch in test helper usage. Out of scope for this plan. ## User Setup Required None - no external service configuration required. ## Known Stubs None - all functionality is fully wired. ## Next Phase Readiness - Tags endpoint and UIStore state ready for Plan 02's UI components (FabMenu, CatalogSearchOverlay, TagChips) - useTags and useGlobalItems hooks ready for consumption by overlay components --- *Phase: 20-fab-full-screen-catalog-search* *Completed: 2026-04-06*