| 103 | @requireSudo |
| 104 | @param('format', Types.Range(['default', 'raw']), true) |
| 105 | async get({ domainId }, format = 'default') { |
| 106 | const showDefault = system.get('server.showDefaultRole') || domainId !== 'system'; |
| 107 | const [dudocs, roles] = await Promise.all([ |
| 108 | domain.collUser.aggregate([ |
| 109 | { |
| 110 | $match: { |
| 111 | role: showDefault ? { $ne: 'guest' } : { |
| 112 | $nin: ['default', 'guest'], |
| 113 | $ne: null, |
| 114 | }, |
| 115 | domainId, |
| 116 | }, |
| 117 | }, |
| 118 | { |
| 119 | $lookup: { |
| 120 | from: 'user', |
| 121 | let: { uid: '$uid' }, |
| 122 | pipeline: [ |
| 123 | { |
| 124 | $match: { |
| 125 | $expr: { $eq: ['$_id', '$$uid'] }, |
| 126 | priv: { $bitsAllSet: PRIV.PRIV_USER_PROFILE }, |
| 127 | }, |
| 128 | }, |
| 129 | { |
| 130 | $project: { |
| 131 | _id: 1, |
| 132 | uname: 1, |
| 133 | avatar: 1, |
| 134 | }, |
| 135 | }, |
| 136 | ], |
| 137 | as: 'user', |
| 138 | }, |
| 139 | }, |
| 140 | { $unwind: '$user' }, |
| 141 | { |
| 142 | $project: { |
| 143 | user: 1, |
| 144 | role: 1, |
| 145 | join: 1, |
| 146 | ...(this.user.hasPerm(PERM.PERM_VIEW_USER_PRIVATE_INFO) ? { displayName: 1 } : {}), |
| 147 | }, |
| 148 | }, |
| 149 | ]).toArray(), |
| 150 | domain.getRoles(domainId), |
| 151 | ]); |
| 152 | const users = dudocs.map((dudoc) => { |
| 153 | const u = { |
| 154 | ...dudoc, |
| 155 | ...dudoc.user, |
| 156 | }; |
| 157 | delete u.user; |
| 158 | return u; |
| 159 | }); |
| 160 | const rudocs = {}; |
| 161 | for (const role of roles) rudocs[role._id] = users.filter((udoc) => (udoc.role || 'default') === role._id); |
| 162 | this.response.template = format === 'raw' ? 'domain_user_raw.html' : 'domain_user.html'; |