import 'package:flutter/material.dart'; import 'package:hub/shared/helpers/base_storage.dart'; import 'package:sqflite/sqflite.dart'; import 'package:sqflite/sqlite_api.dart'; import 'package:path/path.dart'; class SQLiteStorage extends ChangeNotifier implements BaseStorage { SQLiteStorage._(); final String _dbName = 'database.db'; final int _dbVersion = 1; static final SQLiteStorage instance = SQLiteStorage._(); late final _database; @override Future init() async { _database = await openDatabase( join(await getDatabasesPath(), _dbName), version: _dbVersion, onCreate: _onCreate, onUpgrade: _onUpdate, onDowngrade: _onDowngrade, ); await _onInitLocalVariables(_database); } _onCreate(Database database, int version) async { await database.execute(_tableKeychain); } _onUpdate(Database database, int oldVersion, int newVersion) async {} _onDowngrade(Database database, int oldVersion, int newVersion) async {} _onInitLocalVariables(Database database) async { // TODO: Talvez precise colocar um transaction aqui como o // database.batch() para melhorar a performance for (var variable in _localVariables) { var isConfig = await database.query('keychain', where: 'key = ?', whereArgs: [variable['key']]); if (isConfig.isEmpty) { await database.insert('keychain', variable); } } } String get _tableKeychain => ''' CREATE TABLE keychain ( key TEXT UNIQUE, value TEXT, type TEXT, updateAt TEXT, resolvedAt TEXT, createdAt TEXT ); '''; List> get _localVariables => [ {'key': SQLiteStorageKey.devUUID.value, 'value': '', 'type': 'user'}, {'key': SQLiteStorageKey.userUUID.value, 'value': '', 'type': 'user'}, {'key': SQLiteStorageKey.userDevUUID.value, 'value': '', 'type': 'user'}, {'key': SQLiteStorageKey.status.value, 'value': '', 'type': 'user'}, {'key': SQLiteStorageKey.userName.value, 'value': '', 'type': 'user'}, {'key': SQLiteStorageKey.clientUUID.value, 'value': '', 'type': 'local'}, {'key': SQLiteStorageKey.ownerUUID.value, 'value': '', 'type': 'local'}, {'key': SQLiteStorageKey.clientName.value, 'value': '', 'type': 'local'}, {'key': SQLiteStorageKey.whatsapp.value, 'value': 'false', 'type': 'util'}, {'key': SQLiteStorageKey.provisional.value, 'value': 'false', 'type': 'util'}, {'key': SQLiteStorageKey.pets.value, 'value': 'false', 'type': 'util'}, {'key': SQLiteStorageKey.local.value, 'value': 'false', 'type': 'util'}, {'key': SQLiteStorageKey.notify.value, 'value': 'false', 'type': 'util'}, {'key': SQLiteStorageKey.fingerprint.value, 'value': 'false', 'type': 'util'}, {'key': SQLiteStorageKey.access.value, 'value': 'false', 'type': 'util'}, {'key': SQLiteStorageKey.panic.value, 'value': 'false', 'type': 'util'}, {'key': SQLiteStorageKey.person.value, 'value': 'false', 'type': 'util'}, {'key': SQLiteStorageKey.requestOSNotification.value, 'value': 'false', 'type': 'util'}, {'key': SQLiteStorageKey.petAmount.value, 'value': '', 'type': 'local'}, ]; @override Future get(String key) async { var response = await _database.query('keychain', where: 'key = ?', whereArgs: [key]); if (response.isEmpty) { return null; } return response.first['value']; } @override Future set(String key, String value) async { var date = DateTime.now().toIso8601String(); await _database.insert( 'keychain', { 'key': key, 'value': value, 'type': 'local', 'updateAt': date, 'resolvedAt': date, 'createdAt': date, }, conflictAlgorithm: ConflictAlgorithm.replace); notifyListeners(); } @override Future delete(String key) async { var isConfig = await _database.query('keychain', where: 'key = ?', whereArgs: [key]); if (isConfig.isNotEmpty) { await _database.delete('keychain', where: 'key = ?', whereArgs: [key]); } notifyListeners(); } @override Future clearAll() async { await _database.delete('keychain'); notifyListeners(); } }