loadAndMigrateStorageManagedState function
Loads Storage state and migrates the legacy automatically managed secret.
Implementation
Future<StorageManagedStateLoadResult> loadAndMigrateStorageManagedState(
Map<String, dynamic> secrets, {
String configuredSecret = "",
String Function()? generateSecret,
}) async {
final file = File(storageManagedStatePath);
final loaded = file.existsSync()
? Map<String, dynamic>.from(
modifize(loadYaml(await file.readAsString())) as Map? ?? {},
)
: <String, dynamic>{};
final state = _stringMap(loaded);
final cloudflare = _nestedMap(secrets, "cloudflare");
final storage = _nestedMap(cloudflare, "storage");
final legacySecret = storage["download_url_secret"]?.toString() ?? "";
final storedSecret = state["download_url_secret"]?.toString() ?? "";
if (legacySecret.isNotEmpty &&
storedSecret.isNotEmpty &&
legacySecret != storedSecret) {
throw StateError(
"Cloudflare Storage managed state differs between "
"`katana_secrets.yaml` and `$storageManagedStatePath` at "
"`download_url_secret`. Resolve the conflict before running "
"`katana apply` again.",
);
}
final downloadUrlSecret = configuredSecret.isNotEmpty
? configuredSecret
: storedSecret.isNotEmpty
? storedSecret
: legacySecret.isNotEmpty
? legacySecret
: (generateSecret ?? _generateDownloadUrlSecret)();
var secretsChanged = false;
var stateChanged = !file.existsSync();
if (storage.containsKey("download_url_secret")) {
storage.remove("download_url_secret");
secretsChanged = true;
}
if (state["version"] != 1) {
state["version"] = 1;
stateChanged = true;
}
if (state["download_url_secret"] != downloadUrlSecret) {
state["download_url_secret"] = downloadUrlSecret;
stateChanged = true;
}
return StorageManagedStateLoadResult(
state: state,
downloadUrlSecret: downloadUrlSecret,
secretsChanged: secretsChanged,
stateChanged: stateChanged,
);
}