Skip to content

Commit c6ff1d3

Browse files
authored
Merge pull request #1397 from Real-Dev-Squad/develop
Dev to Main Sync
2 parents 4567773 + af81b7f commit c6ff1d3

28 files changed

+933
-148
lines changed

constants/userDataLevels.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
const ACCESS_LEVEL = {
2+
PUBLIC: "public",
3+
INTERNAL: "internal",
4+
PRIVATE: "private",
5+
CONFIDENTIAL: "confidential",
6+
};
7+
8+
const ROLE_LEVEL = {
9+
private: ["super_user"],
10+
internal: ["super_user"],
11+
confidential: ["super_user"],
12+
};
13+
14+
const KEYS_NOT_ALLOWED = {
15+
public: ["email", "phone", "chaincode"],
16+
internal: ["phone", "chaincode"],
17+
private: ["chaincode"],
18+
confidential: [],
19+
};
20+
21+
module.exports = { ACCESS_LEVEL, KEYS_NOT_ALLOWED, ROLE_LEVEL };

constants/users.js

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@ const profileStatus = {
44
NOT_APPROVED: "NOT APPROVED",
55
};
66

7-
const USER_SENSITIVE_DATA = ["phone", "email", "chaincode", "tokens"];
8-
97
const USER_STATUS = {
108
OOO: "ooo",
119
IDLE: "idle",
@@ -23,5 +21,4 @@ module.exports = {
2321
profileStatus,
2422
USER_STATUS,
2523
ALLOWED_FILTER_PARAMS,
26-
USER_SENSITIVE_DATA,
2724
};

controllers/discordactions.js

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ const admin = require("firebase-admin");
33
const config = require("config");
44
const jwt = require("jsonwebtoken");
55
const discordRolesModel = require("../models/discordactions");
6+
const { retrieveUsers } = require("../services/dataAccessLayer");
67

78
/**
89
* Creates a role
@@ -66,9 +67,25 @@ const createGroupRole = async (req, res) => {
6667
const getAllGroupRoles = async (req, res) => {
6768
try {
6869
const { groups } = await discordRolesModel.getAllGroupRoles();
70+
const groupsWithMemberCount = await discordRolesModel.getNumberOfMemberForGroups(groups);
71+
const groupCreatorIds = groupsWithMemberCount.reduce((ids, group) => {
72+
ids.add(group.createdBy);
73+
return ids;
74+
}, new Set());
75+
const groupCreatorsDetails = await retrieveUsers({ userIds: Array.from(groupCreatorIds) });
76+
const groupsWithUserDetails = groupsWithMemberCount.map((group) => {
77+
const groupCreator = groupCreatorsDetails[group.createdBy];
78+
return {
79+
...group,
80+
firstName: groupCreator.first_name,
81+
lastName: groupCreator.last_name,
82+
image: groupCreator.picture?.url,
83+
};
84+
});
85+
6986
return res.json({
7087
message: "Roles fetched successfully!",
71-
groups,
88+
groups: groupsWithUserDetails,
7289
});
7390
} catch (err) {
7491
logger.error(`Error while getting roles: ${err}`);

controllers/events.js

Lines changed: 71 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1-
/* eslint-disable camelcase */
21
const { GET_ALL_EVENTS_LIMIT_MIN, UNWANTED_PROPERTIES_FROM_100MS } = require("../constants/events");
2+
const { INTERNAL_SERVER_ERROR } = require("../constants/errorMessages");
3+
34
const { EventTokenService, EventAPIService } = require("../services");
4-
const { removeUnwantedProperties } = require("../utils/events");
55
const eventQuery = require("../models/events");
6+
67
const logger = require("../utils/logger");
8+
const { removeUnwantedProperties } = require("../utils/events");
79

810
const tokenService = new EventTokenService();
911
const apiService = new EventAPIService(tokenService);
@@ -100,7 +102,7 @@ const joinEvent = async (req, res) => {
100102
});
101103
} catch (error) {
102104
logger.error({ error });
103-
return res.status(500).send("Internal Server Error");
105+
return res.boom.badImplementation(INTERNAL_SERVER_ERROR);
104106
}
105107
};
106108

@@ -193,11 +195,77 @@ const endActiveEvent = async (req, res) => {
193195
}
194196
};
195197

198+
/**
199+
* Adds a peer to an event.
200+
*
201+
* @async
202+
* @function
203+
* @param {Object} req - The Express request object.
204+
* @param {Object} res - The Express response object.
205+
* @returns {Promise<Object>} The JSON response with the added peer data and a success message.
206+
* @throws {Object} The JSON response with an error message if an error occurred while adding the peer.
207+
*/
208+
const addPeerToEvent = async (req, res) => {
209+
try {
210+
const data = await eventQuery.addPeerToEvent({
211+
peerId: req.body.peerId,
212+
name: req.body.name,
213+
role: req.body.role,
214+
joinedAt: req.body.joinedAt,
215+
eventId: req.params.id,
216+
});
217+
return res.status(200).json({
218+
data,
219+
message: `Selected Participant is added to the event.`,
220+
});
221+
} catch (error) {
222+
logger.error({ error });
223+
return res.status(500).json({
224+
error: error.code,
225+
message: "You can't add selected Participant. Please ask Admin or Host for help.",
226+
});
227+
}
228+
};
229+
230+
/**
231+
* Kicks out a peer from an event.
232+
*
233+
* @async
234+
* @function
235+
* @param {Object} req - The Express request object.
236+
* @param {Object} res - The Express response object.
237+
* @returns {Promise<Object>} The JSON response with a success message if the peer is successfully kicked out.
238+
* @throws {Object} The JSON response with an error message if an error occurred while kicking out the peer.
239+
*/
240+
const kickoutPeer = async (req, res) => {
241+
const { id } = req.params;
242+
const payload = {
243+
peer_id: req.body.peerId,
244+
reason: req.body.reason,
245+
};
246+
247+
try {
248+
await apiService.post(`/active-rooms/${id}/remove-peers`, payload);
249+
await eventQuery.kickoutPeer({ eventId: id, peerId: payload.peer_id, reason: req.body.reason });
250+
return res.status(200).json({
251+
message: `Selected Participant is removed from event.`,
252+
});
253+
} catch (error) {
254+
logger.error({ error });
255+
return res.status(500).json({
256+
error: error.code,
257+
message: "You can't remove selected Participant from Remove, Please ask Admin or Host for help.",
258+
});
259+
}
260+
};
261+
196262
module.exports = {
197263
createEvent,
198264
getAllEvents,
199265
joinEvent,
200266
getEventById,
201267
updateEvent,
202268
endActiveEvent,
269+
addPeerToEvent,
270+
kickoutPeer,
203271
};

controllers/members.js

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
const ROLES = require("../constants/roles");
22
const members = require("../models/members");
33
const tasks = require("../models/tasks");
4-
const { SOMETHING_WENT_WRONG } = require("../constants/errorMessages");
4+
const { SOMETHING_WENT_WRONG, INTERNAL_SERVER_ERROR } = require("../constants/errorMessages");
55
const dataAccess = require("../services/dataAccessLayer");
6+
const { addLog } = require("../models/logs");
67
/**
78
* Fetches the data about our members
89
*
@@ -83,17 +84,38 @@ const archiveMembers = async (req, res) => {
8384
try {
8485
const { username } = req.params;
8586
const user = await dataAccess.retrieveUsers({ username });
87+
const superUserId = req.userData.id;
88+
const { reason } = req.body;
89+
const roles = req?.userData?.roles;
90+
const isReasonNullOrUndefined = !reason;
91+
const isReasonEmptyOrWhitespace = /^\s*$/.test(reason);
92+
if (isReasonNullOrUndefined || isReasonEmptyOrWhitespace) {
93+
return res.boom.badRequest("Reason is required");
94+
}
8695
if (user?.userExists) {
8796
const successObject = await members.addArchiveRoleToMembers(user.user.id);
8897
if (successObject.isArchived) {
8998
return res.boom.badRequest("User is already archived");
9099
}
100+
const body = {
101+
reason: reason,
102+
archived_user: {
103+
user_id: user.user.id,
104+
username: user.user.username,
105+
},
106+
archived_by: {
107+
user_id: superUserId,
108+
roles: roles,
109+
},
110+
};
111+
112+
addLog("archived-details", {}, body);
91113
return res.status(204).send();
92114
}
93115
return res.boom.notFound("User doesn't exist");
94116
} catch (err) {
95117
logger.error(`Error while retriving contributions ${err}`);
96-
return res.boom.badImplementation(SOMETHING_WENT_WRONG);
118+
return res.boom.badImplementation(INTERNAL_SERVER_ERROR);
97119
}
98120
};
99121

controllers/users.js

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -101,9 +101,10 @@ const getUsers = async (req, res) => {
101101
}
102102

103103
const data = await dataAccess.retrieveUsers({ query: req.query });
104+
104105
return res.json({
105106
message: "Users returned successfully!",
106-
users: data.allUsers,
107+
users: data.users,
107108
links: {
108109
next: data.nextId ? getPaginationLink(req.query, "next", data.nextId) : "",
109110
prev: data.prevId ? getPaginationLink(req.query, "prev", data.prevId) : "",
@@ -205,10 +206,9 @@ const getUsernameAvailabilty = async (req, res) => {
205206
const getSelfDetails = async (req, res) => {
206207
try {
207208
if (req.userData) {
208-
if (req.query.private) {
209-
return res.send(req.userData);
210-
}
211-
const user = await dataAccess.retrieveUsers({ userdata: req.userData });
209+
const user = await dataAccess.retrieveUsers({
210+
userdata: req.userData,
211+
});
212212
return res.send(user);
213213
}
214214
return res.boom.notFound("User doesn't exist");
@@ -407,6 +407,7 @@ const updateUser = async (req, res) => {
407407
const generateChaincode = async (req, res) => {
408408
try {
409409
const { id } = req.userData;
410+
410411
const chaincode = await chaincodeQuery.storeChaincode(id);
411412
await userQuery.addOrUpdate({ chaincode }, id);
412413
return res.json({

middlewares/authenticate.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
const authService = require("../services/authService");
2-
const users = require("../models/users");
2+
const dataAccess = require("../services/dataAccessLayer");
33

44
/**
55
* Middleware to check if the user has been restricted. If user is restricted,
@@ -54,7 +54,7 @@ module.exports = async (req, res, next) => {
5454
const { userId } = authService.verifyAuthToken(token);
5555

5656
// add user data to `req.userData` for further use
57-
const userData = await users.fetchUser({ userId });
57+
const userData = await dataAccess.retrieveUsers({ id: userId });
5858
req.userData = userData.user;
5959

6060
return checkRestricted(req, res, next);
@@ -79,8 +79,7 @@ module.exports = async (req, res, next) => {
7979
});
8080

8181
// add user data to `req.userData` for further use
82-
req.userData = await users.fetchUser({ userId });
83-
82+
req.userData = await dataAccess.retrieveUsers({ id: userId });
8483
return checkRestricted(req, res, next);
8584
} else {
8685
return res.boom.unauthorized("Unauthenticated User");

middlewares/validators/events.js

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,11 +100,57 @@ const endActiveEvent = async (req, res, next) => {
100100
}
101101
};
102102

103+
const addPeerToEvent = async (req, res, next) => {
104+
const { id } = req.params;
105+
const { peerId, name, role, joinedAt } = req.body;
106+
107+
const schema = joi.object({
108+
peerId: joi.string().required(),
109+
name: joi.string().required(),
110+
id: joi.string().required(),
111+
role: joi.string().required(),
112+
joinedAt: joi.date().required(),
113+
});
114+
115+
const validationOptions = { abortEarly: false };
116+
117+
try {
118+
await schema.validateAsync({ peerId, name, id, role, joinedAt }, validationOptions);
119+
next();
120+
} catch (error) {
121+
logger.error(`Error while adding a peer to the event: ${error}`);
122+
res.boom.badRequest(error.details[0].message);
123+
}
124+
};
125+
126+
const kickoutPeer = async (req, res, next) => {
127+
const { id } = req.params;
128+
const { peerId, reason } = req.body;
129+
130+
const schema = joi.object({
131+
id: joi.string().required(),
132+
peerId: joi.string().required(),
133+
reason: joi.string().required(),
134+
});
135+
136+
const validationOptions = { abortEarly: false };
137+
138+
try {
139+
await schema.validateAsync({ id, peerId, reason }, validationOptions);
140+
next();
141+
} catch (error) {
142+
logger.error(`We encountered some error while removing selected Participant from event: ${error}`);
143+
res.boom.badRequest(error.details[0].message);
144+
}
145+
};
146+
103147
module.exports = {
104148
createEvent,
105149
getAllEvents,
106150
joinEvent,
107151
getEventById,
108152
updateEvent,
109153
endActiveEvent,
154+
addPeerToEvent,
155+
kickoutPeer,
110156
};

models/discordactions.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,10 +114,41 @@ const updateDiscordImageForVerification = async (userDiscordId) => {
114114
}
115115
};
116116

117+
const getNumberOfMemberForGroups = async (groups = []) => {
118+
try {
119+
if (!groups.length) {
120+
return [];
121+
}
122+
const roleIds = groups.map((group) => group.roleid);
123+
124+
const snapshots = await memberRoleModel.where("roleid", "in", roleIds).get();
125+
const roleCount = {};
126+
127+
snapshots.forEach((doc) => {
128+
const roleToMemberMapping = doc.data();
129+
130+
if (roleCount[roleToMemberMapping.roleid]) {
131+
roleCount[roleToMemberMapping.roleid] += 1;
132+
} else {
133+
roleCount[roleToMemberMapping.roleid] = 1;
134+
}
135+
});
136+
137+
return groups.map((group) => ({
138+
...group,
139+
memberCount: roleCount[group.roleid] || 0,
140+
}));
141+
} catch (err) {
142+
logger.error("Error while counting members for each group", err);
143+
throw err;
144+
}
145+
};
146+
117147
module.exports = {
118148
createNewRole,
119149
getAllGroupRoles,
120150
addGroupRoleToMember,
121151
isGroupRoleExists,
122152
updateDiscordImageForVerification,
153+
getNumberOfMemberForGroups,
123154
};

0 commit comments

Comments
 (0)