Skip to content

Commit 08b3dc4

Browse files
authored
Merge pull request #2586 from dpalou/MOBILE-3578
MOBILE-3578 competency: Fix multiple requests when view user profile
2 parents 3c49b7f + 3b89d7b commit 08b3dc4

File tree

2 files changed

+68
-27
lines changed

2 files changed

+68
-27
lines changed

src/addon/competency/providers/competency.ts

Lines changed: 67 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,39 @@ export class AddonCompetencyProvider {
6262
});
6363
}
6464

65+
/**
66+
* Returns whether current user can see another user competencies in a course.
67+
*
68+
* @param courseId Course ID.
69+
* @param userId User ID.
70+
* @param siteId Site ID. If not defined, current site.
71+
* @return Promise resolved with boolean: whether the user can view the competencies.
72+
*/
73+
canViewUserCompetenciesInCourse(courseId: number, userId?: number, siteId?: string): Promise<boolean> {
74+
if (!this.sitesProvider.isLoggedIn()) {
75+
return Promise.resolve(false);
76+
}
77+
78+
return this.getCourseCompetenciesPage(courseId, siteId).then((response) => {
79+
if (!response.competencies.length) {
80+
// No competencies.
81+
return false;
82+
}
83+
84+
if (!userId || userId == this.sitesProvider.getCurrentSiteUserId()) {
85+
// Current user.
86+
return true;
87+
}
88+
89+
// Check if current user can view any competency of the user.
90+
return this.getCompetencyInCourse(courseId, response.competencies[0].competency.id, userId, siteId).then(() => {
91+
return true;
92+
});
93+
}).catch(() => {
94+
return false;
95+
});
96+
}
97+
6598
/**
6699
* Get cache key for user learning plans data WS calls.
67100
*
@@ -333,7 +366,7 @@ export class AddonCompetencyProvider {
333366
}
334367

335368
/**
336-
* Get all competencies in a course.
369+
* Get all competencies in a course for a certain user.
337370
*
338371
* @param courseId ID of the course.
339372
* @param userId ID of the user.
@@ -344,6 +377,39 @@ export class AddonCompetencyProvider {
344377
getCourseCompetencies(courseId: number, userId?: number, siteId?: string, ignoreCache?: boolean)
345378
: Promise<AddonCompetencyDataForCourseCompetenciesPageResult> {
346379

380+
return this.getCourseCompetenciesPage(courseId, siteId, ignoreCache).then((response) => {
381+
382+
if (!userId || userId == this.sitesProvider.getCurrentSiteUserId()) {
383+
return response;
384+
}
385+
386+
let promises: Promise<AddonCompetencyUserCompetencySummaryInCourse>[];
387+
388+
promises = response.competencies.map((competency) =>
389+
this.getCompetencyInCourse(courseId, competency.competency.id, userId, siteId)
390+
);
391+
392+
return Promise.all(promises).then((responses: AddonCompetencyUserCompetencySummaryInCourse[]) => {
393+
responses.forEach((resp, index) => {
394+
response.competencies[index].usercompetencycourse = resp.usercompetencysummary.usercompetencycourse;
395+
});
396+
397+
return response;
398+
});
399+
});
400+
}
401+
402+
/**
403+
* Get all competencies in a course.
404+
*
405+
* @param courseId ID of the course.
406+
* @param siteId Site ID. If not defined, current site.
407+
* @param ignoreCache True if it should ignore cached data (it will always fail in offline or server down).
408+
* @return Promise to be resolved when the course competencies are retrieved.
409+
*/
410+
getCourseCompetenciesPage(courseId: number, siteId?: string, ignoreCache?: boolean)
411+
: Promise<AddonCompetencyDataForCourseCompetenciesPageResult> {
412+
347413
return this.sitesProvider.getSite(siteId).then((site) => {
348414

349415
this.logger.debug('Get course competencies for course ' + courseId);
@@ -370,26 +436,6 @@ export class AddonCompetencyProvider {
370436

371437
return Promise.reject(null);
372438
});
373-
374-
}).then((response) => {
375-
376-
if (!userId || userId == this.sitesProvider.getCurrentSiteUserId()) {
377-
return response;
378-
}
379-
380-
let promises: Promise<AddonCompetencyUserCompetencySummaryInCourse>[];
381-
382-
promises = response.competencies.map((competency) =>
383-
this.getCompetencyInCourse(courseId, competency.competency.id, userId, siteId)
384-
);
385-
386-
return Promise.all(promises).then((responses: AddonCompetencyUserCompetencySummaryInCourse[]) => {
387-
responses.forEach((resp, index) => {
388-
response.competencies[index].usercompetencycourse = resp.usercompetencysummary.usercompetencycourse;
389-
});
390-
391-
return response;
392-
});
393439
});
394440
}
395441

src/addon/competency/providers/user-handler.ts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,15 +71,10 @@ export class AddonCompetencyUserHandler implements CoreUserProfileHandler {
7171
return this.participantsNavEnabledCache[cacheKey];
7272
}
7373

74-
return this.competencyProvider.getCourseCompetencies(courseId, user.id).then((response) => {
75-
const enabled = response.competencies.length > 0;
74+
return this.competencyProvider.canViewUserCompetenciesInCourse(courseId, user.id).then((enabled) => {
7675
this.participantsNavEnabledCache[cacheKey] = enabled;
7776

7877
return enabled;
79-
}).catch((message) => {
80-
this.participantsNavEnabledCache[cacheKey] = false;
81-
82-
return false;
8378
});
8479
} else {
8580
// Link on a user site profile.

0 commit comments

Comments
 (0)