| 375 | }); |
| 376 | |
| 377 | export const listUsers = ( |
| 378 | admin: ExecutorAdmin, |
| 379 | options: AdminUsersListOptions, |
| 380 | directory?: AdminIdentityDirectory | AdminUserDirectory, |
| 381 | ): Effect.Effect<typeof AdminUsersResponse.Type, AdminUsersError> => |
| 382 | Effect.gen(function* () { |
| 383 | const dir = asDirectory(directory); |
| 384 | const subjects = yield* selectSubjects(dir, options, { |
| 385 | page: (paging) => admin.listSubjects(paging).pipe(Effect.mapError(readFailed("users"))), |
| 386 | one: (externalId) => admin.getSubject(externalId).pipe(Effect.mapError(readFailed("users"))), |
| 387 | }); |
| 388 | // One directory read for the page that was actually returned, joined in |
| 389 | // memory — never a lookup per user. |
| 390 | const identities = yield* resolveIdentities( |
| 391 | dir.identities, |
| 392 | subjects.map((subject) => subject.externalId), |
| 393 | ); |
| 394 | return { users: subjects.map((subject) => toUser(subject, identities)) }; |
| 395 | }); |
| 396 | |
| 397 | export const listUsersWithConnections = ( |
| 398 | admin: ExecutorAdmin, |