CampFireID/backend/models/User.ts
degradin 2af270e3d8 Global fixes
Добавлен демо-режим:
Можно открыть приложение с параметром ?demo в URL
В демо-режиме эмулируется Telegram WebApp SDK
Добавлена заглушка для демо-пользователя
Исправлены типы и интерфейсы:
Добавлен тип SafeUser для безопасной работы с mongoose документами
Исправлены пропсы компонентов
Обновлены типы для покупок в магазине
Улучшена обработка ошибок:
Добавлены информативные сообщения об ошибках
Реализована корректная обработка сетевых ошибок
Добавлены toast-уведомления с подробной информацией
Улучшен UI:
Добавлены спиннеры загрузки
Улучшен внешний вид карточек товаров
Добавлены информативные сообщения о состоянии
2025-03-16 12:05:42 +03:00

81 lines
2.2 KiB
TypeScript

import mongoose, { Schema, Document } from 'mongoose';
export interface IAchievement {
id: string;
name: string;
description: string;
dateUnlocked: Date;
}
export interface IInventoryItem {
itemId: mongoose.Types.ObjectId;
name: string;
description: string;
quantity: number;
imageUrl: string;
}
export interface IUser extends Document {
telegramId: string;
username: string;
level: number;
experience: number;
balance: number;
achievements: IAchievement[];
inventory: IInventoryItem[];
addAchievement: (achievement: IAchievement) => Promise<void>;
createdAt: Date;
updatedAt: Date;
}
const UserSchema: Schema = new Schema({
telegramId: { type: String, required: true, unique: true },
username: { type: String, required: true },
level: { type: Number, default: 1 },
experience: { type: Number, default: 0 },
balance: { type: Number, default: 0 },
achievements: [{
id: String,
name: String,
description: String,
dateUnlocked: { type: Date, default: Date.now }
}],
inventory: [{
itemId: { type: Schema.Types.ObjectId, ref: 'ShopItem' },
name: String,
description: String,
quantity: Number,
imageUrl: String
}]
}, {
timestamps: true
});
// Метод для добавления опыта и повышения уровня
UserSchema.methods.addExperience = async function(amount: number) {
this.experience += amount;
// Простая формула для определения необходимого опыта для следующего уровня
const expNeeded = this.level * 100;
while (this.experience >= expNeeded) {
this.experience -= expNeeded;
this.level += 1;
// Бонус за новый уровень
this.balance += this.level * 10;
}
await this.save();
};
// Метод для добавления достижения
UserSchema.methods.addAchievement = async function(achievement: IAchievement) {
if (!this.achievements.some(a => a.id === achievement.id)) {
this.achievements.push(achievement);
// Награда за достижение
this.balance += 50;
await this.save();
}
};
export default mongoose.model<IUser>('User', UserSchema);