| 258 | externalId === null ? [] : subjects.filter((subject) => subject.externalId === externalId); |
| 259 | |
| 260 | export const listUsers = ( |
| 261 | admin: ExecutorAdmin, |
| 262 | options: AdminUsersListOptions, |
| 263 | directory?: AdminIdentityDirectory | AdminUserDirectory, |
| 264 | ): Effect.Effect<typeof AdminUsersResponse.Type, AdminUsersError> => |
| 265 | Effect.gen(function* () { |
| 266 | const dir = asDirectory(directory); |
| 267 | const wanted = |
| 268 | options.email === undefined ? undefined : yield* resolveEmailFilter(dir, options.email); |
| 269 | const all = yield* admin.listSubjects(options).pipe(Effect.mapError(readFailed("users"))); |
| 270 | const subjects = wanted === undefined ? all : filterToId(all, wanted); |
| 271 | // One directory read for the page that was actually returned, joined in |
| 272 | // memory — never a lookup per user. |
| 273 | const identities = yield* resolveIdentities( |
| 274 | dir.identities, |
| 275 | subjects.map((subject) => subject.externalId), |
| 276 | ); |
| 277 | return { users: subjects.map((subject) => toUser(subject, identities)) }; |
| 278 | }); |
| 279 | |
| 280 | export const listUsersWithConnections = ( |
| 281 | admin: ExecutorAdmin, |