import 'dart:convert'; import 'dart:io'; import 'dart:typed_data'; import 'package:core/utils/app_logger.dart'; import 'package:get/get.dart'; import 'package:hive/hive.dart'; import 'package:path_provider/path_provider.dart' as path_provider; import 'package:tmail_ui_user/features/caching/caching_manager.dart'; import 'package:tmail_ui_user/features/caching/config/cache_version.dart'; import 'package:tmail_ui_user/features/caching/utils/caching_constants.dart'; import 'package:tmail_ui_user/features/login/data/local/encryption_key_cache_manager.dart'; import 'package:tmail_ui_user/features/login/data/model/account_cache.dart'; import 'package:tmail_ui_user/features/login/data/model/authentication_info_cache.dart'; import 'package:tmail_ui_user/features/login/data/model/encryption_key_cache.dart'; import 'package:tmail_ui_user/features/login/data/model/recent_login_url_cache.dart'; import 'package:tmail_ui_user/features/login/data/model/recent_login_username_cache.dart'; import 'package:tmail_ui_user/features/login/data/model/token_oidc_cache.dart'; import 'package:tmail_ui_user/features/mailbox/data/model/mailbox_cache.dart'; import 'package:tmail_ui_user/features/mailbox/data/model/mailbox_rights_cache.dart'; import 'package:tmail_ui_user/features/mailbox/data/model/state_cache.dart'; import 'package:tmail_ui_user/features/mailbox/data/model/state_type.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/data/model/recent_search_cache.dart'; import 'package:tmail_ui_user/features/push_notification/data/model/fcm_subscription.dart'; import 'package:tmail_ui_user/features/thread/data/model/email_address_hive_cache.dart'; import 'package:tmail_ui_user/features/thread/data/model/email_cache.dart'; class HiveCacheConfig { Future setUp({String? cachePath}) async { await initializeDatabase(databasePath: cachePath); registerAdapter(); } Future initializeDatabase({String? databasePath}) async { if (databasePath != null) { Hive.init(databasePath); } else { if (!GetPlatform.isWeb) { Directory directory = await path_provider.getApplicationDocumentsDirectory(); Hive.init(directory.path); } } } Future onUpgradeDatabase(CachingManager cachingManager) async { final oldVersion = await cachingManager.getLatestVersion() ?? 0; const newVersion = CacheVersion.hiveDBVersion; log('HiveCacheConfig::onUpgradeDatabase():oldVersion: $oldVersion | newVersion: $newVersion'); if (oldVersion != newVersion) { await cachingManager.onUpgradeCache(oldVersion, newVersion); } return Future.value(); } static Future initializeEncryptionKey() async { final encryptionKeyCacheManager = Get.find(); final encryptionKeyCache = await encryptionKeyCacheManager.getEncryptionKeyStored(); if (encryptionKeyCache == null) { final secureKey = Hive.generateSecureKey(); final secureKeyEncode = base64Encode(secureKey); log('HiveCacheConfig::_initializeEncryptionKey(): secureKeyEncode: $secureKeyEncode'); await encryptionKeyCacheManager.storeEncryptionKey(EncryptionKeyCache(secureKeyEncode)); } } static Future getEncryptionKey() async { final encryptionKeyCacheManager = Get.find(); var encryptionKeyCache = await encryptionKeyCacheManager.getEncryptionKeyStored(); if (encryptionKeyCache != null) { final encryptionKey = encryptionKeyCache.value; log('HiveCacheConfig::getEncryptionKey(): encryptionKey: $encryptionKey'); final encryptionKeyDecode = base64Decode(encryptionKeyCache.value); return encryptionKeyDecode; } else { return null; } } void registerAdapter() { registerCacheAdapter( MailboxCacheAdapter(), CachingConstants.MAILBOX_CACHE_IDENTIFY ); registerCacheAdapter( MailboxRightsCacheAdapter(), CachingConstants.MAILBOX_RIGHTS_CACHE_IDENTIFY ); registerCacheAdapter( StateCacheAdapter(), CachingConstants.STATE_CACHE_IDENTIFY ); registerCacheAdapter( StateTypeAdapter(), CachingConstants.STATE_TYPE_IDENTIFY ); registerCacheAdapter( EmailAddressHiveCacheAdapter(), CachingConstants.EMAIL_ADDRESS_HIVE_CACHE_IDENTIFY ); registerCacheAdapter( EmailCacheAdapter(), CachingConstants.EMAIL_CACHE_IDENTIFY ); registerCacheAdapter( RecentSearchCacheAdapter(), CachingConstants.RECENT_SEARCH_HIVE_CACHE_IDENTIFY ); registerCacheAdapter( TokenOidcCacheAdapter(), CachingConstants.TOKEN_OIDC_HIVE_CACHE_IDENTIFY ); registerCacheAdapter( AccountCacheAdapter(), CachingConstants.ACCOUNT_HIVE_CACHE_IDENTIFY ); registerCacheAdapter( EncryptionKeyCacheAdapter(), CachingConstants.ENCRYPTION_KEY_HIVE_CACHE_IDENTIFY ); registerCacheAdapter( AuthenticationInfoCacheAdapter(), CachingConstants.AUTHENTICATION_INFO_HIVE_CACHE_IDENTIFY ); registerCacheAdapter( RecentLoginUrlCacheAdapter(), CachingConstants.RECENT_LOGIN_URL_HIVE_CACHE_IDENTITY ); registerCacheAdapter( RecentLoginUsernameCacheAdapter(), CachingConstants.RECENT_LOGIN_USERNAME_HIVE_CACHE_IDENTITY ); registerCacheAdapter( FCMSubscriptionCacheAdapter(), CachingConstants.FCM_SUBSCRIPTION_HIVE_CACHE_IDENTITY ); } void registerCacheAdapter(TypeAdapter typeAdapter, int typeId) { if (!Hive.isAdapterRegistered(typeId)) { Hive.registerAdapter(typeAdapter); } } Future closeHive() async { await Hive.close(); } }