Skip to content

Commit f65fd80

Browse files
committed
fix: etag cache
1 parent 0836b47 commit f65fd80

1 file changed

Lines changed: 67 additions & 60 deletions

File tree

lib/api/exptech.dart

Lines changed: 67 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -505,13 +505,19 @@ class ExpTech {
505505

506506
TalkerManager.instance.debug('🌐 API: GET $requestUrl');
507507

508+
final cacheKey = PreferenceKeys.weatherCache;
509+
final etagKey = PreferenceKeys.weatherEtag;
510+
final coordsKey = '${PreferenceKeys.weatherCache}:coords';
511+
final currentCoords = '$lat:$lon';
512+
final cachedCoords = Preference.instance.getString(coordsKey);
513+
508514
final headers = <String, String>{};
509-
final cachedEtag = Preference.instance.getString(
510-
PreferenceKeys.weatherEtag,
511-
);
512-
if (cachedEtag != null) {
513-
headers['If-None-Match'] = cachedEtag;
514-
TalkerManager.instance.debug('🌐 API: Using ETag: $cachedEtag');
515+
if (cachedCoords == currentCoords) {
516+
final cachedEtag = Preference.instance.getString(etagKey);
517+
if (cachedEtag != null) {
518+
headers['If-None-Match'] = cachedEtag;
519+
TalkerManager.instance.debug('🌐 API: Using ETag: $cachedEtag');
520+
}
515521
}
516522

517523
final res = await _sharedClient.get(requestUrl, headers: headers);
@@ -521,9 +527,7 @@ class ExpTech {
521527
);
522528

523529
if (res.statusCode == 304) {
524-
final cachedData = Preference.instance.getString(
525-
PreferenceKeys.weatherCache,
526-
);
530+
final cachedData = Preference.instance.getString(cacheKey);
527531
if (cachedData != null) {
528532
TalkerManager.instance.debug(
529533
'🌐 API: Using cached data (304 Not Modified)',
@@ -547,12 +551,13 @@ class ExpTech {
547551

548552
final etag = res.headers['etag'] ?? res.headers['ETag'];
549553
if (etag != null) {
550-
await Preference.instance.setString(PreferenceKeys.weatherEtag, etag);
554+
await Preference.instance.setString(etagKey, etag);
551555
TalkerManager.instance.debug('🌐 API: Saved ETag: $etag');
552556
}
553557

554558
final json = jsonDecode(res.body) as Map<String, dynamic>;
555-
await Preference.instance.setString(PreferenceKeys.weatherCache, res.body);
559+
await Preference.instance.setString(cacheKey, res.body);
560+
await Preference.instance.setString(coordsKey, currentCoords);
556561
TalkerManager.instance.debug('🌐 API: Saved cached data');
557562

558563
TalkerManager.instance.debug('🌐 API: JSON decoded successfully');
@@ -568,13 +573,20 @@ class ExpTech {
568573

569574
TalkerManager.instance.debug('🌐 Forecast API: GET $requestUrl');
570575

576+
final cacheKey = PreferenceKeys.forecastCache;
577+
final etagKey = PreferenceKeys.forecastEtag;
578+
final regionKey = '${PreferenceKeys.forecastCache}:region';
579+
final cachedRegion = Preference.instance.getString(regionKey);
580+
571581
final headers = <String, String>{};
572-
final cachedEtag = Preference.instance.getString(
573-
PreferenceKeys.forecastEtag,
574-
);
575-
if (cachedEtag != null) {
576-
headers['If-None-Match'] = cachedEtag;
577-
TalkerManager.instance.debug('🌐 Forecast API: Using ETag: $cachedEtag');
582+
if (cachedRegion == region) {
583+
final cachedEtag = Preference.instance.getString(etagKey);
584+
if (cachedEtag != null) {
585+
headers['If-None-Match'] = cachedEtag;
586+
TalkerManager.instance.debug(
587+
'🌐 Forecast API: Using ETag: $cachedEtag',
588+
);
589+
}
578590
}
579591

580592
final res = await _sharedClient.get(requestUrl, headers: headers);
@@ -584,9 +596,7 @@ class ExpTech {
584596
);
585597

586598
if (res.statusCode == 304) {
587-
final cachedData = Preference.instance.getString(
588-
PreferenceKeys.forecastCache,
589-
);
599+
final cachedData = Preference.instance.getString(cacheKey);
590600
if (cachedData != null) {
591601
TalkerManager.instance.debug(
592602
'🌐 Forecast API: Using cached data (304 Not Modified)',
@@ -609,12 +619,13 @@ class ExpTech {
609619

610620
final etag = res.headers['etag'] ?? res.headers['ETag'];
611621
if (etag != null) {
612-
await Preference.instance.setString(PreferenceKeys.forecastEtag, etag);
622+
await Preference.instance.setString(etagKey, etag);
613623
TalkerManager.instance.debug('🌐 Forecast API: Saved ETag: $etag');
614624
}
615625

616626
final json = jsonDecode(res.body) as Map<String, dynamic>;
617-
await Preference.instance.setString(PreferenceKeys.forecastCache, res.body);
627+
await Preference.instance.setString(cacheKey, res.body);
628+
await Preference.instance.setString(regionKey, region);
618629
TalkerManager.instance.debug('🌐 Forecast API: Saved cached data');
619630

620631
TalkerManager.instance.debug('🌐 Forecast API: Response JSON: $json');
@@ -872,16 +883,21 @@ class ExpTech {
872883

873884
TalkerManager.instance.debug('🌐 Realtime Region API: GET $requestUrl');
874885

886+
final cacheKey = PreferenceKeys.realtimeRegionCache;
887+
final etagKey = PreferenceKeys.realtimeRegionEtag;
888+
final regionKey = '${PreferenceKeys.realtimeRegionCache}:region';
889+
875890
final headers = <String, String>{};
876891
await Preference.reload();
877-
final cachedEtag = Preference.instance.getString(
878-
PreferenceKeys.realtimeRegionEtag,
879-
);
880-
if (cachedEtag != null) {
881-
headers['If-None-Match'] = cachedEtag;
882-
TalkerManager.instance.debug(
883-
'🌐 Realtime Region API: Using ETag: $cachedEtag',
884-
);
892+
final cachedRegion = Preference.instance.getString(regionKey);
893+
if (cachedRegion == region) {
894+
final cachedEtag = Preference.instance.getString(etagKey);
895+
if (cachedEtag != null) {
896+
headers['If-None-Match'] = cachedEtag;
897+
TalkerManager.instance.debug(
898+
'🌐 Realtime Region API: Using ETag: $cachedEtag',
899+
);
900+
}
885901
}
886902

887903
final res = await _sharedClient.get(requestUrl, headers: headers);
@@ -891,9 +907,7 @@ class ExpTech {
891907
);
892908

893909
if (res.statusCode == 304) {
894-
final cachedData = Preference.instance.getString(
895-
PreferenceKeys.realtimeRegionCache,
896-
);
910+
final cachedData = Preference.instance.getString(cacheKey);
897911
if (cachedData != null) {
898912
TalkerManager.instance.debug(
899913
'🌐 Realtime Region API: Using cached data (304 Not Modified)',
@@ -919,18 +933,13 @@ class ExpTech {
919933

920934
final etag = res.headers['etag'] ?? res.headers['ETag'];
921935
if (etag != null) {
922-
await Preference.instance.setString(
923-
PreferenceKeys.realtimeRegionEtag,
924-
etag,
925-
);
936+
await Preference.instance.setString(etagKey, etag);
926937
TalkerManager.instance.debug('🌐 Realtime Region API: Saved ETag: $etag');
927938
}
928939

929940
final List<dynamic> jsonData = jsonDecode(res.body) as List<dynamic>;
930-
await Preference.instance.setString(
931-
PreferenceKeys.realtimeRegionCache,
932-
res.body,
933-
);
941+
await Preference.instance.setString(cacheKey, res.body);
942+
await Preference.instance.setString(regionKey, region);
934943
TalkerManager.instance.debug('🌐 Realtime Region API: Saved cached data');
935944

936945
return jsonData
@@ -943,16 +952,21 @@ class ExpTech {
943952

944953
TalkerManager.instance.debug('🌐 History Region API: GET $requestUrl');
945954

955+
final cacheKey = PreferenceKeys.historyRegionCache;
956+
final etagKey = PreferenceKeys.historyRegionEtag;
957+
final regionKey = '${PreferenceKeys.historyRegionCache}:region';
958+
946959
final headers = <String, String>{};
947960
await Preference.reload();
948-
final cachedEtag = Preference.instance.getString(
949-
PreferenceKeys.historyRegionEtag,
950-
);
951-
if (cachedEtag != null) {
952-
headers['If-None-Match'] = cachedEtag;
953-
TalkerManager.instance.debug(
954-
'🌐 History Region API: Using ETag: $cachedEtag',
955-
);
961+
final cachedRegion = Preference.instance.getString(regionKey);
962+
if (cachedRegion == region) {
963+
final cachedEtag = Preference.instance.getString(etagKey);
964+
if (cachedEtag != null) {
965+
headers['If-None-Match'] = cachedEtag;
966+
TalkerManager.instance.debug(
967+
'🌐 History Region API: Using ETag: $cachedEtag',
968+
);
969+
}
956970
}
957971

958972
final res = await _sharedClient.get(requestUrl, headers: headers);
@@ -962,9 +976,7 @@ class ExpTech {
962976
);
963977

964978
if (res.statusCode == 304) {
965-
final cachedData = Preference.instance.getString(
966-
PreferenceKeys.historyRegionCache,
967-
);
979+
final cachedData = Preference.instance.getString(cacheKey);
968980
if (cachedData != null) {
969981
TalkerManager.instance.debug(
970982
'🌐 History Region API: Using cached data (304 Not Modified)',
@@ -990,18 +1002,13 @@ class ExpTech {
9901002

9911003
final etag = res.headers['etag'] ?? res.headers['ETag'];
9921004
if (etag != null) {
993-
await Preference.instance.setString(
994-
PreferenceKeys.historyRegionEtag,
995-
etag,
996-
);
1005+
await Preference.instance.setString(etagKey, etag);
9971006
TalkerManager.instance.debug('🌐 History Region API: Saved ETag: $etag');
9981007
}
9991008

10001009
final List<dynamic> jsonData = jsonDecode(res.body) as List<dynamic>;
1001-
await Preference.instance.setString(
1002-
PreferenceKeys.historyRegionCache,
1003-
res.body,
1004-
);
1010+
await Preference.instance.setString(cacheKey, res.body);
1011+
await Preference.instance.setString(regionKey, region);
10051012
TalkerManager.instance.debug('🌐 History Region API: Saved cached data');
10061013

10071014
return jsonData

0 commit comments

Comments
 (0)