Banco de Dados

PostgreSQL/MySQL com Prisma ou MongoDB com Mongoose.

O PlazerCLI suporta 3 bancos de dados. PostgreSQL e MySQL usam Prisma ORM; MongoDB usa Mongoose ODM. Todos sao configurados com Docker Compose automaticamente.

PostgreSQL / MySQL com Prisma

O Prisma e o ORM padrao para bancos SQL. O PlazerCLI gera o schema, o service e os scripts de migration.

Arquivos gerados:

apps/api/
├── prisma/
│   └── schema.prisma         # Schema do banco
├── src/
│   └── database/
│       ├── prisma.service.ts  # PrismaService (NestJS)
│       ├── prisma.module.ts   # PrismaModule global (NestJS)
│       └── prisma.ts          # Singleton client (Express/Fastify)

Schema do User gerado:

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

model User {
  id        String   @id @default(cuid())
  email     String   @unique
  name      String?
  password  String?
  createdAt DateTime @default(now()) @map("created_at")
  updatedAt DateTime @updatedAt @map("updated_at")

  @@map("users")
}

Se multi-tenant estiver habilitado, o schema inclui o model Tenant e a relacao com User:

model User {
  // ... campos base
  tenantId  String   @map("tenant_id")
  tenant    Tenant   @relation(fields: [tenantId], references: [id])
  @@map("users")
}

model Tenant {
  id        String   @id @default(cuid())
  name      String
  slug      String   @unique
  users     User[]
  createdAt DateTime @default(now()) @map("created_at")
  updatedAt DateTime @updatedAt @map("updated_at")
  @@map("tenants")
}

Prisma Service por framework

NestJS — Service injetavel com lifecycle hooks:

@Injectable()
export class PrismaService extends PrismaClient
  implements OnModuleInit, OnModuleDestroy {
  async onModuleInit() {
    await this.$connect();
  }
  async onModuleDestroy() {
    await this.$disconnect();
  }
}

Express / Fastify — Singleton com cache global:

import { PrismaClient } from '@prisma/client';

const globalForPrisma = globalThis as unknown as { prisma: PrismaClient };

export const prisma = globalForPrisma.prisma || new PrismaClient();

if (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = prisma;

Scripts Prisma

Os seguintes scripts sao adicionados ao package.json da API:

ScriptComandoDescricao
db:pushprisma db pushSincroniza schema com o banco (dev)
db:migrateprisma migrate devCria e aplica migration
db:studioprisma studioAbre admin visual do banco
db:seedprisma db seedRoda seed do banco
db:generateprisma generateRegenera o client

MongoDB com Mongoose

Para MongoDB, o Mongoose ODM e usado com schemas tipados.

Arquivos gerados:

apps/api/src/database/
├── connection.ts             # connectDB function
└── models/
    └── user.model.ts         # IUser interface + UserSchema

Model do User:

import mongoose, { Schema, Document } from 'mongoose';

export interface IUser extends Document {
  email: string;
  name?: string;
  password?: string;
  createdAt: Date;
  updatedAt: Date;
}

const UserSchema = new Schema<IUser>(
  {
    email: { type: String, required: true, unique: true },
    name: { type: String },
    password: { type: String },
  },
  { timestamps: true }
);

export const User = mongoose.model<IUser>('User', UserSchema);

Se multi-tenant estiver habilitado, a conexao suporta criar conexoes separadas por tenant usando getTenantConnection(tenantId).

Docker Compose

O banco de dados e configurado automaticamente no docker-compose.yml:

# PostgreSQL
services:
  postgres:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: meu_projeto
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
    ports:
      - "5432:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data

# MongoDB
services:
  mongo:
    image: mongo:7
    ports:
      - "27017:27017"
    volumes:
      - mongo_data:/data/db