File size: 1,848 Bytes
6c4e56e | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | const Sequelize = require("sequelize");
const db = require("../db");
const crypto = require("crypto");
const User = db.define("user", {
username: {
type: Sequelize.STRING,
unique: true,
allowNull: false,
},
email: {
type: Sequelize.STRING,
unique: true,
allowNull: false,
validate: {
isEmail: true,
},
},
photoUrl: {
type: Sequelize.STRING,
},
password: {
type: Sequelize.STRING,
validate: {
min: 6,
},
allowNull: false,
get() {
return () => this.getDataValue("password");
},
},
salt: {
type: Sequelize.STRING,
get() {
return () => this.getDataValue("salt");
},
},
firstName: {
type: Sequelize.STRING,
},
lastName: {
type: Sequelize.STRING,
},
country: {
type: Sequelize.STRING,
},
bio: {
type: Sequelize.STRING,
},
receiveNotifications: {
type: Sequelize.BOOLEAN,
},
receiveUpdates: {
type: Sequelize.BOOLEAN,
},
completedOnboarding: {
type: Sequelize.BOOLEAN,
allowNull: false,
defaultValue: false,
},
});
User.prototype.correctPassword = function (password) {
return User.encryptPassword(password, this.salt()) === this.password();
};
User.createSalt = function () {
return crypto.randomBytes(16).toString("base64");
};
User.encryptPassword = function (plainPassword, salt) {
return crypto
.createHash("RSA-SHA256")
.update(plainPassword)
.update(salt)
.digest("hex");
};
const setSaltAndPassword = (user) => {
if (user.changed("password")) {
user.salt = User.createSalt();
user.password = User.encryptPassword(user.password(), user.salt());
}
};
User.beforeCreate(setSaltAndPassword);
User.beforeUpdate(setSaltAndPassword);
User.beforeBulkCreate((users) => {
users.forEach(setSaltAndPassword);
});
module.exports = User;
|