aboutsummaryrefslogtreecommitdiffhomepage
path: root/server/models/user.js
diff options
context:
space:
mode:
Diffstat (limited to 'server/models/user.js')
-rw-r--r--server/models/user.js158
1 files changed, 106 insertions, 52 deletions
diff --git a/server/models/user.js b/server/models/user.js
index a19de7072..36ed723cc 100644
--- a/server/models/user.js
+++ b/server/models/user.js
@@ -1,60 +1,81 @@
1const mongoose = require('mongoose') 1'use strict'
2
3const values = require('lodash/values')
2 4
3const customUsersValidators = require('../helpers/custom-validators').users
4const modelUtils = require('./utils') 5const modelUtils = require('./utils')
6const constants = require('../initializers/constants')
5const peertubeCrypto = require('../helpers/peertube-crypto') 7const peertubeCrypto = require('../helpers/peertube-crypto')
6 8const customUsersValidators = require('../helpers/custom-validators').users
7const OAuthToken = mongoose.model('OAuthToken')
8 9
9// --------------------------------------------------------------------------- 10// ---------------------------------------------------------------------------
10 11
11const UserSchema = mongoose.Schema({ 12module.exports = function (sequelize, DataTypes) {
12 createdDate: { 13 const User = sequelize.define('User',
13 type: Date, 14 {
14 default: Date.now 15 password: {
15 }, 16 type: DataTypes.STRING,
16 password: String, 17 allowNull: false,
17 username: String, 18 validate: {
18 role: String 19 passwordValid: function (value) {
19}) 20 const res = customUsersValidators.isUserPasswordValid(value)
20 21 if (res === false) throw new Error('Password not valid.')
21UserSchema.path('password').required(customUsersValidators.isUserPasswordValid) 22 }
22UserSchema.path('username').required(customUsersValidators.isUserUsernameValid) 23 }
23UserSchema.path('role').validate(customUsersValidators.isUserRoleValid) 24 },
24 25 username: {
25UserSchema.methods = { 26 type: DataTypes.STRING,
26 isPasswordMatch, 27 allowNull: false,
27 toFormatedJSON 28 validate: {
28} 29 usernameValid: function (value) {
29 30 const res = customUsersValidators.isUserUsernameValid(value)
30UserSchema.statics = { 31 if (res === false) throw new Error('Username not valid.')
31 countTotal, 32 }
32 getByUsername, 33 }
33 list, 34 },
34 listForApi, 35 role: {
35 loadById, 36 type: DataTypes.ENUM(values(constants.USER_ROLES)),
36 loadByUsername 37 allowNull: false
38 }
39 },
40 {
41 indexes: [
42 {
43 fields: [ 'username' ]
44 }
45 ],
46 classMethods: {
47 associate,
48
49 countTotal,
50 getByUsername,
51 list,
52 listForApi,
53 loadById,
54 loadByUsername
55 },
56 instanceMethods: {
57 isPasswordMatch,
58 toFormatedJSON
59 },
60 hooks: {
61 beforeCreate: beforeCreateOrUpdate,
62 beforeUpdate: beforeCreateOrUpdate
63 }
64 }
65 )
66
67 return User
37} 68}
38 69
39UserSchema.pre('save', function (next) { 70function beforeCreateOrUpdate (user, options, next) {
40 const user = this 71 peertubeCrypto.cryptPassword(user.password, function (err, hash) {
41
42 peertubeCrypto.cryptPassword(this.password, function (err, hash) {
43 if (err) return next(err) 72 if (err) return next(err)
44 73
45 user.password = hash 74 user.password = hash
46 75
47 return next() 76 return next()
48 }) 77 })
49}) 78}
50
51UserSchema.pre('remove', function (next) {
52 const user = this
53
54 OAuthToken.removeByUserId(user._id, next)
55})
56
57mongoose.model('User', UserSchema)
58 79
59// ------------------------------ METHODS ------------------------------ 80// ------------------------------ METHODS ------------------------------
60 81
@@ -64,35 +85,68 @@ function isPasswordMatch (password, callback) {
64 85
65function toFormatedJSON () { 86function toFormatedJSON () {
66 return { 87 return {
67 id: this._id, 88 id: this.id,
68 username: this.username, 89 username: this.username,
69 role: this.role, 90 role: this.role,
70 createdDate: this.createdDate 91 createdAt: this.createdAt
71 } 92 }
72} 93}
73// ------------------------------ STATICS ------------------------------ 94// ------------------------------ STATICS ------------------------------
74 95
96function associate (models) {
97 this.hasOne(models.Author, {
98 foreignKey: 'userId',
99 onDelete: 'cascade'
100 })
101
102 this.hasMany(models.OAuthToken, {
103 foreignKey: 'userId',
104 onDelete: 'cascade'
105 })
106}
107
75function countTotal (callback) { 108function countTotal (callback) {
76 return this.count(callback) 109 return this.count().asCallback(callback)
77} 110}
78 111
79function getByUsername (username) { 112function getByUsername (username) {
80 return this.findOne({ username: username }) 113 const query = {
114 where: {
115 username: username
116 }
117 }
118
119 return this.findOne(query)
81} 120}
82 121
83function list (callback) { 122function list (callback) {
84 return this.find(callback) 123 return this.find().asCallback(callback)
85} 124}
86 125
87function listForApi (start, count, sort, callback) { 126function listForApi (start, count, sort, callback) {
88 const query = {} 127 const query = {
89 return modelUtils.listForApiWithCount.call(this, query, start, count, sort, callback) 128 offset: start,
129 limit: count,
130 order: [ modelUtils.getSort(sort) ]
131 }
132
133 return this.findAndCountAll(query).asCallback(function (err, result) {
134 if (err) return callback(err)
135
136 return callback(null, result.rows, result.count)
137 })
90} 138}
91 139
92function loadById (id, callback) { 140function loadById (id, callback) {
93 return this.findById(id, callback) 141 return this.findById(id).asCallback(callback)
94} 142}
95 143
96function loadByUsername (username, callback) { 144function loadByUsername (username, callback) {
97 return this.findOne({ username: username }, callback) 145 const query = {
146 where: {
147 username: username
148 }
149 }
150
151 return this.findOne(query).asCallback(callback)
98} 152}