fix: make activity summary request cache keys unique, use in-memory cache instead of local storage, remove items from cache on error or on state event sent successfully (#3885)

pull/2245/head
ggurdin 2 months ago committed by GitHub
parent 19381d0fd7
commit 4ad16a33b3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -158,6 +158,7 @@ extension ActivityRoomExtension on Room {
try { try {
final resp = await ActivitySummaryRepo.get( final resp = await ActivitySummaryRepo.get(
id,
ActivitySummaryRequestModel( ActivitySummaryRequestModel(
activity: activityPlan!, activity: activityPlan!,
activityResults: messages, activityResults: messages,
@ -172,6 +173,8 @@ extension ActivityRoomExtension on Room {
analytics: analytics, analytics: analytics,
), ),
); );
ActivitySummaryRepo.delete(id, activityPlan!);
} catch (e, s) { } catch (e, s) {
ErrorHandler.logError( ErrorHandler.logError(
e: e, e: e,

@ -1,8 +1,9 @@
import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'package:get_storage/get_storage.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:fluffychat/pangea/activity_planner/activity_plan_model.dart';
import 'package:fluffychat/pangea/activity_summary/activity_summary_request_model.dart'; import 'package:fluffychat/pangea/activity_summary/activity_summary_request_model.dart';
import 'package:fluffychat/pangea/activity_summary/activity_summary_response_model.dart'; import 'package:fluffychat/pangea/activity_summary/activity_summary_response_model.dart';
import 'package:fluffychat/pangea/common/config/environment.dart'; import 'package:fluffychat/pangea/common/config/environment.dart';
@ -10,31 +11,49 @@ import 'package:fluffychat/pangea/common/network/requests.dart';
import 'package:fluffychat/pangea/common/network/urls.dart'; import 'package:fluffychat/pangea/common/network/urls.dart';
import 'package:fluffychat/widgets/matrix.dart'; import 'package:fluffychat/widgets/matrix.dart';
class ActivitySummaryRepo { class _ActivitySummaryCacheItem {
static final GetStorage _activitySummaryStorage = final Completer<ActivitySummaryResponseModel> completer;
GetStorage('activity_summary_storage'); final DateTime timestamp;
static void set( _ActivitySummaryCacheItem(this.completer) : timestamp = DateTime.now();
ActivitySummaryRequestModel request, }
ActivitySummaryResponseModel response,
) {
_activitySummaryStorage.write(_storageKey(request), response.toJson());
}
static String _storageKey(ActivitySummaryRequestModel request) { class ActivitySummaryRepo {
// You may want to customize this key based on request fields static final Map<String, _ActivitySummaryCacheItem> _cache = {};
return request.activity.hashCode.toString(); static const Duration cacheDuration = Duration(minutes: 10);
static String _storageKey(String roomId, ActivityPlanModel activity) {
return '${roomId}_${activity.hashCode}';
} }
static Future<ActivitySummaryResponseModel> get( static Future<ActivitySummaryResponseModel> get(
String roomId,
ActivitySummaryRequestModel request, ActivitySummaryRequestModel request,
) async { ) async {
final cachedJson = _activitySummaryStorage.read(_storageKey(request)); final storageKey = _storageKey(roomId, request.activity);
if (cachedJson != null) { final cached = _cache[storageKey];
final cached = ActivitySummaryResponseModel.fromJson(cachedJson); if (cached != null) {
return cached; return _cache[storageKey]!.completer.future;
}
_cache[storageKey] = _ActivitySummaryCacheItem(
Completer<ActivitySummaryResponseModel>(),
);
try {
final response = await _fetch(request);
_cache[storageKey]!.completer.complete(response);
return response;
} catch (e) {
_cache[storageKey]!.completer.completeError(e);
_cache.remove(storageKey);
rethrow;
} }
}
static Future<ActivitySummaryResponseModel> _fetch(
ActivitySummaryRequestModel request,
) async {
final Requests req = Requests( final Requests req = Requests(
choreoApiKey: Environment.choreoApiKey, choreoApiKey: Environment.choreoApiKey,
accessToken: MatrixState.pangeaController.userController.accessToken, accessToken: MatrixState.pangeaController.userController.accessToken,
@ -46,10 +65,14 @@ class ActivitySummaryRepo {
); );
final decodedBody = jsonDecode(utf8.decode(res.bodyBytes)); final decodedBody = jsonDecode(utf8.decode(res.bodyBytes));
final response = ActivitySummaryResponseModel.fromJson(decodedBody); return ActivitySummaryResponseModel.fromJson(decodedBody);
}
set(request, response);
return response; static void delete(
String roomId,
ActivityPlanModel activity,
) async {
final storageKey = _storageKey(roomId, activity);
_cache.remove(storageKey);
} }
} }

Loading…
Cancel
Save