Skip to content

Commit 8845b5a

Browse files
committed
Add member email for copilots / admins when getting resources, used in the review UI
1 parent 369c6c4 commit 8845b5a

File tree

2 files changed

+42
-2
lines changed

2 files changed

+42
-2
lines changed

src/services/ResourceService.js

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,24 @@ const prisma = require('../common/prisma').getClient()
1616

1717
const payloadFields = ['id', 'challengeId', 'memberId', 'memberHandle', 'roleId', 'created', 'createdBy', 'updated', 'updatedBy']
1818

19+
let copilotResourceRoleIdsCache
20+
21+
async function getCopilotResourceRoleIds () {
22+
if (copilotResourceRoleIdsCache) {
23+
return copilotResourceRoleIdsCache
24+
}
25+
const roles = await prisma.resourceRole.findMany({
26+
where: {
27+
nameLower: 'copilot'
28+
},
29+
select: {
30+
id: true
31+
}
32+
})
33+
copilotResourceRoleIdsCache = roles.map(role => role.id)
34+
return copilotResourceRoleIdsCache
35+
}
36+
1937
/**
2038
* Check whether the user can access resources
2139
* @param {Array} resources resources of current user for specified challenge id
@@ -74,9 +92,13 @@ async function getResources (currentUser, challengeId, roleId, memberId, memberH
7492
const prismaFilter = { where: { AND: [] } }
7593

7694
let hasFullAccess
95+
let userHasCopilotRole = false
7796

7897
// Check if the user has a resource with full access on the challenge
79-
if (currentUser && !currentUser.isMachine && !helper.hasAdminRole(currentUser)) {
98+
const isMachineUser = !!(currentUser && currentUser.isMachine)
99+
const isAdminUser = !!(currentUser && helper.hasAdminRole(currentUser))
100+
101+
if (currentUser && !isMachineUser && !isAdminUser) {
80102
if (challengeId) {
81103
const resources = await prisma.resource.findMany({
82104
where: {
@@ -92,6 +114,10 @@ async function getResources (currentUser, challengeId, roleId, memberId, memberH
92114
} catch (e) {
93115
hasFullAccess = false
94116
}
117+
if (!userHasCopilotRole) {
118+
const copilotRoleIds = await getCopilotResourceRoleIds()
119+
userHasCopilotRole = resources.some(resource => copilotRoleIds.includes(resource.roleId))
120+
}
95121
}
96122
if (memberId && _.toString(memberId) !== _.toString(currentUser.userId)) {
97123
throw new errors.ForbiddenError('You are not allowed to perform this operation!')
@@ -110,7 +136,7 @@ async function getResources (currentUser, challengeId, roleId, memberId, memberH
110136
if (!currentUser) {
111137
// if the user is not logged in, only return resources with submitter role ID
112138
prismaFilter.where.AND.push({ roleId: config.SUBMITTER_RESOURCE_ROLE_ID })
113-
} else if (!currentUser.isMachine && !helper.hasAdminRole(currentUser) && !hasFullAccess) {
139+
} else if (!isMachineUser && !isAdminUser && !hasFullAccess) {
114140
// if not admin, and not machine, only return submitters + all my roles
115141
prismaFilter.where.AND.push({
116142
OR: [
@@ -151,6 +177,8 @@ async function getResources (currentUser, challengeId, roleId, memberId, memberH
151177

152178
let memberObjects = await helper.getMemberInfoByIdList(memberIds)
153179
logger.info(`Retrieved member objects: ${JSON.stringify(memberObjects)}`)
180+
181+
const shouldExposeMemberEmail = Boolean(challengeId) && (isMachineUser || isAdminUser || userHasCopilotRole)
154182
const completeResources = []
155183
for (const resource of resources) {
156184
const memberInfo = _.find(memberObjects, (o) => _.toNumber('' + o.userId) === _.toNumber(resource.memberId))
@@ -160,6 +188,9 @@ async function getResources (currentUser, challengeId, roleId, memberId, memberH
160188
rating: memberInfo.maxRating ? memberInfo.maxRating.rating : undefined,
161189
memberHandle: memberInfo.handle
162190
}
191+
if (shouldExposeMemberEmail && memberInfo.email) {
192+
completeResource.memberEmail = memberInfo.email
193+
}
163194
completeResources.push(completeResource)
164195
} else {
165196
completeResources.push(resource)

test/unit/getResources.test.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ module.exports = describe('Get resources', () => {
6363
should.equal(result.total, 5)
6464
for (const record of result.data) {
6565
await assertResource(record.id, record)
66+
should.exist(record.memberEmail)
67+
record.memberEmail.should.be.String()
6668
}
6769
// user phead should have two resources
6870
should.equal(hasCopilotRole, true)
@@ -76,6 +78,8 @@ module.exports = describe('Get resources', () => {
7678
should.equal(result.total, 5)
7779
for (const record of result.data) {
7880
await assertResource(record.id, record)
81+
should.exist(record.memberEmail)
82+
record.memberEmail.should.be.String()
7983
}
8084
// user phead should have two resources
8185
should.equal(hasCopilotRole, true)
@@ -86,6 +90,7 @@ module.exports = describe('Get resources', () => {
8690
const result = await service.getResources(user.diazz, challengeId)
8791
should.equal(result.total, 1)
8892
should.equal(result.data[0].memberHandle, 'diazz')
93+
should.not.exist(result.data[0].memberEmail)
8994
})
9095

9196
it('get resources using m2m token', async () => {
@@ -95,6 +100,8 @@ module.exports = describe('Get resources', () => {
95100
should.equal(result.total, 5)
96101
for (const record of result.data) {
97102
await assertResource(record.id, record)
103+
should.exist(record.memberEmail)
104+
record.memberEmail.should.be.String()
98105
}
99106
// user phead should have two resources
100107
should.equal(hasCopilotRole, true)
@@ -108,6 +115,8 @@ module.exports = describe('Get resources', () => {
108115
should.equal(result.total, 1)
109116
for (const record of result.data) {
110117
await assertResource(record.id, record)
118+
should.exist(record.memberEmail)
119+
record.memberEmail.should.be.String()
111120
}
112121
// user phead should have copilot role
113122
should.equal(hasCopilotRole, true)

0 commit comments

Comments
 (0)