diff --git a/apps/lib/core/cache/cache_invalidator.dart b/apps/lib/core/cache/cache_invalidator.dart new file mode 100644 index 0000000..b6e3181 --- /dev/null +++ b/apps/lib/core/cache/cache_invalidator.dart @@ -0,0 +1,27 @@ +import 'dart:async'; + +import 'hybrid_cache_store.dart'; + +class CacheInvalidator { + final HybridCacheStore? _store; + final Set _invalidated = {}; + + CacheInvalidator({HybridCacheStore? store}) : _store = store; + + void invalidate(String key) { + _invalidated.add(key); + final removeFuture = _store?.remove(key); + if (removeFuture != null) { + unawaited(removeFuture); + } + } + + void invalidateCalendarDay(DateTime date) { + final month = '${date.year}-${date.month.toString().padLeft(2, '0')}'; + final day = '$month-${date.day.toString().padLeft(2, '0')}'; + invalidate('calendar:day:$day'); + invalidate('calendar:month:$month'); + } + + bool wasInvalidated(String key) => _invalidated.contains(key); +} diff --git a/apps/lib/core/di/injection.dart b/apps/lib/core/di/injection.dart index 60c3822..a7557fc 100644 --- a/apps/lib/core/di/injection.dart +++ b/apps/lib/core/di/injection.dart @@ -2,6 +2,10 @@ import 'package:dio/dio.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:get_it/get_it.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import '../cache/cache_invalidator.dart'; +import '../cache/hybrid_cache_store.dart'; +import '../cache/memory_cache_store.dart'; +import '../cache/persistent_cache_store.dart'; import '../api/api_client.dart'; import '../api/i_api_client.dart'; import '../storage/token_storage.dart'; @@ -56,6 +60,19 @@ Future configureDependencies() async { final sharedPreferences = await SharedPreferences.getInstance(); sl.registerSingleton(sharedPreferences); + final memoryCacheStore = MemoryCacheStore(); + final persistentCacheStore = PersistentCacheStore(); + final hybridCacheStore = HybridCacheStore( + memory: memoryCacheStore, + persistent: persistentCacheStore, + ); + sl.registerSingleton(memoryCacheStore); + sl.registerSingleton(persistentCacheStore); + sl.registerSingleton(hybridCacheStore); + sl.registerSingleton( + CacheInvalidator(store: hybridCacheStore), + ); + final usersApi = UsersApi(apiClient); sl.registerSingleton(usersApi); diff --git a/apps/test/core/cache/cache_invalidator_test.dart b/apps/test/core/cache/cache_invalidator_test.dart new file mode 100644 index 0000000..a41635c --- /dev/null +++ b/apps/test/core/cache/cache_invalidator_test.dart @@ -0,0 +1,11 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:social_app/core/cache/cache_invalidator.dart'; + +void main() { + test('invalidate calendar day should also invalidate month key', () { + final inv = CacheInvalidator(); + inv.invalidateCalendarDay(DateTime(2026, 3, 20)); + expect(inv.wasInvalidated('calendar:day:2026-03-20'), true); + expect(inv.wasInvalidated('calendar:month:2026-03'), true); + }); +}