@@ -9,6 +9,89 @@ const convoError = new conversationErrors.ConversationControllerError()
99const validateUUID = require ( 'uuid' ) . validate
1010const authContext = require ( '../../utils/authContext' )
1111
12+ function addUUIDsToSet ( uuidSet , values ) {
13+ if ( ! Array . isArray ( values ) ) return
14+ values . filter ( Boolean ) . forEach ( uuid => uuidSet . add ( uuid ) )
15+ }
16+
17+ function addConversationAuthorUUIDsToSet ( uuidSet , conversations ) {
18+ if ( ! Array . isArray ( conversations ) ) return
19+ conversations . forEach ( conversation => {
20+ if ( conversation . author_id ) {
21+ uuidSet . add ( conversation . author_id )
22+ }
23+ } )
24+ }
25+
26+ function asPlainObject ( value ) {
27+ return typeof value ?. toObject === 'function' ? value . toObject ( ) : value
28+ }
29+
30+ function buildOrgShortNameByUserUUID ( orgs , requestedUserUUIDs ) {
31+ const orgShortNameByUserUUID = { }
32+ orgs . forEach ( org => {
33+ const orgObject = asPlainObject ( org )
34+ if ( ! Array . isArray ( orgObject . users ) ) return
35+
36+ orgObject . users . forEach ( userUUID => {
37+ if ( requestedUserUUIDs . has ( userUUID ) ) {
38+ orgShortNameByUserUUID [ userUUID ] = orgObject . short_name
39+ }
40+ } )
41+ } )
42+ return orgShortNameByUserUUID
43+ }
44+
45+ async function buildUserMapForUUIDs ( userUUIDs , userRepo , orgRepo ) {
46+ if ( userUUIDs . size === 0 ) {
47+ return { }
48+ }
49+
50+ const userUUIDList = Array . from ( userUUIDs )
51+ const users = await userRepo . findUsersByUUIDs ( userUUIDList )
52+ const orgs = await orgRepo . findOrgsByUserUUIDs ( userUUIDList )
53+ const orgShortNameByUserUUID = buildOrgShortNameByUserUUID ( orgs , userUUIDs )
54+
55+ return users . reduce ( ( userMap , user ) => {
56+ const userObject = asPlainObject ( user )
57+ if ( ! userUUIDs . has ( userObject . UUID ) ) return userMap
58+ const orgShortName = orgShortNameByUserUUID [ userObject . UUID ]
59+ userMap [ userObject . UUID ] = _ . omitBy ( {
60+ username : userObject . username ,
61+ name : userObject . name ,
62+ org : orgShortName ? { short_name : orgShortName } : undefined
63+ } , _ . isUndefined )
64+ return userMap
65+ } , { } )
66+ }
67+
68+ async function buildOrgUserMap ( org , userRepo , orgRepo ) {
69+ const orgObject = asPlainObject ( org )
70+ const userUUIDs = new Set ( )
71+ addUUIDsToSet ( userUUIDs , orgObject . users )
72+ addUUIDsToSet ( userUUIDs , orgObject . admins )
73+ addUUIDsToSet ( userUUIDs , orgObject . contact_info ?. additional_contacts )
74+
75+ return buildUserMapForUUIDs ( userUUIDs , userRepo , orgRepo )
76+ }
77+
78+ async function buildUserMap ( org , userRepo , orgRepo ) {
79+ const orgObject = asPlainObject ( org )
80+ const userUUIDs = new Set ( )
81+ addUUIDsToSet ( userUUIDs , orgObject . users )
82+ addUUIDsToSet ( userUUIDs , orgObject . admins )
83+ addUUIDsToSet ( userUUIDs , orgObject . contact_info ?. additional_contacts )
84+ addConversationAuthorUUIDsToSet ( userUUIDs , orgObject . conversation )
85+
86+ return buildUserMapForUUIDs ( userUUIDs , userRepo , orgRepo )
87+ }
88+
89+ function removeUserUUIDFields ( org ) {
90+ delete org . users
91+ delete org . admins
92+ _ . unset ( org , 'contact_info.additional_contacts' )
93+ }
94+
1295/**
1396 * Retrieves information about all registry organizations.
1497 *
@@ -101,7 +184,21 @@ async function getOrg (req, res, next) {
101184 if ( isSecretariat ) {
102185 returnValue . conversation = conversation ?. length ? _ . map ( conversation , c => _ . omit ( c , [ '__v' , '_id' , 'previous_conversation_uuid' , 'next_conversation_uuid' , 'target_uuid' ] ) ) : undefined
103186 } else {
104- returnValue . conversation = conversation ?. length ? _ . map ( conversation , c => _ . omit ( c , [ '__v' , '_id' , 'UUID' , 'previous_conversation_uuid' , 'next_conversation_uuid' , 'target_uuid' , 'visibility' ] ) ) : undefined
187+ returnValue . conversation = conversation ?. length ? _ . map ( conversation , c => _ . omit ( c , [ '__v' , '_id' , 'UUID' , 'previous_conversation_uuid' , 'next_conversation_uuid' , 'target_uuid' , 'visibility' , 'author_id' ] ) ) : undefined
188+ }
189+
190+ if ( req . ctx . query ?. expand === 'users' ) {
191+ const userRepo = req . ctx . repositories . getBaseUserRepository ( )
192+ const isAdminOfRequestedOrg = ! isSecretariat && await userRepo . isAdmin ( req . ctx . user , returnValue . short_name , { } )
193+ if ( isSecretariat ) {
194+ returnValue . _userMap = await buildUserMap ( returnValue , userRepo , repo )
195+ } else if ( isAdminOfRequestedOrg ) {
196+ returnValue . _userMap = await buildOrgUserMap ( requesterOrg , userRepo , repo )
197+ }
198+ }
199+
200+ if ( ! isSecretariat ) {
201+ removeUserUUIDFields ( returnValue )
105202 }
106203 }
107204 } catch ( error ) {
0 commit comments