Files
fullstack-starter/src/server/api/routers/todo.router.ts
T
imbytecat 2678a53034 refactor(api): 删掉 db ORPC middleware,handler 直接用 db
db middleware 的存在只是为了把 db 注入到 ORPC context——这是 Cloudflare
Workers / 多租户场景的模式(db 依赖 per-request 的 env binding)。在
Bun 单进程 + 模块级 const db 下,这层中间件是纯粹的仪式:一行 import
直接拿到 db,反而更清晰。

- 删除 src/server/api/middlewares/ 整个目录(不留空脚手架,KISS)
- context.ts 去掉 DBContext 与示例注释,只留 BaseContext { headers }
  作为未来 auth/tenant 等 middleware 的扩展点
- routers/todo.router.ts 不再 .use(db),handler 内直接 db.query / db.insert

需要 per-request 上下文(auth、tenant、rate-limit)时再按 ORPC 的
os.middleware 模式新增,不在此预先铺陈。
2026-04-24 20:37:11 +08:00

40 lines
1.1 KiB
TypeScript

import { ORPCError } from '@orpc/server'
import { eq } from 'drizzle-orm'
import { os } from '@/server/api/server'
import { db } from '@/server/db'
import { todoTable } from '@/server/db/schema'
export const list = os.todo.list.handler(async () => {
return db.query.todoTable.findMany({
orderBy: (table, { desc }) => desc(table.createdAt),
})
})
export const create = os.todo.create.handler(async ({ input }) => {
const [newTodo] = await db.insert(todoTable).values(input).returning()
if (!newTodo) {
throw new ORPCError('INTERNAL_SERVER_ERROR', { message: 'Failed to create todo' })
}
return newTodo
})
export const update = os.todo.update.handler(async ({ input }) => {
const [updatedTodo] = await db.update(todoTable).set(input.data).where(eq(todoTable.id, input.id)).returning()
if (!updatedTodo) {
throw new ORPCError('NOT_FOUND')
}
return updatedTodo
})
export const remove = os.todo.remove.handler(async ({ input }) => {
const [deleted] = await db.delete(todoTable).where(eq(todoTable.id, input.id)).returning({ id: todoTable.id })
if (!deleted) {
throw new ORPCError('NOT_FOUND')
}
})