Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions team-nishita-dashboard/server/models/Achievement.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import mongoose, { Document, Schema } from 'mongoose';

export interface IAchievement extends Document {
name: string;
description: string;
isActive: boolean;
condition: {
field: string;
operator: string;
value: number;
};
pointsAwarded: number;
}

const AchievementSchema = new Schema<IAchievement>({
name: { type: String, required: true },
description: { type: String, required: true },
isActive: { type: Boolean, default: true },
condition: {
field: { type: String, required: true },
operator: { type: String, required: true },
value: { type: Number, required: true }
},
pointsAwarded: { type: Number, required: true }
});

export const Achievement = mongoose.model<IAchievement>('Achievement', AchievementSchema);
23 changes: 23 additions & 0 deletions team-nishita-dashboard/server/models/UserProgress.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import mongoose, { Document, Schema } from 'mongoose';

export interface IUserProgress extends Document {
userId: mongoose.Types.ObjectId;
lessonsCompleted: number;
quizzesTaken: number;
studyTime: number;
pointsEarned: number;
isCheckedIn: boolean;
date: Date;
}

const UserProgressSchema = new Schema<IUserProgress>({
userId: { type: Schema.Types.ObjectId, ref: 'User', required: true },
lessonsCompleted: { type: Number, default: 0 },
quizzesTaken: { type: Number, default: 0 },
studyTime: { type: Number, default: 0 },
pointsEarned: { type: Number, default: 0 },
isCheckedIn: { type: Boolean, default: false },
date: { type: Date, required: true }
});

export const UserProgress = mongoose.model<IUserProgress>('UserProgress', UserProgressSchema);
6 changes: 5 additions & 1 deletion team-nishita-dashboard/server/models/user.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ interface IUser extends Document {
lastLogin: Date;
loginStreak: number;
loginDays: Date[];
currentStreak: number;
totalPoints: number;
};

const userSchema = new mongoose.Schema<IUser>({
Expand All @@ -14,7 +16,9 @@ const userSchema = new mongoose.Schema<IUser>({
role: { type: String, enum: ['user', 'admin'], default: 'user' },
lastLogin: { type: Date },
loginStreak: { type: Number, default: 0 },
loginDays: [{ type: Date }]
loginDays: [{ type: Date }],
currentStreak: { type: Number, default: 0 },
totalPoints: { type: Number, default: 0 }
})

export const User = mongoose.model('User', userSchema);
2 changes: 1 addition & 1 deletion team-nishita-dashboard/server/utils/badgeChecker.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// utils/badgeChecker.ts
import { Achievement } from '../models/Achievement.js';
import { Achievement, IAchievement } from '../models/Achievement.js';
import UserBadge from '../models/UserBadge.js';
import { UserProgress } from '../models/UserProgress.js';
import { User } from '../models/user.js';
Expand Down
4 changes: 1 addition & 3 deletions team-nishita-dashboard/server/utils/streakCalculator.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import UserProgress from '../models/UserProgress.js';
import { UserProgress } from '../models/UserProgress.js';
import { User } from '../models/user.js';

export const calculateStreak = async (userId: string): Promise<number> => {
Expand Down Expand Up @@ -61,8 +61,6 @@ export const updateUserLevel = async (userId: string, totalPoints: number): Prom

// server/middleware/pointsTracker.ts
import { Request, Response, NextFunction } from 'express';
import { updateUserLevel } from '../utils/badgeChecker.js';

export const pointsTracker = async (req: Request, res: Response, next: NextFunction) => {
// This middleware can be used to automatically update user level after points change
const originalSend = res.json;
Expand Down