Files
gameno-api/components/users/userModel.js
T
kavehhn 5c2fad4b44 feat: add adminNotes and registered class counts for users
Expose nationalId aliases and enrollment counts on user list responses, and store admin notes on users, classes, and sessions.
2026-08-15 02:39:10 +03:30

119 lines
2.1 KiB
JavaScript

// /components/users/userModel.js
const mongoose = require('mongoose');
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
},
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'
}],
refreshTokens: [refreshTokenSchema],
isActive: {
type: Boolean,
default: true
},
adminNotes: {
type: [String],
default: []
}
}, {
timestamps: true
});
module.exports = mongoose.model('User', userSchema);