summaryrefslogtreecommitdiffstats
path: root/server/models/User.js
diff options
context:
space:
mode:
Diffstat (limited to 'server/models/User.js')
-rw-r--r--server/models/User.js72
1 files changed, 72 insertions, 0 deletions
diff --git a/server/models/User.js b/server/models/User.js
new file mode 100644
index 0000000..4fa6ffe
--- /dev/null
+++ b/server/models/User.js
@@ -0,0 +1,72 @@
+const mongoose = require("mongoose");
+const bcrypt = require('bcryptjs');
+const jwt = require('jsonwebtoken');
+
+const userSchema = new mongoose.Schema({
+ email: {
+ type: String,
+ trim: true,
+ lowercase: true,
+ unique: true,
+ required: true,
+ min: 4,
+ max: 255,
+ validate(value) {
+ if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value)) {
+ throw new Error('Wrong email address');
+ }
+ }
+ },
+ password: {
+ type: String,
+ required: true,
+ min: 4,
+ max: 1024,
+ },
+ tokens: [{
+ token: {
+ type: String,
+ required: true
+ }
+ }]
+});
+
+userSchema.methods.generateAuthToken = async function () {
+ const user = this;
+ const token = jwt.sign({ _id: user._id.toString() }, 'replaceThisWithSecretString')
+
+ user.tokens = user.tokens.concat({ token });
+ user.save();
+
+ return token;
+}
+
+userSchema.statics.findByCredentials = async (email, password) => {
+ const user = await User.findOne({ email });
+
+ if (!user) {
+ throw new Error('Unable to login');
+ }
+
+ const isMatch = await bcrypt.compare(password, user.password);
+
+ if (!isMatch) {
+ throw new Error('Unable to login');
+ }
+
+ return user;
+}
+
+userSchema.pre('save', async function(next){
+ const user = this;
+
+ if (user.isModified('password')) {
+ user.password = await bcrypt.hash(user.password, 8);
+ }
+
+ next();
+})
+
+const User = mongoose.model('User', userSchema);
+
+module.exports = User;