@duvdu-v1/duvdu 1.1.225 → 1.1.227

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -87,8 +87,10 @@ const userSchema = new mongoose_1.Schema({
87
87
  .index({ location: '2dsphere' });
88
88
  userSchema.pre('save', function (next) {
89
89
  return __awaiter(this, void 0, void 0, function* () {
90
- if (this.isModified('acceptedProjectsCounter'))
90
+ if (this.isModified('acceptedProjectsCounter') ||
91
+ this.isModified('likes')) {
91
92
  yield (0, rank_service_1.updateRankForUser)(this);
93
+ }
92
94
  next();
93
95
  });
94
96
  });
@@ -26,6 +26,9 @@
26
26
  export interface Irank {
27
27
  actionCount: number;
28
28
  rank: string;
29
+ favoriteCount: number;
30
+ projectsLiked: number;
31
+ projectsCount: number;
29
32
  color: string;
30
33
  }
31
34
  export declare const Rank: import("mongoose").Model<Irank, {}, {}, {}, import("mongoose").Document<unknown, {}, Irank> & Irank & {
@@ -7,4 +7,7 @@ exports.Rank = (0, mongoose_1.model)(model_names_1.MODELS.rank, new mongoose_1.S
7
7
  actionCount: { type: Number, unique: true, default: 0 },
8
8
  rank: { type: String, unique: true, default: null },
9
9
  color: { type: String, default: null },
10
+ favoriteCount: { type: Number, default: 0 },
11
+ projectsLiked: { type: Number, default: 0 },
12
+ projectsCount: { type: Number, default: 0 },
10
13
  }, { timestamps: true, collection: model_names_1.MODELS.rank }));
@@ -26,3 +26,4 @@ import { Document } from 'mongoose';
26
26
  import { Iuser } from '../types/User';
27
27
  export type UserDocument = Document & Iuser;
28
28
  export declare const updateRankForUser: (user: UserDocument) => Promise<UserDocument>;
29
+ export declare const recalculateAllUsersRanks: () => Promise<void>;
@@ -9,22 +9,75 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  });
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.updateRankForUser = void 0;
12
+ exports.recalculateAllUsersRanks = exports.updateRankForUser = void 0;
13
+ const allProjects_model_1 = require("../models/allProjects.model");
14
+ const favourites_model_1 = require("../models/favourites.model");
13
15
  const ranks_model_1 = require("../models/ranks.model");
16
+ const User_model_1 = require("../models/User.model");
14
17
  const updateRankForUser = (user) => __awaiter(void 0, void 0, void 0, function* () {
15
- const currentRank = yield ranks_model_1.Rank.findOne({ actionCount: { $lte: user.acceptedProjectsCounter } })
16
- .sort({ actionCount: -1 })
18
+ // get all user stats
19
+ const projectsCount = yield allProjects_model_1.Project.countDocuments({ user: user._id });
20
+ const favoriteCount = yield favourites_model_1.Favourites.countDocuments({ user: user._id });
21
+ const projectsLiked = user.likes;
22
+ const acceptedProjectsCounter = user.acceptedProjectsCounter;
23
+ // Find current rank that matches ALL criteria
24
+ const currentRank = yield ranks_model_1.Rank.findOne({
25
+ actionCount: { $lte: acceptedProjectsCounter },
26
+ favoriteCount: { $lte: favoriteCount },
27
+ projectsLiked: { $lte: projectsLiked },
28
+ projectsCount: { $lte: projectsCount }
29
+ })
30
+ .sort({
31
+ actionCount: -1,
32
+ favoriteCount: -1,
33
+ projectsLiked: -1,
34
+ projectsCount: -1
35
+ })
17
36
  .exec();
18
- const nextRank = yield ranks_model_1.Rank.findOne({ actionCount: { $gt: user.acceptedProjectsCounter } })
19
- .sort({ actionCount: 1 })
37
+ // Find next possible rank
38
+ const nextRank = yield ranks_model_1.Rank.findOne({
39
+ $or: [
40
+ { actionCount: { $gt: acceptedProjectsCounter } },
41
+ { favoriteCount: { $gt: favoriteCount } },
42
+ { projectsLiked: { $gt: projectsLiked } },
43
+ { projectsCount: { $gt: projectsCount } }
44
+ ]
45
+ })
46
+ .sort({
47
+ actionCount: 1,
48
+ favoriteCount: 1,
49
+ projectsLiked: 1,
50
+ projectsCount: 1
51
+ })
20
52
  .exec();
21
53
  if (currentRank) {
22
54
  user.rank.title = currentRank.rank;
23
55
  user.rank.color = currentRank.color;
24
56
  if (nextRank) {
25
- const actionsNeeded = nextRank.actionCount - currentRank.actionCount;
26
- const actionsCompleted = user.acceptedProjectsCounter - currentRank.actionCount;
27
- user.rank.nextRangPercentage = (actionsCompleted / actionsNeeded) * 100;
57
+ // Calculate progress based on the most relevant criterion
58
+ const criteriaProgress = [
59
+ {
60
+ completed: acceptedProjectsCounter - currentRank.actionCount,
61
+ needed: nextRank.actionCount - currentRank.actionCount
62
+ },
63
+ {
64
+ completed: favoriteCount - currentRank.favoriteCount,
65
+ needed: nextRank.favoriteCount - currentRank.favoriteCount
66
+ },
67
+ {
68
+ completed: projectsLiked - currentRank.projectsLiked,
69
+ needed: nextRank.projectsLiked - currentRank.projectsLiked
70
+ },
71
+ {
72
+ completed: projectsCount - currentRank.projectsCount,
73
+ needed: nextRank.projectsCount - currentRank.projectsCount
74
+ }
75
+ ];
76
+ // Find the criterion with the highest progress percentage
77
+ const progress = criteriaProgress
78
+ .filter(c => c.needed > 0)
79
+ .map(c => (c.completed / c.needed) * 100);
80
+ user.rank.nextRangPercentage = progress.length ? Math.max(...progress) : 0;
28
81
  user.rank.nextRankTitle = nextRank.rank;
29
82
  }
30
83
  else {
@@ -40,3 +93,33 @@ const updateRankForUser = (user) => __awaiter(void 0, void 0, void 0, function*
40
93
  return user.save();
41
94
  });
42
95
  exports.updateRankForUser = updateRankForUser;
96
+ const recalculateAllUsersRanks = () => __awaiter(void 0, void 0, void 0, function* () {
97
+ const BATCH_SIZE = 100;
98
+ let processedCount = 0;
99
+ try {
100
+ // Process users in batches
101
+ while (true) {
102
+ const users = yield User_model_1.Users.find({})
103
+ .skip(processedCount)
104
+ .limit(BATCH_SIZE)
105
+ .lean();
106
+ if (users.length === 0)
107
+ break;
108
+ // Update rank for each user in the batch
109
+ yield Promise.all(users.map((user) => __awaiter(void 0, void 0, void 0, function* () {
110
+ try {
111
+ yield (0, exports.updateRankForUser)(user);
112
+ }
113
+ catch (error) {
114
+ console.error(`Failed to update rank for user ${user._id}:`, error);
115
+ }
116
+ })));
117
+ processedCount += users.length;
118
+ }
119
+ }
120
+ catch (error) {
121
+ console.error('Failed to recalculate user ranks:', error);
122
+ throw error;
123
+ }
124
+ });
125
+ exports.recalculateAllUsersRanks = recalculateAllUsersRanks;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@duvdu-v1/duvdu",
3
- "version": "1.1.225",
3
+ "version": "1.1.227",
4
4
  "main": "./build/index.js",
5
5
  "types": "./build/index.d.ts",
6
6
  "files": [