Implement update backup and restore proof

This commit is contained in:
Jacob Dubin
2026-05-17 10:11:36 -05:00
parent dfcf521a5a
commit 3b279fdd6f
6 changed files with 95 additions and 11 deletions

View File

@@ -35,6 +35,7 @@ public interface ICloudStateStore
IDictionary<string, object?>? meta);
IReadOnlyList<BackupRecord> GetBackups();
BackupRecord CreateBackup(string name);
bool ShouldCreateSymmetricKey(string loopId);
string GetOrCreateSymmetricKey(string loopId);
KeyRequestRecord CreateKeyRequest(string loopId, string publicKey);
@@ -43,4 +44,4 @@ public interface ICloudStateStore
IReadOnlyList<KeyRequestRecord> GetBinaryRequests();
IReadOnlyList<object> GetHolidays();
void UpdateRobot(DeviceRegistration registration);
}
}

View File

@@ -51,7 +51,7 @@ public sealed class JiboCloudProtocolService(ICloudStateStore stateStore)
return Task.FromResult(HandleLog(operation, envelope));
if (servicePrefix.StartsWith("Backup_", StringComparison.OrdinalIgnoreCase))
return Task.FromResult(HandleBackup(operation));
return Task.FromResult(HandleBackup(operation, envelope));
if (servicePrefix.StartsWith("Account_", StringComparison.OrdinalIgnoreCase))
return Task.FromResult(HandleAccount(operation, envelope));
@@ -353,11 +353,19 @@ public sealed class JiboCloudProtocolService(ICloudStateStore stateStore)
: []);
}
private ProtocolDispatchResult HandleBackup(string operation)
private ProtocolDispatchResult HandleBackup(string operation, ProtocolEnvelope envelope)
{
return operation.Equals("List", StringComparison.OrdinalIgnoreCase)
? ProtocolDispatchResult.Ok(stateStore.GetBackups())
: ProtocolDispatchResult.Ok(Array.Empty<object>());
if (operation.Equals("List", StringComparison.OrdinalIgnoreCase))
return ProtocolDispatchResult.Ok(stateStore.GetBackups());
if (operation.Equals("Create", StringComparison.OrdinalIgnoreCase))
{
var body = envelope.TryParseBody();
var requestedName = ReadString(body, "name") ?? ReadString(body, "backupName");
return ProtocolDispatchResult.Ok(stateStore.CreateBackup(requestedName ?? $"backup-{DateTimeOffset.UtcNow:yyyyMMddHHmmss}"));
}
return ProtocolDispatchResult.Ok(Array.Empty<object>());
}
private ProtocolDispatchResult HandleKey(string operation, ProtocolEnvelope envelope)
@@ -631,4 +639,4 @@ public sealed class JiboCloudProtocolService(ICloudStateStore stateStore)
bool.TryParse(value, out var parsed) &&
parsed;
}
}
}

View File

@@ -452,6 +452,18 @@ public sealed class InMemoryCloudStateStore : ICloudStateStore
return _backups.ToArray();
}
public BackupRecord CreateBackup(string name)
{
var backup = new BackupRecord
{
Name = string.IsNullOrWhiteSpace(name) ? "backup" : name.Trim()
};
_backups.Add(backup);
TouchState();
return backup;
}
public bool ShouldCreateSymmetricKey(string loopId)
{
return !_symmetricKeys.ContainsKey(loopId);
@@ -661,4 +673,4 @@ public sealed class InMemoryCloudStateStore : ICloudStateStore
};
}
}
}
}