Skip to content

Commit 409973a

Browse files
authored
perf: Add local caching for server-stored settings to reduce loading from server (parse-community#3094)
1 parent e4522a6 commit 409973a

File tree

2 files changed

+76
-6
lines changed

2 files changed

+76
-6
lines changed

src/lib/FilterPreferencesManager.js

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,13 @@ import { getPreferences, updatePreferences, getAllPreferences } from './ClassPre
1212

1313
const VERSION = 1;
1414

15+
/**
16+
* In-memory cache for filters fetched from server storage
17+
* Cache persists for the lifetime of the page (until browser reload)
18+
* Structure: { appId: { className: filters[] } }
19+
*/
20+
const serverFiltersCache = {};
21+
1522
/**
1623
* FilterPreferencesManager with server-side storage support
1724
* Manages DataBrowser filters for specific classes
@@ -32,9 +39,23 @@ export default class FilterPreferencesManager {
3239
// Check if server storage is enabled and user prefers it
3340
if (this.serverStorage.isServerConfigEnabled() && prefersServerStorage(appId)) {
3441
try {
42+
// Check cache first
43+
if (serverFiltersCache[appId] && serverFiltersCache[appId][className]) {
44+
return serverFiltersCache[appId][className];
45+
}
46+
47+
// Fetch from server and cache the result
3548
const serverFilters = await this._getFiltersFromServer(appId, className);
3649
// Always return server filters (even if empty) when server storage is preferred
37-
return serverFilters || [];
50+
const filters = serverFilters || [];
51+
52+
// Cache the fetched filters
53+
if (!serverFiltersCache[appId]) {
54+
serverFiltersCache[appId] = {};
55+
}
56+
serverFiltersCache[appId][className] = filters;
57+
58+
return filters;
3859
} catch (error) {
3960
console.error('Failed to get filters from server:', error);
4061
// When server storage is preferred, return empty array instead of falling back to local
@@ -61,7 +82,14 @@ export default class FilterPreferencesManager {
6182
// Check if server storage is enabled and user prefers it
6283
if (this.serverStorage.isServerConfigEnabled() && prefersServerStorage(appId)) {
6384
try {
64-
return await this._saveFilterToServer(appId, className, filterWithId);
85+
await this._saveFilterToServer(appId, className, filterWithId);
86+
87+
// Invalidate cache for this class - will be reloaded on next getFilters call
88+
if (serverFiltersCache[appId]) {
89+
delete serverFiltersCache[appId][className];
90+
}
91+
92+
return;
6593
} catch (error) {
6694
console.error('Failed to save filter to server:', error);
6795
// On error, fallback to local storage
@@ -84,7 +112,14 @@ export default class FilterPreferencesManager {
84112
// Check if server storage is enabled and user prefers it
85113
if (this.serverStorage.isServerConfigEnabled() && prefersServerStorage(appId)) {
86114
try {
87-
return await this._deleteFilterFromServer(appId, filterId);
115+
await this._deleteFilterFromServer(appId, filterId);
116+
117+
// Invalidate cache for this class - will be reloaded on next getFilters call
118+
if (serverFiltersCache[appId]) {
119+
delete serverFiltersCache[appId][className];
120+
}
121+
122+
return;
88123
} catch (error) {
89124
console.error('Failed to delete filter from server:', error);
90125
// On error, fallback to local storage
@@ -166,6 +201,9 @@ export default class FilterPreferencesManager {
166201
};
167202
}
168203

204+
// Invalidate cache after migration
205+
delete serverFiltersCache[appId];
206+
169207
return { success: true, filterCount: totalFilterCount };
170208
} catch (error) {
171209
console.error('Failed to migrate filters to server:', error);

src/lib/ViewPreferencesManager.js

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,13 @@ import { prefersServerStorage, setStoragePreference } from './StoragePreferences
1111

1212
const VERSION = 1;
1313

14+
/**
15+
* In-memory cache for views fetched from server storage
16+
* Cache persists for the lifetime of the page (until browser reload)
17+
* Structure: { appId: views[] }
18+
*/
19+
const serverViewsCache = {};
20+
1421
/**
1522
* Enhanced ViewPreferences with server-side storage support
1623
*/
@@ -29,9 +36,20 @@ export default class ViewPreferencesManager {
2936
// Check if server storage is enabled and user prefers it
3037
if (this.serverStorage.isServerConfigEnabled() && prefersServerStorage(appId)) {
3138
try {
39+
// Check cache first
40+
if (serverViewsCache[appId]) {
41+
return serverViewsCache[appId];
42+
}
43+
44+
// Fetch from server and cache the result
3245
const serverViews = await this._getViewsFromServer(appId);
3346
// Always return server views (even if empty) when server storage is preferred
34-
return serverViews || [];
47+
const views = serverViews || [];
48+
49+
// Cache the fetched views
50+
serverViewsCache[appId] = views;
51+
52+
return views;
3553
} catch (error) {
3654
console.error('Failed to get views from server:', error);
3755
// When server storage is preferred, return empty array instead of falling back to local
@@ -54,7 +72,12 @@ export default class ViewPreferencesManager {
5472
// Check if server storage is enabled and user prefers it
5573
if (this.serverStorage.isServerConfigEnabled() && prefersServerStorage(appId)) {
5674
try {
57-
return await this._saveViewToServer(appId, view);
75+
await this._saveViewToServer(appId, view);
76+
77+
// Invalidate cache - will be reloaded on next getViews call
78+
delete serverViewsCache[appId];
79+
80+
return;
5881
} catch (error) {
5982
console.error('Failed to save view to server:', error);
6083
// On error, fallback to local storage
@@ -76,7 +99,12 @@ export default class ViewPreferencesManager {
7699
// Check if server storage is enabled and user prefers it
77100
if (this.serverStorage.isServerConfigEnabled() && prefersServerStorage(appId)) {
78101
try {
79-
return await this._deleteViewFromServer(appId, viewId);
102+
await this._deleteViewFromServer(appId, viewId);
103+
104+
// Invalidate cache - will be reloaded on next getViews call
105+
delete serverViewsCache[appId];
106+
107+
return;
80108
} catch (error) {
81109
console.error('Failed to delete view from server:', error);
82110
// On error, fallback to local storage
@@ -137,6 +165,10 @@ export default class ViewPreferencesManager {
137165

138166
// Proceed with migration (merge mode)
139167
await this._migrateViewsToServer(appId, localViews, overwriteConflicts);
168+
169+
// Invalidate cache after migration
170+
delete serverViewsCache[appId];
171+
140172
return { success: true, viewCount: localViews.length };
141173
} catch (error) {
142174
console.error('Failed to migrate views to server:', error);

0 commit comments

Comments
 (0)