exec method

  1. @override
Future<void> exec(
  1. ExecContext context
)
override

Run command.

The contents of katana.yaml and the arguments of the command are passed to context.

コマンドを実行します。

contextkatana.yamlの内容やコマンドの引数が渡されます。

Implementation

@override
Future<void> exec(ExecContext context) async {
  final cloudflare = context.yaml.getAsMap("cloudflare");
  final workers = cloudflare.getAsMap("workers");
  final deleteUser =
      cloudflare.getAsMap("authentication").getAsMap("delete_user");
  final firebase = context.yaml.getAsMap("firebase");
  final firebaseProjectId = firebase.get("project_id", "");
  final enableFirebaseAuthentication =
      firebase.getAsMap("authentication").get("enable", false);
  if (!workers.get("enable", false)) {
    error(
      "[cloudflare]->[workers]->[enable] must be true when [cloudflare]->[authentication]->[delete_user]->[enable] is enabled.",
    );
    return;
  }
  if (!workers.get("enable_firebase_auth", false)) {
    error(
      "[cloudflare]->[workers]->[enable_firebase_auth] must be true when the delete-user Worker is enabled.",
    );
    return;
  }
  if (firebaseProjectId.isEmpty) {
    error(
      "[firebase]->[project_id] is required when the delete-user Worker is enabled.",
    );
    return;
  }
  if (!enableFirebaseAuthentication) {
    error(
      "[firebase]->[authentication]->[enable] must be true when the delete-user Worker is enabled.",
    );
    return;
  }
  final cloudflareDir = Directory("cloudflare");
  if (!cloudflareDir.existsSync()) {
    error(
      "The directory `cloudflare` does not exist. Initialize Cloudflare Workers by executing `katana apply`.",
    );
    return;
  }
  final serviceAccount = await _resolveServiceAccountJson(
    yamlValue: deleteUser.get("service_account", ""),
    secretsValue: context.secrets
        .getAsMap("cloudflare")
        .getAsMap("authentication")
        .getAsMap("delete_user")
        .get("service_account", ""),
  );
  if (serviceAccount.isEmpty) {
    error(
      "Firebase Admin SDK service account JSON was not found. Set [cloudflare]->[authentication]->[delete_user]->[service_account] in `katana_secrets.yaml` (recommended) or `katana.yaml`, or place a service account JSON under `cloudflare/` or `android/`.",
    );
    return;
  }
  if (!_isServiceAccountJson(serviceAccount)) {
    error(
      "The configured delete-user service account is not a valid Firebase Admin SDK service account JSON.",
    );
    return;
  }

  final bin = context.yaml.getAsMap("bin");
  final npm = bin.get("npm", "npm");
  final wrangler = bin.get("wrangler", "wrangler");
  await addFlutterImport(
    [
      "masamune_auth_firebase",
      "masamune_functions_cloudflare",
    ],
  );
  label("Add Cloudflare Workers delete-user function");
  final applied = await applyCloudflareWorkersFunctions(
    alias: "auth",
    package: "@mathrunet/masamune_cloudflare_auth",
    functions: {
      "auth.Functions.deleteUser":
          "    auth.Functions.deleteUser({ projectId: ${jsonEncode(firebaseProjectId)} }),",
    },
  );
  if (!applied) {
    return;
  }
  await command(
    "Package installation.",
    [
      npm,
      "install",
      "@mathrunet/masamune_cloudflare_auth",
    ],
    workingDirectory: "cloudflare",
    runInShell: true,
  );
  await putWranglerSecret(
    wrangler: wrangler,
    name: "GOOGLE_SERVICE_ACCOUNT",
    value: serviceAccount,
  );
}