nakama/backend/models/User.js

119 lines
2.7 KiB
JavaScript
Raw Normal View History

2025-11-03 20:35:01 +00:00
const mongoose = require('mongoose');
const UserSchema = new mongoose.Schema({
telegramId: {
type: String,
2026-01-01 17:57:05 +00:00
sparse: true, // Разрешаем null для web-пользователей
2025-11-03 20:35:01 +00:00
unique: true
},
username: {
type: String,
required: true
},
firstName: String,
lastName: String,
photoUrl: String,
bio: {
type: String,
default: '',
maxlength: 300
},
role: {
type: String,
enum: ['user', 'moderator', 'admin'],
default: 'user'
},
followers: [{
type: mongoose.Schema.Types.ObjectId,
ref: 'User'
}],
following: [{
type: mongoose.Schema.Types.ObjectId,
ref: 'User'
}],
settings: {
whitelist: {
noFurry: { type: Boolean, default: false },
onlyAnime: { type: Boolean, default: false },
2025-12-01 14:26:18 +00:00
// Скрыть контент 18+
noNSFW: { type: Boolean, default: false },
// Скрыть гомосексуальный контент
noHomo: { type: Boolean, default: true }
2025-11-03 20:35:01 +00:00
},
searchPreference: {
type: String,
2025-11-10 20:13:22 +00:00
enum: ['furry', 'anime'],
default: 'furry'
2025-11-03 20:35:01 +00:00
}
},
2025-12-07 22:15:00 +00:00
// Предпочитаемые теги для ленты по интересам
preferredTags: [{
type: String,
lowercase: true,
trim: true
}],
// Предложенные пользователем теги (ожидают модерации)
suggestedTags: [{
tagName: {
type: String,
required: true,
lowercase: true,
trim: true
},
category: {
type: String,
enum: ['theme', 'style', 'mood', 'technical']
},
description: String,
status: {
type: String,
enum: ['pending', 'approved', 'rejected'],
default: 'pending'
},
createdAt: {
type: Date,
default: Date.now
}
}],
2025-11-10 20:13:22 +00:00
lastActiveAt: {
type: Date,
default: Date.now
},
2025-11-03 20:35:01 +00:00
banned: {
type: Boolean,
default: false
},
bannedUntil: Date,
2025-12-07 02:20:45 +00:00
// Билеты для Monthly Ladder
tickets: {
type: Number,
default: 0
},
2025-12-08 23:42:32 +00:00
// Email и пароль для авторизации через логин/пароль
email: {
type: String,
lowercase: true,
trim: true,
sparse: true, // Разрешить null, но если есть - должен быть уникальным
index: true
},
passwordHash: {
type: String,
select: false // Не возвращать по умолчанию
},
emailVerified: {
type: Boolean,
default: false
},
2026-01-01 17:57:05 +00:00
// Magic-link токены для авторизации
magicLinkToken: String,
magicLinkExpires: Date,
2025-11-03 20:35:01 +00:00
createdAt: {
type: Date,
default: Date.now
}
});
module.exports = mongoose.model('User', UserSchema);