add providers filter to runBackupCycle

This commit is contained in:
Sebastian 2021-07-07 13:28:02 -03:00
parent ff09c98f3b
commit ebfc79756f
No known key found for this signature in database
GPG Key ID: BE4FF68352439FC1
3 changed files with 39 additions and 3 deletions

View File

@ -110,3 +110,18 @@ export function strcmp(s1: string, s2: string): number {
export function j2s(x: any): string { export function j2s(x: any): string {
return JSON.stringify(x, undefined, 2); return JSON.stringify(x, undefined, 2);
} }
/**
* Use this to filter null or undefined from an array in a type-safe fashion
*
* example:
* const array: Array<T | undefined> = [undefined, null]
* const filtered: Array<T> = array.filter(notEmpty)
*
* @param value
* @returns
*/
export function notEmpty<T>(value: T | null | undefined): value is T {
return value !== null && value !== undefined;
}

View File

@ -33,6 +33,7 @@ import {
Codec, Codec,
codecForAmountString, codecForAmountString,
codecForBoolean, codecForBoolean,
codecForList,
codecForNumber, codecForNumber,
codecForString, codecForString,
codecOptional, codecOptional,
@ -41,6 +42,7 @@ import {
getTimestampNow, getTimestampNow,
j2s, j2s,
Logger, Logger,
notEmpty,
NotificationType, NotificationType,
PreparePayResultType, PreparePayResultType,
RecoveryLoadRequest, RecoveryLoadRequest,
@ -520,6 +522,19 @@ export async function processBackupForProvider(
await guardOperationException(run, onOpErr); await guardOperationException(run, onOpErr);
} }
export interface RunBackupCycleRequest {
/**
* List of providers to backup or empty for all known providers.
*/
providers?: Array<string>;
}
export const codecForRunBackupCycle = (): Codec<RunBackupCycleRequest> =>
buildCodecForObject<RunBackupCycleRequest>()
.property("providers", codecOptional(codecForList(codecForString())))
.build("RunBackupCycleRequest");
/** /**
* Do one backup cycle that consists of: * Do one backup cycle that consists of:
* 1. Exporting a backup and try to upload it. * 1. Exporting a backup and try to upload it.
@ -527,11 +542,15 @@ export async function processBackupForProvider(
* 2. Download, verify and import backups from connected sync accounts. * 2. Download, verify and import backups from connected sync accounts.
* 3. Upload the updated backup blob. * 3. Upload the updated backup blob.
*/ */
export async function runBackupCycle(ws: InternalWalletState): Promise<void> { export async function runBackupCycle(ws: InternalWalletState, req: RunBackupCycleRequest): Promise<void> {
const providers = await ws.db const providers = await ws.db
.mktx((x) => ({ backupProviders: x.backupProviders })) .mktx((x) => ({ backupProviders: x.backupProviders }))
.runReadOnly(async (tx) => { .runReadOnly(async (tx) => {
return await tx.backupProviders.iter().toArray(); if (req.providers) {
const rs = await Promise.all(req.providers.map(id => tx.backupProviders.get(id)))
return rs.filter(notEmpty)
}
return await tx.backupProviders.iter(req.providers).toArray();
}); });
const backupJson = await exportBackup(ws); const backupJson = await exportBackup(ws);
const backupConfig = await provideBackupState(ws); const backupConfig = await provideBackupState(ws);

View File

@ -41,6 +41,7 @@ import {
import { import {
addBackupProvider, addBackupProvider,
codecForAddBackupProviderRequest, codecForAddBackupProviderRequest,
codecForRunBackupCycle,
getBackupInfo, getBackupInfo,
getBackupRecovery, getBackupRecovery,
loadBackupRecovery, loadBackupRecovery,
@ -809,7 +810,8 @@ async function dispatchRequestInternal(
return {}; return {};
} }
case "runBackupCycle": { case "runBackupCycle": {
await runBackupCycle(ws); const req = codecForRunBackupCycle().decode(payload);
await runBackupCycle(ws, req);
return {}; return {};
} }
case "exportBackupRecovery": { case "exportBackupRecovery": {