Skip to content
This repository has been archived by the owner on Dec 24, 2023. It is now read-only.

nikitakoschelenko/nestjs-response-dto-mapper

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

3 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Nest Logo

A progressive Node.js framework for building efficient and scalable server-side applications.

NestJS Response DTO Mapper

๐Ÿ‘€ Response to DTO mapper for NestJS and Swagger with class-transformer

Installation

yarn add nestjs-response-dto-mapper

Usage

  1. Create a DTO class using at least one class-transformer decorator for each field:
import { ApiProperty } from '@nestjs/swagger';
import { Expose } from 'class-transformer';

export class UserDto {
  @Expose()
  @ApiProperty({ description: 'ID' }) // or you can use `@nestjs/swagger` CLI plugin
  id: number;

  @Expose()
  @ApiProperty({ description: 'First name' })
  firstName: string;

  @Expose()
  @ApiProperty({ description: 'Last name' })
  lastName: string;

  @Expose()
  @ApiProperty({ description: 'Email' })
  email: string;

  @Expose()
  @ApiProperty({ description: 'Phone number' })
  phone: string;
}
  1. Decorate each controller method with the MapResponseToDto decorator:
import { Controller, Get } from '@nestjs/common';
import { ApiOperation } from '@nestjs/swagger';
import { MapResponseToDto } from 'nestjs-response-dto-mapper';
import { User as UserModel } from '@prisma/client'; // for example

import { UserDto } from './dto/user.dto';

@Controller('user')
export class UserController {
  @Get()
  @ApiOperation({ summary: 'List all users' }) // or you can use @nestjs/swagger CLI plugin
  @MapResponseToDto(UserDto, { /* ApiOkResponse decorator options */ isArray: true })
  findMany(): UserModel[] {
    // for example
    return [
      {
        id: 1,
        firstName: 'Example',
        lastName: 'Example',
        email: 'example@example.com',
        phone: '+99999999999',
        password: '$2y$10$gN9UIb8EjkhNWxu8iRJQOe/kAk1TqhtJ1M72DKx.BrpgyAe7XURhq',
        rights: 'user'
      },
      {
        id: 2,
        firstName: 'Test',
        lastName: 'Test',
        email: 'test@example.com',
        phone: '+88888888888',
        password: '$2y$10$Mrh1URLy.Fo8tmBZtaPd5OR.1gDaPvU7GX02./uK9kKz.Skoc2C5y',
        rights: 'user'
      },
       {
        id: 3,
        firstName: 'Admin',
        lastName: 'Admin',
        email: 'admin@example.com',
        phone: '+88005553535',
        password: '$2y$10$qi8oDsLM88XMw4ZStIE7pOG6yZNceqDTVOp0ajLIOk2ttyIcPF9r.',
        rights: 'admin'
      }
    ]
  }
}
  1. Run and test it!

Swagger schema:

Response:

[
  {
    "id": 1,
    "firstName": "Example",
    "lastName": "Example",
    "email": "example@example.com",
    "phone": "99999999999"
  },
  {
    "id": 2,
    "firstName": "Test",
    "lastName": "Test",
    "email": "test@example.com",
    "phone": "+88888888888"
  },
    {
    "id": 3,
    "firstName": "Admin",
    "lastName": "Admin",
    "email": "admin@example.com",
    "phone": "+88005553535"
  }
]

Troubleshooting

I use the @nestjs/swagger CLI Plugin and my method returns an array of objects, but the swagger does not display the method summary and response schema

Try casting the return value to the dto type:

// controller...
export class UserController {
  // ...
  findMany(): UserDto[] {
    // findMany returns UserModel[]
    return this.userService.findMany() as UserDto[];
  }
}

License

MIT

About

๐Ÿ‘€ Response to DTO mapper for NestJS and Swagger with class-transformer

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published