Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

user.js 2.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. import {
  2. hashPassword,
  3. verifyPassword,
  4. } from '../utils/helpers/hashPasswordHelpers';
  5. const mongoose = require('mongoose');
  6. const validator = require('validator');
  7. const UserSchema = new mongoose.Schema({
  8. fullName: {
  9. type: String,
  10. required: [true, 'Please provide a name.'],
  11. maxlength: [60, 'Name cannot be more than 60 characters'],
  12. trim: true,
  13. },
  14. username: {
  15. type: String,
  16. required: [true, 'Please provide an username.'],
  17. unique: [true, 'Username must be unique.'],
  18. maxlength: [60, 'Name cannot be more than 60 characters'],
  19. trim: true,
  20. },
  21. email: {
  22. type: String,
  23. unique: [true, 'Email must be unique.'],
  24. required: [true, 'Please provide an email.'],
  25. trim: true,
  26. lowercase: true,
  27. validate(value) {
  28. if (!validator.isEmail(value)) {
  29. throw new Error('Email is invalid');
  30. }
  31. },
  32. },
  33. password: {
  34. type: String,
  35. required: [true, 'Please provide a password.'],
  36. minlength: 7,
  37. trim: true,
  38. validate(value) {
  39. if (value.toLowerCase().includes('password')) {
  40. throw new Error('Password cannot contain "password"');
  41. }
  42. },
  43. },
  44. country: {
  45. type: String,
  46. required: [true, 'Please provide a country.'],
  47. trim: true,
  48. },
  49. city: {
  50. type: String,
  51. required: [true, 'Please provide a city.'],
  52. trim: true,
  53. },
  54. address: {
  55. type: String,
  56. required: [true, 'Please provide an address.'],
  57. trim: true,
  58. },
  59. address2: {
  60. type: String,
  61. trim: true,
  62. },
  63. postcode: {
  64. type: String,
  65. required: [true, 'Please provide a postal code.'],
  66. },
  67. });
  68. UserSchema.virtual('orders', {
  69. ref: 'Order',
  70. localField: '_id',
  71. foreignField: 'owner',
  72. });
  73. UserSchema.statics.findByCredentials = async (username, password) => {
  74. const user = await User.findOne({ username });
  75. if (!user) {
  76. throw new Error('Unable to login');
  77. }
  78. const isMatch = await verifyPassword(password, user.password);
  79. if (!isMatch) {
  80. throw new Error('Unable to login');
  81. }
  82. const userData = {
  83. fullName: user.fullName,
  84. email: user.email,
  85. address: user.address,
  86. address2: user.address2,
  87. city: user.city,
  88. country: user.country,
  89. postcode: user.postcode,
  90. _id: user._id,
  91. };
  92. return userData;
  93. };
  94. UserSchema.pre('save', async function (next) {
  95. const user = this;
  96. if (user.isModified('password')) {
  97. user.password = await hashPassword(user.password);
  98. }
  99. next();
  100. });
  101. const User = mongoose.models.User || mongoose.model('User', UserSchema);
  102. module.exports = User;