'Sequelize scope on create
I am quite new to sequelize and trying to use it with sequelize-typescript.
I have a user model like this:
@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...
}
Also have a type for authenticated user,
type AuthenticatedUser = Omit<IUser, | "password" | "email" /* more */>
And, I am creating a new user with the following code:
await new User(credentials, { raw: true }).save()
So is there a easier way to apply authenticated scope on create?
Solution 1:[1]
After some searchings and browsing of the docs, couldn't find anything.
So, define an array for unwanted keys:
export const authenticableExclude = ["id", "updatedAt", "createdAt", "email"]
And define a @AfterCreate hook and set these keys as undefined
@AfterCreate
static async editLikeScope(i: User) {
Object.keys(i.get()).forEach((k) => {
if (authenticatedExclude.includes(k)) i.set(k as (keyof IUser), undefined)
})
}
That's it.
PS: The main idea is, @AfterCreate hooks aren't update your model instance, as long as you are not call the .save() method. Herewith, attributes can be change and update without affecting the created model.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | alp |
