aboutsummaryrefslogtreecommitdiffstats
path: root/backend/src/models/User.js
diff options
context:
space:
mode:
Diffstat (limited to 'backend/src/models/User.js')
-rw-r--r--backend/src/models/User.js70
1 files changed, 70 insertions, 0 deletions
diff --git a/backend/src/models/User.js b/backend/src/models/User.js
new file mode 100644
index 0000000..dda71d0
--- /dev/null
+++ b/backend/src/models/User.js
@@ -0,0 +1,70 @@
+const mongoose = require('mongoose');
+const bcrypt = require('bcryptjs');
+
+const userSchema = new mongoose.Schema(
+ {
+ name: {
+ type: String,
+ required: [true, 'Name is required'],
+ trim: true
+ },
+ email: {
+ type: String,
+ required: [true, 'Email is required'],
+ unique: true,
+ trim: true,
+ lowercase: true,
+ match: [/^\w+([.-]?\w+)*@\w+([.-]?\w+)*(\.\w{2,3})+$/, 'Please enter a valid email']
+ },
+ password: {
+ type: String,
+ required: [true, 'Password is required'],
+ minlength: [6, 'Password must be at least 6 characters long'],
+ select: false
+ },
+ role: {
+ type: String,
+ enum: ['customer', 'staff', 'admin'],
+ default: 'customer'
+ },
+ phone: {
+ type: String,
+ trim: true
+ },
+ address: {
+ type: String,
+ trim: true
+ },
+ active: {
+ type: Boolean,
+ default: true
+ }
+ },
+ {
+ timestamps: true
+ }
+);
+
+// Password hashing middleware
+userSchema.pre('save', async function (next) {
+ if (!this.isModified('password')) {
+ return next();
+ }
+
+ try {
+ const salt = await bcrypt.genSalt(10);
+ this.password = await bcrypt.hash(this.password, salt);
+ next();
+ } catch (error) {
+ next(error);
+ }
+});
+
+// Compare password method
+userSchema.methods.comparePassword = async function (candidatePassword) {
+ return await bcrypt.compare(candidatePassword, this.password);
+};
+
+const User = mongoose.model('User', userSchema);
+
+module.exports = User; \ No newline at end of file