Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/woowabros/nestjs-library-crud

Automatically generate CRUD Rest API based on NestJS and TypeOrm
https://github.com/woowabros/nestjs-library-crud

crud crud-generator decorator nest nestjs pagination restful-api swagger typeorm typescript

Last synced: about 1 month ago
JSON representation

Automatically generate CRUD Rest API based on NestJS and TypeOrm

Awesome Lists containing this project

README

        

# @nestjs-library/crud


Node.js CI

Coverage Status












English

|

한국어

CRUD Rest API를 자동으로 생성하는 라이브러리입니다.

`NestJS`와 `TypeORM` 기반으로 작성되었습니다.

## 기능

Entity를 기반으로 ReadOne, ReadMany, Search, Update, Insert, Upsert, Delete, Recover API과 Swagger Documents를 제공합니다.

- TypeOrm이 지원하는 모든 종류의 DBMS에서 사용할 수 있습니다.
- 모든 API는 `Swagger` Document를 제공하며, `Decorator`를 통해 Override 할 수 있습니다.
- 모든 API는 `Options`을 통해 관리할 수 있으며, Request 별로 제어가 필요한 경우 `Interceptor`를 통해 Request와 Response를 관리할 수 있습니다.
- 모든 API는 `Validation`을 위한 Dto를 제공하고 있으며, Entity에 정의된 `groups` 정보를 통해 자동으로 생성합니다.
- `ReadMany`와 `Search`는 Cursor와 Offset Type의 페이지네이션을 제공합니다.
- `ReadMany`를 통해 단순한 조건으로 조회를 할 수 있다면, `Search`는 복잡한 조건으로 조회할 수 있습니다.
- `SoftDelete`와 `Recover`를 지원합니다.
- 구현된 `많은 기능과 사례`는 작성된 예제를 확인할 수 있습니다.

---

## 설치

```bash
# npm
npm install @nestjs-library/crud

# yarn
yarn add @nestjs-library/crud

# pnpm
pnpm add @nestjs-library/crud
```

## 사용 방법

---

### Step 1. Entity를 정의합니다.

Crud decorator를 사용하기 위해서는 먼저 TypeORM Entity를 정의해야 합니다.
다음의 예시에서는 id, username, email 속성을 가진 User Entity를 정의합니다.

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

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

@Column()
username: string;

@Column()
email: string;
}
```

### Step 2: Service provider를 생성합니다.

TypeORM Entity에 대한 NestJS Service 를 생성합니다.
이 때 Service 객체는 CrudService를 상속해야 합니다.

```typescript
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 {
constructor(@InjectRepository(User) repository: Repository) {
super(repository);
}
}
```

### Step 3. Controller를 생성합니다.

TypeORM Entity에 대한 NestJS Controller 를 생성합니다.
이 때 Controller 객체는 CrudController를 구현해야 합니다.

```typescript
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 {
constructor(public readonly crudService: UserService) {}
}
```

### Step 4: 생성된 Entity와 Service, Controller를 Module에 추가합니다.

NestJS 모듈을 정의합니다. 위에서 생성한 Entity, Service, Controller를 각각 imports, controllers, providers에 추가합니다.

```typescript
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 5: Server를 시작하고 CRUD API를 확인할 수 있습니다.

모듈이 초기화되면 다음의 endpoint가 자동으로 생성됩니다.

- `GET /users` - pagination을 적용하여 user의 목록을 조회합니다.
- `GET /users/:id` - ID를 기반으로 단일한 user를 조회합니다.
- `POST /users` - 단일한, 혹은 여러 명의 user를 생성합니다.
- `PATCH /users/:id` - ID를 기반으로 기존의 user를 수정합니다.
- `DELETE /users/:id` - ID를 기반으로 기존의 user를 삭제합니다.
- `PUT /users/:id` - ID를 기반으로 기존의 user를 upsert (수정하거나 생성) 합니다.
- `POST /users/search` - 복잡한 검색 조건을 적용하여 user의 목록을 조회합니다.
- `POST /users/:id/recover` - ID를 기반으로 soft delete 된 user를 복구합니다.

---

## 설정

Crud decorator는 다음과 같은 옵션을 제공합니다.

### entity

(required) controller가 다룰 TypeORM Entity를 지정합니다.

### routes

(optional) 옵션을 지정하여 각각의 route를 설정합니다.

예를 들어 Search route의 기본 pagination 크기를 설정하고 싶다면, 다음과 같이 옵션을 지정할 수 있습니다.

```typescript
@Crud({
entity: User,
routes: {
search: { numberOfTake: 5 },
},
})
```

모든 route는 다음의 기본 옵션들을 가질 수 있습니다.

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

interface RouteBaseOption {
decorators?: Array;
interceptors?: Array>;
swagger?: {
hide?: boolean;
response?: Type;
};
}
```

`CREATE`, `UPDATE`, `DELETE`, `UPSERT`, `RECOVER` route는 다음의 옵션을 가질 수 있습니다.

```typescript
interface SaveOptions {
listeners?: boolean;
}
```

각각의 route는 아래와 같은 옵션을 가질 수 있습니다.

#### `READ_ONE`

```typescript
interface ReadOneOptions {
params?: string[];
softDelete?: boolean;
relations?: false | string[];
}
```

#### `READ_MANY`

```typescript
import { Sort, PaginationType } from 'src/lib/interface';

interface ReadManyOptions {
sort?: Sort | `${Sort}`;
paginationType?: PaginationType | `${PaginationType}`;
numberOfTake?: number;
relations?: false | string[];
softDelete?: boolean;
paginationKeys?: string[];
}
```

#### `SEARCH`

```typescript
import { PaginationType } from 'src/lib/interface';

interface SearchOptions {
paginationType?: PaginationType | `${PaginationType}`;
numberOfTake?: number;
limitOfTake?: number;
relations?: false | string[];
softDelete?: boolean;
paginationKeys?: string[];
}
```

#### `CREATE`

```typescript
import { Type } from '@nestjs/common';
import { Author } from 'src/lib/interface';

interface CreateOptions {
swagger?: {
body?: Type;
};
author?: Author;
}
```

#### `UPDATE`

```typescript
import { Type } from '@nestjs/common';
import { Author } from 'src/lib/interface';

interface UpdateOptions {
params?: string[];
swagger?: {
body?: Type;
};
author?: Author;
}
```

#### `DELETE`

```typescript
import { Author } from 'src/lib/interface';

interface DeleteOptions {
params?: string[];
softDelete?: boolean;
author?: Author;
}
```

#### `UPSERT`

```typescript
interface UpsertOptions {
params?: string[];
swagger?: {
body?: Type;
};
author?: Author;
}
```

#### `RECOVER`

```typescript
interface RecoverOptions {
params?: string[];
author?: Author;
}
```

### only

(optional) route를 생성할 Method 목록을 지정합니다.

예를 들어 Create와 ReadOne에 대한 route만 생성하고 싶다면 다음과 같이 설정할 수 있습니다.

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

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

## [Contributors](https://github.com/woowabros/nestjs-library-crud/graphs/contributors)

![Contributors](https://contrib.rocks/image?repo=woowabros/nestjs-library-crud)

---

## License

This library is licensed under the MIT License. See the [LICENSE](./LICENSE.md) file for details.