selfprivacy.org.app/lib/logic/models/job.dart

476 lines
12 KiB
Dart
Raw Normal View History

import 'package:easy_localization/easy_localization.dart';
2021-05-25 21:53:54 +00:00
import 'package:equatable/equatable.dart';
2021-06-08 18:52:44 +00:00
import 'package:flutter/material.dart';
import 'package:selfprivacy/config/get_it_config.dart';
2024-01-31 05:14:23 +00:00
import 'package:selfprivacy/logic/models/hive/user.dart';
import 'package:selfprivacy/logic/models/json/server_job.dart';
import 'package:selfprivacy/logic/models/service.dart';
2021-08-18 09:36:40 +00:00
import 'package:selfprivacy/utils/password_generator.dart';
2021-05-25 21:53:54 +00:00
2021-06-08 18:52:44 +00:00
@immutable
abstract class ClientJob extends Equatable {
ClientJob({
2021-05-25 21:53:54 +00:00
required this.title,
2022-06-05 19:36:32 +00:00
final String? id,
this.requiresRebuild = true,
this.status = JobStatusEnum.created,
this.message,
2021-08-18 09:36:40 +00:00
}) : id = id ?? StringGenerators.simpleId();
2021-05-25 21:53:54 +00:00
final String title;
final String id;
final bool requiresRebuild;
final JobStatusEnum status;
final String? message;
2021-05-25 21:53:54 +00:00
bool canAddTo(final List<ClientJob> jobs) => true;
Future<(bool, String)> execute();
2021-05-25 21:53:54 +00:00
@override
List<Object> get props => [id, title, status];
ClientJob copyWithNewStatus({
required final JobStatusEnum status,
final String? message,
});
2021-05-25 21:53:54 +00:00
}
2021-06-08 18:52:44 +00:00
class UpgradeServerJob extends ClientJob {
UpgradeServerJob({
super.status,
super.message,
super.id,
}) : super(title: 'jobs.start_server_upgrade'.tr());
@override
bool canAddTo(final List<ClientJob> jobs) =>
!jobs.any((final job) => job is UpgradeServerJob);
@override
Future<(bool, String)> execute() async => (false, 'unimplemented');
@override
UpgradeServerJob copyWithNewStatus({
required final JobStatusEnum status,
final String? message,
}) =>
UpgradeServerJob(
status: status,
message: message,
id: id,
);
}
class CollectNixGarbageJob extends ClientJob {
CollectNixGarbageJob({
super.status,
super.message,
super.id,
}) : super(title: 'jobs.collect_nix_garbage'.tr());
@override
bool canAddTo(final List<ClientJob> jobs) =>
!jobs.any((final job) => job is CollectNixGarbageJob);
@override
Future<(bool, String)> execute() async {
final result =
await getIt<ApiConnectionRepository>().api.collectNixGarbage();
return (result.success, result.message ?? '');
}
@override
CollectNixGarbageJob copyWithNewStatus({
required final JobStatusEnum status,
final String? message,
}) =>
CollectNixGarbageJob(
status: status,
message: message,
id: id,
);
}
class RebootServerJob extends ClientJob {
RebootServerJob({
super.status,
super.message,
super.id,
}) : super(title: 'jobs.reboot_server'.tr(), requiresRebuild: false);
@override
bool canAddTo(final List<ClientJob> jobs) =>
!jobs.any((final job) => job is RebootServerJob);
@override
Future<(bool, String)> execute() async => (false, 'unimplemented');
@override
RebootServerJob copyWithNewStatus({
required final JobStatusEnum status,
final String? message,
}) =>
RebootServerJob(
status: status,
message: message,
id: id,
);
}
class CreateUserJob extends ClientJob {
2021-06-08 18:52:44 +00:00
CreateUserJob({
required this.user,
super.status,
super.message,
super.id,
}) : super(title: '${"jobs.create_user".tr()} ${user.login}');
2021-06-08 18:52:44 +00:00
final User user;
@override
Future<(bool, String)> execute() async =>
getIt<ApiConnectionRepository>().createUser(user);
2021-06-08 18:52:44 +00:00
@override
List<Object> get props => [...super.props, user];
@override
CreateUserJob copyWithNewStatus({
required final JobStatusEnum status,
final String? message,
}) =>
CreateUserJob(
user: user,
status: status,
message: message,
id: id,
);
2021-06-08 18:52:44 +00:00
}
2021-08-18 10:44:46 +00:00
2022-09-18 20:25:26 +00:00
class ResetUserPasswordJob extends ClientJob {
ResetUserPasswordJob({
required this.user,
super.status,
super.message,
super.id,
}) : super(title: '${"jobs.reset_user_password".tr()} ${user.login}');
2022-09-18 20:25:26 +00:00
final User user;
@override
Future<(bool, String)> execute() async =>
getIt<ApiConnectionRepository>().changeUserPassword(user, user.password!);
2022-09-18 20:25:26 +00:00
@override
List<Object> get props => [...super.props, user];
@override
ResetUserPasswordJob copyWithNewStatus({
required final JobStatusEnum status,
final String? message,
}) =>
ResetUserPasswordJob(
user: user,
status: status,
message: message,
id: id,
);
2022-09-18 20:25:26 +00:00
}
class DeleteUserJob extends ClientJob {
2021-12-20 15:25:31 +00:00
DeleteUserJob({
required this.user,
super.status,
super.message,
super.id,
}) : super(title: '${"jobs.delete_user".tr()} ${user.login}');
2021-12-20 15:25:31 +00:00
final User user;
@override
bool canAddTo(final List<ClientJob> jobs) => !jobs.any(
(final job) => job is DeleteUserJob && job.user.login == user.login,
);
@override
Future<(bool, String)> execute() async =>
getIt<ApiConnectionRepository>().deleteUser(user);
2021-12-20 15:25:31 +00:00
@override
List<Object> get props => [...super.props, user];
@override
DeleteUserJob copyWithNewStatus({
required final JobStatusEnum status,
final String? message,
}) =>
DeleteUserJob(
user: user,
status: status,
message: message,
id: id,
);
2021-12-20 15:25:31 +00:00
}
class ServiceToggleJob extends ClientJob {
2022-01-25 17:00:47 +00:00
ServiceToggleJob({
required this.service,
2021-08-18 10:44:46 +00:00
required this.needToTurnOn,
super.status,
super.message,
super.id,
2021-08-29 15:02:51 +00:00
}) : super(
2022-01-25 17:00:47 +00:00
title:
'${needToTurnOn ? "jobs.service_turn_on".tr() : "jobs.service_turn_off".tr()} ${service.displayName}',
2022-01-25 17:00:47 +00:00
);
2021-08-18 10:44:46 +00:00
final bool needToTurnOn;
final Service service;
@override
bool canAddTo(final List<ClientJob> jobs) => !jobs.any(
(final job) => job is ServiceToggleJob && job.service.id == service.id,
);
@override
Future<(bool, String)> execute() async {
2024-02-21 02:00:45 +00:00
final result = await getIt<ApiConnectionRepository>()
.api
.switchService(service.id, needToTurnOn);
2024-02-21 02:00:45 +00:00
return (result.success, result.message ?? 'jobs.generic_error'.tr());
}
@override
List<Object> get props => [...super.props, service];
@override
ServiceToggleJob copyWithNewStatus({
required final JobStatusEnum status,
final String? message,
}) =>
ServiceToggleJob(
service: service,
needToTurnOn: needToTurnOn,
status: status,
message: message,
id: id,
);
2021-08-18 10:44:46 +00:00
}
2021-09-02 19:32:07 +00:00
class CreateSSHKeyJob extends ClientJob {
CreateSSHKeyJob({
required this.user,
required this.publicKey,
super.status,
super.message,
super.id,
2022-05-24 18:55:39 +00:00
}) : super(title: 'jobs.create_ssh_key'.tr(args: [user.login]));
final User user;
final String publicKey;
2021-09-02 19:32:07 +00:00
@override
Future<(bool, String)> execute() async =>
getIt<ApiConnectionRepository>().addSshKey(user, publicKey);
2021-09-02 19:32:07 +00:00
@override
List<Object> get props => [...super.props, user, publicKey];
@override
CreateSSHKeyJob copyWithNewStatus({
required final JobStatusEnum status,
final String? message,
}) =>
CreateSSHKeyJob(
user: user,
publicKey: publicKey,
status: status,
message: message,
id: id,
);
}
class DeleteSSHKeyJob extends ClientJob {
DeleteSSHKeyJob({
required this.user,
required this.publicKey,
super.status,
super.message,
super.id,
2022-05-24 18:55:39 +00:00
}) : super(title: 'jobs.delete_ssh_key'.tr(args: [user.login]));
final User user;
final String publicKey;
@override
bool canAddTo(final List<ClientJob> jobs) => !jobs.any(
(final job) =>
job is DeleteSSHKeyJob &&
job.publicKey == publicKey &&
job.user.login == user.login,
);
@override
Future<(bool, String)> execute() async =>
getIt<ApiConnectionRepository>().deleteSshKey(user, publicKey);
@override
List<Object> get props => [...super.props, user, publicKey];
@override
DeleteSSHKeyJob copyWithNewStatus({
required final JobStatusEnum status,
final String? message,
}) =>
DeleteSSHKeyJob(
user: user,
publicKey: publicKey,
status: status,
message: message,
id: id,
);
}
abstract class ReplaceableJob extends ClientJob {
ReplaceableJob({
required super.title,
super.id,
super.status,
super.message,
});
bool shouldRemoveInsteadOfAdd(final List<ClientJob> jobs) => false;
}
class ChangeAutoUpgradeSettingsJob extends ReplaceableJob {
ChangeAutoUpgradeSettingsJob({
required this.enable,
required this.allowReboot,
super.status,
super.message,
super.id,
}) : super(title: 'jobs.change_auto_upgrade_settings'.tr());
final bool enable;
final bool allowReboot;
@override
Future<(bool, String)> execute() async => getIt<ApiConnectionRepository>()
.setAutoUpgradeSettings(enable, allowReboot);
@override
bool shouldRemoveInsteadOfAdd(final List<ClientJob> jobs) {
final currentSettings = getIt<ApiConnectionRepository>()
.apiData
.settings
.data
?.autoUpgradeSettings;
if (currentSettings == null) {
return false;
}
return currentSettings.enable == enable &&
currentSettings.allowReboot == allowReboot;
}
@override
List<Object> get props => [...super.props, enable, allowReboot];
@override
ChangeAutoUpgradeSettingsJob copyWithNewStatus({
required final JobStatusEnum status,
final String? message,
}) =>
ChangeAutoUpgradeSettingsJob(
enable: enable,
allowReboot: allowReboot,
status: status,
message: message,
id: id,
);
}
class ChangeServerTimezoneJob extends ReplaceableJob {
ChangeServerTimezoneJob({
required this.timezone,
super.status,
super.message,
super.id,
}) : super(title: 'jobs.change_server_timezone'.tr());
final String timezone;
@override
Future<(bool, String)> execute() async =>
getIt<ApiConnectionRepository>().setServerTimezone(timezone);
@override
bool shouldRemoveInsteadOfAdd(final List<ClientJob> jobs) {
final currentSettings =
getIt<ApiConnectionRepository>().apiData.settings.data?.timezone;
if (currentSettings == null) {
return false;
}
return currentSettings == timezone;
}
@override
List<Object> get props => [...super.props, timezone];
@override
ChangeServerTimezoneJob copyWithNewStatus({
required final JobStatusEnum status,
final String? message,
}) =>
ChangeServerTimezoneJob(
timezone: timezone,
status: status,
message: message,
id: id,
);
2021-09-02 19:32:07 +00:00
}
2024-03-09 16:30:43 +00:00
class ChangeSshSettingsJob extends ReplaceableJob {
ChangeSshSettingsJob({
required this.enable,
required this.passwordAuthentication,
super.status,
super.message,
super.id,
}) : super(title: 'jobs.change_ssh_settings'.tr());
final bool enable;
final bool passwordAuthentication;
@override
Future<(bool, String)> execute() async => getIt<ApiConnectionRepository>()
.setSshSettings(enable, passwordAuthentication);
@override
bool shouldRemoveInsteadOfAdd(final List<ClientJob> jobs) {
final currentSettings =
getIt<ApiConnectionRepository>().apiData.settings.data?.sshSettings;
if (currentSettings == null) {
return false;
}
return currentSettings.enable == enable &&
currentSettings.passwordAuthentication == passwordAuthentication;
}
@override
List<Object> get props => [...super.props, enable, passwordAuthentication];
@override
ChangeSshSettingsJob copyWithNewStatus({
required final JobStatusEnum status,
final String? message,
}) =>
ChangeSshSettingsJob(
enable: enable,
passwordAuthentication: passwordAuthentication,
status: status,
message: message,
id: id,
);
}