1
1
const userQuery = require ( "../models/users" ) ;
2
2
const members = require ( "../models/members" ) ;
3
- const { USER_SENSITIVE_DATA } = require ( "../constants/users " ) ;
3
+ const { ROLE_LEVEL , KEYS_NOT_ALLOWED , ACCESS_LEVEL } = require ( "../constants/userDataLevels " ) ;
4
4
5
5
const retrieveUsers = async ( {
6
6
id = null ,
7
7
username = null ,
8
8
usernames = null ,
9
9
query = null ,
10
10
userdata,
11
+ level = ACCESS_LEVEL . PUBLIC ,
12
+ role = null ,
11
13
userIds = [ ] ,
12
14
} ) => {
13
15
if ( id || username ) {
@@ -17,79 +19,93 @@ const retrieveUsers = async ({
17
19
} else {
18
20
result = await userQuery . fetchUser ( { username : username } ) ;
19
21
}
20
- removeSensitiveInfo ( result . user ) ;
22
+ const user = levelSpecificAccess ( result . user , level , role ) ;
23
+ result . user = user ;
21
24
return result ;
22
25
} else if ( usernames ) {
23
26
const { users } = await userQuery . fetchUsers ( usernames ) ;
24
- users . forEach ( ( element ) => {
25
- removeSensitiveInfo ( element ) ;
27
+ const result = [ ] ;
28
+ users . forEach ( ( userdata ) => {
29
+ const user = levelSpecificAccess ( userdata , level , role ) ;
30
+ result . push ( user ) ;
26
31
} ) ;
27
- return users ;
32
+ return result ;
28
33
} else if ( userIds . length > 0 ) {
29
34
const userDetails = await userQuery . fetchUserByIds ( userIds ) ;
30
-
31
35
Object . keys ( userDetails ) . forEach ( ( userId ) => {
32
36
removeSensitiveInfo ( userDetails [ userId ] ) ;
33
37
} ) ;
34
-
35
38
return userDetails ;
36
39
} else if ( query ) {
37
40
const { allUsers, nextId, prevId } = await userQuery . fetchPaginatedUsers ( query ) ;
38
- allUsers . forEach ( ( element ) => {
39
- removeSensitiveInfo ( element ) ;
41
+ const users = [ ] ;
42
+ allUsers . forEach ( ( userdata ) => {
43
+ const user = levelSpecificAccess ( userdata , level , role ) ;
44
+ users . push ( user ) ;
40
45
} ) ;
41
- return { allUsers , nextId, prevId } ;
46
+ return { users , nextId, prevId } ;
42
47
} else {
43
- removeSensitiveInfo ( userdata ) ;
44
- return userdata ;
48
+ const result = await userQuery . fetchUser ( { userId : userdata . id } ) ;
49
+ return levelSpecificAccess ( result . user , level , role ) ;
45
50
}
46
51
} ;
47
52
48
- const retrieveDiscordUsers = async ( ) => {
53
+ const retrieveDiscordUsers = async ( level = ACCESS_LEVEL . PUBLIC , role = null ) => {
49
54
const users = await userQuery . getDiscordUsers ( ) ;
50
- users . forEach ( ( element ) => {
51
- removeSensitiveInfo ( element ) ;
55
+ const usersData = [ ] ;
56
+ users . forEach ( ( userdata ) => {
57
+ const user = levelSpecificAccess ( userdata , level , role ) ;
58
+ usersData . push ( user ) ;
52
59
} ) ;
53
- return users ;
60
+ return usersData ;
54
61
} ;
55
62
56
63
const retreiveFilteredUsers = async ( query ) => {
57
64
const users = await userQuery . getUsersBasedOnFilter ( query ) ;
58
- users . forEach ( ( element ) => {
59
- removeSensitiveInfo ( element ) ;
65
+ users . forEach ( ( userdata ) => {
66
+ removeSensitiveInfo ( userdata ) ;
60
67
} ) ;
61
68
return users ;
62
69
} ;
63
70
64
71
const retrieveMembers = async ( query ) => {
65
72
const allUsers = await members . fetchUsers ( query ) ;
66
- allUsers . forEach ( ( element ) => {
67
- removeSensitiveInfo ( element ) ;
73
+ allUsers . forEach ( ( userdata ) => {
74
+ removeSensitiveInfo ( userdata ) ;
68
75
} ) ;
69
76
return allUsers ;
70
77
} ;
71
78
72
79
const retrieveUsersWithRole = async ( role ) => {
73
80
const users = await members . fetchUsersWithRole ( role ) ;
74
- users . forEach ( ( element ) => {
75
- removeSensitiveInfo ( element ) ;
81
+ users . forEach ( ( userdata ) => {
82
+ removeSensitiveInfo ( userdata ) ;
76
83
} ) ;
77
84
return users ;
78
85
} ;
79
86
80
- const removeSensitiveInfo = function ( obj ) {
81
- for ( let i = 0 ; i < USER_SENSITIVE_DATA . length ; i ++ ) {
82
- if ( Object . prototype . hasOwnProperty . call ( obj , USER_SENSITIVE_DATA [ i ] ) ) {
83
- delete obj [ USER_SENSITIVE_DATA [ i ] ] ;
87
+ const removeSensitiveInfo = function ( obj , level = ACCESS_LEVEL . PUBLIC ) {
88
+ for ( let i = 0 ; i < KEYS_NOT_ALLOWED [ level ] . length ; i ++ ) {
89
+ if ( Object . prototype . hasOwnProperty . call ( obj , KEYS_NOT_ALLOWED [ level ] [ i ] ) ) {
90
+ delete obj [ KEYS_NOT_ALLOWED [ level ] [ i ] ] ;
84
91
}
85
92
}
86
93
} ;
87
94
95
+ const levelSpecificAccess = ( user , level = ACCESS_LEVEL . PUBLIC , role = null ) => {
96
+ if ( level === ACCESS_LEVEL . PUBLIC || ROLE_LEVEL [ level ] . includes ( role ) ) {
97
+ removeSensitiveInfo ( user , level ) ;
98
+ return user ;
99
+ }
100
+ return "unauthorized" ;
101
+ } ;
102
+
88
103
module . exports = {
89
104
retrieveUsers,
90
105
removeSensitiveInfo,
91
106
retrieveDiscordUsers,
92
107
retrieveMembers,
93
108
retrieveUsersWithRole,
94
109
retreiveFilteredUsers,
110
+ levelSpecificAccess,
95
111
} ;
0 commit comments