Files
GearBox/.planning/phases/14-postgresql-migration/14-04-PLAN.md

8.0 KiB

phase, plan, type, wave, depends_on, files_modified, autonomous, requirements, must_haves
phase plan type wave depends_on files_modified autonomous requirements must_haves
14-postgresql-migration 04 execute 2
14-01
src/server/routes/items.ts
src/server/routes/categories.ts
src/server/routes/threads.ts
src/server/routes/setups.ts
src/server/routes/auth.ts
src/server/routes/oauth.ts
src/server/routes/images.ts
src/server/routes/settings.ts
src/server/routes/totals.ts
true
DB-01
DB-02
truths artifacts key_links
Every route handler awaits service function calls
All route handlers that call services are async
No route returns a Promise object instead of resolved data
path provides contains
src/server/routes/items.ts Async item route handlers await
path provides contains
src/server/routes/settings.ts Async settings handlers with direct DB calls await
from to via pattern
src/server/routes/*.ts src/server/services/*.ts await service function calls await .*(get|create|update|delete)
Convert all 9 route handler files to properly await async service calls. Route handlers that call service functions must be async and await the results.

Purpose: With services now async (Plan 03), route handlers must await them. Missing awaits would return Promise objects as JSON responses instead of actual data. Output: All route files properly await service calls.

<execution_context> @$HOME/.claude/get-shit-done/workflows/execute-plan.md @$HOME/.claude/get-shit-done/templates/summary.md </execution_context>

@.planning/PROJECT.md @.planning/ROADMAP.md @.planning/phases/14-postgresql-migration/14-CONTEXT.md @.planning/phases/14-postgresql-migration/14-RESEARCH.md @.planning/phases/14-postgresql-migration/14-03-SUMMARY.md

@src/server/routes/items.ts @src/server/routes/settings.ts

Conversion rules for routes:

  • Handler callback must be async (c) => { ... }
  • Every service call: const result = serviceFunction(db, ...) -> const result = await serviceFunction(db, ...)
  • Settings route has direct DB calls: add await and remove .all()/.get()/.run()
  • OAuth routes may have direct DB calls for token validation
Task 1: Convert data route handlers to async (items, categories, threads, setups, totals) src/server/routes/items.ts, src/server/routes/categories.ts, src/server/routes/threads.ts, src/server/routes/setups.ts, src/server/routes/totals.ts src/server/routes/items.ts, src/server/routes/categories.ts, src/server/routes/threads.ts, src/server/routes/setups.ts, src/server/routes/totals.ts For each route file, read the full file first. Then:
  1. Ensure every handler callback is async (c) => { ... } (many may already be async for body parsing)
  2. Add await before every service function call
  3. If any handler has direct DB calls (.select(), .insert(), etc.), apply the same rules as services: remove .all()/.get()/.run(), use destructuring for single rows

items.ts — Handlers call: getAllItems(db), getItemById(db, id), createItem(db, data), updateItem(db, id, data), duplicateItem(db, id), deleteItem(db, id). Add await before each.

categories.ts — Handlers call: getAllCategories(db), createCategory(db, data), updateCategory(db, id, data), deleteCategory(db, id). Add await before each.

threads.ts — Handlers call: getAllThreads(db), getThreadById(db, id), createThread(db, data), updateThread(db, id, data), deleteThread(db, id), resolveThread(db, id, data), unresolveThread(db, id), addCandidate(db, data), updateCandidate(db, id, data), removeCandidate(db, id), reorderCandidates(db, data). Add await before each.

setups.ts — Handlers call: getAllSetups(db), getSetupById(db, id), createSetup(db, data), updateSetup(db, id, data), deleteSetup(db, id), updateSetupItems(db, id, data), updateClassification(...). Add await before each.

totals.ts — Handlers call totals service functions. Add await before each. ! grep -n "= getAllItems|= getItemById|= createItem|= getAllCategories|= getAllThreads|= getAllSetups" src/server/routes/items.ts src/server/routes/categories.ts src/server/routes/threads.ts src/server/routes/setups.ts 2>/dev/null | grep -v "await" && echo "PASS" || echo "FAIL" <acceptance_criteria> - items.ts: every service call is preceded by await - categories.ts: every service call is preceded by await - threads.ts: every service call is preceded by await - setups.ts: every service call is preceded by await - totals.ts: every service call is preceded by await - No route handler assigns a service call result without await </acceptance_criteria> All data route handlers properly await async service calls.

Task 2: Convert auth, OAuth, settings, and images route handlers to async src/server/routes/auth.ts, src/server/routes/oauth.ts, src/server/routes/settings.ts, src/server/routes/images.ts src/server/routes/auth.ts, src/server/routes/oauth.ts, src/server/routes/settings.ts, src/server/routes/images.ts, src/server/middleware/auth.ts **auth.ts** — Handlers call auth service functions. Add `await` before each service call.

oauth.ts — Handlers call OAuth service functions. Add await before each service call. Also check for any direct DB queries in OAuth routes and apply async conversion.

settings.ts — This route likely accesses the database DIRECTLY (no service layer) using db.select().from(settings) etc. Apply full async conversion:

  • Remove .all()const rows = await db.select().from(settings)
  • Remove .get()const [row] = await db.select().from(settings).where(...)
  • Remove .run()await db.insert(settings).values(...)

images.ts — May call image service functions. Add await before each service call.

Also check src/server/middleware/auth.ts — The auth middleware queries sessions and API keys. If it has direct DB calls, convert them:

  • Make the middleware function async (if not already)
  • Add await before DB queries
  • Remove .get() -> use destructuring ! grep -n ".all()|.get()|.run()" src/server/routes/settings.ts src/server/routes/auth.ts src/server/routes/oauth.ts src/server/routes/images.ts 2>/dev/null && echo "PASS" || echo "FAIL" <acceptance_criteria>
    • auth.ts: every service call is preceded by await
    • oauth.ts: every service call is preceded by await
    • settings.ts: does NOT contain .all(), .get(), or .run()
    • settings.ts: contains await db.select() and await db.insert()
    • images.ts: every service call is preceded by await
    • If auth middleware has DB calls, they are all awaited with no .get() or .all() </acceptance_criteria> Auth, OAuth, settings, and images routes properly await all DB operations. Auth middleware updated if needed.
- `grep -rn "\.all()\|\.get()\|\.run()" src/server/routes/` returns NO matches - Every route handler that calls a service function uses `await`

<success_criteria> All 9 route files await async service calls. Settings route uses async direct DB calls. No route handler will return a Promise object instead of resolved data. </success_criteria>

After completion, create `.planning/phases/14-postgresql-migration/14-04-SUMMARY.md`