From 6af450efb2049c78af38e8186e88527908951707 Mon Sep 17 00:00:00 2001 From: Wilson Date: Fri, 14 Feb 2025 09:58:01 -0800 Subject: [PATCH] make word meaning activity refetch new definition if cache expires (#1779) * make word meaning activity refetch new definition if cache expires * generated * bake expire at into response json * generated * add expire at in to and from json method --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: ggurdin <46800240+ggurdin@users.noreply.github.com> --- lib/pangea/lemmas/lemma_info_repo.dart | 41 ++++++++++--------- lib/pangea/lemmas/lemma_info_response.dart | 6 +++ .../lemma_meaning_activity_generator.dart | 2 +- 3 files changed, 28 insertions(+), 21 deletions(-) diff --git a/lib/pangea/lemmas/lemma_info_repo.dart b/lib/pangea/lemmas/lemma_info_repo.dart index 00e269da1..3490aff30 100644 --- a/lib/pangea/lemmas/lemma_info_repo.dart +++ b/lib/pangea/lemmas/lemma_info_repo.dart @@ -1,39 +1,50 @@ import 'dart:convert'; -import 'dart:developer'; - -import 'package:flutter/foundation.dart'; import 'package:get_storage/get_storage.dart'; import 'package:http/http.dart'; +import 'package:fluffychat/pangea/common/config/environment.dart'; +import 'package:fluffychat/pangea/common/network/requests.dart'; import 'package:fluffychat/pangea/common/network/urls.dart'; -import 'package:fluffychat/pangea/common/utils/error_handler.dart'; import 'package:fluffychat/pangea/events/models/content_feedback.dart'; import 'package:fluffychat/pangea/lemmas/lemma_info_request.dart'; import 'package:fluffychat/pangea/lemmas/lemma_info_response.dart'; import 'package:fluffychat/widgets/matrix.dart'; -import '../common/config/environment.dart'; -import '../common/network/requests.dart'; class LemmaInfoRepo { static final GetStorage _lemmaStorage = GetStorage('lemma_storage'); static void set(LemmaInfoRequest request, LemmaInfoResponse response) { + // set expireAt if not set + response.expireAt ??= DateTime.now().add(const Duration(minutes: 1)); _lemmaStorage.write(request.storageKey, response.toJson()); } static Future get( LemmaInfoRequest request, [ String? feedback, + bool useExpireAt = false, ]) async { final cachedJson = _lemmaStorage.read(request.storageKey); - if (cachedJson != null) { - final cached = LemmaInfoResponse.fromJson(cachedJson); + final cached = + cachedJson == null ? null : LemmaInfoResponse.fromJson(cachedJson); + if (cached != null) { if (feedback == null) { - // in this case, we just return the cached response - return cached; + // at this point we have a cache without feedback + if (!useExpireAt) { + // return cache as is if we're not using expireAt + return cached; + } else if (cached.expireAt != null) { + if (DateTime.now().isBefore(cached.expireAt!)) { + // return cache as is if we're using expireAt and it's set but not expired + return cached; + } + } + // we intentionally do not handle the case of expired at not set because + // old caches won't have them set, and we want to trigger a new + // choreo call } else { // we're adding this within the service to avoid needing to have the widgets // save state including the bad response @@ -42,16 +53,6 @@ class LemmaInfoRepo { feedback, ); } - } else if (feedback != null) { - // the cache should have the request in order for the user to provide feedback - // this would be a strange situation and indicate some error in our logic - debugger(when: kDebugMode); - ErrorHandler.logError( - m: 'Feedback provided for a non-cached request', - data: request.toJson(), - ); - } else { - debugPrint('No cached response for lemma ${request.lemma}, calling API'); } final Requests req = Requests( diff --git a/lib/pangea/lemmas/lemma_info_response.dart b/lib/pangea/lemmas/lemma_info_response.dart index 8fe34d7bc..748eb85c9 100644 --- a/lib/pangea/lemmas/lemma_info_response.dart +++ b/lib/pangea/lemmas/lemma_info_response.dart @@ -3,16 +3,21 @@ import 'package:fluffychat/pangea/events/models/content_feedback.dart'; class LemmaInfoResponse implements JsonSerializable { final List emoji; final String meaning; + DateTime? expireAt; LemmaInfoResponse({ required this.emoji, required this.meaning, + this.expireAt, }); factory LemmaInfoResponse.fromJson(Map json) { return LemmaInfoResponse( emoji: (json['emoji'] as List).map((e) => e as String).toList(), meaning: json['meaning'] as String, + expireAt: json['expireAt'] == null + ? null + : DateTime.parse(json['expireAt'] as String), ); } @@ -21,6 +26,7 @@ class LemmaInfoResponse implements JsonSerializable { return { 'emoji': emoji, 'meaning': meaning, + 'expireAt': expireAt?.toIso8601String(), }; } diff --git a/lib/pangea/toolbar/repo/lemma_meaning_activity_generator.dart b/lib/pangea/toolbar/repo/lemma_meaning_activity_generator.dart index 8f371a2f0..4dd18f57e 100644 --- a/lib/pangea/toolbar/repo/lemma_meaning_activity_generator.dart +++ b/lib/pangea/toolbar/repo/lemma_meaning_activity_generator.dart @@ -38,7 +38,7 @@ class LemmaMeaningActivityGenerator { userL1: req.userL1, ); - final res = await LemmaInfoRepo.get(lemmaDefReq); + final res = await LemmaInfoRepo.get(lemmaDefReq, null, true); final choices = await getDistractorMeanings(lemmaDefReq, 3);