mkcart / backend /models /adminModel.js
Kumar
updated
c2efbe6
const mongoose = require("mongoose");
const bcrypt = require('bcryptjs');
const adminSchema = mongoose.Schema({
username: {
type: String,
required: true,
unique: true,
trim: true,
minlength: 3,
maxlength: 30
},
email: {
type: String,
required: true,
unique: true,
lowercase: true,
trim: true
},
password: {
type: String,
required: true,
minlength: 8
},
firstName: {
type: String,
required: true,
trim: true
},
lastName: {
type: String,
required: true,
trim: true
},
role: {
type: String,
enum: ['super_admin', 'admin', 'moderator', 'support'],
default: 'admin'
},
permissions: {
users: {
view: { type: Boolean, default: true },
create: { type: Boolean, default: false },
edit: { type: Boolean, default: false },
delete: { type: Boolean, default: false }
},
products: {
view: { type: Boolean, default: true },
create: { type: Boolean, default: true },
edit: { type: Boolean, default: true },
delete: { type: Boolean, default: false }
},
orders: {
view: { type: Boolean, default: true },
edit: { type: Boolean, default: true },
delete: { type: Boolean, default: false }
},
analytics: {
view: { type: Boolean, default: true },
export: { type: Boolean, default: false }
},
settings: {
view: { type: Boolean, default: false },
edit: { type: Boolean, default: false }
}
},
avatar: {
type: String,
default: null
},
isActive: {
type: Boolean,
default: true
},
lastLogin: {
type: Date,
default: null
},
twoFactorEnabled: {
type: Boolean,
default: false
},
twoFactorSecret: {
type: String,
default: null
},
preferences: {
theme: { type: String, default: 'dark' },
language: { type: String, default: 'en' },
notifications: {
email: { type: Boolean, default: true },
push: { type: Boolean, default: true },
sms: { type: Boolean, default: false }
}
},
activityLog: [{
action: String,
description: String,
ipAddress: String,
userAgent: String,
timestamp: { type: Date, default: Date.now }
}]
}, {
timestamps: true
});
adminSchema.pre('save', async function(next) {
if (!this.isModified('password')) {
return next();
}
try {
const salt = await bcrypt.genSalt(12);
this.password = await bcrypt.hash(this.password, salt);
next();
} catch (error) {
next(error);
}
});
adminSchema.methods.checkPassword = async function(password) {
return await bcrypt.compare(password, this.password);
};
adminSchema.methods.hasPermission = function(resource, action) {
if (this.role === 'super_admin') return true;
return this.permissions[resource]?.[action] || false;
};
adminSchema.methods.getFullName = function() {
return `${this.firstName} ${this.lastName}`;
};
module.exports = mongoose.model('Admin', adminSchema);