@omni-api/plugin-orm
v0.0.2
Published
Database transaction middleware for OmniAPI; ORM-agnostic via DataSource convention.
Readme
@omni/plugin-orm
OmniAPI 数据库事务中间件,不绑定具体 ORM。
核心概念
DataSource:约定接口(client+withTransaction+health)attachDataSource(ds):把 DataSource 挂到 ctx(全局或 router 级中间件)transactional():把 handler 包进事务getTx(ctx):在 handler / service 中获取当前事务/客户端
用法
import { PrismaClient } from '@prisma/client';
import { attachDataSource, transactional, getTx, prismaDataSource } from '@omni/plugin-orm';
const ds = prismaDataSource(new PrismaClient());
defineProcedure({
name: 'order.create',
middleware: [attachDataSource(ds), transactional()],
handler: async ({ input, ctx }) => {
const db = getTx<typeof ds.client>(ctx);
const order = await db.order.create({ data: ... });
await db.audit.create({ data: { event: 'order_created', orderId: order.id } });
return order;
},
});内置适配器
prismaDataSource(prisma)— PrismadrizzleDataSource(db)— DrizzlecreateMemoryDataSource(initial)— 内存(仅示例 / 单测)- 自己实现
DataSource接口适配任何驱动
getTx 设计
通过 AsyncLocalStorage 自动透传事务,业务代码不需要传 tx 参数:
// service.ts
function userService_create(ctx, data) {
const db = getTx(ctx); // 自动拿到事务/非事务客户端
return db.user.create(...);
}
// 上层是否包了 transactional() 都不影响 service 写法