77 lines
1.8 KiB
JavaScript
77 lines
1.8 KiB
JavaScript
|
|
const mongoose = require('mongoose');
|
|||
|
|
|
|||
|
|
const TicketActivitySchema = new mongoose.Schema({
|
|||
|
|
user: {
|
|||
|
|
type: mongoose.Schema.Types.ObjectId,
|
|||
|
|
ref: 'User',
|
|||
|
|
required: true,
|
|||
|
|
index: true
|
|||
|
|
},
|
|||
|
|
date: {
|
|||
|
|
type: Date,
|
|||
|
|
required: true,
|
|||
|
|
index: true
|
|||
|
|
},
|
|||
|
|
// Счетчики для разных типов активности
|
|||
|
|
postsCreated: {
|
|||
|
|
type: Number,
|
|||
|
|
default: 0
|
|||
|
|
},
|
|||
|
|
likesGiven: {
|
|||
|
|
type: Number,
|
|||
|
|
default: 0
|
|||
|
|
},
|
|||
|
|
likesReceived: {
|
|||
|
|
type: Number,
|
|||
|
|
default: 0
|
|||
|
|
},
|
|||
|
|
commentsWritten: {
|
|||
|
|
type: Number,
|
|||
|
|
default: 0
|
|||
|
|
},
|
|||
|
|
commentsReceived: {
|
|||
|
|
type: Number,
|
|||
|
|
default: 0
|
|||
|
|
},
|
|||
|
|
referralsCounted: {
|
|||
|
|
type: Number,
|
|||
|
|
default: 0
|
|||
|
|
},
|
|||
|
|
// Для отслеживания баллов с реакций на арты (по постам)
|
|||
|
|
// Используем объект вместо Map для совместимости с Mongoose
|
|||
|
|
artReactionsPoints: {
|
|||
|
|
type: mongoose.Schema.Types.Mixed,
|
|||
|
|
default: {}
|
|||
|
|
},
|
|||
|
|
createdAt: {
|
|||
|
|
type: Date,
|
|||
|
|
default: Date.now
|
|||
|
|
}
|
|||
|
|
}, {
|
|||
|
|
timestamps: true
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// Индекс для быстрого поиска по пользователю и дате
|
|||
|
|
TicketActivitySchema.index({ user: 1, date: 1 }, { unique: true });
|
|||
|
|
|
|||
|
|
// Метод для получения или создания активности за сегодня (по московскому времени)
|
|||
|
|
TicketActivitySchema.statics.getOrCreateToday = async function(userId) {
|
|||
|
|
const { getMoscowDate } = require('../utils/moscowTime');
|
|||
|
|
const today = getMoscowDate();
|
|||
|
|
|
|||
|
|
let activity = await this.findOne({ user: userId, date: today });
|
|||
|
|
|
|||
|
|
if (!activity) {
|
|||
|
|
activity = new this({
|
|||
|
|
user: userId,
|
|||
|
|
date: today
|
|||
|
|
});
|
|||
|
|
await activity.save();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return activity;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
module.exports = mongoose.model('TicketActivity', TicketActivitySchema);
|
|||
|
|
|