ZenStack是一个节点/typescript工具包,可简化Web应用程序后端的开发。它通过灵活的授权层和自动生成的类型安全的API/钩子增强了Prisma Orm,从而解开了其全堆栈开发的全部潜力。
我们的目标是让您节省时间编写样板代码,并专注于构建真实功能!
阅读完整的文档? Zenstack.dev。加入Discord以获取反馈和问题。
Zenstack通过以下四层逐步扩展Prisma的力量:
Zenstack引入了一种名为“ Zmodel”的数据建模语言 - Prisma Schema语言的超集。它通过自定义属性和功能扩展了Prisma模式,并基于此实现了Prisma周围的灵活访问控制层。
// base.zmodel
abstract model Base {
id String @ id
author User @ relation ( fields : [ authorId ] , references : [ id ] )
authorId String
// ? allow full CRUD by author
@@ allow ( 'all' , author == auth ( ) )
} // schema.zmodel
import "base"
model Post extends Base {
title String
published Boolean @ default ( false )
// ? allow logged-in users to read published posts
@@ allow ( 'read' , auth ( ) != null && published )
} zenstack CLI将ZMODEL转移到标准的Prisma架构中,您可以将其与常规的Prisma工作流程一起使用。
在运行时,围绕Prisma客户端创建了透明代理,以拦截查询和突变以执行访问策略。
import { enhance } from '@zenstackhq/runtime' ;
// a regular Prisma client
const prisma = new PrismaClient ( ) ;
async function getPosts ( userId : string ) {
// create an enhanced Prisma client that has access control enabled
const enhanced = enhance ( prisma , { user : userId } ) ;
// only posts that're visible to the user will be returned
return enhanced . post . findMany ( ) ;
}服务器适配器软件包可帮助您将启用访问控制的PRISMA客户端包装到可从前端安全调用的后端CRUD API。这是Next.js的一个示例:
// pages/api/model/[...path].ts
import { requestHandler } from '@zenstackhq/next' ;
import { enhance } from '@zenstackhq/runtime' ;
import { getSessionUser } from '@lib/auth' ;
import { prisma } from '@lib/db' ;
// Mount Prisma-style APIs: "/api/model/post/findMany", "/api/model/post/create", etc.
// Can be configured to provide standard RESTful APIs (using JSON:API) instead.
export default requestHandler ( {
getPrisma : ( req , res ) => enhance ( prisma , { user : getSessionUser ( req , res ) } ) ,
} ) ;插件可以生成与上述API交谈的强型客户库。这是一个反应的示例:
// components/MyPosts.tsx
import { useFindManyPost } from '@lib/hooks' ;
const MyPosts = ( ) => {
// list all posts that're visible to the current user, together with their authors
const { data : posts } = useFindManyPost ( {
include : { author : true } ,
orderBy : { createdAt : 'desc' } ,
} ) ;
return (
< ul >
{ posts ?. map ( ( post ) => (
< li key = { post . id } >
{ post . title } by { post . author . name }
</ li >
) ) }
</ ul >
) ;
} ; 下图给出了Zenstack的高级体系结构概述。
样本回购包括以下模式:
您可以将此博客文章用作简介。
查看多租户应用程序的运行示例。您可以在下面找到不同的实现:
加入我们的Discord服务器进行聊天和更新!
如果您喜欢Zenstack,请加入我们,使其成为更好的工具!请使用贡献指南以获取有关如何入门的详细信息,并毫不犹豫地加入Discord以分享您的想法。文档位于单独的存储库中:zenstack-docs。
还请考虑赞助我们的工作以加快发展的速度。您的贡献将100%用作赏金奖励,以鼓励社区成员帮助修复错误,添加功能并改善文档。
感谢您的慷慨支持!
大块主义 | 美人鱼图表 | coderabbit | 约翰·罗恩(Johann Rohn) |
本杰明·泽西罗维奇 | Ulric | Fabian Jocks |
感谢所有帮助Zenstack变得更好的贡献者!
麻省理工学院