@faster-crud/prisma
v0.3.0
Published
Prisma adapter for @faster-crud
Downloads
25
Readme
@faster-crud/prisma
Prisma adapter for @faster-crud.
Install
npm install @faster-crud/core @faster-crud/nest @faster-crud/prisma @prisma/clientQuick Start
1. Define your entity
import { Col, Resource, Searchable, Rule } from '@faster-crud/core';
@Resource('users')
export class User {
@Col() id!: number;
@Searchable() @Col() name!: string;
@Searchable() @Col() email!: string;
@Rule.required() @Col() role!: string;
}2. Create the service
Pass the entity class and the matching Prisma model delegate to PrismaResourceService:
import { Injectable } from '@nestjs/common';
import { PrismaClient } from '@prisma/client';
import { PrismaResourceService } from '@faster-crud/prisma';
import { User } from './user.entity';
const prisma = new PrismaClient();
@Injectable()
export class UsersService extends PrismaResourceService(User, prisma.user) {}3. Use in a controller (or with @faster-crud/nest)
import { Controller, Get, Post, Patch, Delete, Body, Param, Query } from '@nestjs/common';
import { UsersService } from './users.service';
@Controller('users')
export class UsersController {
constructor(private readonly users: UsersService) {}
@Post()
create(@Body() dto: any) {
return this.users.create(dto);
}
@Get()
list(@Query() query: any) {
return this.users.list(query);
}
@Get(':id')
get(@Param('id') id: number) {
return this.users.get(+id);
}
@Patch(':id')
update(@Param('id') id: number, @Body() dto: any) {
return this.users.update(+id, dto);
}
@Delete(':id')
remove(@Param('id') id: number) {
return this.users.remove(+id);
}
}Relation queries (include)
All read and write methods accept an optional second/third argument with an include key that is forwarded directly to Prisma:
// Eager-load posts when fetching a user
const user = await usersService.get(1, { include: { posts: true } });
// Include profile in list results
const page = await usersService.list(
{ page: { current: 1, size: 20 } },
{ include: { profile: true } },
);
// Return related posts after creating a user
const created = await usersService.create(
{ name: 'Ada', role: 'admin' },
{ include: { posts: true } },
);
// Return related data after update
const updated = await usersService.update(
1,
{ name: 'Ada Lovelace' },
{ include: { posts: true } },
);Filtering
Filters use the { op, value } shape on @Searchable() fields:
| op | Prisma equivalent |
|--------------|-------------------------------|
| eq | field: value |
| ne | field: { not: value } |
| lt | field: { lt: value } |
| lte | field: { lte: value } |
| gt | field: { gt: value } |
| gte | field: { gte: value } |
| in | field: { in: [...] } |
| between | field: { gte: a, lte: b } |
| like | field: { contains: value } |
| contains | field: { contains: value } |
| startsWith | field: { startsWith: value }|
| endsWith | field: { endsWith: value } |
Only fields decorated with @Searchable() are included in the where clause — all others are silently ignored.
Pagination & sorting
await usersService.list({
page: { current: 2, size: 25 },
sort: { field: 'name', order: 'asc' },
filters: {
name: { op: 'like', value: 'ada' },
},
});
// → { data: [...], total: N, page: 2, size: 25 }Documentation
Full docs at github.com/bkmashiro/nest-faster-crud
Ecosystem
| Package | Description |
|---------|-------------|
| @faster-crud/core | Decorators and types |
| @faster-crud/nest | NestJS controller factory |
| @faster-crud/typeorm | TypeORM adapter |
| @faster-crud/prisma | Prisma adapter (this package) |
