Pesquisa de site

node.js - TypeORM verificar se a coluna mudou


Então, estou usando TypeORM com o padrão ActiveRecord e tenho esta entidade

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

  @Column()
  public username: string;

  @Column()
  public password: string;

  @BeforeInsert()
  public async hashPassword() {
    this.password = await hashPassword(this.password);
  }

}

Agora o que eu quero realizar é reprocessar minha senha quando qualquer Usuário for alterado, MAS apenas se o campo da senha tiver mudado. Eu vi algumas respostas onde eu deveria armazenar a tempPassword como um campo na classe User, mas se por algum motivo o servidor cair, eu perderia esses dados. Também vi algumas pessoas sugerirem o tipo Subscriber que o TypeORM tem e estou interessado nisso, mas não tenho certeza exatamente de como eu implementaria isso com ele. Para referência, é assim que eu faria o que quero fazer com o Mongoose.

UserSchema.pre("save", function(next) {
  if (this.isModified("password") || this.isNew) {
    // hash the password
  }
})

qualquer ajuda é apreciada

Resposta #1

Você pode usar o decorador AfterLoad para armazenar a senha antiga como uma variável temporária privada e compará-la com a nova senha.

private tempPassword: string;
  @AfterLoad()
  storeOriginalPassword() {
    this.tempPassword = this.password;
  }

  @BeforeInsert()
  public async hashPassword() {
    if (this.password && this.password !== this.tempPassword) {
      this.password = await hashPassword(this.password);
    }
  }

Resposta #2

De acordo com a documentação do TypeOrm, você pode definir um método com qualquer nome na entidade e marcá-lo com o decorador @BeforeUpdate, e o TypeORM irá chamá-lo antes que uma entidade existente seja atualizada usando repository/manager save.

@BeforeUpdate()
  async updatePassword(): Promise<void> {
    this.password = await hashPassword(this.password);;
  }

Você pode verificar dentro o que quiser, mas eu não acho que será necessário porque se o campo de senha não for alterado, ele será o mesmo, e o ORM não atualizará essa coluna de qualquer maneira. Só será atualizado se for alterado.

O Mongoose nos fornece os métodos isModified() & isNew() porque ele não realiza as verificações para você, é necessário verificar explicitamente se o campo foi realmente modificado ou se é novo.

Artigos relacionados