]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - server/models/user.js
Server: add database field validations
[github/Chocobozzz/PeerTube.git] / server / models / user.js
1 'use strict'
2
3 const values = require('lodash/values')
4
5 const modelUtils = require('./utils')
6 const constants = require('../initializers/constants')
7 const peertubeCrypto = require('../helpers/peertube-crypto')
8 const customUsersValidators = require('../helpers/custom-validators').users
9
10 // ---------------------------------------------------------------------------
11
12 module.exports = function (sequelize, DataTypes) {
13 const User = sequelize.define('User',
14 {
15 password: {
16 type: DataTypes.STRING,
17 allowNull: false,
18 validate: {
19 passwordValid: function (value) {
20 const res = customUsersValidators.isUserPasswordValid(value)
21 if (res === false) throw new Error('Password not valid.')
22 }
23 }
24 },
25 username: {
26 type: DataTypes.STRING,
27 allowNull: false,
28 validate: {
29 usernameValid: function (value) {
30 const res = customUsersValidators.isUserUsernameValid(value)
31 if (res === false) throw new Error('Username not valid.')
32 }
33 }
34 },
35 role: {
36 type: DataTypes.ENUM(values(constants.USER_ROLES)),
37 allowNull: false
38 }
39 },
40 {
41 classMethods: {
42 associate,
43
44 countTotal,
45 getByUsername,
46 list,
47 listForApi,
48 loadById,
49 loadByUsername
50 },
51 instanceMethods: {
52 isPasswordMatch,
53 toFormatedJSON
54 },
55 hooks: {
56 beforeCreate: beforeCreateOrUpdate,
57 beforeUpdate: beforeCreateOrUpdate
58 }
59 }
60 )
61
62 return User
63 }
64
65 function beforeCreateOrUpdate (user, options, next) {
66 peertubeCrypto.cryptPassword(user.password, function (err, hash) {
67 if (err) return next(err)
68
69 user.password = hash
70
71 return next()
72 })
73 }
74
75 // ------------------------------ METHODS ------------------------------
76
77 function isPasswordMatch (password, callback) {
78 return peertubeCrypto.comparePassword(password, this.password, callback)
79 }
80
81 function toFormatedJSON () {
82 return {
83 id: this.id,
84 username: this.username,
85 role: this.role,
86 createdAt: this.createdAt
87 }
88 }
89 // ------------------------------ STATICS ------------------------------
90
91 function associate (models) {
92 this.hasMany(models.OAuthToken, {
93 foreignKey: 'userId',
94 onDelete: 'cascade'
95 })
96 }
97
98 function countTotal (callback) {
99 return this.count().asCallback(callback)
100 }
101
102 function getByUsername (username) {
103 const query = {
104 where: {
105 username: username
106 }
107 }
108
109 return this.findOne(query)
110 }
111
112 function list (callback) {
113 return this.find().asCallback(callback)
114 }
115
116 function listForApi (start, count, sort, callback) {
117 const query = {
118 offset: start,
119 limit: count,
120 order: [ modelUtils.getSort(sort) ]
121 }
122
123 return this.findAndCountAll(query).asCallback(function (err, result) {
124 if (err) return callback(err)
125
126 return callback(null, result.rows, result.count)
127 })
128 }
129
130 function loadById (id, callback) {
131 return this.findById(id).asCallback(callback)
132 }
133
134 function loadByUsername (username, callback) {
135 const query = {
136 where: {
137 username: username
138 }
139 }
140
141 return this.findOne(query).asCallback(callback)
142 }