Prisma & Database
New Apps (Prisma 8)
npm install prisma@latest @prisma/orm-postgres
prisma.config.tswithdefineConfignpx prisma migrate dev --name description- Node.js 22.18+
Model Conventions
model category {
id String @id @default(uuid()) # UUID for catalog
name_en String # bilingual
name_ar String
slug String @unique
deleted DateTime? # soft delete
sort Int @default(0)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@index([deleted])
}
| ID type | Use for |
|---|---|
UUID @default(uuid()) |
Catalog entities (category, product, user) |
Int @id @default(autoincrement()) |
Orders, junction tables, logs |
Soft Delete
PrismaService uses Client Extensions — auto-injects where: { deleted: null } on findMany/count/findFirst.
Setting deleted: new Date() = soft delete.
Delete Pattern
// First delete → soft
await prisma.feature.update({ where: { id }, data: { deleted: new Date() } });
// Second delete on same record → hard + cleanup relations
await prisma.junction.deleteMany({ where: { featureId: id } });
await prisma.feature.delete({ where: { id } });
Or extend BaseService → handleDelete(model, id) handles soft→hard + sequence reset.
Search
where.OR = [
{ name_en: { contains: search, mode: 'insensitive' } },
{ name_ar: { contains: search, mode: 'insensitive' } },
];
Relations
// Connect on create
type: { connect: { id: dto.typeId } }
// Include on read
include: { type: true, ProductCategory: true }
Migrations
New apps: prisma migrate dev only.
Legacy: manual SQL in prisma/migrations/*.sql + edit schema.
Sequence Reset
After hard delete on autoincrement tables: SequenceResetService or POST /maintenance/reset-sequences.
Seed
prisma/seed.ts — npx prisma db seed