user.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. let bcrypt = require('bcryptjs')
  2. let randomColor = require('randomcolor')
  3. const Errors = require('../lib/errors.js')
  4. module.exports = (sequelize, DataTypes) => {
  5. let User = sequelize.define('User', {
  6. username: {
  7. type: DataTypes.STRING,
  8. unique: true,
  9. validate: {
  10. min: {
  11. args: [1],
  12. msg: 'username can\'t be less than 6 characters'
  13. },
  14. max: {
  15. arg: 50,
  16. msg: 'username can\'t be more than 50 characters'
  17. },
  18. isString (val) {
  19. if(typeof val !== 'string') {
  20. throw new sequelize.ValidationError('username must be a string')
  21. }
  22. }
  23. }
  24. },
  25. description: DataTypes.TEXT,
  26. color: {
  27. type: DataTypes.STRING,
  28. defaultValue () {
  29. return randomColor()
  30. }
  31. },
  32. hash: {
  33. type: DataTypes.STRING,
  34. allowNull: false,
  35. validate: {
  36. min: {
  37. arg: 6,
  38. msg: 'password can\'t be less than 6 characters'
  39. },
  40. max: {
  41. arg: 100,
  42. msg: 'password can\'t be more than 100 characters'
  43. },
  44. isString (val) {
  45. if(typeof val !== 'string') {
  46. throw new sequelize.ValidationError('password must be a string')
  47. }
  48. }
  49. }
  50. },
  51. admin: {
  52. type: DataTypes.BOOLEAN,
  53. defaultValue: false
  54. }
  55. }, {
  56. classMethods: {
  57. associate (models) {
  58. User.hasMany(models.Post)
  59. User.hasMany(models.Thread)
  60. },
  61. includeOptions (from, limit) {
  62. let models = sequelize.models
  63. let options = models.Post.includeOptions()
  64. return [{
  65. model: models.Post,
  66. include: options,
  67. limit,
  68. where: { postNumber: { $gte: from } },
  69. order: [['id', 'ASC']]
  70. }]
  71. },
  72. async canBeAdmin (token) {
  73. let { User, AdminToken } = sequelize.models
  74. let adminUser = await User.findOne({ where: {
  75. admin: true
  76. }})
  77. if(adminUser) {
  78. if(token) {
  79. let adminToken = await AdminToken.findOne({ where: { token } })
  80. if(adminToken && adminToken.isValid()) {
  81. await adminToken.destroy()
  82. return true
  83. } else {
  84. throw Errors.invalidToken
  85. }
  86. } else {
  87. throw Errors.missingParameter('token')
  88. }
  89. } else {
  90. return true
  91. }
  92. }
  93. },
  94. hooks: {
  95. async afterValidate(user) {
  96. user.hash = await bcrypt.hash(user.hash, 12)
  97. }
  98. }
  99. })
  100. return User
  101. }