waiterjan-technical-task/Draft.md

3.2 KiB

Project setup

Nestjs

Clone a Nest starter project

git clone https://github.com/nestjs/typescript-starter.git demo-app
cd demo-app
npm install

dependentele

npm install @zenstackhq/runtime @nestjs/jwt bcrypt @nestjs/graphql @nestjs/apollo @apollo/server graphql graphql-scalars type-graphql
npm install prisma zenstack @types/bcrypt typegraphql-prisma-nestjs --save-dev

Prisma

Initializam stack-ul Prisma

npx prisma init

Conexiunea db catre bd sqlite

  1. schimbam provider-ul in fisierul schema.prisma
...
datasource db {
  provider = "sqlite"
...
  1. Ajustam url-ul de conectare catre db in fisierul .env
DATABASE_URL="file:./demo-app.db"
  1. Declaram tabele unde se vor stoca utilizatorii, rolurile si nivelele de acces schema.prisma
model User {
  id        Int      @id @default(autoincrement())
  email     String   @unique
  password  String
  createdAt DateTime @default(now())
  updatedAt DateTime @default(now())
  roles      UsersRoles[]
}

model Role {
  id        Int      @id @default(autoincrement())
  name      String   @unique
  createdAt DateTime @default(now())
  updatedAt DateTime @default(now())
  permission Permission[]
  users UsersRoles[]
}

model Permission {
  id        Int      @id @default(autoincrement())
  name      String   @unique
  createdAt DateTime @default(now())
  updatedAt DateTime @default(now())
  role      Role @relation(fields: [roleId], references: [id])
  roleId Int
}

model UsersRoles {
  user     User    @relation(fields: [userId], references: [id])
  userId  Int
  role Role   @relation(fields: [roleId], references: [id])
  roleId Int
  assignedAt DateTime @default(now())
  assignedBy String
  @@id([userId, roleId])
}
  1. Generam clientul prisma
npx prisma generate

Zenstack

Copy schema.prisma to ../schema.zmodel

Declaram zmodel-ul pentru tabela produselor schema.zmodel si gestionam acesele la ea

model Product {
  id        String @id @default(cuid())
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
  title     String
  published Boolean @default(false)
  author    User @relation(fields: [authorId], references: [id])
  authorId  Int

  // author has full access
  @@allow('all', auth() == author)

  // logged-in users can view published posts
  @@allow('read', auth() != null && published)
}

generam staf-ul zenstack

npx zenstack generate

Creem ceva date mock in prisma/seed.ts

npx prisma migrate dev
npx prisma db seed

GraphQL Integration

In fisierul schema.zmodel adaugam si rulam npx zenstack generate

generator typegraphql {
  provider = "typegraphql-prisma-nestjs"
  output   = "../prisma/generated/type-graphql"
}

Enable graphql integration app.module si tot aici indicam clientul prisma enhancing de ZenStack

...
imports: [
   GraphQLModule.forRoot<ApolloDriverConfig>({
      driver: ApolloDriver,
      autoSchemaFile: join(process.cwd(), 'src/schema.gql'),
      playground: true,
      buildSchemaOptions: { dateScalarMode: 'timestamp' },
  ],
  controllers:
  ...

Registering all resolvers inside providers of the Nest module

providers: [
  ...