flutter-freaccess-hub/lib/shared/utils/storage_util.dart

414 lines
12 KiB
Dart

import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:hub/shared/helpers/secure_storage_helper.dart';
import 'package:hub/shared/helpers/shared_preferences_storage_helper.dart';
import 'package:hub/shared/helpers/sqlite_storage_helper.dart';
import 'package:hub/shared/utils/cache_util.dart';
import 'package:shared_preferences/shared_preferences.dart';
enum StorageType { secureStorage, sharedPreferences, dbSQLite3 }
abstract class Storage {
Future<void> set(String key, dynamic value, Function(dynamic) cacheSetter);
Future<dynamic> get(String key);
Future<void> delete(String key);
Future<void> purge();
}
class StorageData {
final String key;
final dynamic value;
final StorageType type;
StorageData(this.key, this.value, this.type);
}
class StorageUtil {
static final StorageUtil _instance = StorageUtil._internal();
factory StorageUtil() {
return _instance;
}
StorageUtil._internal();
final SQLiteStorageHelper _sqliteStorage = SQLiteStorageHelper();
final SecureStorageHelper _secureStorage = SecureStorageHelper();
final SharedPreferencesStorageHelper _sharedPreferences =
SharedPreferencesStorageHelper();
static Future<void> set(StorageData data) async {
try {
var currentValue = CacheUtil().get(data.key);
if (currentValue != null && currentValue == data.value) {
log('Value for key ${data.key} is already set to ${data.value}, skipping update.');
return;
}
switch (data.type) {
case StorageType.secureStorage:
await SecureStorageHelper().set(data.key, data.value, (v) {});
break;
case StorageType.sharedPreferences:
await SharedPreferencesStorageHelper()
.set(data.key, data.value, (v) {});
break;
case StorageType.dbSQLite3:
await SQLiteStorageHelper().set(data.key, data.value, (v) {});
break;
}
CacheUtil().set(data.key, data.value);
} catch (e) {
log('Error setting data: $e');
}
}
static Future<dynamic> get(StorageData data) async {
try {
var value = CacheUtil().get(data.key);
if (value == null) {
switch (data.type) {
case StorageType.secureStorage:
value = await SecureStorageHelper().get(data.key);
break;
case StorageType.sharedPreferences:
value = await SharedPreferencesStorageHelper().get(data.key);
break;
case StorageType.dbSQLite3:
value = await SQLiteStorageHelper().get(data.key);
break;
}
CacheUtil().set(data.key, value);
}
return value;
} catch (e) {
log('Error getting data: $e');
return null;
}
}
static Future<void> delete(StorageData data) async {
try {
CacheUtil().delete(data.key);
switch (data.type) {
case StorageType.secureStorage:
await SecureStorageHelper().delete(data.key);
break;
case StorageType.sharedPreferences:
await SharedPreferencesStorageHelper().delete(data.key);
break;
case StorageType.dbSQLite3:
await SQLiteStorageHelper().delete(data.key);
break;
}
} catch (e) {
log('Error deleting data: $e');
}
}
static Future<void> purge() async {
try {
// await SecureStorageHelper().purge();
// await SharedPreferencesStorageHelper().purge();
await SQLiteStorageHelper().purge();
} catch (e) {
log('Error purging data: $e');
}
}
Future<void> ensureInitialization() async {
await initSQLiteStorage();
await initSharedPreferences();
await initSecureStorage();
}
Future<void> initSharedPreferences() async {
_sharedPreferences.prefs ??= await SharedPreferences.getInstance();
final bool milestone =
_sharedPreferences.prefs?.getBool('milestone') ?? true;
if (milestone) {
isFirstRun = false;
await _sharedPreferences.prefs?.setBool('milestone', false);
_secureStorage.purge();
}
}
Future<void> initSecureStorage() async {
log('SecureStorageHelper: Starting initialization');
try {
_email = await _secureStorage.getString('ff_email');
_passwd = await _secureStorage.getString('ff_passwd');
_deviceType = await _secureStorage.getString('ff_deviceType');
_isLogged = await _secureStorage.getBool('ff_isLogged');
_tokenAPNS = await _secureStorage.getString('ff_tokenAPNS');
_accessPass = await _secureStorage.getString('accessPass');
_panicPass = await _secureStorage.getString('panicPass');
_fingerprintPass = await _secureStorage.getString('fingerprintPass');
_haveLocal = await _secureStorage.getBool('ff_have_local');
_deviceDescription = await _secureStorage.getString('deviceDescription');
} catch (e) {
log('SecureStorageHelper: Error during initialization: $e');
}
log('SecureStorageHelper: Initialization complete');
}
Future<void> initSQLiteStorage() async {
log('SQLiteStorageHelper: Starting initialization');
try {
await _sqliteStorage.database;
_devUUID = await _sqliteStorage.get('devUUID') ?? '';
_userUUID = await _sqliteStorage.get('userUUID') ?? '';
_userDevUUID = await _sqliteStorage.get('userDevUUID') ?? '';
_status = await _sqliteStorage.get('status') ?? '';
_userName = await _sqliteStorage.get('userName') ?? '';
_cliUUID = await _sqliteStorage.get('cliUUID') ?? '';
_ownerUUID = await _sqliteStorage.get('ownerUUID') ?? '';
_cliName = await _sqliteStorage.get('cliName') ?? '';
_petAmountRegister = await _sqliteStorage.get('petAmountRegister') ?? '';
_whatsapp = await _sqliteStorage.getBoolean('whatsapp');
_provisional = await _sqliteStorage.getBoolean('provisional');
_pets = await _sqliteStorage.getBoolean('pets');
_local = await _sqliteStorage.getBoolean('local');
_notify = await _sqliteStorage.getBoolean('notify');
_fingerprint = await _sqliteStorage.getBoolean('fingerprint');
_access = await _sqliteStorage.getBoolean('access');
_panic = await _sqliteStorage.getBoolean('panic');
_person = await _sqliteStorage.getBoolean('person');
_requestOSnotification =
await _sqliteStorage.getBoolean('requestOSnotification');
} catch (e) {
log('SQLiteStorageHelper: Error during initialization: $e');
}
log('SQLiteStorageHelper: Initialization complete');
}
bool _isFirstRun = true;
bool get isFirstRun => _isFirstRun;
set isFirstRun(bool value) {
_isFirstRun = value;
_sharedPreferences.set('milestone', value, (v) => _isFirstRun = v);
}
String? _deviceDescription;
String get deviceDescription => _deviceDescription ?? '';
set deviceDescription(String value) {
_deviceDescription = value;
_secureStorage.set(
'deviceDescription', value, (v) => _deviceDescription = v);
}
BuildContext? _context;
BuildContext? get context => _context;
set context(BuildContext? value) {
_context = value;
_secureStorage.set('ff_context', value.toString(), (v) => _context = value);
}
bool? _haveLocal;
bool? get haveLocal => _haveLocal;
set haveLocal(bool? value) {
_haveLocal = value;
_secureStorage.set(
'ff_have_local', value ?? false, (v) => _haveLocal = value);
}
String? _fingerprintPass;
String get fingerprintPass => _fingerprintPass ?? '';
set fingerprintPass(String value) {
_fingerprintPass = value;
_secureStorage.set('fingerprintPass', value, (v) => _fingerprintPass = v);
}
String? _accessPass;
String get accessPass => _accessPass ?? '';
set accessPass(String value) {
_accessPass = value;
_secureStorage.set('accessPass', value, (v) => _accessPass = v);
}
String? _panicPass;
String get panicPass => _panicPass ?? '';
set panicPass(String value) {
_panicPass = value;
_secureStorage.set('panicPass', value, (v) => _panicPass = v);
}
String? _tokenAPNS;
String? get tokenAPNS => _tokenAPNS;
set tokenAPNS(String? value) {
_tokenAPNS = value;
_secureStorage.set('ff_tokenAPNS', value ?? '', (v) => _tokenAPNS = v);
}
String? _email;
String get email => _email ?? '';
set email(String value) {
_email = value;
_secureStorage.set('ff_email', value, (v) => _email = v);
}
String? _passwd;
String get passwd => _passwd ?? '';
set passwd(String value) {
_passwd = value;
_secureStorage.set('ff_passwd', value, (v) => _passwd = v);
}
String? _deviceType;
String get deviceType => _deviceType ?? '';
set deviceType(String value) {
_deviceType = value;
_secureStorage.set('ff_deviceType', value, (v) => _deviceType = v);
}
bool? _isLogged;
bool? get isLogged => _isLogged;
set isLogged(bool? value) {
_isLogged = value;
_secureStorage.set('ff_isLogged', value, (v) => _isLogged = v);
}
String? _token;
String get token => _token ?? '';
set token(String value) {
_token = value;
_secureStorage.set('ff_token', value, (v) => _token = v);
}
String _devUUID = '';
String get devUUID => _devUUID;
set devUUID(String value) {
_devUUID = value;
_sqliteStorage.set('devUUID', value, (v) {});
}
String _userUUID = '';
String get userUUID => _userUUID;
set userUUID(String value) {
_userUUID = value;
_sqliteStorage.set('userUUID', value, (v) {});
}
String _userDevUUID = '';
String get userDevUUID => _userDevUUID;
set userDevUUID(String value) {
_userDevUUID = value;
_sqliteStorage.set('userDevUUID', value, (v) {});
}
String _status = '';
String get status => _status;
set status(String value) {
_status = value;
_sqliteStorage.set('status', value, (v) {});
}
String _userName = '';
String get userName => _userName;
set userName(String value) {
_userName = value;
_sqliteStorage.set('userName', value, (v) {});
}
String _cliUUID = '';
String get cliUUID => _cliUUID;
set cliUUID(String value) {
_cliUUID = value;
_sqliteStorage.set('cliUUID', value, (v) {});
}
String _ownerUUID = '';
String get ownerUUID => _ownerUUID;
set ownerUUID(String value) {
_ownerUUID = value;
_sqliteStorage.set('ownerUUID', value, (v) {});
}
String _cliName = '';
String get cliName => _cliName;
set cliName(String value) {
_cliName = value;
_sqliteStorage.set('cliName', value, (v) {});
}
String _petAmountRegister = '';
String get petAmountRegister => _petAmountRegister;
set petAmountRegister(String value) {
_petAmountRegister = value;
_sqliteStorage.set('petAmountRegister', value, (v) {});
}
bool _whatsapp = false;
bool get whatsapp => _whatsapp;
set whatsapp(bool value) {
_whatsapp = value;
_sqliteStorage.set('whatsapp', value, (v) {});
}
bool _provisional = false;
bool get provisional => _provisional;
set provisional(bool value) {
_provisional = value;
_sqliteStorage.set('provisional', value, (v) {});
}
bool _pets = false;
bool get pets => _pets;
set pets(bool value) {
_pets = value;
_sqliteStorage.set('pets', value, (v) {});
}
bool _local = false;
bool get local => _local;
set local(bool value) {
_local = value;
_sqliteStorage.set('local', value, (v) {});
}
bool _notify = false;
bool get notify => _notify;
set notify(bool value) {
_notify = value;
_sqliteStorage.set('notify', value, (v) {});
}
bool _fingerprint = false;
bool get fingerprint => _fingerprint;
set fingerprint(bool value) {
_fingerprint = value;
_sqliteStorage.set('fingerprint', value, (v) {});
}
bool _access = false;
bool get access => _access;
set access(bool value) {
_access = value;
_sqliteStorage.set('access', value, (v) {});
}
bool _panic = false;
bool get panic => _panic;
set panic(bool value) {
_panic = value;
_sqliteStorage.set('panic', value, (v) {});
}
bool _person = false;
bool get person => _person;
set person(bool value) {
_person = value;
_sqliteStorage.set('person', value, (v) {});
}
bool _requestOSnotification = false;
bool get requestOSnotification => _requestOSnotification;
set requestOSnotification(bool value) {
_requestOSnotification = value;
_sqliteStorage.set('requestOSnotification', value, (v) {});
}
String get createdAt => '0000-00-00 00:00:00';
}