MOBILE-4525 filter: Group requests when getting category filters
parent
42d18b8e11
commit
0d6b624210
|
@ -35,6 +35,7 @@ import { CoreSite } from '@classes/sites/site';
|
|||
import { CoreCourseHelper } from '@features/course/services/course-helper';
|
||||
import { firstValueFrom } from 'rxjs';
|
||||
import { ContextLevel } from '@/core/constants';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
|
||||
/**
|
||||
* Helper service to provide filter functionalities.
|
||||
|
@ -106,6 +107,39 @@ export class CoreFilterHelperProvider {
|
|||
return filters[contextLevel][instanceId] || [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Return contexts of enrolled courses categories to decrease number of WS requests.
|
||||
* If cannot retrieve categories or current category is not in the list, return only the context of the current category.
|
||||
*
|
||||
* @param categoryId Category ID.
|
||||
* @param siteId Site ID. If not defined, current site.
|
||||
* @returns Promise resolved with the contexts.
|
||||
*/
|
||||
async getCategoryContexts(categoryId: number, siteId?: string): Promise<CoreFiltersGetAvailableInContextWSParamContext[]> {
|
||||
// Get the categories of courses the user is enrolled in to decrease the number of WS requests.
|
||||
// Using CoreCourses.getCategories would group more categories, but it would require a new WS request.
|
||||
const courses = await CoreUtils.ignoreErrors(CoreCourses.getUserCourses(true, siteId));
|
||||
|
||||
const categoriesIds = (courses ?? []).map(course => course.categoryid)
|
||||
.filter((categoryId): categoryId is number => categoryId !== undefined);
|
||||
|
||||
if (!categoriesIds.includes(categoryId)) {
|
||||
return [
|
||||
{
|
||||
contextlevel: ContextLevel.COURSECAT,
|
||||
instanceid: categoryId,
|
||||
},
|
||||
];
|
||||
}
|
||||
|
||||
categoriesIds.sort((a, b) => b - a);
|
||||
|
||||
return categoriesIds.map((categoryId) => ({
|
||||
contextlevel: ContextLevel.COURSECAT,
|
||||
instanceid: categoryId,
|
||||
}));
|
||||
}
|
||||
|
||||
/**
|
||||
* If user is enrolled in the course, return contexts of all enrolled courses to decrease number of WS requests.
|
||||
*
|
||||
|
@ -236,6 +270,11 @@ export class CoreFilterHelperProvider {
|
|||
// If enrolled, get all enrolled courses filters with a single call to decrease number of WS calls.
|
||||
const getFilters = () => this.getCourseContexts(instanceId, siteId);
|
||||
|
||||
return await this.getCacheableFilters(contextLevel, instanceId, getFilters, options, site);
|
||||
} else if (contextLevel === ContextLevel.COURSECAT) {
|
||||
// Try to get all the categories with a single call.
|
||||
const getFilters = () => this.getCategoryContexts(instanceId, siteId);
|
||||
|
||||
return await this.getCacheableFilters(contextLevel, instanceId, getFilters, options, site);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue