| import { Schema, model, Document, Types } from 'mongoose'; |
|
|
| |
| export interface IUserStats extends Document { |
| user: Types.ObjectId; |
| |
| |
| totalOnlineTime: number; |
| lastOnlineTime: Date; |
| averageSessionDuration: number; |
| totalSessions: number; |
| |
| |
| eventsCreated: number; |
| eventsJoined: number; |
| eventsCompleted: number; |
| formsCreated: number; |
| formsSubmitted: number; |
| |
| |
| trainersVerified?: number; |
| trainersRejected?: number; |
| |
| |
| organizationsVerified?: number; |
| organizationsRejected?: number; |
| |
| |
| loginCount: number; |
| lastLoginDate: Date; |
| consecutiveLoginDays: number; |
| longestLoginStreak: number; |
| |
| |
| profileUpdates: number; |
| locationUpdates: number; |
| documentsUploaded: number; |
| |
| |
| averageEventAttendance?: number; |
| totalEventParticipants?: number; |
| formResponsesReceived?: number; |
| |
| |
| lastActivityDate: Date; |
| lastActivityType: string; |
| |
| |
| periodStart: Date; |
| periodEnd: Date; |
| |
| createdAt: Date; |
| updatedAt: Date; |
| } |
|
|
| const UserStatsSchema = new Schema<IUserStats>({ |
| user: { |
| type: Schema.Types.ObjectId, |
| ref: 'User', |
| required: true, |
| unique: true, |
| index: true |
| }, |
| |
| |
| totalOnlineTime: { |
| type: Number, |
| default: 0 |
| }, |
| lastOnlineTime: { |
| type: Date, |
| default: Date.now |
| }, |
| averageSessionDuration: { |
| type: Number, |
| default: 0 |
| }, |
| totalSessions: { |
| type: Number, |
| default: 0 |
| }, |
| |
| |
| eventsCreated: { |
| type: Number, |
| default: 0, |
| index: true |
| }, |
| eventsJoined: { |
| type: Number, |
| default: 0, |
| index: true |
| }, |
| eventsCompleted: { |
| type: Number, |
| default: 0 |
| }, |
| formsCreated: { |
| type: Number, |
| default: 0 |
| }, |
| formsSubmitted: { |
| type: Number, |
| default: 0 |
| }, |
| |
| |
| trainersVerified: { |
| type: Number, |
| default: 0 |
| }, |
| trainersRejected: { |
| type: Number, |
| default: 0 |
| }, |
| organizationsVerified: { |
| type: Number, |
| default: 0 |
| }, |
| organizationsRejected: { |
| type: Number, |
| default: 0 |
| }, |
| |
| |
| loginCount: { |
| type: Number, |
| default: 0, |
| index: true |
| }, |
| lastLoginDate: { |
| type: Date, |
| default: Date.now, |
| index: true |
| }, |
| consecutiveLoginDays: { |
| type: Number, |
| default: 0 |
| }, |
| longestLoginStreak: { |
| type: Number, |
| default: 0 |
| }, |
| |
| |
| profileUpdates: { |
| type: Number, |
| default: 0 |
| }, |
| locationUpdates: { |
| type: Number, |
| default: 0 |
| }, |
| documentsUploaded: { |
| type: Number, |
| default: 0 |
| }, |
| |
| |
| averageEventAttendance: { |
| type: Number, |
| default: 0 |
| }, |
| totalEventParticipants: { |
| type: Number, |
| default: 0 |
| }, |
| formResponsesReceived: { |
| type: Number, |
| default: 0 |
| }, |
| |
| |
| lastActivityDate: { |
| type: Date, |
| default: Date.now, |
| index: true |
| }, |
| lastActivityType: { |
| type: String, |
| default: '' |
| }, |
| |
| |
| periodStart: { |
| type: Date, |
| default: Date.now |
| }, |
| periodEnd: { |
| type: Date, |
| default: () => new Date(Date.now() + 30 * 24 * 60 * 60 * 1000) |
| } |
| }, { |
| timestamps: true |
| }); |
|
|
| |
| UserStatsSchema.index({ eventsCreated: -1 }); |
| UserStatsSchema.index({ eventsJoined: -1 }); |
| UserStatsSchema.index({ totalOnlineTime: -1 }); |
| UserStatsSchema.index({ loginCount: -1 }); |
| UserStatsSchema.index({ longestLoginStreak: -1 }); |
|
|
| export default model<IUserStats>('UserStats', UserStatsSchema); |