import 'package:flutter/material.dart'; import 'package:sqflite/sqflite.dart'; import 'package:adguard_home_manager/services/http_requests.dart'; import 'package:adguard_home_manager/models/server_status.dart'; import 'package:adguard_home_manager/functions/conversions.dart'; import 'package:adguard_home_manager/models/server.dart'; class ServersProvider with ChangeNotifier { Database? _dbInstance; List _serversList = []; Server? _selectedServer; final ServerStatus _serverStatus = ServerStatus( loadStatus: 0, // 0 = loading, 1 = loaded, 2 = error data: null ); // serverStatus != null means server is connected List _protectionsManagementProcess = []; // protections that are currenty being enabled or disabled List get serversList { return _serversList; } Server? get selectedServer { return _selectedServer; } ServerStatus get serverStatus { return _serverStatus; } List get protectionsManagementProcess { return _protectionsManagementProcess; } void setDbInstance(Database db) { _dbInstance = db; } void addServer(Server server) { _serversList.add(server); notifyListeners(); } void setSelectedServer(Server server) { _selectedServer = server; notifyListeners(); } void setServerStatusData(ServerStatusData data) { _serverStatus.data = data; notifyListeners(); } void setServerStatusLoad(int status) { _serverStatus.loadStatus = status; notifyListeners(); } Future createServer(Server server) async { final saved = await saveServerIntoDb(server); if (saved == true) { if (server.defaultServer == true) { final defaultServer = await setDefaultServer(server); if (defaultServer == true) { _serversList.add(server); notifyListeners(); return true; } else { return false; } } else { _serversList.add(server); notifyListeners(); return true; } } else { return false; } } Future setDefaultServer(Server server) async { final updated = await setDefaultServerDb(server.id); if (updated == true) { List newServers = _serversList.map((s) { if (s.id == server.id) { s.defaultServer = true; return s; } else { s.defaultServer = false; return s; } }).toList(); _serversList = newServers; notifyListeners(); return true; } else { return false; } } Future editServer(Server server) async { final result = await editServerDb(server); if (result == true) { List newServers = _serversList.map((s) { if (s.id == server.id) { return server; } else { return s; } }).toList(); _serversList = newServers; notifyListeners(); return true; } else { return false; } } Future removeServer(Server server) async { final result = await removeFromDb(server.id); if (result == true) { _selectedServer = null; List newServers = _serversList.where((s) => s.id != server.id).toList(); _serversList = newServers; notifyListeners(); return true; } else { return false; } } Future updateBlocking(Server server, String block, bool newStatus) async { switch (block) { case 'general': _protectionsManagementProcess.add('general'); notifyListeners(); final result = await updateGeneralProtection(server, newStatus); _protectionsManagementProcess = _protectionsManagementProcess.where((e) => e != 'general').toList(); if (result['result'] == 'success') { _serverStatus.data!.generalEnabled = newStatus; notifyListeners(); return true; } else { notifyListeners(); return false; } case 'filtering': _protectionsManagementProcess.add('filtering'); notifyListeners(); final result = await updateFiltering(server, newStatus); _protectionsManagementProcess = _protectionsManagementProcess.where((e) => e != 'filtering').toList(); if (result['result'] == 'success') { _serverStatus.data!.filteringEnabled = newStatus; notifyListeners(); return true; } else { notifyListeners(); return false; } case 'safeSearch': _protectionsManagementProcess.add('safeSearch'); notifyListeners(); final result = await updateSafeSearch(server, newStatus); _protectionsManagementProcess = _protectionsManagementProcess.where((e) => e != 'safeSearch').toList(); if (result['result'] == 'success') { _serverStatus.data!.safeSearchEnabled = newStatus; notifyListeners(); return true; } else { notifyListeners(); return false; } case 'safeBrowsing': _protectionsManagementProcess.add('safeBrowsing'); notifyListeners(); final result = await updateSafeBrowsing(server, newStatus); _protectionsManagementProcess = _protectionsManagementProcess.where((e) => e != 'safeBrowsing').toList(); if (result['result'] == 'success') { _serverStatus.data!.safeBrowsingEnabled = newStatus; notifyListeners(); return true; } else { notifyListeners(); return false; } case 'parentalControl': _protectionsManagementProcess.add('parentalControl'); notifyListeners(); final result = await updateParentalControl(server, newStatus); _protectionsManagementProcess = _protectionsManagementProcess.where((e) => e != 'parentalControl').toList(); if (result['result'] == 'success') { _serverStatus.data!.parentalControlEnabled = newStatus; notifyListeners(); return true; } else { notifyListeners(); return false; } default: return false; } } Future saveServerIntoDb(Server server) async { try { return await _dbInstance!.transaction((txn) async { await txn.rawInsert( 'INSERT INTO servers (id, name, connectionMethod, domain, path, port, user, password, defaultServer, authToken) VALUES ("${server.id}", "${server.name}", "${server.connectionMethod}", "${server.domain}", ${server.path != null ? "${server.path}" : null}, ${server.port}, "${server.user}", "${server.password}", 0, "${server.authToken}")', ); return true; }); } catch (e) { return false; } } Future editServerDb(Server server) async { try { return await _dbInstance!.transaction((txn) async { await txn.rawUpdate( 'UPDATE servers SET name = "${server.name}", connectionMethod = "${server.connectionMethod}", domain = "${server.domain}", path = ${server.path != null ? "${server.path}" : null}, port = ${server.port}, user = "${server.user}", password = "${server.password}", authToken = "${server.authToken}" WHERE id = "${server.id}"', ); return true; }); } catch (e) { return false; } } Future removeFromDb(String id) async { try { return await _dbInstance!.transaction((txn) async { await txn.rawDelete( 'DELETE FROM servers WHERE id = "$id"', ); return true; }); } catch (e) { return false; } } Future setDefaultServerDb(String id) async { try { return await _dbInstance!.transaction((txn) async { await txn.rawUpdate( 'UPDATE servers SET defaultServer = 0 WHERE defaultServer = 1', ); await txn.rawUpdate( 'UPDATE servers SET defaultServer = 1 WHERE id = "$id"', ); return true; }); } catch (e) { return false; } } void saveFromDb(List>? data) async { if (data != null) { for (var server in data) { final Server serverObj = Server( id: server['id'], name: server['name'], connectionMethod: server['connectionMethod'], domain: server['domain'], path: server['path'], port: server['port'], user: server['user'], password: server['password'], defaultServer: convertFromIntToBool(server['defaultServer'])!, authToken: server['authToken'] ); _serversList.add(serverObj); if (convertFromIntToBool(server['defaultServer']) == true) { _selectedServer = serverObj; _serverStatus.loadStatus = 0; final serverStatus = await getServerStatus(serverObj); if (serverStatus['result'] == 'success') { _serverStatus.data = serverStatus['data']; _serverStatus.loadStatus = 1; } else { _serverStatus.loadStatus = 2; } } } } notifyListeners(); } }