Git Product home page Git Product logo

nestjs-library-crud's Introduction

@nestjs-library/crud

Node.js CI Coverage Status

English | 한국어

This is a Typescript library that provides a NestJS decorator which automatically generates CRUD routes of a controller for given TypeORM entity. The decorator generates endpoints for not only create, retrieve one, retrieve many, update, delete but also upsert, recover and search operations for the entity.

Features

  • Automatically generates CRUD routes for a given TypeORM entity
  • Automatically generates swagger for generated routes
  • Supports pagination, sorting, filtering, relation, searching, upserting, recovering and soft deleting
  • Supports complex search criteria(LIKE, ILIKE, BETWEEN, IN, NULL, ?, @>, JSON_CONTAINS)
  • Supports strong validation by using class-validator
  • Supports saving author information for mutating operations(Create, Update, Upsert, Delete and Recover)
  • Supports adding decorators, interceptors to each routes in Controller for customizing
  • Supports customizing swagger response

Installation

# npm
npm install @nestjs-library/crud

# yarn
yarn add @nestjs-library/crud

# pnpm
pnpm add @nestjs-library/crud

Usage

Step 1: Define a TypeORM entity

In order to use the Crud decorator, you need to define a TypeORM entity first. The following example defines a User entity with the following properties.

import { BaseEntity, Entity, PrimaryGeneratedColumn, Column } from 'typeorm';

@Entity()
export class User extends BaseEntity {
    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    username: string;

    @Column()
    email: string;
}

Step 2: Create Service and Controller

Create a NestJS service and controller with a TypeORM entity. The service needs to extend the CrudService class and the controller needs to implement the CrudController interface.

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { CrudService } from '@nestjs-library/crud';
import { Repository } from 'typeorm';

import { User } from './user.entity';

@Injectable()
export class UserService extends CrudService<User> {
    constructor(@InjectRepository(User) repository: Repository<User>) {
        super(repository);
    }
}
import { Controller } from '@nestjs/common';
import { Crud, CrudController } from '@nestjs-library/crud';

import { User } from './user.entity';
import { UserService } from './user.service';

@Crud({ entity: User })
@Controller('users')
export class UserController implements CrudController<User> {
    constructor(public readonly crudService: UserService) {}
}

Step 3: Add Service, Controller and TypeORM module to your module

In your NestJS module, add Service, Controller and TypeORM module to providers, controllers, imports array respectively.

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';

import { User } from './user.entity';
import { UserController } from './user.controller';
import { UserService } from './user.service';

@Module({
    imports: [TypeOrmModule.forFeature([User])],
    controllers: [UserController],
    providers: [UserService],
})
export class UserModule {}

Step 4: Access the generated endpoints

After the module initializes, it will generate the following CRUD endpoints:

  • GET /users - retrieves a list of users with pagination
  • GET /users/:id - retrieves a single user by ID
  • POST /users - creates single or multiple users
  • PATCH /users/:id - updates an existing user by ID
  • DELETE /users/:id - deletes an existing user by ID
  • PUT /users/:id - upserts (update or create) an existing user by ID
  • POST /users/search - retrieves a list of users based on complex search criteria
  • POST /users/:id/recover - recovers a soft deleted user by ID

Configuration

The Crud decorator supports the following configuration options:

entity

(required) The TypeORM entity that the controller operates on.

routes

(optional) You can configure each route by specifying the routes option. Every route has the following base options.

import { NestInterceptor, Type } from '@nestjs/common';

interface RouteBaseOption {
    decorators?: Array<PropertyDecorator | MethodDecorator>;
    interceptors?: Array<Type<NestInterceptor>>;
    swagger?: {
        hide?: boolean;
        response?: Type<unknown>;
    };
    exclude?: string[];
}

And each route has its own options as below.

(To be added)

only

(optional) An array of methods to generate routes for. If not specified, all routes will be generated.

For example, if you want to generate only create and retrieve one, you can specify the following configuration.

import { Crud, Method } from '@nestjs-library/crud';

@Crud({ entity: User, only: [Method.CREATE,  Method.READ_ONE] })

Contributors

License

This library is licensed under the MIT License. See the LICENSE file for details.

nestjs-library-crud's People

Contributors

jiho-kr avatar dependabot[bot] avatar pigrabbit avatar thilllon avatar wbdc-phong-do avatar kibae avatar lavelee avatar hseoy avatar jadenkim-dev avatar csy1204 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.