Finish recovery flow cubit

pull/90/head
Inex Code 2022-05-23 17:21:34 +03:00
parent eddeac57d6
commit fa6f74e884
6 changed files with 82 additions and 13 deletions

View File

@ -311,7 +311,8 @@
"confirm_server_decline": "Choose a different server", "confirm_server_decline": "Choose a different server",
"choose_server": "Choose your server", "choose_server": "Choose your server",
"choose_server_description": "We couldn't figure out which server your are trying to connect to.", "choose_server_description": "We couldn't figure out which server your are trying to connect to.",
"no_servers": "There is no available servers on your account." "no_servers": "There is no available servers on your account.",
"domain_not_available_on_token": "Selected domain is not available on this token."
}, },
"modals": { "modals": {

View File

@ -313,7 +313,9 @@
"confirm_server_decline": "Выбрать другой сервер", "confirm_server_decline": "Выбрать другой сервер",
"choose_server": "Выберите сервер", "choose_server": "Выберите сервер",
"choose_server_description": "Не удалось определить, с каким сервером вы устанавливаете связь.", "choose_server_description": "Не удалось определить, с каким сервером вы устанавливаете связь.",
"no_servers": "На вашем аккаунте нет доступных серверов." "no_servers": "На вашем аккаунте нет доступных серверов.",
"domain_not_available_on_token": "Введённый токен не имеет доступа к нужному домену."
}, },
"modals": { "modals": {
"_comment": "messages in modals", "_comment": "messages in modals",

View File

@ -153,13 +153,15 @@ class ServerApi extends ApiMap {
); );
} }
Future<ApiResponse<List<String>>> getUsersList() async { Future<ApiResponse<List<String>>> getUsersList(
{withMainUser = false}
) async {
List<String> res = []; List<String> res = [];
Response response; Response response;
var client = await getClient(); var client = await getClient();
try { try {
response = await client.get('/users'); response = await client.get('/users', queryParameters: withMainUser ? {'withMainUser': 'true'} : null);
for (var user in response.data) { for (var user in response.data) {
res.add(user.toString()); res.add(user.toString());
} }

View File

@ -75,6 +75,15 @@ class ServerInstallationCubit extends Cubit<ServerInstallationState> {
applicationKey: applicationKey, applicationKey: applicationKey,
); );
await repository.saveBackblazeKey(backblazeCredential); await repository.saveBackblazeKey(backblazeCredential);
if (state is ServerInstallationRecovery) {
final mainUser = await repository.getMainUser();
final updatedState = (state as ServerInstallationRecovery).copyWith(
backblazeCredential: backblazeCredential,
rootUser: mainUser,
);
emit(updatedState.finish());
return;
}
emit((state as ServerInstallationNotFinished) emit((state as ServerInstallationNotFinished)
.copyWith(backblazeCredential: backblazeCredential)); .copyWith(backblazeCredential: backblazeCredential));
} }
@ -410,14 +419,27 @@ class ServerInstallationCubit extends Cubit<ServerInstallationState> {
)); ));
} }
// Future<void> setAndValidateCloudflareToken(String token) async { Future<void> setAndValidateCloudflareToken(String token) async {
// final dataState = this.state as ServerInstallationRecovery; final dataState = this.state as ServerInstallationRecovery;
// final serverDomain = dataState.serverDomain; final serverDomain = dataState.serverDomain;
// if (serverDomain == null) { if (serverDomain == null) {
// return; return;
// } }
// final domainId = await repository.getDomainId(serverDomain.domainName); final zoneId = await repository.getDomainId(token, serverDomain.domainName);
// } if (zoneId == null) {
getIt<NavigationService>()
.showSnackBar('recovering.domain_not_available_on_token'.tr());
return;
}
emit(dataState.copyWith(
serverDomain: ServerDomain(
domainName: serverDomain.domainName,
zoneId: zoneId,
provider: DnsProvider.Cloudflare,
),
currentStep: RecoveryStep.BackblazeToken,
));
}
@override @override
void onChange(Change<ServerInstallationState> change) { void onChange(Change<ServerInstallationState> change) {

View File

@ -346,7 +346,7 @@ class ServerInstallationRepository {
} }
try { try {
final parsedVersion = Version.parse(serverApiVersion); final parsedVersion = Version.parse(serverApiVersion);
if (parsedVersion.major == 1 && parsedVersion.minor < 2) { if (!VersionConstraint.parse('>=1.2.0').allows(parsedVersion)) {
return ServerRecoveryCapabilities.legacy; return ServerRecoveryCapabilities.legacy;
} }
return ServerRecoveryCapabilities.loginTokens; return ServerRecoveryCapabilities.loginTokens;
@ -485,6 +485,34 @@ class ServerInstallationRepository {
); );
} }
Future<User> getMainUser() async {
var serverApi = ServerApi();
final fallbackUser = User(
isFoundOnServer: false,
note: 'Couldn\'t find main user on server, API is outdated',
login: 'UNKNOWN',
sshKeys: [],
);
final serverApiVersion = await serverApi.getApiVersion();
final users = await serverApi.getUsersList(withMainUser: true);
if (serverApiVersion == null || !users.isSuccess) {
return fallbackUser;
}
try {
final parsedVersion = Version.parse(serverApiVersion);
if (!VersionConstraint.parse('>=1.2.5').allows(parsedVersion)) {
return fallbackUser;
}
return User(
isFoundOnServer: true,
login: users.data[0],
);
} on FormatException {
return fallbackUser;
}
}
Future<List<ServerBasicInfo>> getServersOnHetznerAccount() async { Future<List<ServerBasicInfo>> getServersOnHetznerAccount() async {
var hetznerApi = HetznerApi(); var hetznerApi = HetznerApi();
final servers = await hetznerApi.getServers(); final servers = await hetznerApi.getServers();

View File

@ -336,4 +336,18 @@ class ServerInstallationRecovery extends ServerInstallationState {
currentStep: currentStep ?? this.currentStep, currentStep: currentStep ?? this.currentStep,
recoveryCapabilities: recoveryCapabilities ?? this.recoveryCapabilities, recoveryCapabilities: recoveryCapabilities ?? this.recoveryCapabilities,
); );
ServerInstallationFinished finish() {
return ServerInstallationFinished(
hetznerKey: hetznerKey!,
cloudFlareKey: cloudFlareKey!,
backblazeCredential: backblazeCredential!,
serverDomain: serverDomain!,
rootUser: rootUser!,
serverDetails: serverDetails!,
isServerStarted: true,
isServerResetedFirstTime: true,
isServerResetedSecondTime: true,
);
}
} }