Skip to content

Commit a70f00f

Browse files
authored
Merge pull request #1914 from Real-Dev-Squad/develop
Dev to main
2 parents e2c8cbd + 9a7602b commit a70f00f

File tree

5 files changed

+185
-1
lines changed

5 files changed

+185
-1
lines changed

controllers/users.js

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ const {
2828
} = require("../constants/users");
2929
const { addLog } = require("../models/logs");
3030
const { getUserStatus } = require("../models/userStatus");
31+
const config = require("config");
32+
const discordDeveloperRoleId = config.get("discordDeveloperRoleId");
3133

3234
const verifyUser = async (req, res) => {
3335
const userId = req.userData.id;
@@ -243,6 +245,26 @@ const getUsers = async (req, res) => {
243245
}
244246
};
245247

248+
const isDeveloper = async (req, res) => {
249+
try {
250+
const { userData } = req;
251+
if (userData.roles.in_discord) {
252+
const membersInDiscord = await getDiscordMembers();
253+
const discordMember = membersInDiscord.find((member) => member.user.id === userData.discordId);
254+
if (discordMember) {
255+
const { roles } = discordMember;
256+
if (roles) {
257+
return res.status(200).json({ developerRoleExistsOnUser: roles.includes(discordDeveloperRoleId) });
258+
}
259+
}
260+
}
261+
return res.status(200).json({ developerRoleExistsOnUser: false });
262+
} catch (error) {
263+
logger.error(`Error while fetching developer tag: ${error}`);
264+
return res.boom.serverUnavailable(SOMETHING_WENT_WRONG);
265+
}
266+
};
267+
246268
/**
247269
* Fetches the data about user with given id
248270
*
@@ -371,7 +393,7 @@ const getSelfDetails = async (req, res) => {
371393
*/
372394
const updateSelf = async (req, res) => {
373395
try {
374-
const { id: userId } = req.userData;
396+
const { id: userId, roles: userRoles, discordId } = req.userData;
375397
const { user } = await dataAccess.retrieveUsers({ id: userId });
376398

377399
if (req.body.username) {
@@ -387,6 +409,17 @@ const updateSelf = async (req, res) => {
387409
}
388410
}
389411

412+
if (userRoles.in_discord) {
413+
const membersInDiscord = await getDiscordMembers();
414+
const discordMember = membersInDiscord.find((member) => member.user.id === discordId);
415+
if (discordMember) {
416+
const { roles } = discordMember;
417+
if (roles && roles.includes(discordDeveloperRoleId)) {
418+
return res.boom.forbidden("Developers can't update their profile data. Use profile service for updating.");
419+
}
420+
}
421+
}
422+
390423
const updatedUser = await userQuery.addOrUpdate(req.body, userId);
391424

392425
if (!updatedUser.isNewUser) {
@@ -930,4 +963,5 @@ module.exports = {
930963
archiveUserIfNotInDiscord,
931964
usersPatchHandler,
932965
migrations,
966+
isDeveloper,
933967
};

routes/users.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ router.get("/userId/:userId", users.getUserById);
1616
router.patch("/self", authenticate, userValidator.updateUser, users.updateSelf);
1717
router.get("/", userValidator.getUsers, users.getUsers);
1818
router.get("/self", authenticate, users.getSelfDetails);
19+
router.get("/isDeveloper", authenticate, users.isDeveloper);
1920
router.get("/isUsernameAvailable/:username", authenticate, users.getUsernameAvailabilty);
2021
router.get("/username", authenticate, userValidator.validateGenerateUsernameQuery, users.generateUsername);
2122
router.get("/chaincode", authenticate, users.generateChaincode);

test/integration/restricted.test.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ const authService = require("../../services/authService");
77
const cleanDb = require("../utils/cleanDb");
88
const userData = require("../fixtures/user/user")();
99
const addUser = require("../utils/addUser");
10+
const sinon = require("sinon");
11+
const { getDiscordMembers } = require("../fixtures/discordResponse/discord-response");
1012

1113
const cookieName = config.get("userToken.cookieName");
1214
const unrestrictedUser = userData[0];
@@ -17,15 +19,25 @@ chai.use(chaiHttp);
1719
describe("checkRestrictedUser", function () {
1820
let restrictedJwt;
1921
let unrestrictedJwt;
22+
let fetchStub;
2023

2124
before(async function () {
2225
const restrictedUserId = await addUser(restrictedUser);
2326
const unrestrictedUserId = await addUser(unrestrictedUser);
2427
restrictedJwt = authService.generateAuthToken({ userId: restrictedUserId });
2528
unrestrictedJwt = authService.generateAuthToken({ userId: unrestrictedUserId });
29+
30+
fetchStub = sinon.stub(global, "fetch");
31+
fetchStub.returns(
32+
Promise.resolve({
33+
status: 200,
34+
json: () => Promise.resolve(getDiscordMembers),
35+
})
36+
);
2637
});
2738

2839
after(async function () {
40+
sinon.restore();
2941
await cleanDb();
3042
});
3143

test/integration/users.test.js

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ const superUser = userData[4];
1515
const searchParamValues = require("../fixtures/user/search")();
1616

1717
const config = require("config");
18+
const discordDeveloperRoleId = config.get("discordDeveloperRoleId");
1819
const { getDiscordMembers } = require("../fixtures/discordResponse/discord-response");
1920
const joinData = require("../fixtures/user/join");
2021
const {
@@ -65,6 +66,20 @@ describe("Users", function () {
6566
});
6667

6768
describe("PATCH /users/self", function () {
69+
beforeEach(function () {
70+
fetchStub = Sinon.stub(global, "fetch");
71+
fetchStub.returns(
72+
Promise.resolve({
73+
status: 200,
74+
json: () => Promise.resolve(getDiscordMembers),
75+
})
76+
);
77+
});
78+
79+
afterEach(function () {
80+
Sinon.restore();
81+
});
82+
6883
it("Should update the user", function (done) {
6984
chai
7085
.request(app)
@@ -2168,4 +2183,114 @@ describe("Users", function () {
21682183
});
21692184
});
21702185
});
2186+
2187+
describe("GET /users/isDeveloper for developers not in_discord", function () {
2188+
beforeEach(function () {
2189+
fetchStub = Sinon.stub(global, "fetch");
2190+
fetchStub.returns(
2191+
Promise.resolve({
2192+
status: 200,
2193+
json: () => Promise.resolve(getDiscordMembers),
2194+
})
2195+
);
2196+
});
2197+
2198+
afterEach(function () {
2199+
Sinon.restore();
2200+
});
2201+
2202+
it("Should return false if user is a developer and not in discord", function (done) {
2203+
chai
2204+
.request(app)
2205+
.get("/users/isDeveloper")
2206+
.set("cookie", `${cookieName}=${jwt}`)
2207+
.end((err, res) => {
2208+
if (err) {
2209+
return done(err);
2210+
}
2211+
2212+
expect(res).to.have.status(200);
2213+
expect(res.body.developerRoleExistsOnUser).to.equal(false);
2214+
2215+
return done();
2216+
});
2217+
});
2218+
});
2219+
2220+
describe("PATCH /users/self for developers", function () {
2221+
beforeEach(function () {
2222+
fetchStub = Sinon.stub(global, "fetch");
2223+
const discordMembers = [...getDiscordMembers];
2224+
discordMembers[0].user.id = "12345";
2225+
discordMembers[0].roles.push(discordDeveloperRoleId);
2226+
fetchStub.returns(
2227+
Promise.resolve({
2228+
status: 200,
2229+
json: () => Promise.resolve(discordMembers),
2230+
})
2231+
);
2232+
});
2233+
2234+
afterEach(function () {
2235+
Sinon.restore();
2236+
});
2237+
2238+
it("Should not update the user if user is a developer", function (done) {
2239+
chai
2240+
.request(app)
2241+
.patch("/users/self")
2242+
.set("cookie", `${cookieName}=${jwt}`)
2243+
.send({
2244+
first_name: "Test first_name",
2245+
})
2246+
.end((err, res) => {
2247+
if (err) {
2248+
return done(err);
2249+
}
2250+
2251+
expect(res).to.have.status(403);
2252+
expect(res.body.message).to.equal(
2253+
"Developers can't update their profile data. Use profile service for updating."
2254+
);
2255+
2256+
return done();
2257+
});
2258+
});
2259+
});
2260+
2261+
describe("GET /users/isDeveloper for developers", function () {
2262+
beforeEach(function () {
2263+
fetchStub = Sinon.stub(global, "fetch");
2264+
const discordMembers = [...getDiscordMembers];
2265+
discordMembers[0].user.id = "12345";
2266+
discordMembers[0].roles.push(discordDeveloperRoleId);
2267+
fetchStub.returns(
2268+
Promise.resolve({
2269+
status: 200,
2270+
json: () => Promise.resolve(discordMembers),
2271+
})
2272+
);
2273+
});
2274+
2275+
afterEach(function () {
2276+
Sinon.restore();
2277+
});
2278+
2279+
it("Should return true if user is a developer", function (done) {
2280+
chai
2281+
.request(app)
2282+
.get("/users/isDeveloper")
2283+
.set("cookie", `${cookieName}=${jwt}`)
2284+
.end((err, res) => {
2285+
if (err) {
2286+
return done(err);
2287+
}
2288+
2289+
expect(res).to.have.status(200);
2290+
expect(res.body.developerRoleExistsOnUser).to.equal(true);
2291+
2292+
return done();
2293+
});
2294+
});
2295+
});
21712296
});

test/unit/middlewares/contentTypeCheck.test.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
const chai = require("chai");
22
const { expect } = chai;
33
const chaiHttp = require("chai-http");
4+
const { getDiscordMembers } = require("../../fixtures/discordResponse/discord-response");
5+
const sinon = require("sinon");
46

57
const app = require("../../../server");
68
const authService = require("../../../services/authService");
@@ -13,13 +15,23 @@ chai.use(chaiHttp);
1315

1416
describe("contentTypeCheck", function () {
1517
let jwt;
18+
let fetchStub;
1619

1720
beforeEach(async function () {
1821
const userId = await addUser();
1922
jwt = authService.generateAuthToken({ userId });
23+
24+
fetchStub = sinon.stub(global, "fetch");
25+
fetchStub.returns(
26+
Promise.resolve({
27+
status: 200,
28+
json: () => Promise.resolve(getDiscordMembers),
29+
})
30+
);
2031
});
2132

2233
afterEach(async function () {
34+
sinon.restore();
2335
await cleanDb();
2436
});
2537

0 commit comments

Comments
 (0)