Files
gameno-api/components/users/userModel.js
T

146 lines
2.6 KiB
JavaScript

// /components/users/userModel.js
const mongoose = require('mongoose');
const uniqueCodePlugin = require('../../utils/mongooseUniqueCodePlugin');
const refreshTokenSchema = new mongoose.Schema({
token: { type: String, required: true },
expiresAt: { type: Date, required: true },
createdAt: { type: Date, default: Date.now }
});
const userSchema = new mongoose.Schema({
nationalIdCode: {
type: String,
required: true,
unique: true,
trim: true,
index: true
},
name: {
type: String,
required: true,
trim: true
},
gender: {
type: String,
enum: ['male', 'female'],
trim: true
},
phoneNumber: {
type: String,
required: true,
unique: true,
trim: true,
index: true
},
preferredMessenger: {
type: [{
type: String,
enum: ['Bale', 'WhatsApp', 'Telegram', 'SMS', 'Email']
}],
default: ['SMS']
},
email: {
type: String,
sparse: true,
trim: true,
lowercase: true,
match: [/^\w+([.-]?\w+)*@\w+([.-]?\w+)*(\.\w{2,3})+$/, 'Please fill a valid email address']
},
address: {
type: String,
trim: true
},
birthCertificateNumber: {
type: String,
trim: true
},
postalCode: {
type: String,
trim: true
},
placeOfIssue: {
type: String,
trim: true
},
fatherName: {
type: String,
trim: true
},
birthDate: {
type: Date
},
education: {
type: String,
trim: true
},
parentPhoneNumber: {
type: String,
trim: true
},
cardNumber: {
type: String,
trim: true
},
shabaNumber: {
type: String,
trim: true
},
username: {
type: String,
required: true,
unique: true,
trim: true,
index: true
},
passwordHash: {
type: String,
required: true
},
role: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Role',
required: true
},
courses: [{
type: mongoose.Schema.Types.ObjectId,
ref: 'Course'
}],
certificates: [{
type: mongoose.Schema.Types.ObjectId,
ref: 'Certificate'
}],
documents: [{
type: mongoose.Schema.Types.ObjectId,
ref: 'Document'
}],
refreshTokens: [refreshTokenSchema],
isActive: {
type: Boolean,
default: true
},
adminNotes: {
type: [String],
default: []
},
preferences: {
theme: {
type: String,
enum: ['light', 'dark', 'system'],
default: 'system'
},
fontSize: {
type: String,
enum: ['small', 'medium', 'large'],
default: 'medium'
}
}
}, {
timestamps: true
});
userSchema.plugin(uniqueCodePlugin);
module.exports = mongoose.model('User', userSchema);