| 
									
										
										
										
											2024-03-07 09:28:58 +08:00
										 |  |  | import 'package:appflowy/shared/feature_flags.dart'; | 
					
						
							| 
									
										
										
										
											2024-03-04 11:24:25 +07:00
										 |  |  | import 'package:appflowy_backend/log.dart'; | 
					
						
							|  |  |  | import 'package:path_provider/path_provider.dart'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class FlowyCacheManager { | 
					
						
							|  |  |  |   final _caches = <ICache>[]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // if you add a new cache, you should register it here.
 | 
					
						
							|  |  |  |   void registerCache(ICache cache) { | 
					
						
							|  |  |  |     _caches.add(cache); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   void unregisterAllCache(ICache cache) { | 
					
						
							|  |  |  |     _caches.clear(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Future<void> clearAllCache() async { | 
					
						
							|  |  |  |     try { | 
					
						
							|  |  |  |       for (final cache in _caches) { | 
					
						
							|  |  |  |         await cache.clearAll(); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Log.info('Cache cleared'); | 
					
						
							|  |  |  |     } catch (e) { | 
					
						
							|  |  |  |       Log.error(e); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Future<int> getCacheSize() async { | 
					
						
							|  |  |  |     try { | 
					
						
							|  |  |  |       int tmpDirSize = 0; | 
					
						
							|  |  |  |       for (final cache in _caches) { | 
					
						
							|  |  |  |         tmpDirSize += await cache.cacheSize(); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       Log.info('Cache size: $tmpDirSize'); | 
					
						
							|  |  |  |       return tmpDirSize; | 
					
						
							|  |  |  |     } catch (e) { | 
					
						
							|  |  |  |       Log.error(e); | 
					
						
							|  |  |  |       return 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | abstract class ICache { | 
					
						
							|  |  |  |   Future<int> cacheSize(); | 
					
						
							|  |  |  |   Future<void> clearAll(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class TemporaryDirectoryCache implements ICache { | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   Future<int> cacheSize() async { | 
					
						
							|  |  |  |     final tmpDir = await getTemporaryDirectory(); | 
					
						
							|  |  |  |     final tmpDirStat = await tmpDir.stat(); | 
					
						
							|  |  |  |     return tmpDirStat.size; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   Future<void> clearAll() async { | 
					
						
							|  |  |  |     final tmpDir = await getTemporaryDirectory(); | 
					
						
							|  |  |  |     await tmpDir.delete(recursive: true); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2024-03-07 09:28:58 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | class FeatureFlagCache implements ICache { | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   Future<int> cacheSize() async { | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   Future<void> clearAll() async { | 
					
						
							|  |  |  |     await FeatureFlag.clear(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } |