1. @override
Future<int> handle()

Handles the command input.

Override this method to perform actions for this command.

Return value is the value returned to the command line operation. Return 0 for success.

Source

@override
Future<int> handle() async {
  if (clientID == null) {
    displayError("Option --id required.");
    return 1;
  }

  if (secret == null && redirectUri != null) {
    displayError(
        "A client that supports the authorization code flow must be a confidential client");
    displayProgress(
        "Using option --redirect-uri creates a client that supports the authorization code flow. Either provide --secret or remove --redirect-uri.");
    return 1;
  }

  var dataModel = new ManagedDataModel.fromCurrentMirrorSystem();
  ManagedContext.defaultContext = new ManagedContext(dataModel, persistentStore);

  var credentials = AuthUtility.generateAPICredentialPair(
      clientID, secret, redirectURI: redirectUri,
      hashLength: hashLength, hashRounds: hashRounds, hashFunction: hashFunction)
    ..allowedScopes = allowedScopes?.map((s) => new AuthScope(s))?.toList();

  var managedCredentials = new ManagedClient()
    ..id = credentials.id
    ..hashedSecret = credentials.hashedSecret
    ..salt = credentials.salt
    ..redirectURI = credentials.redirectURI
    ..allowedScope = credentials.allowedScopes?.map((s) => s.scopeString)?.join(" ");

  var query = new Query<ManagedClient>()..values = managedCredentials;

  try {
    await query.insert();

    displayInfo("Success", color: CLIColor.green);
    displayProgress("Client with ID '$clientID' has been added.");
    if (secret != null) {
      displayProgress(
          "The client secret has been hashed. You must store it elsewhere, as it cannot be retrieved.");
    }
    if (managedCredentials.allowedScope != null) {
      displayProgress("Allowed scope: ${managedCredentials.allowedScope}");
    }
    return 0;
  } on QueryException catch (e) {
    displayError("Adding Client Failed");
    if (e.event == QueryExceptionEvent.conflict) {
      PostgreSQLException underlying = e.underlyingException;
      if (underlying.constraintName == "_authclient_redirecturi_key") {
        displayProgress(
            "Redirect URI '$redirectUri' already exists for another client.");
      } else {
        displayProgress("Client ID '$clientID' already exists.");
      }

      return 1;
    }

    var underlying = e.underlyingException;
    if (underlying is PostgreSQLException) {
      if (underlying.code == PostgreSQLErrorCode.undefinedTable) {
        displayProgress(
            "No table to store OAuth 2.0 client exists. Have you run 'aqueduct db upgrade'?");
      } else {
        displayProgress("$e");
      }
    } else {
      displayProgress("$e");
    }
  }

  return 1;
}