1
+ import { isLastPRMergedWithinDays } from "../services/githubService" ;
2
+ import { getUserStatus } from "../models/userStatus" ;
3
+ import userService from "../services/users" ;
4
+ import { getOverdueTasks } from "../models/tasks" ;
5
+
1
6
const chaincodeQuery = require ( "../models/chaincodes" ) ;
2
7
const userQuery = require ( "../models/users" ) ;
3
8
const profileDiffsQuery = require ( "../models/profileDiffs" ) ;
@@ -23,7 +28,6 @@ const { getQualifiers } = require("../utils/helper");
23
28
const { parseSearchQuery } = require ( "../utils/users" ) ;
24
29
const { getFilteredPRsOrIssues } = require ( "../utils/pullRequests" ) ;
25
30
const { getFilteredPaginationLink } = require ( "../utils/userStatus" ) ;
26
- const userUtils = require ( "../utils/users" ) ;
27
31
const {
28
32
USERS_PATCH_HANDLER_ACTIONS ,
29
33
USERS_PATCH_HANDLER_ERROR_MESSAGES ,
@@ -106,23 +110,23 @@ const getUsers = async (req, res) => {
106
110
107
111
try {
108
112
if ( id ) {
109
- const user = await userUtils . findUserById ( id ) ;
113
+ const user = await findUserById ( id ) ;
110
114
return res . json ( {
111
115
message : "User returned successfully!" ,
112
116
user : user ,
113
117
} ) ;
114
118
}
115
119
116
120
if ( profile ) {
117
- return res . send ( await userUtils . getUserByProfileData ( userData ) ) ;
121
+ return res . send ( await getUserByProfileData ( userData ) ) ;
118
122
}
119
123
120
124
if ( ! transformedQuery ?. days && transformedQuery ?. filterBy === "unmerged_prs" ) {
121
125
return res . boom . badRequest ( `Days is required for filterBy ${ transformedQuery ?. filterBy } ` ) ;
122
126
}
123
127
124
128
if ( filterBy === "unmerged_prs" && days ) {
125
- const users = await userUtils . getUsersByUnmergedPrs ( days ) ;
129
+ const users = await getUsersByUnmergedPrs ( days ) ;
126
130
return res . json ( {
127
131
message : "Inactive users returned successfully!" ,
128
132
count : users . length ,
@@ -132,7 +136,7 @@ const getUsers = async (req, res) => {
132
136
133
137
if ( discordId ) {
134
138
if ( dev ) {
135
- const user = await userUtils . getUserByDiscordId ( discordId ) ;
139
+ const user = await getUserByDiscordId ( discordId ) ;
136
140
return res . json ( {
137
141
message : user ? "User returned successfully!" : "User not found" ,
138
142
user : user ,
@@ -146,7 +150,7 @@ const getUsers = async (req, res) => {
146
150
if ( ! dev ) {
147
151
return res . boom . notFound ( "Route not found" ) ;
148
152
}
149
- const { result, departedUsers } = await userUtils . getDepartedUsers ( reqQueryObject ) ;
153
+ const { result, departedUsers } = await getDepartedUsers ( reqQueryObject ) ;
150
154
if ( departedUsers . length === 0 ) return res . status ( 204 ) . send ( ) ;
151
155
return res . json ( {
152
156
message : "Users with abandoned tasks fetched successfully" ,
@@ -159,7 +163,7 @@ const getUsers = async (req, res) => {
159
163
}
160
164
161
165
if ( filterBy === OVERDUE_TASKS ) {
162
- const users = await userUtils . getUsersByOverDueTasks ( days , dev ) ;
166
+ const users = await getUsersByOverDueTasks ( days , dev ) ;
163
167
if ( ! users || users . length === 0 ) {
164
168
return res . json ( {
165
169
message : "No users found" ,
@@ -1038,6 +1042,149 @@ const updateProfile = async (req, res) => {
1038
1042
}
1039
1043
} ;
1040
1044
1045
+ /**
1046
+ * @param userId { string }: Id of the User
1047
+ * @returns Promise<object>
1048
+ */
1049
+ const findUserById = async ( userId ) => {
1050
+ let result ;
1051
+ try {
1052
+ result = await dataAccess . retrieveUsers ( { id : userId } ) ;
1053
+ if ( ! result . userExists ) {
1054
+ throw NotFound ( "User doesn't exist" ) ;
1055
+ }
1056
+ return result . user ;
1057
+ } catch ( error ) {
1058
+ logger . error ( `Error while fetching user: ${ error } ` ) ;
1059
+ throw error ;
1060
+ }
1061
+ } ;
1062
+
1063
+ /**
1064
+ * @param userData { Object }: req.userData
1065
+ * @returns Promise<object>
1066
+ */
1067
+ const getUserByProfileData = async ( userData ) => {
1068
+ if ( ! userData . id ) {
1069
+ throw BadRequest ( "User ID not provided." ) ;
1070
+ }
1071
+
1072
+ try {
1073
+ const result = await dataAccess . retrieveUsers ( { id : userData . id } ) ;
1074
+ return result . user ;
1075
+ } catch ( error ) {
1076
+ logger . error ( `Error while fetching user: ${ error } ` ) ;
1077
+ throw error ;
1078
+ }
1079
+ } ;
1080
+
1081
+ /**
1082
+ * @param days {number}: days since last unmerged pr.
1083
+ * @returns Promise<object[]>
1084
+ */
1085
+ const getUsersByUnmergedPrs = async ( days ) => {
1086
+ try {
1087
+ const inDiscordUser = await dataAccess . retrieveUsersWithRole ( ROLES . INDISCORD ) ;
1088
+ const users = [ ] ;
1089
+
1090
+ for ( const user of inDiscordUser ) {
1091
+ const username = user . github_id ;
1092
+ const isMerged = await isLastPRMergedWithinDays ( username , days ) ;
1093
+ if ( ! isMerged ) {
1094
+ users . push ( user . id ) ;
1095
+ }
1096
+ }
1097
+
1098
+ return users ;
1099
+ } catch ( error ) {
1100
+ logger . error ( `Error while fetching all users: ${ error } ` ) ;
1101
+ throw error ;
1102
+ }
1103
+ } ;
1104
+
1105
+ /**
1106
+ * @param discordId { string }: discordId of the user
1107
+ * @returns Promise<object>
1108
+ */
1109
+ const getUserByDiscordId = async ( discordId ) => {
1110
+ let result , user ;
1111
+ try {
1112
+ result = await dataAccess . retrieveUsers ( { discordId } ) ;
1113
+ user = result . user ;
1114
+ if ( ! result . userExists ) {
1115
+ return null ;
1116
+ }
1117
+
1118
+ const userStatusResult = await getUserStatus ( user . id ) ;
1119
+ if ( userStatusResult . userStatusExists ) {
1120
+ user . state = userStatusResult . data . currentStatus . state ;
1121
+ }
1122
+ } catch ( error ) {
1123
+ logger . error ( `Error while fetching user: ${ error } ` ) ;
1124
+ throw error ;
1125
+ }
1126
+ return user ;
1127
+ } ;
1128
+
1129
+ /**
1130
+ * @param queryObject { Object }: request query object
1131
+ * @returns Promise<object>
1132
+ */
1133
+ const getDepartedUsers = async ( queryObject ) => {
1134
+ try {
1135
+ const result = await dataAccess . retrieveUsers ( { query : queryObject } ) ;
1136
+ const departedUsers = await userService . getUsersWithIncompleteTasks ( result . users ) ;
1137
+ if ( ! departedUsers || departedUsers . length === 0 ) return { departedUsers : [ ] } ;
1138
+ return { result, departedUsers } ;
1139
+ } catch ( error ) {
1140
+ logger . error ( "Error when fetching users who abandoned tasks:" , error ) ;
1141
+ throw error ;
1142
+ }
1143
+ } ;
1144
+
1145
+ /**
1146
+ * @param days { number }: overdue days
1147
+ * @param dev {boolean}: dev feature flag
1148
+ * @returns Promise<object[]>
1149
+ */
1150
+ const getUsersByOverDueTasks = async ( days , dev ) => {
1151
+ try {
1152
+ const tasksData = await getOverdueTasks ( days ) ;
1153
+ if ( ! tasksData . length ) {
1154
+ return [ ] ;
1155
+ }
1156
+ const userIds = new Set ( ) ;
1157
+ const usersData = [ ] ;
1158
+
1159
+ tasksData . forEach ( ( task ) => {
1160
+ if ( task . assignee ) {
1161
+ userIds . add ( task . assignee ) ;
1162
+ }
1163
+ } ) ;
1164
+
1165
+ const userInfo = await dataAccess . retrieveUsers ( { userIds : Array . from ( userIds ) } ) ;
1166
+ userInfo . forEach ( ( user ) => {
1167
+ if ( ! user . roles . archived ) {
1168
+ const userTasks = tasksData . filter ( ( task ) => task . assignee === user . id ) ;
1169
+ const userData = {
1170
+ id : user . id ,
1171
+ discordId : user . discordId ,
1172
+ username : user . username ,
1173
+ } ;
1174
+ if ( dev ) {
1175
+ userData . tasks = userTasks ;
1176
+ }
1177
+ usersData . push ( userData ) ;
1178
+ }
1179
+ } ) ;
1180
+
1181
+ return usersData ;
1182
+ } catch ( error ) {
1183
+ logger . error ( `Error while fetching users and tasks: ${ error } ` ) ;
1184
+ throw error ;
1185
+ }
1186
+ } ;
1187
+
1041
1188
module . exports = {
1042
1189
verifyUser,
1043
1190
generateChaincode,
0 commit comments