exec method
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,
);
}