@zola_do/crud
v0.1.10
Published
Generic CRUD controllers and services for NestJS
Readme
@zola_do/crud
Generic CRUD controllers, services, and repositories for NestJS entities.
Installation
# Install individually
npm install @zola_do/crud
# Or via meta package
npm install @zola_do/nestjs-sharedDependencies
This package requires:
@zola_do/core— Entities,DataResponseFormat,EntityCrudOptions@zola_do/collection-query—decodeCollectionQuery,QueryConstructor,FilterOperators@zola_do/authorization—JwtGuard,PermissionsGuard
Usage
Entity Setup
Extend CommonEntity (or Audit for tenant-aware entities) and use with the CRUD factories:
import { CommonEntity } from '@zola_do/core';
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
@Entity('products')
export class Product extends CommonEntity {
@PrimaryGeneratedColumn('uuid')
id: string;
@Column()
name: string;
@Column({ type: 'decimal', precision: 10, scale: 2 })
price: number;
}Controller and Service
Create a CRUD controller and service for your entity:
import { Controller } from '@nestjs/common';
import {
EntityCrudController,
EntityCrudService,
} from '@zola_do/crud';
import { Product } from './product.entity';
@Controller('products')
export class ProductsController extends EntityCrudController<Product>({
createPermission: 'product:create',
viewPermission: 'product:view',
updatePermission: 'product:update',
deletePermission: 'product:delete',
}) {
constructor(service: EntityCrudService<Product>) {
super(service);
}
}import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { EntityCrudService } from '@zola_do/crud';
import { Product } from './product.entity';
import { ProductsController } from './products.controller';
@Module({
imports: [TypeOrmModule.forFeature([Product])],
controllers: [ProductsController],
providers: [EntityCrudService],
})
export class ProductsModule {}Available Endpoints
POST /— CreateGET /— Find all (supports?q=collection query)GET /:id— Find onePUT /:id— UpdateDELETE /:id— Soft delete
EntityCrudOptions
import { EntityCrudOptions } from '@zola_do/core';
const options: EntityCrudOptions = {
createDto: CreateProductDto,
updateDto: UpdateProductDto,
createPermission: 'product:create',
viewPermission: 'product:view',
updatePermission: 'product:update',
deletePermission: 'product:delete',
restorePermission: 'product:restore',
viewArchivedPermission: 'product:view_archived',
};Relation CRUD
For many-to-many or relation management:
import { RelationCrudController, RelationCrudService } from '@zola_do/crud';
@Controller('products/:productId/categories')
export class ProductCategoriesController extends RelationCrudController(
{
firstEntityIdName: 'productId',
firstInclude: 'product',
secondEntityIdName: 'categoryId',
secondInclude: 'category',
viewPermission: 'product:view',
},
ProductCategory,
) {
constructor(service: RelationCrudService) {
super(service);
}
}Exports
- Controllers:
EntityCrudController,RelationCrudController,ExtraCrudController - Services:
EntityCrudService,RelationCrudService,ExtraCrudService - Repositories:
EntityCrudRepository,RelationCrudRepository,ExtraCrudRepository
Related Packages
- @zola_do/core — Entity base classes,
EntityCrudOptions - @zola_do/collection-query — Query decoding for list endpoints
- @zola_do/authorization — Guards for protected CRUD
