10 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 |
|
|
true |
|
|
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. The auth middleware queries sessions and API keys on every request -- these direct DB calls must also be async. Output: All route files and auth middleware properly await service/DB 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 @src/server/middleware/auth.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
awaitand remove.all()/.get()/.run() - OAuth routes may have direct DB calls for token validation
Conversion rules for auth middleware:
- Middleware function must be async
- Session lookup:
db.select()...where(eq(sessions.id, ...))-> addawait, remove.get(), use destructuring - API key lookup: same pattern
- Ensure every handler callback is
async (c) => { ... }(many may already be async for body parsing) - Add
awaitbefore every service function call - 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.
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.
src/server/middleware/auth.ts -- The auth middleware queries sessions and API keys on every authenticated request. These are direct DB calls that must become async:
- Make the middleware function async (if not already)
- Add
awaitbefore all DB queries (session lookup, API key lookup) - Remove
.get()-> use destructuring:const [session] = await db.select()... - Remove
.all()if present - This is critical -- the auth middleware runs on every POST/PUT/DELETE request, so missing awaits here would break ALL write operations
After all conversions, run a PGlite smoke test to verify routes work end-to-end:
bun -e "
import { createTestDb } from './tests/helpers/db.ts';
import * as schema from './src/db/schema.ts';
const db = await createTestDb();
// Verify auth middleware can be imported without errors
const authMod = await import('./src/server/middleware/auth.ts');
console.log('Auth middleware imports OK');
// Verify settings route pattern works
const rows = await db.select().from(schema.settings);
console.log('Direct DB query works, settings count:', rows.length);
console.log('Route smoke test PASSED');
"
<success_criteria> All 9 route files and auth middleware await async service/DB calls. Settings route uses async direct DB calls. Auth middleware properly awaits session and API key lookups. No route handler will return a Promise object instead of resolved data. Lint passes. </success_criteria>
After completion, create `.planning/phases/14-postgresql-migration/14-04-SUMMARY.md`