public async run()

in src/commands/distribute/groups/list.ts [13:87]


  public async run(client: AppCenterClient): Promise<CommandResult> {
    const app = this.app;

    debug("Getting list of the distribution groups");
    let distributionGroupsListRequestResponse: ClientResponse<models.DistributionGroupResponse[]>;
    try {
      distributionGroupsListRequestResponse = await out.progress(
        "Getting list of the distribution groups...",
        clientRequest<models.DistributionGroupResponse[]>((cb) => client.distributionGroups.list(app.ownerName, app.appName, cb))
      );
    } catch (error) {
      debug(`Failed to get list of the distribution groups - ${inspect(error)}`);
      return failure(ErrorCodes.Exception, "failed to fetch list of all distribution groups");
    }

    if (distributionGroupsListRequestResponse.response.statusCode >= 400) {
      return failure(ErrorCodes.Exception, "failed to fetch list of all distribution groups");
    }

    const distributionGroupsNames = _(distributionGroupsListRequestResponse.result)
      .sortBy((distributionGroup) => distributionGroup.name)
      .map((distributionGroup) => distributionGroup.name)
      .value();

    const limit = pLimit(10);

    debug("Creating requests for retrieving user counts of distribution groups");
    const distributionGroupUsersPromises: Array<Promise<ClientResponse<models.DistributionGroupUserGetResponse[]>>> = [];
    for (const distributionGroupName of distributionGroupsNames) {
      distributionGroupUsersPromises.push(
        limit(() =>
          clientRequest<models.DistributionGroupUserGetResponse[]>((cb) =>
            client.distributionGroups.listUsers(this.app.ownerName, this.app.appName, distributionGroupName, cb)
          )
        )
      );
    }

    // Showing progress spinner while requests are being sent
    const requestsCompletedPromise = out.progress(
      "Getting number of users for distribution groups",
      Promise.all(distributionGroupUsersPromises.map((dg) => dg.catch((res) => Promise.resolve())))
    );

    const userCounts: string[] = [];
    for (let i = 0; i < distributionGroupUsersPromises.length; i++) {
      const distributionGroupUsers = distributionGroupUsersPromises[i];
      let userCount: string;

      try {
        debug(`Waiting for ${distributionGroupsNames[i]} distribution group users request response`);
        const distributionGroupUsersRequestResponse = await distributionGroupUsers;
        if (distributionGroupUsersRequestResponse.response.statusCode >= 400) {
          throw distributionGroupUsersRequestResponse.response.statusCode;
        }
        debug(`Request for the list of ${distributionGroupsNames[i]} distribution group users has succeeded`);
        userCount = distributionGroupUsersRequestResponse.result.length.toString();
      } catch (error) {
        debug(`Request for the list of ${distributionGroupsNames[i]} distribution group users has failed - ${inspect(error)}`);
        userCount = "failed to get number of users";
      }

      userCounts.push(userCount);
    }

    // Waiting for spinner to stop
    await requestsCompletedPromise;

    const outputArray = _.zip(distributionGroupsNames, userCounts);

    // Printing the result table
    out.table(out.getCommandOutputTableOptions(["Group", "Users"]), outputArray);

    return success();
  }