2023-06-08 16:27:51 +02:00
|
|
|
import 'dart:async';
|
|
|
|
|
2022-09-26 16:08:56 +02:00
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
import 'package:sqflite/sqflite.dart';
|
|
|
|
|
|
|
|
import 'package:adguard_home_manager/models/server.dart';
|
2023-04-29 00:24:30 +02:00
|
|
|
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';
|
2023-04-29 00:24:30 +02:00
|
|
|
import 'package:adguard_home_manager/services/db/queries.dart';
|
2023-04-06 22:56:32 +02:00
|
|
|
import 'package:adguard_home_manager/constants/enums.dart';
|
2022-09-26 16:08:56 +02:00
|
|
|
|
|
|
|
class ServersProvider with ChangeNotifier {
|
|
|
|
Database? _dbInstance;
|
|
|
|
|
|
|
|
List<Server> _serversList = [];
|
|
|
|
Server? _selectedServer;
|
2023-05-25 15:06:21 +02:00
|
|
|
ApiClient? _apiClient;
|
2022-09-28 15:47:43 +02:00
|
|
|
|
2023-06-08 22:51:15 +02:00
|
|
|
bool _updatingServer = false;
|
|
|
|
|
2023-04-06 22:56:32 +02:00
|
|
|
final UpdateAvailable _updateAvailable = UpdateAvailable(
|
|
|
|
loadStatus: LoadStatus.loading,
|
|
|
|
data: null,
|
|
|
|
);
|
|
|
|
|
2023-05-25 15:06:21 +02:00
|
|
|
ApiClient? get apiClient {
|
|
|
|
return _apiClient;
|
|
|
|
}
|
|
|
|
|
2022-09-26 16:08:56 +02:00
|
|
|
List<Server> get serversList {
|
|
|
|
return _serversList;
|
|
|
|
}
|
|
|
|
|
|
|
|
Server? get selectedServer {
|
|
|
|
return _selectedServer;
|
|
|
|
}
|
|
|
|
|
2023-04-06 22:56:32 +02:00
|
|
|
UpdateAvailable get updateAvailable {
|
|
|
|
return _updateAvailable;
|
|
|
|
}
|
|
|
|
|
2023-06-08 22:51:15 +02:00
|
|
|
bool get updatingServer {
|
|
|
|
return _updatingServer;
|
|
|
|
}
|
|
|
|
|
2022-09-26 16:08:56 +02:00
|
|
|
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
|
|
|
|
2023-05-25 15:06:21 +02:00
|
|
|
void setApiClient(ApiClient client) {
|
|
|
|
_apiClient = client;
|
|
|
|
notifyListeners();
|
|
|
|
}
|
|
|
|
|
2023-06-08 22:51:15 +02:00
|
|
|
void setUpdatingServer(bool status) {
|
|
|
|
_updatingServer = status;
|
|
|
|
notifyListeners();
|
|
|
|
}
|
|
|
|
|
2022-11-01 19:41:41 +01:00
|
|
|
Future<dynamic> createServer(Server server) async {
|
2023-04-29 00:24:30 +02:00
|
|
|
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 {
|
2023-04-29 00:24:30 +02:00
|
|
|
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 {
|
2023-04-29 00:24:30 +02:00
|
|
|
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;
|
2023-05-25 15:06:21 +02:00
|
|
|
|
|
|
|
if (selectedServer != null &&server.id == selectedServer!.id) {
|
|
|
|
_apiClient = ApiClient(server: server);
|
|
|
|
}
|
|
|
|
|
2022-09-26 22:43:30 +02:00
|
|
|
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 {
|
2023-04-29 00:24:30 +02:00
|
|
|
final result = await removeServerQuery(_dbInstance!, server.id);
|
2022-09-26 22:43:30 +02:00
|
|
|
if (result == true) {
|
|
|
|
_selectedServer = null;
|
2023-05-25 15:06:21 +02:00
|
|
|
_apiClient = null;
|
2022-09-26 22:43:30 +02:00
|
|
|
List<Server> newServers = _serversList.where((s) => s.id != server.id).toList();
|
|
|
|
_serversList = newServers;
|
|
|
|
notifyListeners();
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-06-08 16:27:51 +02:00
|
|
|
void checkServerUpdatesAvailable({
|
|
|
|
required Server server,
|
2023-10-04 19:20:43 +02:00
|
|
|
ApiClient? apiClient
|
2023-06-08 16:27:51 +02:00
|
|
|
}) async {
|
2023-10-04 19:20:43 +02:00
|
|
|
final client = apiClient ?? _apiClient;
|
2023-06-08 22:51:15 +02:00
|
|
|
setUpdateAvailableLoadStatus(LoadStatus.loading, true);
|
2023-10-04 19:20:43 +02:00
|
|
|
final result = await client!.checkServerUpdates();
|
2023-04-07 16:48:58 +02:00
|
|
|
if (result['result'] == 'success') {
|
2023-04-15 02:52:23 +02:00
|
|
|
UpdateAvailableData data = UpdateAvailableData.fromJson(result['data']);
|
2023-10-05 09:15:19 +02:00
|
|
|
final gitHubResult = await client.getUpdateChangelog(releaseTag: data.newVersion ?? data.currentVersion);
|
2023-04-15 02:52:23 +02:00
|
|
|
if (gitHubResult['result'] == 'success') {
|
|
|
|
data.changelog = gitHubResult['body'];
|
2023-04-07 16:48:58 +02:00
|
|
|
}
|
2023-06-08 22:51:15 +02:00
|
|
|
setUpdateAvailableData(data);
|
|
|
|
setUpdateAvailableLoadStatus(LoadStatus.loaded, true);
|
2023-04-06 22:56:32 +02:00
|
|
|
}
|
|
|
|
else {
|
2023-06-08 22:51:15 +02:00
|
|
|
setUpdateAvailableLoadStatus(LoadStatus.error, true);
|
2023-04-06 22:56:32 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-10-04 19:20:43 +02:00
|
|
|
Future initializateServer(Server server, ApiClient apiClient) async {
|
2023-05-25 15:06:21 +02:00
|
|
|
final serverStatus = await _apiClient!.getServerStatus();
|
2023-05-24 13:51:22 +02:00
|
|
|
if (serverStatus['result'] == 'success') {
|
2023-06-08 22:51:15 +02:00
|
|
|
checkServerUpdatesAvailable( // Do not await
|
2023-06-08 16:27:51 +02:00
|
|
|
server: server,
|
2023-10-04 19:20:43 +02:00
|
|
|
apiClient: apiClient
|
2023-06-08 22:51:15 +02:00
|
|
|
);
|
2023-05-24 13:51:22 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-05-25 15:11:24 +02:00
|
|
|
Future saveFromDb(List<Map<String, dynamic>>? data) async {
|
2022-09-26 16:08:56 +02:00
|
|
|
if (data != null) {
|
2023-05-24 13:51:22 +02:00
|
|
|
Server? defaultServer;
|
2022-09-26 16:08:56 +02:00
|
|
|
for (var server in data) {
|
|
|
|
final Server serverObj = Server(
|
2022-09-26 18:49:41 +02:00
|
|
|
id: server['id'],
|
2022-09-26 16:08:56 +02:00
|
|
|
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'])!,
|
2022-10-16 23:59:56 +02:00
|
|
|
authToken: server['authToken'],
|
|
|
|
runningOnHa: convertFromIntToBool(server['runningOnHa'])!,
|
2022-09-26 16:08:56 +02:00
|
|
|
);
|
|
|
|
_serversList.add(serverObj);
|
2022-09-26 18:49:41 +02:00
|
|
|
if (convertFromIntToBool(server['defaultServer']) == true) {
|
2023-05-24 13:51:22 +02:00
|
|
|
defaultServer = serverObj;
|
2022-09-26 16:08:56 +02:00
|
|
|
}
|
|
|
|
}
|
2023-05-24 13:51:22 +02:00
|
|
|
|
|
|
|
notifyListeners();
|
|
|
|
|
|
|
|
if (defaultServer != null) {
|
2023-05-25 15:06:21 +02:00
|
|
|
_selectedServer = defaultServer;
|
2023-10-04 19:20:43 +02:00
|
|
|
final client = ApiClient(server: defaultServer);
|
|
|
|
_apiClient = client;
|
|
|
|
initializateServer(defaultServer, client);
|
2023-05-24 13:51:22 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
notifyListeners();
|
|
|
|
return null;
|
2022-09-26 16:08:56 +02:00
|
|
|
}
|
|
|
|
}
|
2023-06-08 16:27:51 +02:00
|
|
|
|
|
|
|
void recheckPeriodServerUpdated() {
|
|
|
|
if (_selectedServer != null) {
|
2023-06-08 22:51:15 +02:00
|
|
|
setUpdatingServer(true);
|
2023-06-08 16:27:51 +02:00
|
|
|
Server server = _selectedServer!;
|
|
|
|
Timer.periodic(
|
|
|
|
const Duration(seconds: 2),
|
2023-06-08 22:51:15 +02:00
|
|
|
(timer) async {
|
2023-06-08 16:27:51 +02:00
|
|
|
if (_selectedServer != null && _selectedServer == server) {
|
2023-06-08 22:51:15 +02:00
|
|
|
final result = await _apiClient!.checkServerUpdates();
|
|
|
|
if (result['result'] == 'success') {
|
|
|
|
UpdateAvailableData data = UpdateAvailableData.fromJsonUpdate(result['data']);
|
|
|
|
if (data.currentVersion == data.newVersion) {
|
|
|
|
final gitHubResult = await _apiClient!.getUpdateChangelog(releaseTag: data.newVersion ?? data.currentVersion);
|
|
|
|
if (gitHubResult['result'] == 'success') {
|
|
|
|
data.changelog = gitHubResult['body'];
|
|
|
|
}
|
|
|
|
setUpdateAvailableData(data);
|
|
|
|
timer.cancel();
|
|
|
|
setUpdatingServer(false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
timer.cancel();
|
|
|
|
setUpdatingServer(false);
|
|
|
|
}
|
2023-06-08 16:27:51 +02:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
timer.cancel();
|
2023-06-08 22:51:15 +02:00
|
|
|
setUpdatingServer(false);
|
2023-06-08 16:27:51 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
2022-09-26 16:08:56 +02:00
|
|
|
}
|