+'use strict'
+
+const values = require('lodash/values')
+
const modelUtils = require('./utils')
+const constants = require('../initializers/constants')
const peertubeCrypto = require('../helpers/peertube-crypto')
+const customUsersValidators = require('../helpers/custom-validators').users
// ---------------------------------------------------------------------------
const User = sequelize.define('User',
{
password: {
- type: DataTypes.STRING
+ type: DataTypes.STRING,
+ allowNull: false,
+ validate: {
+ passwordValid: function (value) {
+ const res = customUsersValidators.isUserPasswordValid(value)
+ if (res === false) throw new Error('Password not valid.')
+ }
+ }
},
username: {
- type: DataTypes.STRING
+ type: DataTypes.STRING,
+ allowNull: false,
+ validate: {
+ usernameValid: function (value) {
+ const res = customUsersValidators.isUserUsernameValid(value)
+ if (res === false) throw new Error('Username not valid.')
+ }
+ }
+ },
+ email: {
+ type: DataTypes.STRING(400),
+ allowNull: false,
+ validate: {
+ isEmail: true
+ }
+ },
+ displayNSFW: {
+ type: DataTypes.BOOLEAN,
+ allowNull: false,
+ defaultValue: false,
+ validate: {
+ nsfwValid: function (value) {
+ const res = customUsersValidators.isUserDisplayNSFWValid(value)
+ if (res === false) throw new Error('Display NSFW is not valid.')
+ }
+ }
},
role: {
- type: DataTypes.STRING
+ type: DataTypes.ENUM(values(constants.USER_ROLES)),
+ allowNull: false
}
},
{
+ indexes: [
+ {
+ fields: [ 'username' ],
+ unique: true
+ },
+ {
+ fields: [ 'email' ],
+ unique: true
+ }
+ ],
classMethods: {
associate,
list,
listForApi,
loadById,
- loadByUsername
+ loadByUsername,
+ loadByUsernameOrEmail
},
instanceMethods: {
isPasswordMatch,
return User
}
-// TODO: Validation
-// UserSchema.path('password').required(customUsersValidators.isUserPasswordValid)
-// UserSchema.path('username').required(customUsersValidators.isUserUsernameValid)
-// UserSchema.path('role').validate(customUsersValidators.isUserRoleValid)
-
function beforeCreateOrUpdate (user, options, next) {
peertubeCrypto.cryptPassword(user.password, function (err, hash) {
if (err) return next(err)
return {
id: this.id,
username: this.username,
+ email: this.email,
+ displayNSFW: this.displayNSFW,
role: this.role,
createdAt: this.createdAt
}
// ------------------------------ STATICS ------------------------------
function associate (models) {
+ this.hasOne(models.Author, {
+ foreignKey: 'userId',
+ onDelete: 'cascade'
+ })
+
this.hasMany(models.OAuthToken, {
foreignKey: 'userId',
onDelete: 'cascade'
return this.findOne(query).asCallback(callback)
}
+
+function loadByUsernameOrEmail (username, email, callback) {
+ const query = {
+ where: {
+ $or: [ { username }, { email } ]
+ }
+ }
+
+ return this.findOne(query).asCallback(callback)
+}