Как иметь sh пароль перед вставкой? - PullRequest
0 голосов
/ 07 февраля 2020

Я использую Nest. Js с TypeORM и хочу иметь sh мой пароль перед сохранением в БД.

Я пытался использовать декоратор событий @ BeforeInsert () однако это не работало для меня, но позже я обнаружил, что это не работало, потому что я принимал DTO в качестве ввода.

user.controller.ts

  @Post()
  async create(@Body() data: CreateUserDto, @Res() res) {

    // if user already exist
    const isUserExist = await this.service.findByEmail(data.email);
    if (isUserExist) {
      throw new BadRequestException('Email already exist');
    }

    // insert user
    this.service.create(data);

    // send response
    return res.status(201).json({
      statusCode: 201,
      message: 'User added Successfully',
    });
  }


user.service.ts

    create(data: CreateUserDto) {
        return this.userRepository.save(data)
    }

Итак, я в основном использовал DTO для сохранения данных. Вот почему это не сработало.

Но я хочу сопоставить DTO с пользовательским объектом. Итак, это то, что я сделал.

  @Post()
  async create(@Body() data: CreateUserDto, @Res() res) {

    // Create User object
    const user = new User();

    // Map DTO to User object
    for (const [key, value] of Object.entries(data)) {
      user[key] = value;
    }

    // if user already exist
    const isUserExist = await this.service.findByEmail(user.email);
    if (isUserExist) {
      throw new BadRequestException('Email already exist');
    }

    // insert user
    this.service.create(user);

    // send response
    return res.status(201).json({
      statusCode: 201,
      message: 'User added Successfully',
    });
  }

create-user.dto.ts

import { IsEmail, IsNotEmpty, IsString } from 'class-validator';
import { ApiProperty } from '@nestjs/swagger';
export class CreateUserDto {
    @IsNotEmpty()
    @IsString()
    @ApiProperty()
    readonly firstName: string;
    @IsNotEmpty()
    @IsString()
    @ApiProperty()
    readonly lastName: string;
    @IsNotEmpty()
    @IsString()
    @IsEmail()
    @ApiProperty()
    readonly email: string;
    @IsNotEmpty()
    @IsString()
    @ApiProperty()
    readonly password: string;
}

Есть ли лучший подход для этого? Потому что в настоящее время я должен написать код в каждом методе, чтобы отобразить его.

Ответы [ 3 ]

1 голос
/ 07 февраля 2020

Я бы сначала переместил все логи c с моего контроллера в сервис. Это позволит вам повторно использовать логи c в других местах, если таковые имеются (поскольку вы предпочитаете иметь этот класс обслуживания).

Лично я бы не стал писать умный код, потому что он экономит мне 2 или 3 строки кода. Когда кто-то, кроме вас, должен был бы пересмотреть / реорганизовать это было бы болью в спине. Просто напишите что-нибудь, что легко понять.

В-третьих, я бы не стал использовать магические c вещи, такие как beforeInsert. Да, это может выглядеть умным, но вы не даете понять, как генерируется проход.

Если ваша сущность имеет те же поля, что и ваш DTO, какая польза от этого. Лично я бы не стал раскрывать свойство пароля объекта. Вместо этого у меня был бы метод changePassword (generator: IUserPassGenerator) в объекте. Что касается проверки прохода, у меня есть что-то вроде метода verifyPass (validator: IPassChecker).

Еще одна вещь, которую я бы избегал, - это сеттеры или публичные c реквизиты, главным образом потому, что это может привести к тому, что ваша сущность войдет в недопустимое состояние. В вашем случае, например, кто-то другой может изменить свойство пароля с md5 га sh. В конце концов, они даже могут изменить его с помощью неброшенной строки.

0 голосов
/ 12 февраля 2020

Мы можем легко сопоставить Plain Object Literal с Class Instances, используя 'class-transformer' пакет

Ответ:

async create(@Body() data: CreateUserDto, @Res() res) {

const user = plainToClass(User, data)

}
0 голосов
/ 07 февраля 2020

это правильный подход.

Что вы можете сделать, это извлечь эту логику c из метода create и создать некоторый объект Builder для создания объектов User из DTO и наоборот и вызывать конструктор там, где вам это нужно.

...