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);
|
||
|