Skip to content

Commit 1aa3b16

Browse files
committed
MOBILE-1465 addons: Use a cache to minimize WS calls in handlers
1 parent 370a24f commit 1aa3b16

File tree

9 files changed

+183
-12
lines changed

9 files changed

+183
-12
lines changed

www/addons/coursecompletion/services/coursecompletion.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ angular.module('mm.addons.coursecompletion')
188188
*
189189
* @module mm.addons.coursecompletion
190190
* @ngdoc method
191-
* @name $mmaCourseCompletion#isPluginViewEnabledForCourse
191+
* @name $mmaCourseCompletion#isPluginViewEnabledForUser
192192
* @param {Number} courseId Course ID.
193193
* @param {Number} userId User ID.
194194
* @return {Promise} Promise resolved with true if plugin is enabled, rejected or resolved with false otherwise.

www/addons/coursecompletion/services/handlers.js

Lines changed: 71 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,50 @@ angular.module('mm.addons.coursecompletion')
2525
*/
2626
.factory('$mmaCourseCompletionHandlers', function($mmaCourseCompletion, $state, mmCoursesAccessMethods) {
2727

28-
var self = {};
28+
// We use "caches" to decrease network usage.
29+
var self = {},
30+
viewCompletionEnabledCache = {},
31+
coursesNavEnabledCache = {};
32+
33+
/**
34+
* Get a cache key to identify a course and a user.
35+
*
36+
* @param {Number} courseId Course ID.
37+
* @param {Number} userId User ID.
38+
* @return {String} Cache key.
39+
*/
40+
function getCacheKey(courseId, userId) {
41+
return courseId + '#' + userId;
42+
}
43+
44+
/**
45+
* Clear view completion cache.
46+
* If a courseId and userId are specified, it will only delete the entry for that user and course.
47+
*
48+
* @module mm.addons.coursecompletion
49+
* @ngdoc method
50+
* @name $mmaCourseCompletionHandlers#clearViewCompletionCache
51+
* @param {Number} [courseId] Course ID.
52+
* @param {Number} [userId] User ID.
53+
*/
54+
self.clearViewCompletionCache = function(courseId, userId) {
55+
if (courseId && userId) {
56+
delete viewCompletionEnabledCache[getCacheKey(courseId, userId)];
57+
} else {
58+
viewCompletionEnabledCache = {};
59+
}
60+
};
61+
62+
/**
63+
* Clear courses nav caches.
64+
*
65+
* @module mm.addons.coursecompletion
66+
* @ngdoc method
67+
* @name $mmaCourseCompletionHandlers#clearCoursesNavCache
68+
*/
69+
self.clearCoursesNavCache = function() {
70+
coursesNavEnabledCache = {};
71+
};
2972

3073
/**
3174
* View user completion handler.
@@ -56,7 +99,14 @@ angular.module('mm.addons.coursecompletion')
5699
*/
57100
self.isEnabledForUser = function(user, courseId) {
58101
return $mmaCourseCompletion.isPluginViewEnabledForCourse(courseId).then(function() {
59-
return $mmaCourseCompletion.isPluginViewEnabledForUser(courseId, user.id);
102+
var cacheKey = getCacheKey(courseId, user.id);
103+
if (typeof viewCompletionEnabledCache[cacheKey] != 'undefined') {
104+
return viewCompletionEnabledCache[cacheKey];
105+
}
106+
return $mmaCourseCompletion.isPluginViewEnabledForUser(courseId, user.id).then(function(enabled) {
107+
viewCompletionEnabledCache[cacheKey] = enabled;
108+
return enabled;
109+
});
60110
});
61111
};
62112

@@ -130,7 +180,13 @@ angular.module('mm.addons.coursecompletion')
130180
}
131181
return $mmaCourseCompletion.isPluginViewEnabledForCourse(courseId).then(function() {
132182
// Check if the user can see his own report, teachers can't.
133-
return $mmaCourseCompletion.isPluginViewEnabledForUser(courseId);
183+
if (typeof coursesNavEnabledCache[courseId] != 'undefined') {
184+
return coursesNavEnabledCache[courseId];
185+
}
186+
return $mmaCourseCompletion.isPluginViewEnabledForUser(courseId).then(function(enabled) {
187+
coursesNavEnabledCache[courseId] = enabled;
188+
return enabled;
189+
});
134190
});
135191
};
136192

@@ -166,4 +222,16 @@ angular.module('mm.addons.coursecompletion')
166222
};
167223

168224
return self;
225+
})
226+
227+
.run(function($mmaCourseCompletionHandlers, $mmEvents, mmCoreEventLogout, mmCoursesEventMyCoursesRefreshed,
228+
mmUserEventProfileRefreshed) {
229+
$mmEvents.on(mmCoreEventLogout, function() {
230+
$mmaCourseCompletionHandlers.clearViewCompletionCache();
231+
$mmaCourseCompletionHandlers.clearCoursesNavCache();
232+
});
233+
$mmEvents.on(mmCoursesEventMyCoursesRefreshed, $mmaCourseCompletionHandlers.clearCoursesNavCache);
234+
$mmEvents.on(mmUserEventProfileRefreshed, function(data) {
235+
$mmaCourseCompletionHandlers.clearViewCompletionCache(data.courseid, data.userid);
236+
});
169237
});

www/addons/grades/services/handlers.js

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,37 @@ angular.module('mm.addons.grades')
2323
*/
2424
.factory('$mmaGradesHandlers', function($mmaGrades, $state, $mmUtil, $mmContentLinksHelper, mmCoursesAccessMethods) {
2525

26-
var self = {};
26+
var self = {},
27+
viewGradesEnabledCache = {}; // We use a "cache" to decrease network usage.
28+
29+
/**
30+
* Get a cache key to identify a course and a user.
31+
*
32+
* @param {Number} courseId Course ID.
33+
* @param {Number} userId User ID.
34+
* @return {String} Cache key.
35+
*/
36+
function getCacheKey(courseId, userId) {
37+
return courseId + '#' + userId;
38+
}
39+
40+
/**
41+
* Clear view grades cache.
42+
* If a courseId and userId are specified, it will only delete the entry for that user and course.
43+
*
44+
* @module mm.addons.grades
45+
* @ngdoc method
46+
* @name $mmaGradesHandlers#clearViewGradesCache
47+
* @param {Number} [courseId] Course ID.
48+
* @param {Number} [userId] User ID.
49+
*/
50+
self.clearViewGradesCache = function(courseId, userId) {
51+
if (courseId && userId) {
52+
delete viewGradesEnabledCache[getCacheKey(courseId, userId)];
53+
} else {
54+
viewGradesEnabledCache = {};
55+
}
56+
};
2757

2858
/**
2959
* Course nav handler.
@@ -119,7 +149,14 @@ angular.module('mm.addons.grades')
119149
*/
120150
self.isEnabledForUser = function(user, courseId) {
121151
return $mmaGrades.isPluginEnabledForCourse(courseId).then(function() {
122-
return $mmaGrades.isPluginEnabledForUser(courseId, user.id);
152+
var cacheKey = getCacheKey(courseId, user.id);
153+
if (typeof viewGradesEnabledCache[cacheKey] != 'undefined') {
154+
return viewGradesEnabledCache[cacheKey];
155+
}
156+
return $mmaGrades.isPluginEnabledForUser(courseId, user.id).then(function(enabled) {
157+
viewGradesEnabledCache[cacheKey] = enabled;
158+
return enabled;
159+
});
123160
});
124161
};
125162

@@ -239,4 +276,11 @@ angular.module('mm.addons.grades')
239276
};
240277

241278
return self;
279+
})
280+
281+
.run(function($mmaGradesHandlers, $mmEvents, mmCoreEventLogout, mmUserEventProfileRefreshed) {
282+
$mmEvents.on(mmCoreEventLogout, $mmaGradesHandlers.clearViewGradesCache);
283+
$mmEvents.on(mmUserEventProfileRefreshed, function(data) {
284+
$mmaGradesHandlers.clearViewGradesCache(data.courseid, data.userid);
285+
});
242286
});

www/addons/notes/services/handlers.js

Lines changed: 57 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,38 @@ angular.module('mm.addons.notes')
2525
*/
2626
.factory('$mmaNotesHandlers', function($mmaNotes, $mmSite, $mmApp, $ionicModal, $mmUtil, $q, mmCoursesAccessMethods) {
2727

28-
var self = {};
28+
// We use "caches" to decrease network usage.
29+
var self = {},
30+
addNoteEnabledCache = {},
31+
coursesNavEnabledCache = {};
32+
33+
/**
34+
* Clear add note cache.
35+
* If a courseId is specified, it will only delete the entry for that course.
36+
*
37+
* @module mm.addons.notes
38+
* @ngdoc method
39+
* @name $mmaNotesHandlers#clearAddNoteCache
40+
* @param {Number} [courseId] Course ID.
41+
*/
42+
self.clearAddNoteCache = function(courseId) {
43+
if (courseId) {
44+
delete addNoteEnabledCache[courseId];
45+
} else {
46+
addNoteEnabledCache = {};
47+
}
48+
};
49+
50+
/**
51+
* Clear courses nav cache.
52+
*
53+
* @module mm.addons.notes
54+
* @ngdoc method
55+
* @name $mmaNotesHandlers#clearCoursesNavCache
56+
*/
57+
self.clearCoursesNavCache = function() {
58+
coursesNavEnabledCache = {};
59+
};
2960

3061
/**
3162
* Add a note handler.
@@ -59,7 +90,13 @@ angular.module('mm.addons.notes')
5990
if (!courseId || user.id == $mmSite.getUserId()) {
6091
return $q.when(false);
6192
}
62-
return $mmaNotes.isPluginAddNoteEnabledForCourse(courseId);
93+
if (typeof addNoteEnabledCache[courseId] != 'undefined') {
94+
return addNoteEnabledCache[courseId];
95+
}
96+
return $mmaNotes.isPluginAddNoteEnabledForCourse(courseId).then(function(enabled) {
97+
addNoteEnabledCache[courseId] = enabled;
98+
return enabled;
99+
});
63100
};
64101

65102
/**
@@ -164,7 +201,13 @@ angular.module('mm.addons.notes')
164201
if (accessData && accessData.type == mmCoursesAccessMethods.guest) {
165202
return false; // Not enabled for guests.
166203
}
167-
return $mmaNotes.isPluginViewNotesEnabledForCourse(courseId);
204+
if (typeof coursesNavEnabledCache[courseId] != 'undefined') {
205+
return coursesNavEnabledCache[courseId];
206+
}
207+
return $mmaNotes.isPluginViewNotesEnabledForCourse(courseId).then(function(enabled) {
208+
coursesNavEnabledCache[courseId] = enabled;
209+
return enabled;
210+
});
168211
};
169212

170213
/**
@@ -199,4 +242,15 @@ angular.module('mm.addons.notes')
199242
};
200243

201244
return self;
245+
})
246+
247+
.run(function($mmaNotesHandlers, $mmEvents, mmCoreEventLogout, mmCoursesEventMyCoursesRefreshed, mmUserEventProfileRefreshed) {
248+
$mmEvents.on(mmCoreEventLogout, function() {
249+
$mmaNotesHandlers.clearAddNoteCache();
250+
$mmaNotesHandlers.clearCoursesNavCache();
251+
});
252+
$mmEvents.on(mmCoursesEventMyCoursesRefreshed, $mmaNotesHandlers.clearCoursesNavCache);
253+
$mmEvents.on(mmUserEventProfileRefreshed, function(data) {
254+
$mmaNotesHandlers.clearAddNoteCache(data.courseid);
255+
});
202256
});

www/addons/notes/services/notes.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ angular.module('mm.addons.notes')
9292
*/
9393
self.isPluginAddNoteEnabledForCourse = function(courseId) {
9494
// The only way to detect if it's enabled is to perform a WS call.
95-
// We use an invalid user ID (-1) and check if the error is due to permissions or to invalid ID.
95+
// We use an invalid user ID (-1) to avoid saving the note if the user has permissions.
9696
var data = {
9797
"notes[0][userid]" : -1,
9898
"notes[0][courseid]": courseId,

www/core/components/courses/controllers/list.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ angular.module('mm.core.courses')
2222
* @name mmCoursesListCtrl
2323
*/
2424
.controller('mmCoursesListCtrl', function($scope, $mmCourses, $mmCoursesDelegate, $mmUtil, $mmEvents, $mmSite,
25-
mmCoursesEventMyCoursesUpdated) {
25+
mmCoursesEventMyCoursesUpdated, mmCoursesEventMyCoursesRefreshed) {
2626

2727
$scope.searchEnabled = $mmCourses.isSearchCoursesAvailable();
2828
$scope.areNavHandlersLoadedFor = $mmCoursesDelegate.areNavHandlersLoadedFor;
@@ -49,6 +49,7 @@ angular.module('mm.core.courses')
4949
});
5050

5151
$scope.refreshCourses = function() {
52+
$mmEvents.trigger(mmCoursesEventMyCoursesRefreshed);
5253
$mmCourses.invalidateUserCourses().finally(function() {
5354
fetchCourses(true).finally(function() {
5455
$scope.$broadcast('scroll.refreshComplete');

www/core/components/courses/main.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ angular.module('mm.core.courses', [])
1818
.constant('mmCoursesSearchPerPage', 20) // Max of courses per page when searching courses.
1919
.constant('mmCoursesEnrolInvalidKey', 'mmCoursesEnrolInvalidKey')
2020
.constant('mmCoursesEventMyCoursesUpdated', 'my_courses_updated')
21+
.constant('mmCoursesEventMyCoursesRefreshed', 'my_courses_refreshed') // User refreshed My Courses.
2122
.constant('mmCoursesAccessMethods', {
2223
guest: 'guest',
2324
default: 'default'

www/core/components/user/controllers/profile.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ angular.module('mm.core.user')
2121
* @ngdoc controller
2222
* @name mmaParticipantsProfileCtrl
2323
*/
24-
.controller('mmUserProfileCtrl', function($scope, $stateParams, $mmUtil, $mmUser, $mmUserDelegate, $mmSite, $q, $translate) {
24+
.controller('mmUserProfileCtrl', function($scope, $stateParams, $mmUtil, $mmUser, $mmUserDelegate, $mmSite, $q, $translate,
25+
$mmEvents, mmUserEventProfileRefreshed) {
2526

2627
var courseid = $stateParams.courseid,
2728
userid = $stateParams.userid;
@@ -74,6 +75,7 @@ angular.module('mm.core.user')
7475
});
7576

7677
$scope.refreshUser = function() {
78+
$mmEvents.trigger(mmUserEventProfileRefreshed, {courseid: courseid, userid: userid});
7779
$mmUser.invalidateUserCache(userid).finally(function() {
7880
fetchUserData().finally(function() {
7981
$scope.$broadcast('scroll.refreshComplete');

www/core/components/user/main.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
angular.module('mm.core.user', [])
1616

17+
.constant('mmUserEventProfileRefreshed', 'user_profile_refreshed') // User refreshed an user profile.
1718
.value('mmUserProfileState', 'site.mm_user-profile')
1819

1920
.config(function($stateProvider, $mmContentLinksDelegateProvider) {

0 commit comments

Comments
 (0)