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