119 lines
2.7 KiB
JavaScript
119 lines
2.7 KiB
JavaScript
const mongoose = require('mongoose');
|
||
|
||
const UserSchema = new mongoose.Schema({
|
||
telegramId: {
|
||
type: String,
|
||
sparse: true, // Разрешаем null для web-пользователей
|
||
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 },
|
||
// Скрыть контент 18+
|
||
noNSFW: { type: Boolean, default: false },
|
||
// Скрыть гомосексуальный контент
|
||
noHomo: { type: Boolean, default: true }
|
||
},
|
||
searchPreference: {
|
||
type: String,
|
||
enum: ['furry', 'anime'],
|
||
default: 'furry'
|
||
}
|
||
},
|
||
// Предпочитаемые теги для ленты по интересам
|
||
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
|
||
}
|
||
}],
|
||
lastActiveAt: {
|
||
type: Date,
|
||
default: Date.now
|
||
},
|
||
banned: {
|
||
type: Boolean,
|
||
default: false
|
||
},
|
||
bannedUntil: Date,
|
||
// Билеты для Monthly Ladder
|
||
tickets: {
|
||
type: Number,
|
||
default: 0
|
||
},
|
||
// Email и пароль для авторизации через логин/пароль
|
||
email: {
|
||
type: String,
|
||
lowercase: true,
|
||
trim: true,
|
||
sparse: true, // Разрешить null, но если есть - должен быть уникальным
|
||
index: true
|
||
},
|
||
passwordHash: {
|
||
type: String,
|
||
select: false // Не возвращать по умолчанию
|
||
},
|
||
emailVerified: {
|
||
type: Boolean,
|
||
default: false
|
||
},
|
||
// Magic-link токены для авторизации
|
||
magicLinkToken: String,
|
||
magicLinkExpires: Date,
|
||
createdAt: {
|
||
type: Date,
|
||
default: Date.now
|
||
}
|
||
});
|
||
|
||
module.exports = mongoose.model('User', UserSchema);
|
||
|