@@ -16,6 +16,24 @@ const prisma = require('../common/prisma').getClient()
1616
1717const 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 )
0 commit comments