Selegic CRM Docs
ServerDatabase

Client Usage

How to use Prisma clients in server and feature code.

Importing Prisma Clients

Core Client (Global Data)

import { basePrisma } from "@repo/crm-db";

// Use for: Users, Sessions, Organizations, Members
const users = await basePrisma.user.findMany();

Organization Client (Tenant Data)

import { orgPrisma } from "@repo/crm-db";

// Use for: Entities, Fields, Dynamic records
const entities = await orgPrisma.entity.findMany({
  where: { orgId: "org_123" },
});

Accessing from HandlerContext

Middleware attaches Prisma to the context:

app.get("/api/entities", requireAuth, async (c) => {
  const prisma = c.get("prisma"); // Tenant-scoped
  const entities = await prisma.entity.findMany();
});

Using with Effect-TS

import { PrismaTag } from "@/lib/tags";

const program = Effect.gen(function* () {
  const prisma = yield* PrismaTag;
  return yield* Effect.tryPromise(() => prisma.user.findMany());
});

Transaction Support

await prisma.$transaction(async (tx) => {
  await tx.entity.create({ data: { ... } });
  await tx.field.createMany({ data: [...] });
});

Best Practices

  • Use tenant-scoped client: Always use c.get("prisma") in route handlers
  • Use basePrisma: Only for cross-org data (auth, org management)
  • Avoid raw queries: Use Prisma client for type safety
  • Use transactions: For multi-table operations

On this page