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.
