adguard-home-manager/lib/providers/servers_provider.dart

229 lines
6.2 KiB
Dart
Raw Normal View History

import 'package:flutter/material.dart';
import 'package:sqflite/sqflite.dart';
2022-10-19 20:26:40 +02:00
import 'package:adguard_home_manager/models/dns_info.dart';
import 'package:adguard_home_manager/models/server.dart';
import 'package:adguard_home_manager/models/update_available.dart';
2022-10-22 23:06:27 +02:00
import 'package:adguard_home_manager/services/http_requests.dart';
import 'package:adguard_home_manager/functions/conversions.dart';
import 'package:adguard_home_manager/services/db/queries.dart';
2023-04-06 22:56:32 +02:00
import 'package:adguard_home_manager/functions/compare_versions.dart';
import 'package:adguard_home_manager/constants/enums.dart';
class ServersProvider with ChangeNotifier {
Database? _dbInstance;
List<Server> _serversList = [];
Server? _selectedServer;
2022-09-28 15:47:43 +02:00
2023-04-06 22:56:32 +02:00
final UpdateAvailable _updateAvailable = UpdateAvailable(
loadStatus: LoadStatus.loading,
data: null,
);
List<Server> get serversList {
return _serversList;
}
Server? get selectedServer {
return _selectedServer;
}
2023-04-06 22:56:32 +02:00
UpdateAvailable get updateAvailable {
return _updateAvailable;
}
void setDbInstance(Database db) {
_dbInstance = db;
}
void addServer(Server server) {
_serversList.add(server);
notifyListeners();
}
2022-09-26 22:43:30 +02:00
void setSelectedServer(Server server) {
_selectedServer = server;
notifyListeners();
}
2022-10-15 14:47:32 +02:00
2023-04-06 22:56:32 +02:00
void setUpdateAvailableLoadStatus(LoadStatus status, bool notify) {
_updateAvailable.loadStatus = status;
if (notify == true) {
notifyListeners();
}
}
void setUpdateAvailableData(UpdateAvailableData data) {
_updateAvailable.data = data;
notifyListeners();
}
2023-04-14 01:40:40 +02:00
2022-11-01 19:41:41 +01:00
Future<dynamic> createServer(Server server) async {
final saved = await saveServerQuery(_dbInstance!, server);
2022-11-01 19:41:41 +01:00
if (saved == null) {
2022-09-26 18:49:41 +02:00
if (server.defaultServer == true) {
final defaultServer = await setDefaultServer(server);
2022-11-01 19:41:41 +01:00
if (defaultServer == null) {
2022-09-26 18:49:41 +02:00
_serversList.add(server);
notifyListeners();
2022-11-01 19:41:41 +01:00
return null;
2022-09-26 18:49:41 +02:00
}
else {
2022-11-01 19:41:41 +01:00
return defaultServer;
2022-09-26 18:49:41 +02:00
}
}
else {
_serversList.add(server);
notifyListeners();
2022-11-01 19:41:41 +01:00
return null;
2022-09-26 18:49:41 +02:00
}
}
else {
2022-11-01 19:41:41 +01:00
return saved;
2022-09-26 18:49:41 +02:00
}
}
2022-11-01 19:41:41 +01:00
Future<dynamic> setDefaultServer(Server server) async {
final updated = await setDefaultServerQuery(_dbInstance!, server.id);
2022-11-01 19:41:41 +01:00
if (updated == null) {
2022-09-26 18:49:41 +02:00
List<Server> newServers = _serversList.map((s) {
if (s.id == server.id) {
s.defaultServer = true;
return s;
}
else {
s.defaultServer = false;
return s;
}
}).toList();
_serversList = newServers;
notifyListeners();
2022-11-01 19:41:41 +01:00
return null;
2022-09-26 18:49:41 +02:00
}
else {
2022-11-01 19:41:41 +01:00
return updated;
2022-09-26 18:49:41 +02:00
}
}
2022-11-01 19:41:41 +01:00
Future<dynamic> editServer(Server server) async {
final result = await editServerQuery(_dbInstance!, server);
2022-11-01 19:41:41 +01:00
if (result == null) {
2022-09-26 22:43:30 +02:00
List<Server> newServers = _serversList.map((s) {
if (s.id == server.id) {
return server;
}
else {
return s;
}
}).toList();
_serversList = newServers;
notifyListeners();
2022-11-01 19:41:41 +01:00
return null;
2022-09-26 22:43:30 +02:00
}
else {
2022-11-01 19:41:41 +01:00
return result;
2022-09-26 22:43:30 +02:00
}
}
Future<bool> removeServer(Server server) async {
final result = await removeServerQuery(_dbInstance!, server.id);
2022-09-26 22:43:30 +02:00
if (result == true) {
_selectedServer = null;
List<Server> newServers = _serversList.where((s) => s.id != server.id).toList();
_serversList = newServers;
notifyListeners();
return true;
}
else {
return false;
}
}
2023-04-06 22:56:32 +02:00
void checkServerUpdatesAvailable(Server server) async {
setUpdateAvailableLoadStatus(LoadStatus.loading, true);
2023-04-07 16:48:58 +02:00
final result = await checkServerUpdates(server: server);
if (result['result'] == 'success') {
2023-04-15 02:52:23 +02:00
UpdateAvailableData data = UpdateAvailableData.fromJson(result['data']);
final gitHubResult = await getUpdateChangelog(server: server, releaseTag: data.newVersion ?? data.currentVersion);
if (gitHubResult['result'] == 'success') {
data.changelog = gitHubResult['body'];
2023-04-07 16:48:58 +02:00
}
2023-04-15 02:52:23 +02:00
data.updateAvailable = data.newVersion != null
? compareVersions(
currentVersion: data.currentVersion,
newVersion: data.newVersion!,
)
2023-04-15 02:52:23 +02:00
: false;
setUpdateAvailableData(data);
setUpdateAvailableLoadStatus(LoadStatus.loaded, true);
2023-04-06 22:56:32 +02:00
}
else {
setUpdateAvailableLoadStatus(LoadStatus.error, true);
}
}
void clearUpdateAvailable(Server server, String newCurrentVersion) {
if (_updateAvailable.data != null) {
_updateAvailable.data!.updateAvailable = null;
_updateAvailable.data!.currentVersion = newCurrentVersion;
notifyListeners();
}
}
Future<Map<String, dynamic>> initializateServer(Server server) async {
_selectedServer = server;
final serverStatus = await getServerStatus(server);
if (serverStatus['result'] == 'success') {
checkServerUpdatesAvailable(server); // Do not await
return {
"success": true,
"serverData": serverStatus['data']
};
}
else {
return {
"success": false
};
}
}
Future<Map<String, dynamic>?> saveFromDb(List<Map<String, dynamic>>? data) async {
if (data != null) {
Server? defaultServer;
for (var server in data) {
final Server serverObj = Server(
2022-09-26 18:49:41 +02:00
id: server['id'],
name: server['name'],
connectionMethod: server['connectionMethod'],
domain: server['domain'],
path: server['path'],
port: server['port'],
user: server['user'],
password: server['password'],
2022-09-26 18:49:41 +02:00
defaultServer: convertFromIntToBool(server['defaultServer'])!,
authToken: server['authToken'],
runningOnHa: convertFromIntToBool(server['runningOnHa'])!,
);
_serversList.add(serverObj);
2022-09-26 18:49:41 +02:00
if (convertFromIntToBool(server['defaultServer']) == true) {
defaultServer = serverObj;
}
}
notifyListeners();
if (defaultServer != null) {
final result = await initializateServer(defaultServer);
return result;
}
else {
return null;
}
}
else {
notifyListeners();
return null;
}
}
}