refactor: Move backup business logic to BackupsCubit
This commit is contained in:
parent
08988ed10b
commit
8f6cb77cc4
|
@ -29,6 +29,8 @@ class BackupsCubit extends ServerInstallationDependendCubit<BackupsState> {
|
||||||
final BackblazeBucket? bucket = getIt<ApiConfigModel>().backblazeBucket;
|
final BackblazeBucket? bucket = getIt<ApiConfigModel>().backblazeBucket;
|
||||||
final BackupConfiguration? backupConfig =
|
final BackupConfiguration? backupConfig =
|
||||||
await api.getBackupsConfiguration();
|
await api.getBackupsConfiguration();
|
||||||
|
final BackupsCredential? backupsCredential =
|
||||||
|
getIt<ApiConfigModel>().backblazeCredential;
|
||||||
final List<Backup> backups = await api.getBackups();
|
final List<Backup> backups = await api.getBackups();
|
||||||
backups.sort((final a, final b) => b.time.compareTo(a.time));
|
backups.sort((final a, final b) => b.time.compareTo(a.time));
|
||||||
emit(
|
emit(
|
||||||
|
@ -37,6 +39,7 @@ class BackupsCubit extends ServerInstallationDependendCubit<BackupsState> {
|
||||||
isInitialized: backupConfig?.isInitialized,
|
isInitialized: backupConfig?.isInitialized,
|
||||||
autobackupPeriod: backupConfig?.autobackupPeriod ?? Duration.zero,
|
autobackupPeriod: backupConfig?.autobackupPeriod ?? Duration.zero,
|
||||||
autobackupQuotas: backupConfig?.autobackupQuotas,
|
autobackupQuotas: backupConfig?.autobackupQuotas,
|
||||||
|
backupsCredential: backupsCredential,
|
||||||
backups: backups,
|
backups: backups,
|
||||||
preventActions: false,
|
preventActions: false,
|
||||||
refreshing: false,
|
refreshing: false,
|
||||||
|
@ -45,6 +48,19 @@ class BackupsCubit extends ServerInstallationDependendCubit<BackupsState> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<void> setBackupsKey(
|
||||||
|
final String keyId,
|
||||||
|
final String applicationKey,
|
||||||
|
) async {
|
||||||
|
final BackupsCredential backupsCredential = BackupsCredential(
|
||||||
|
keyId: keyId,
|
||||||
|
applicationKey: applicationKey,
|
||||||
|
provider: BackupsProviderType.backblaze,
|
||||||
|
);
|
||||||
|
await getIt<ApiConfigModel>().storeBackblazeCredential(backupsCredential);
|
||||||
|
emit(state.copyWith(backupsCredential: backupsCredential));
|
||||||
|
}
|
||||||
|
|
||||||
Future<void> initializeBackups() async {
|
Future<void> initializeBackups() async {
|
||||||
emit(state.copyWith(preventActions: true));
|
emit(state.copyWith(preventActions: true));
|
||||||
final String? encryptionKey =
|
final String? encryptionKey =
|
||||||
|
|
|
@ -10,6 +10,7 @@ class BackupsState extends ServerInstallationDependendState {
|
||||||
this.autobackupPeriod,
|
this.autobackupPeriod,
|
||||||
this.backblazeBucket,
|
this.backblazeBucket,
|
||||||
this.autobackupQuotas,
|
this.autobackupQuotas,
|
||||||
|
this.backupsCredential,
|
||||||
});
|
});
|
||||||
|
|
||||||
final bool isInitialized;
|
final bool isInitialized;
|
||||||
|
@ -20,6 +21,7 @@ class BackupsState extends ServerInstallationDependendState {
|
||||||
final Duration? autobackupPeriod;
|
final Duration? autobackupPeriod;
|
||||||
final BackblazeBucket? backblazeBucket;
|
final BackblazeBucket? backblazeBucket;
|
||||||
final AutobackupQuotas? autobackupQuotas;
|
final AutobackupQuotas? autobackupQuotas;
|
||||||
|
final BackupsCredential? backupsCredential;
|
||||||
|
|
||||||
List<Backup> serviceBackups(final String serviceId) => backups
|
List<Backup> serviceBackups(final String serviceId) => backups
|
||||||
.where((final backup) => backup.serviceId == serviceId)
|
.where((final backup) => backup.serviceId == serviceId)
|
||||||
|
@ -43,6 +45,7 @@ class BackupsState extends ServerInstallationDependendState {
|
||||||
final Duration? autobackupPeriod,
|
final Duration? autobackupPeriod,
|
||||||
final BackblazeBucket? backblazeBucket,
|
final BackblazeBucket? backblazeBucket,
|
||||||
final AutobackupQuotas? autobackupQuotas,
|
final AutobackupQuotas? autobackupQuotas,
|
||||||
|
final BackupsCredential? backupsCredential,
|
||||||
}) =>
|
}) =>
|
||||||
BackupsState(
|
BackupsState(
|
||||||
isInitialized: isInitialized ?? this.isInitialized,
|
isInitialized: isInitialized ?? this.isInitialized,
|
||||||
|
@ -50,12 +53,13 @@ class BackupsState extends ServerInstallationDependendState {
|
||||||
preventActions: preventActions ?? this.preventActions,
|
preventActions: preventActions ?? this.preventActions,
|
||||||
refreshTimer: refreshTimer ?? this.refreshTimer,
|
refreshTimer: refreshTimer ?? this.refreshTimer,
|
||||||
refreshing: refreshing ?? this.refreshing,
|
refreshing: refreshing ?? this.refreshing,
|
||||||
|
backupsCredential: backupsCredential ?? this.backupsCredential,
|
||||||
|
backblazeBucket: backblazeBucket ?? this.backblazeBucket,
|
||||||
|
autobackupQuotas: autobackupQuotas ?? this.autobackupQuotas,
|
||||||
// The autobackupPeriod might be null, so if the duration is set to 0, we
|
// The autobackupPeriod might be null, so if the duration is set to 0, we
|
||||||
// set it to null.
|
// set it to null.
|
||||||
autobackupPeriod: autobackupPeriod?.inSeconds == 0
|
autobackupPeriod: autobackupPeriod?.inSeconds == 0
|
||||||
? null
|
? null
|
||||||
: autobackupPeriod ?? this.autobackupPeriod,
|
: autobackupPeriod ?? this.autobackupPeriod,
|
||||||
backblazeBucket: backblazeBucket ?? this.backblazeBucket,
|
|
||||||
autobackupQuotas: autobackupQuotas ?? this.autobackupQuotas,
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,12 +2,12 @@ import 'dart:async';
|
||||||
import 'package:cubit_form/cubit_form.dart';
|
import 'package:cubit_form/cubit_form.dart';
|
||||||
import 'package:selfprivacy/config/get_it_config.dart';
|
import 'package:selfprivacy/config/get_it_config.dart';
|
||||||
import 'package:selfprivacy/logic/api_maps/rest_maps/backblaze.dart';
|
import 'package:selfprivacy/logic/api_maps/rest_maps/backblaze.dart';
|
||||||
import 'package:selfprivacy/logic/cubit/server_installation/server_installation_cubit.dart';
|
import 'package:selfprivacy/logic/cubit/backups/backups_cubit.dart';
|
||||||
import 'package:selfprivacy/logic/models/hive/backups_credential.dart';
|
import 'package:selfprivacy/logic/models/hive/backups_credential.dart';
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
|
|
||||||
class BackblazeFormCubit extends FormCubit {
|
class BackblazeFormCubit extends FormCubit {
|
||||||
BackblazeFormCubit(this.serverInstallationCubit) {
|
BackblazeFormCubit(this.backupsCubit) {
|
||||||
keyId = FieldCubit(
|
keyId = FieldCubit(
|
||||||
initalValue: '',
|
initalValue: '',
|
||||||
validations: [
|
validations: [
|
||||||
|
@ -27,13 +27,13 @@ class BackblazeFormCubit extends FormCubit {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
FutureOr<void> onSubmit() async {
|
FutureOr<void> onSubmit() async {
|
||||||
serverInstallationCubit.setBackblazeKey(
|
await backupsCubit.setBackupsKey(
|
||||||
keyId.state.value,
|
keyId.state.value,
|
||||||
applicationKey.state.value,
|
applicationKey.state.value,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
final ServerInstallationCubit serverInstallationCubit;
|
final BackupsCubit backupsCubit;
|
||||||
|
|
||||||
late final FieldCubit<String> keyId;
|
late final FieldCubit<String> keyId;
|
||||||
late final FieldCubit<String> applicationKey;
|
late final FieldCubit<String> applicationKey;
|
||||||
|
|
|
@ -5,11 +5,8 @@ import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:equatable/equatable.dart';
|
import 'package:equatable/equatable.dart';
|
||||||
import 'package:selfprivacy/config/get_it_config.dart';
|
import 'package:selfprivacy/config/get_it_config.dart';
|
||||||
import 'package:selfprivacy/logic/api_maps/graphql_maps/server_api/server_api.dart';
|
import 'package:selfprivacy/logic/api_maps/graphql_maps/server_api/server_api.dart';
|
||||||
import 'package:selfprivacy/logic/api_maps/rest_maps/backblaze.dart';
|
|
||||||
import 'package:selfprivacy/logic/api_maps/tls_options.dart';
|
import 'package:selfprivacy/logic/api_maps/tls_options.dart';
|
||||||
import 'package:selfprivacy/logic/models/disk_size.dart';
|
import 'package:selfprivacy/logic/models/disk_size.dart';
|
||||||
import 'package:selfprivacy/logic/models/hive/backblaze_bucket.dart';
|
|
||||||
import 'package:selfprivacy/logic/models/hive/backups_credential.dart';
|
|
||||||
import 'package:selfprivacy/logic/models/callback_dialogue_branching.dart';
|
import 'package:selfprivacy/logic/models/callback_dialogue_branching.dart';
|
||||||
import 'package:selfprivacy/logic/models/hive/server_details.dart';
|
import 'package:selfprivacy/logic/models/hive/server_details.dart';
|
||||||
import 'package:selfprivacy/logic/models/hive/user.dart';
|
import 'package:selfprivacy/logic/models/hive/user.dart';
|
||||||
|
@ -214,33 +211,6 @@ class ServerInstallationCubit extends Cubit<ServerInstallationState> {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void setBackblazeKey(final String keyId, final String applicationKey) async {
|
|
||||||
final BackupsCredential backblazeCredential = BackupsCredential(
|
|
||||||
keyId: keyId,
|
|
||||||
applicationKey: applicationKey,
|
|
||||||
provider: BackupsProviderType.backblaze,
|
|
||||||
);
|
|
||||||
final BackblazeBucket? bucket;
|
|
||||||
await repository.saveBackblazeKey(backblazeCredential);
|
|
||||||
if (state is ServerInstallationRecovery) {
|
|
||||||
final configuration = await ServerApi(
|
|
||||||
customToken:
|
|
||||||
(state as ServerInstallationRecovery).serverDetails!.apiToken,
|
|
||||||
isWithToken: true,
|
|
||||||
).getBackupsConfiguration();
|
|
||||||
if (configuration != null) {
|
|
||||||
try {
|
|
||||||
bucket = await BackblazeApi()
|
|
||||||
.fetchBucket(backblazeCredential, configuration);
|
|
||||||
await getIt<ApiConfigModel>().storeBackblazeBucket(bucket!);
|
|
||||||
} catch (e) {
|
|
||||||
print(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void setDomain(final ServerDomain serverDomain) async {
|
void setDomain(final ServerDomain serverDomain) async {
|
||||||
await repository.saveDomain(serverDomain);
|
await repository.saveDomain(serverDomain);
|
||||||
emit(
|
emit(
|
||||||
|
|
|
@ -75,7 +75,7 @@ class BackupDetailsPage extends StatelessWidget {
|
||||||
BrandButton.rised(
|
BrandButton.rised(
|
||||||
onPressed: preventActions
|
onPressed: preventActions
|
||||||
? null
|
? null
|
||||||
: () => context.pushRoute(const BackupProviderPicker()),
|
: () => context.pushRoute(const BackupProviderPickerRoute()),
|
||||||
text: 'backup.initialize'.tr(),
|
text: 'backup.initialize'.tr(),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|
|
@ -8,8 +8,8 @@ import 'package:selfprivacy/ui/components/buttons/brand_button.dart';
|
||||||
import 'package:selfprivacy/ui/layouts/responsive_layout_with_infobox.dart';
|
import 'package:selfprivacy/ui/layouts/responsive_layout_with_infobox.dart';
|
||||||
|
|
||||||
@RoutePage()
|
@RoutePage()
|
||||||
class BackupProviderPicker extends StatelessWidget {
|
class BackupProviderPickerPage extends StatelessWidget {
|
||||||
const BackupProviderPicker({
|
const BackupProviderPickerPage({
|
||||||
super.key,
|
super.key,
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,79 +0,0 @@
|
||||||
import 'package:cubit_form/cubit_form.dart';
|
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:selfprivacy/logic/cubit/forms/setup/initializing/backblaze_form_cubit.dart';
|
|
||||||
import 'package:selfprivacy/logic/cubit/server_installation/server_installation_cubit.dart';
|
|
||||||
import 'package:selfprivacy/logic/cubit/support_system/support_system_cubit.dart';
|
|
||||||
import 'package:selfprivacy/ui/components/buttons/brand_button.dart';
|
|
||||||
import 'package:selfprivacy/ui/layouts/brand_hero_screen.dart';
|
|
||||||
|
|
||||||
class RecoveryConfirmBackblaze extends StatelessWidget {
|
|
||||||
const RecoveryConfirmBackblaze({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(final BuildContext context) {
|
|
||||||
final ServerInstallationCubit appConfig =
|
|
||||||
context.watch<ServerInstallationCubit>();
|
|
||||||
|
|
||||||
return BlocProvider(
|
|
||||||
create: (final BuildContext context) => BackblazeFormCubit(appConfig),
|
|
||||||
child: Builder(
|
|
||||||
builder: (final BuildContext context) {
|
|
||||||
final FormCubitState formCubitState =
|
|
||||||
context.watch<BackblazeFormCubit>().state;
|
|
||||||
|
|
||||||
return BrandHeroScreen(
|
|
||||||
heroTitle: 'recovering.provider_connected'.tr(args: ['Backblaze']),
|
|
||||||
heroSubtitle: 'recovering.provider_connected_description'.tr(
|
|
||||||
args: ['Backblaze'],
|
|
||||||
),
|
|
||||||
hasBackButton: true,
|
|
||||||
ignoreBreakpoints: true,
|
|
||||||
hasSupportDrawer: true,
|
|
||||||
onBackButtonPressed: () {
|
|
||||||
Navigator.of(context).popUntil((final route) => route.isFirst);
|
|
||||||
},
|
|
||||||
hasFlashButton: false,
|
|
||||||
children: [
|
|
||||||
CubitFormTextField(
|
|
||||||
autofocus: true,
|
|
||||||
formFieldCubit: context.read<BackblazeFormCubit>().keyId,
|
|
||||||
decoration: const InputDecoration(
|
|
||||||
border: OutlineInputBorder(),
|
|
||||||
labelText: 'KeyID',
|
|
||||||
),
|
|
||||||
),
|
|
||||||
const SizedBox(height: 16),
|
|
||||||
CubitFormTextField(
|
|
||||||
formFieldCubit:
|
|
||||||
context.read<BackblazeFormCubit>().applicationKey,
|
|
||||||
decoration: const InputDecoration(
|
|
||||||
border: OutlineInputBorder(),
|
|
||||||
labelText: 'Master Application Key',
|
|
||||||
),
|
|
||||||
),
|
|
||||||
const SizedBox(height: 16),
|
|
||||||
BrandButton.rised(
|
|
||||||
onPressed: formCubitState.isSubmitting
|
|
||||||
? null
|
|
||||||
: () => context.read<BackblazeFormCubit>().trySubmit(),
|
|
||||||
text: 'basis.connect'.tr(),
|
|
||||||
),
|
|
||||||
const SizedBox(height: 16),
|
|
||||||
Builder(
|
|
||||||
builder: (final context) => BrandButton.text(
|
|
||||||
onPressed: () =>
|
|
||||||
context.read<SupportSystemCubit>().showArticle(
|
|
||||||
article: 'how_backblaze',
|
|
||||||
context: context,
|
|
||||||
),
|
|
||||||
title: 'initializing.how'.tr(),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -25,6 +25,7 @@ import 'package:selfprivacy/ui/pages/services/services.dart';
|
||||||
import 'package:selfprivacy/ui/pages/setup/initializing/initializing.dart';
|
import 'package:selfprivacy/ui/pages/setup/initializing/initializing.dart';
|
||||||
import 'package:selfprivacy/ui/pages/setup/recovering/recovery_routing.dart';
|
import 'package:selfprivacy/ui/pages/setup/recovering/recovery_routing.dart';
|
||||||
import 'package:selfprivacy/ui/pages/users/users.dart';
|
import 'package:selfprivacy/ui/pages/users/users.dart';
|
||||||
|
import 'package:selfprivacy/ui/pages/backups/backup_provider_picker_page.dart';
|
||||||
|
|
||||||
part 'router.gr.dart';
|
part 'router.gr.dart';
|
||||||
|
|
||||||
|
@ -100,7 +101,7 @@ class RootRouter extends _$RootRouter {
|
||||||
AutoRoute(page: BackupsListRoute.page),
|
AutoRoute(page: BackupsListRoute.page),
|
||||||
AutoRoute(page: ServerStorageRoute.page),
|
AutoRoute(page: ServerStorageRoute.page),
|
||||||
AutoRoute(page: ExtendingVolumeRoute.page),
|
AutoRoute(page: ExtendingVolumeRoute.page),
|
||||||
AutoRoute(page: BackupProviderPicker.page),
|
AutoRoute(page: BackupProviderPickerRoute.page),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
AutoRoute(page: ServicesMigrationRoute.page),
|
AutoRoute(page: ServicesMigrationRoute.page),
|
||||||
|
|
|
@ -186,10 +186,10 @@ abstract class _$RootRouter extends RootStackRouter {
|
||||||
child: const RecoveryRouting(),
|
child: const RecoveryRouting(),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
BackupProviderPicker.name: (routeData) {
|
BackupProviderPickerRoute.name: (routeData) {
|
||||||
return AutoRoutePage<dynamic>(
|
return AutoRoutePage<dynamic>(
|
||||||
routeData: routeData,
|
routeData: routeData,
|
||||||
child: const BackupProviderPicker(),
|
child: const BackupProviderPickerPage(),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
@ -691,15 +691,15 @@ class RecoveryRoute extends PageRouteInfo<void> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// generated route for
|
/// generated route for
|
||||||
/// [BackupProviderPicker]
|
/// [BackupProviderPickerPage]
|
||||||
class BackupProviderPicker extends PageRouteInfo<void> {
|
class BackupProviderPickerRoute extends PageRouteInfo<void> {
|
||||||
const BackupProviderPicker({List<PageRouteInfo>? children})
|
const BackupProviderPickerRoute({List<PageRouteInfo>? children})
|
||||||
: super(
|
: super(
|
||||||
BackupProviderPicker.name,
|
BackupProviderPickerRoute.name,
|
||||||
initialChildren: children,
|
initialChildren: children,
|
||||||
);
|
);
|
||||||
|
|
||||||
static const String name = 'BackupProviderPicker';
|
static const String name = 'BackupProviderPickerRoute';
|
||||||
|
|
||||||
static const PageInfo<void> page = PageInfo<void>(name);
|
static const PageInfo<void> page = PageInfo<void>(name);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue