| 5 | import { schema } from './zenstack/schema'; |
| 6 | |
| 7 | async function main() { |
| 8 | const db = new ZenStackClient(schema, { |
| 9 | dialect: new SqliteDialect({ database: new SQLite('./zenstack/dev.db') }), |
| 10 | computedFields: { |
| 11 | user: { |
| 12 | postCount: (eb, { modelAlias }) => |
| 13 | eb |
| 14 | .selectFrom('Post') |
| 15 | .whereRef('Post.authorId', '=', sql.ref(`${modelAlias}.id`)) |
| 16 | .select(({ fn }) => fn.countAll<number>().as('postCount')), |
| 17 | }, |
| 18 | }, |
| 19 | procedures: { |
| 20 | signUp: ({ client, args }) => |
| 21 | client.user.create({ |
| 22 | data: { ...args }, |
| 23 | }), |
| 24 | listPublicPosts: ({}) => [], |
| 25 | }, |
| 26 | }).$use({ |
| 27 | id: 'cost-logger', |
| 28 | onQuery: async ({ model, operation, args, proceed }) => { |
| 29 | const start = Date.now(); |
| 30 | const result = await proceed(args as any); |
| 31 | console.log(`[cost] ${model} ${operation} took ${Date.now() - start}ms`); |
| 32 | return result; |
| 33 | }, |
| 34 | }); |
| 35 | |
| 36 | // clean up existing data |
| 37 | await db.post.deleteMany(); |
| 38 | await db.profile.deleteMany(); |
| 39 | await db.user.deleteMany(); |
| 40 | |
| 41 | db.user.findMany({ where: { id: '1' } }); |
| 42 | |
| 43 | // create users and some posts |
| 44 | const user1 = await db.user.create({ |
| 45 | data: { |
| 46 | email: 'yiming@gmail.com', |
| 47 | role: 'ADMIN', |
| 48 | posts: { |
| 49 | create: [ |
| 50 | { |
| 51 | title: 'Post1', |
| 52 | content: 'An unpublished post', |
| 53 | published: false, |
| 54 | }, |
| 55 | { |
| 56 | title: 'Post2', |
| 57 | content: 'A published post', |
| 58 | published: true, |
| 59 | }, |
| 60 | ], |
| 61 | }, |
| 62 | }, |
| 63 | include: { posts: true }, |
| 64 | }); |