MOBILE-2333 siteaddons: Support restrict users and courses
parent
8e87a1ade9
commit
141f979cea
|
@ -30,6 +30,7 @@ import { CoreSiteAddonsModuleIndexComponent } from '../components/module-index/m
|
||||||
import { CoreSiteAddonsProvider } from './siteaddons';
|
import { CoreSiteAddonsProvider } from './siteaddons';
|
||||||
import { CoreSiteAddonsModulePrefetchHandler } from '../classes/module-prefetch-handler';
|
import { CoreSiteAddonsModulePrefetchHandler } from '../classes/module-prefetch-handler';
|
||||||
import { CoreCompileProvider } from '../../compile/providers/compile';
|
import { CoreCompileProvider } from '../../compile/providers/compile';
|
||||||
|
import { CoreCoursesProvider } from '../../courses/providers/courses';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper service to provide functionalities regarding site addons. It basically has the features to load and register site
|
* Helper service to provide functionalities regarding site addons. It basically has the features to load and register site
|
||||||
|
@ -45,30 +46,37 @@ export class CoreSiteAddonsHelperProvider {
|
||||||
private mainMenuDelegate: CoreMainMenuDelegate, private moduleDelegate: CoreCourseModuleDelegate,
|
private mainMenuDelegate: CoreMainMenuDelegate, private moduleDelegate: CoreCourseModuleDelegate,
|
||||||
private userDelegate: CoreUserDelegate, private langProvider: CoreLangProvider,
|
private userDelegate: CoreUserDelegate, private langProvider: CoreLangProvider,
|
||||||
private siteAddonsProvider: CoreSiteAddonsProvider, private prefetchDelegate: CoreCourseModulePrefetchDelegate,
|
private siteAddonsProvider: CoreSiteAddonsProvider, private prefetchDelegate: CoreCourseModulePrefetchDelegate,
|
||||||
private compileProvider: CoreCompileProvider, private utils: CoreUtilsProvider) {
|
private compileProvider: CoreCompileProvider, private utils: CoreUtilsProvider,
|
||||||
|
private coursesProvider: CoreCoursesProvider) {
|
||||||
this.logger = logger.getInstance('CoreSiteAddonsHelperProvider');
|
this.logger = logger.getInstance('CoreSiteAddonsHelperProvider');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Bootstrap a handler if it has some bootstrap JS.
|
* Bootstrap a handler if it has some bootstrap method.
|
||||||
*
|
*
|
||||||
* @param {any} addon Data of the addon.
|
* @param {any} addon Data of the addon.
|
||||||
* @param {string} handlerName Name of the handler in the addon.
|
* @param {string} handlerName Name of the handler in the addon.
|
||||||
* @param {any} handlerSchema Data about the handler.
|
* @param {any} handlerSchema Data about the handler.
|
||||||
* @return {Promise<any>} Promise resolved when done. The resolve param is the result of the javascript execution (if any).
|
* @return {Promise<{restrict?: any, jsResult?: any}>} Promise resolved when done. It returns the "restrict" of the handler and
|
||||||
|
* the result of the javascript execution (if any).
|
||||||
*/
|
*/
|
||||||
protected bootstrapHandler(addon: any, handlerName: string, handlerSchema: any): Promise<any> {
|
protected bootstrapHandler(addon: any, handlerName: string, handlerSchema: any): Promise<{restrict?: any, jsResult?: any}> {
|
||||||
if (!handlerSchema.bootstrap) {
|
if (!handlerSchema.bootstrap) {
|
||||||
return Promise.resolve();
|
return Promise.resolve({});
|
||||||
}
|
}
|
||||||
|
|
||||||
const siteId = this.sitesProvider.getCurrentSiteId(),
|
const siteId = this.sitesProvider.getCurrentSiteId(),
|
||||||
preSets = {getFromCache: false}; // Try to ignore cache.
|
preSets = {getFromCache: false}; // Try to ignore cache.
|
||||||
|
|
||||||
return this.siteAddonsProvider.getContent(addon.component, handlerSchema.bootstrap, {}, preSets).then((result) => {
|
return this.siteAddonsProvider.getContent(addon.component, handlerSchema.bootstrap, {}, preSets).then((result) => {
|
||||||
|
const data = {
|
||||||
|
restrict: result.restrict,
|
||||||
|
jsResult: undefined
|
||||||
|
};
|
||||||
|
|
||||||
if (!result.javascript || this.sitesProvider.getCurrentSiteId() != siteId) {
|
if (!result.javascript || this.sitesProvider.getCurrentSiteId() != siteId) {
|
||||||
// No javascript or site has changed, stop.
|
// No javascript or site has changed, stop.
|
||||||
return;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create a "fake" instance to hold all the libraries.
|
// Create a "fake" instance to hold all the libraries.
|
||||||
|
@ -76,7 +84,9 @@ export class CoreSiteAddonsHelperProvider {
|
||||||
this.compileProvider.injectLibraries(instance);
|
this.compileProvider.injectLibraries(instance);
|
||||||
|
|
||||||
// Now execute the javascript using this instance.
|
// Now execute the javascript using this instance.
|
||||||
return this.compileProvider.executeJavascript(instance, result.javascript);
|
data.jsResult = this.compileProvider.executeJavascript(instance, result.javascript);
|
||||||
|
|
||||||
|
return data;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -205,15 +215,16 @@ export class CoreSiteAddonsHelperProvider {
|
||||||
|
|
||||||
switch (handlerSchema.delegate) {
|
switch (handlerSchema.delegate) {
|
||||||
case 'CoreMainMenuDelegate':
|
case 'CoreMainMenuDelegate':
|
||||||
uniqueName = this.registerMainMenuHandler(addon, handlerName, handlerSchema, result);
|
uniqueName = this.registerMainMenuHandler(addon, handlerName, handlerSchema, result.jsResult, result.restrict);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'CoreCourseModuleDelegate':
|
case 'CoreCourseModuleDelegate':
|
||||||
uniqueName = this.registerModuleHandler(addon, handlerName, handlerSchema, result);
|
uniqueName = this.registerModuleHandler(addon, handlerName, handlerSchema, result.jsResult, result.restrict);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'CoreUserDelegate':
|
case 'CoreUserDelegate':
|
||||||
uniqueName = this.registerUserProfileHandler(addon, handlerName, handlerSchema, result);
|
uniqueName = this.registerUserProfileHandler(addon, handlerName, handlerSchema, result.jsResult,
|
||||||
|
result.restrict);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -239,9 +250,11 @@ export class CoreSiteAddonsHelperProvider {
|
||||||
* @param {string} handlerName Name of the handler in the addon.
|
* @param {string} handlerName Name of the handler in the addon.
|
||||||
* @param {any} handlerSchema Data about the handler.
|
* @param {any} handlerSchema Data about the handler.
|
||||||
* @param {any} [bootstrapResult] Result of executing the bootstrap JS.
|
* @param {any} [bootstrapResult] Result of executing the bootstrap JS.
|
||||||
|
* @param {any} [restrict] List of users and courses the handler is restricted to.
|
||||||
* @return {string} A string to identify the handler.
|
* @return {string} A string to identify the handler.
|
||||||
*/
|
*/
|
||||||
protected registerMainMenuHandler(addon: any, handlerName: string, handlerSchema: any, bootstrapResult?: any): string {
|
protected registerMainMenuHandler(addon: any, handlerName: string, handlerSchema: any, bootstrapResult?: any, restrict?: any)
|
||||||
|
: string {
|
||||||
if (!handlerSchema || !handlerSchema.displaydata) {
|
if (!handlerSchema || !handlerSchema.displaydata) {
|
||||||
// Required data not provided, stop.
|
// Required data not provided, stop.
|
||||||
return;
|
return;
|
||||||
|
@ -284,9 +297,11 @@ export class CoreSiteAddonsHelperProvider {
|
||||||
* @param {string} handlerName Name of the handler in the addon.
|
* @param {string} handlerName Name of the handler in the addon.
|
||||||
* @param {any} handlerSchema Data about the handler.
|
* @param {any} handlerSchema Data about the handler.
|
||||||
* @param {any} [bootstrapResult] Result of executing the bootstrap JS.
|
* @param {any} [bootstrapResult] Result of executing the bootstrap JS.
|
||||||
|
* @param {any} [restrict] List of users and courses the handler is restricted to.
|
||||||
* @return {string} A string to identify the handler.
|
* @return {string} A string to identify the handler.
|
||||||
*/
|
*/
|
||||||
protected registerModuleHandler(addon: any, handlerName: string, handlerSchema: any, bootstrapResult?: any): string {
|
protected registerModuleHandler(addon: any, handlerName: string, handlerSchema: any, bootstrapResult?: any, restrict?: any)
|
||||||
|
: string {
|
||||||
if (!handlerSchema || !handlerSchema.displaydata) {
|
if (!handlerSchema || !handlerSchema.displaydata) {
|
||||||
// Required data not provided, stop.
|
// Required data not provided, stop.
|
||||||
return;
|
return;
|
||||||
|
@ -342,9 +357,11 @@ export class CoreSiteAddonsHelperProvider {
|
||||||
* @param {string} handlerName Name of the handler in the addon.
|
* @param {string} handlerName Name of the handler in the addon.
|
||||||
* @param {any} handlerSchema Data about the handler.
|
* @param {any} handlerSchema Data about the handler.
|
||||||
* @param {any} [bootstrapResult] Result of executing the bootstrap JS.
|
* @param {any} [bootstrapResult] Result of executing the bootstrap JS.
|
||||||
|
* @param {any} [restrict] List of users and courses the handler is restricted to.
|
||||||
* @return {string} A string to identify the handler.
|
* @return {string} A string to identify the handler.
|
||||||
*/
|
*/
|
||||||
protected registerUserProfileHandler(addon: any, handlerName: string, handlerSchema: any, bootstrapResult?: any): string {
|
protected registerUserProfileHandler(addon: any, handlerName: string, handlerSchema: any, bootstrapResult?: any, restrict?: any)
|
||||||
|
: string {
|
||||||
if (!handlerSchema || !handlerSchema.displaydata) {
|
if (!handlerSchema || !handlerSchema.displaydata) {
|
||||||
// Required data not provided, stop.
|
// Required data not provided, stop.
|
||||||
return;
|
return;
|
||||||
|
@ -360,11 +377,31 @@ export class CoreSiteAddonsHelperProvider {
|
||||||
userHandler = Object.assign(baseHandler, {
|
userHandler = Object.assign(baseHandler, {
|
||||||
priority: handlerSchema.priority,
|
priority: handlerSchema.priority,
|
||||||
type: handlerSchema.type,
|
type: handlerSchema.type,
|
||||||
isEnabledForUser: (user: any, courseId: number, navOptions?: any, admOptions?: any): boolean => {
|
isEnabledForUser: (user: any, courseId: number, navOptions?: any, admOptions?: any): boolean | Promise<boolean> => {
|
||||||
if (handlerSchema.restricted == 'current' && user.id != this.sitesProvider.getCurrentSite().getUserId()) {
|
if (handlerSchema.restricttocurrentuser && user.id != this.sitesProvider.getCurrentSite().getUserId()) {
|
||||||
|
// Only enabled for current user.
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (restrict) {
|
||||||
|
if (restrict.users && restrict.users.indexOf(user.id) == -1) {
|
||||||
|
// User is not in the list of restricted users.
|
||||||
|
return false;
|
||||||
|
} else if (restrict.courses && restrict.courses.indexOf(courseId) == -1) {
|
||||||
|
// Course is not in the list of restricted courses.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (handlerSchema.restricttoenrolledcourses || typeof handlerSchema.restricttoenrolledcourses == 'undefined') {
|
||||||
|
// Only enabled for courses the user is enrolled to. Check if the user is enrolled in the course.
|
||||||
|
return this.coursesProvider.getUserCourse(courseId, true).then(() => {
|
||||||
|
return true;
|
||||||
|
}).catch(() => {
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
getDisplayData: (user: any, courseId: number): CoreUserProfileHandlerData => {
|
getDisplayData: (user: any, courseId: number): CoreUserProfileHandlerData => {
|
||||||
|
|
|
@ -51,32 +51,6 @@ export interface CoreSiteAddonsHandler {
|
||||||
bootstrapResult?: any;
|
bootstrapResult?: any;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface CoreSiteAddonsGetContentResult {
|
|
||||||
/**
|
|
||||||
* The content in HTML.
|
|
||||||
* @type {string}
|
|
||||||
*/
|
|
||||||
html: string;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The javascript for the content.
|
|
||||||
* @type {string}
|
|
||||||
*/
|
|
||||||
javascript: string;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The files for the content.
|
|
||||||
* @type {any[]}
|
|
||||||
*/
|
|
||||||
files?: any[];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Other data.
|
|
||||||
* @type {any}
|
|
||||||
*/
|
|
||||||
otherdata?: any;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Service to provide functionalities regarding site addons.
|
* Service to provide functionalities regarding site addons.
|
||||||
*/
|
*/
|
||||||
|
@ -187,10 +161,9 @@ export class CoreSiteAddonsProvider {
|
||||||
* @param {any} args The params for the method.
|
* @param {any} args The params for the method.
|
||||||
* @param {CoreSiteWSPreSets} [preSets] Extra options.
|
* @param {CoreSiteWSPreSets} [preSets] Extra options.
|
||||||
* @param {string} [siteId] Site ID. If not defined, current site.
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
* @return {Promise<CoreSiteAddonsGetContentResult>} Promise resolved with the result.
|
* @return {Promise<any>} Promise resolved with the result.
|
||||||
*/
|
*/
|
||||||
getContent(component: string, method: string, args: any, preSets?: CoreSiteWSPreSets, siteId?: string)
|
getContent(component: string, method: string, args: any, preSets?: CoreSiteWSPreSets, siteId?: string): Promise<any> {
|
||||||
: Promise<CoreSiteAddonsGetContentResult> {
|
|
||||||
this.logger.debug(`Get content for component '${component}' and method '${method}'`);
|
this.logger.debug(`Get content for component '${component}' and method '${method}'`);
|
||||||
|
|
||||||
return this.sitesProvider.getSite(siteId).then((site) => {
|
return this.sitesProvider.getSite(siteId).then((site) => {
|
||||||
|
|
Loading…
Reference in New Issue