| 293 | }); |
| 294 | |
| 295 | export const listUsers = ( |
| 296 | admin: ExecutorAdmin, |
| 297 | options: AdminUsersListOptions, |
| 298 | directory?: AdminIdentityDirectory | AdminUserDirectory, |
| 299 | ): Effect.Effect<typeof AdminUsersResponse.Type, AdminUsersError> => |
| 300 | Effect.gen(function* () { |
| 301 | const dir = asDirectory(directory); |
| 302 | const subjects = |
| 303 | options.email === undefined |
| 304 | ? yield* admin.listSubjects(options).pipe(Effect.mapError(readFailed("users"))) |
| 305 | : yield* selectByEmail(dir, options.email, options, (externalId) => |
| 306 | admin.getSubject(externalId).pipe(Effect.mapError(readFailed("users"))), |
| 307 | ); |
| 308 | // One directory read for the page that was actually returned, joined in |
| 309 | // memory — never a lookup per user. |
| 310 | const identities = yield* resolveIdentities( |
| 311 | dir.identities, |
| 312 | subjects.map((subject) => subject.externalId), |
| 313 | ); |
| 314 | return { users: subjects.map((subject) => toUser(subject, identities)) }; |
| 315 | }); |
| 316 | |
| 317 | export const listUsersWithConnections = ( |
| 318 | admin: ExecutorAdmin, |