Files
Checkmate/server/src/db/models/User.js
T

114 lines
2.3 KiB
JavaScript
Raw Normal View History

2025-04-20 11:29:53 -07:00
import mongoose from "mongoose";
2025-04-25 12:46:35 -07:00
import bcrypt from "bcryptjs";
2025-04-20 11:29:53 -07:00
import logger from "../../utils/logger.js";
2025-06-24 12:07:02 +08:00
import Monitor from "./Monitor.js";
import Team from "./Team.js";
import Notification from "./Notification.js";
2025-04-20 11:29:53 -07:00
const UserSchema = mongoose.Schema(
{
firstName: {
type: String,
required: true,
},
lastName: {
type: String,
required: true,
},
email: {
type: String,
required: true,
unique: true,
},
password: {
type: String,
required: true,
},
avatarImage: {
type: String,
},
profileImage: {
data: Buffer,
contentType: String,
},
isActive: {
type: Boolean,
default: true,
},
isVerified: {
type: Boolean,
default: false,
},
role: {
type: [String],
default: "user",
enum: ["user", "admin", "superadmin", "demo"],
},
teamId: {
type: mongoose.Schema.Types.ObjectId,
ref: "Team",
immutable: true,
},
checkTTL: {
type: Number,
},
},
{
timestamps: true,
}
);
2025-04-25 12:46:35 -07:00
UserSchema.pre("save", function (next) {
2025-04-20 11:29:53 -07:00
if (!this.isModified("password")) {
2025-04-25 12:46:35 -07:00
return next();
2025-04-20 11:29:53 -07:00
}
2025-04-25 12:46:35 -07:00
const salt = bcrypt.genSaltSync(10);
this.password = bcrypt.hashSync(this.password, salt);
2025-04-20 11:29:53 -07:00
next();
});
2025-04-25 12:46:35 -07:00
UserSchema.pre("findOneAndUpdate", function (next) {
2025-04-20 11:29:53 -07:00
const update = this.getUpdate();
if ("password" in update) {
2025-04-25 12:46:35 -07:00
const salt = bcrypt.genSaltSync(10);
update.password = bcrypt.hashSync(update.password, salt);
2025-04-20 11:29:53 -07:00
}
next();
});
2025-06-24 12:07:02 +08:00
UserSchema.pre("findOneAndDelete", async function (next) {
try {
const userToDelete = await this.model.findOne(this.getFilter());
2025-06-24 13:25:10 +08:00
if (!userToDelete) return next();
2025-06-24 12:07:02 +08:00
if (userToDelete.role.includes("superadmin")) {
await Team.deleteOne({ _id: userToDelete.teamId });
await Monitor.deleteMany({ userId: userToDelete._id });
await this.model.deleteMany({
teamId: userToDelete.teamId,
_id: { $ne: userToDelete._id },
});
await Notification.deleteMany({ teamId: userToDelete.teamId });
}
next();
} catch (error) {
next(error);
}
});
2025-04-20 11:29:53 -07:00
UserSchema.methods.comparePassword = async function (submittedPassword) {
const res = await bcrypt.compare(submittedPassword, this.password);
return res;
};
const User = mongoose.model("User", UserSchema);
User.init().then(() => {
logger.info({
message: "User model initialized",
service: "UserModel",
method: "init",
});
});
2025-04-25 12:46:35 -07:00
export default User;