Soy bastante nuevo en la secuencia y trato de usarlo con sequelize-typescript .
Tengo un modelo de usuario como este:
@Scopes(() => ({ authenticated: { attributes: { exclude: ["password", "email" /* more .. */] } } })) export default class User extends Model<IUser, UserOnCreate> implements IUser { @PrimaryKey @AutoIncrement @Column(DataType.INTEGER) declare id: number @Unique @Column(DataType.STRING(20)) declare username: string @Column(DataType.STRING(64)) get password(): string { return this.getDataValue("password") } set password(p: string) { /* some hashing algorithms */ } // more columns... }También tenga un tipo para usuario autenticado,
type AuthenticatedUser = Omit<IUser, | "password" | "email" /* more */>Y estoy creando un nuevo usuario con el siguiente código:
await new User(credentials, { raw: true }).save() Entonces, ¿hay una manera más fácil de aplicar el alcance authenticated en la creación?
Después de algunas búsquedas y navegación de los documentos, no pude encontrar nada.
Entonces, defina una matriz para claves no deseadas:
export const authenticableExclude = ["id", "updatedAt", "createdAt", "email"] Y defina un enlace @AfterCreate y establezca estas claves como undefined
@AfterCreate static async editLikeScope(i: User) { Object.keys(i.get()).forEach((k) => { if (authenticatedExclude.includes(k)) i.set(k as (keyof IUser), undefined) }) } Eso es todo.
PD: La idea principal es que los ganchos @AfterCreate no actualizan la instancia de su modelo, siempre que no llame al método .save() . Con esto, los atributos se pueden cambiar y actualizar sin afectar el modelo creado.