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.

コマンドを実行します。

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

Implementation

@override
Future<void> exec(ExecContext context) async {
  final cloudflare = context.yaml.getAsMap("cloudflare");
  final workers = cloudflare.getAsMap("workers");
  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 resolveCloudflareFirebaseServiceAccount(
    context,
    projectId: firebaseProjectId,
  );

  final bin = context.yaml.getAsMap("bin");
  final npm = bin.get("npm", "npm");
  final wrangler = bin.get("wrangler", "wrangler");
  final flavor = context.flavorContext?.flavor.name ?? "prod";
  final indexFile = File(cloudflareEdgeEntryPath);
  if (indexFile.existsSync()) {
    CloudflareSourceUtils.validateFirebaseProjectId(
      await indexFile.readAsString(),
      firebaseProjectId,
    );
  }
  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(),",
    },
    replaceExisting: false,
  );
  if (!applied) {
    return;
  }
  await installMissingCloudflarePackages(
    npm: npm,
    packages: const ["@mathrunet/masamune_cloudflare_auth"],
  );
  await putWranglerSecret(
    wrangler: wrangler,
    environment: flavor,
    name: "GOOGLE_SERVICE_ACCOUNT",
    value: serviceAccount,
  );
}