commit
af4635ed3a
|
@ -17,7 +17,7 @@ if [ $TRAVIS_BRANCH == 'integration' ] || [ $TRAVIS_BRANCH == 'master' ] || [ $T
|
||||||
version=`grep versionname src/config.json| cut -d: -f2|cut -d'"' -f2`
|
version=`grep versionname src/config.json| cut -d: -f2|cut -d'"' -f2`
|
||||||
date=`date +%Y%m%d`'00'
|
date=`date +%Y%m%d`'00'
|
||||||
|
|
||||||
pushd ../../moodle-local_moodlemobileapp
|
pushd ../moodle-local_moodlemobileapp
|
||||||
sed -ie "s/release[ ]*=[ ]*'[^']*';/release = '$version';/1" version.php
|
sed -ie "s/release[ ]*=[ ]*'[^']*';/release = '$version';/1" version.php
|
||||||
sed -ie "s/version[ ]*=[ ]*[0-9]*;/version = $date;/1" version.php
|
sed -ie "s/version[ ]*=[ ]*[0-9]*;/version = $date;/1" version.php
|
||||||
rm version.phpe
|
rm version.phpe
|
||||||
|
|
|
@ -1342,6 +1342,7 @@
|
||||||
"core.favourites": "moodle",
|
"core.favourites": "moodle",
|
||||||
"core.filename": "repository",
|
"core.filename": "repository",
|
||||||
"core.filenameexist": "local_moodlemobileapp",
|
"core.filenameexist": "local_moodlemobileapp",
|
||||||
|
"core.filenotfound": "resource",
|
||||||
"core.fileuploader.addfiletext": "repository",
|
"core.fileuploader.addfiletext": "repository",
|
||||||
"core.fileuploader.audio": "local_moodlemobileapp",
|
"core.fileuploader.audio": "local_moodlemobileapp",
|
||||||
"core.fileuploader.camera": "local_moodlemobileapp",
|
"core.fileuploader.camera": "local_moodlemobileapp",
|
||||||
|
|
|
@ -166,9 +166,10 @@ export class AddonMessagesMainMenuHandler implements CoreMainMenuHandler, CoreCr
|
||||||
* Receives the ID of the site affected, undefined for all sites.
|
* Receives the ID of the site affected, undefined for all sites.
|
||||||
*
|
*
|
||||||
* @param {string} [siteId] ID of the site affected, undefined for all sites.
|
* @param {string} [siteId] ID of the site affected, undefined for all sites.
|
||||||
|
* @param {boolean} [force] Wether the execution is forced (manual sync).
|
||||||
* @return {Promise<any>} Promise resolved when done, rejected if failure.
|
* @return {Promise<any>} Promise resolved when done, rejected if failure.
|
||||||
*/
|
*/
|
||||||
execute(siteId?: string): Promise<any> {
|
execute(siteId?: string, force?: boolean): Promise<any> {
|
||||||
if (this.sitesProvider.isCurrentSite(siteId)) {
|
if (this.sitesProvider.isCurrentSite(siteId)) {
|
||||||
this.refreshBadge();
|
this.refreshBadge();
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,9 +30,10 @@ export class AddonMessagesSyncCronHandler implements CoreCronHandler {
|
||||||
* Receives the ID of the site affected, undefined for all sites.
|
* Receives the ID of the site affected, undefined for all sites.
|
||||||
*
|
*
|
||||||
* @param {string} [siteId] ID of the site affected, undefined for all sites.
|
* @param {string} [siteId] ID of the site affected, undefined for all sites.
|
||||||
|
* @param {boolean} [force] Wether the execution is forced (manual sync).
|
||||||
* @return {Promise<any>} Promise resolved when done, rejected if failure.
|
* @return {Promise<any>} Promise resolved when done, rejected if failure.
|
||||||
*/
|
*/
|
||||||
execute(siteId?: string): Promise<any> {
|
execute(siteId?: string, force?: boolean): Promise<any> {
|
||||||
return this.messagesSync.syncAllDiscussions(siteId);
|
return this.messagesSync.syncAllDiscussions(siteId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -110,26 +110,28 @@ export class AddonModAssignSyncProvider extends CoreSyncBaseProvider {
|
||||||
* Try to synchronize all the assignments in a certain site or in all sites.
|
* Try to synchronize all the assignments in a certain site or in all sites.
|
||||||
*
|
*
|
||||||
* @param {string} [siteId] Site ID to sync. If not defined, sync all sites.
|
* @param {string} [siteId] Site ID to sync. If not defined, sync all sites.
|
||||||
|
* @param {boolean} force Wether to force sync not depending on last execution.
|
||||||
* @return {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
* @return {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
||||||
*/
|
*/
|
||||||
syncAllAssignments(siteId?: string): Promise<any> {
|
syncAllAssignments(siteId?: string, force?: boolean): Promise<any> {
|
||||||
return this.syncOnSites('all assignments', this.syncAllAssignmentsFunc.bind(this), [], siteId);
|
return this.syncOnSites('all assignments', this.syncAllAssignmentsFunc.bind(this), [force], siteId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sync all assignments on a site.
|
* Sync all assignments on a site.
|
||||||
*
|
*
|
||||||
* @param {string} [siteId] Site ID to sync. If not defined, sync all sites.
|
* @param {string} [siteId] Site ID to sync. If not defined, sync all sites.
|
||||||
|
* @param {boolean} [force] Wether to force sync not depending on last execution.
|
||||||
* @param {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
* @param {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
||||||
*/
|
*/
|
||||||
protected syncAllAssignmentsFunc(siteId?: string): Promise<any> {
|
protected syncAllAssignmentsFunc(siteId?: string, force?: boolean): Promise<any> {
|
||||||
// Get all assignments that have offline data.
|
// Get all assignments that have offline data.
|
||||||
return this.assignOfflineProvider.getAllAssigns(siteId).then((assignIds) => {
|
return this.assignOfflineProvider.getAllAssigns(siteId).then((assignIds) => {
|
||||||
const promises = [];
|
|
||||||
|
|
||||||
// Sync all assignments that haven't been synced for a while.
|
// Sync all assignments that haven't been synced for a while.
|
||||||
assignIds.forEach((assignId) => {
|
const promises = assignIds.map((assignId) => {
|
||||||
promises.push(this.syncAssignIfNeeded(assignId, siteId).then((data) => {
|
const promise = force ? this.syncAssign(assignId, siteId) : this.syncAssignIfNeeded(assignId, siteId);
|
||||||
|
|
||||||
|
return promise.then((data) => {
|
||||||
if (data && data.updated) {
|
if (data && data.updated) {
|
||||||
// Sync done. Send event.
|
// Sync done. Send event.
|
||||||
this.eventsProvider.trigger(AddonModAssignSyncProvider.AUTO_SYNCED, {
|
this.eventsProvider.trigger(AddonModAssignSyncProvider.AUTO_SYNCED, {
|
||||||
|
@ -137,7 +139,7 @@ export class AddonModAssignSyncProvider extends CoreSyncBaseProvider {
|
||||||
warnings: data.warnings
|
warnings: data.warnings
|
||||||
}, siteId);
|
}, siteId);
|
||||||
}
|
}
|
||||||
}));
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
return Promise.all(promises);
|
return Promise.all(promises);
|
||||||
|
|
|
@ -28,6 +28,7 @@ import { CoreGradesHelperProvider } from '@core/grades/providers/helper';
|
||||||
import { CoreUserProvider } from '@core/user/providers/user';
|
import { CoreUserProvider } from '@core/user/providers/user';
|
||||||
import { AddonModAssignProvider } from './assign';
|
import { AddonModAssignProvider } from './assign';
|
||||||
import { AddonModAssignHelperProvider } from './helper';
|
import { AddonModAssignHelperProvider } from './helper';
|
||||||
|
import { AddonModAssignSyncProvider } from './assign-sync';
|
||||||
import { AddonModAssignFeedbackDelegate } from './feedback-delegate';
|
import { AddonModAssignFeedbackDelegate } from './feedback-delegate';
|
||||||
import { AddonModAssignSubmissionDelegate } from './submission-delegate';
|
import { AddonModAssignSubmissionDelegate } from './submission-delegate';
|
||||||
|
|
||||||
|
@ -47,7 +48,8 @@ export class AddonModAssignPrefetchHandler extends CoreCourseActivityPrefetchHan
|
||||||
protected textUtils: CoreTextUtilsProvider, protected feedbackDelegate: AddonModAssignFeedbackDelegate,
|
protected textUtils: CoreTextUtilsProvider, protected feedbackDelegate: AddonModAssignFeedbackDelegate,
|
||||||
protected submissionDelegate: AddonModAssignSubmissionDelegate, protected courseHelper: CoreCourseHelperProvider,
|
protected submissionDelegate: AddonModAssignSubmissionDelegate, protected courseHelper: CoreCourseHelperProvider,
|
||||||
protected groupsProvider: CoreGroupsProvider, protected gradesHelper: CoreGradesHelperProvider,
|
protected groupsProvider: CoreGroupsProvider, protected gradesHelper: CoreGradesHelperProvider,
|
||||||
protected userProvider: CoreUserProvider, protected assignHelper: AddonModAssignHelperProvider) {
|
protected userProvider: CoreUserProvider, protected assignHelper: AddonModAssignHelperProvider,
|
||||||
|
protected syncProvider: AddonModAssignSyncProvider) {
|
||||||
|
|
||||||
super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils);
|
super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils);
|
||||||
}
|
}
|
||||||
|
@ -454,4 +456,16 @@ export class AddonModAssignPrefetchHandler extends CoreCourseActivityPrefetchHan
|
||||||
|
|
||||||
return Promise.all(promises);
|
return Promise.all(promises);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sync a module.
|
||||||
|
*
|
||||||
|
* @param {any} module Module.
|
||||||
|
* @param {number} courseId Course ID the module belongs to
|
||||||
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
|
* @return {Promise<any>} Promise resolved when done.
|
||||||
|
*/
|
||||||
|
sync(module: any, courseId: number, siteId?: any): Promise<any> {
|
||||||
|
return this.syncProvider.syncAssign(module.instance, siteId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,10 +30,11 @@ export class AddonModAssignSyncCronHandler implements CoreCronHandler {
|
||||||
* Receives the ID of the site affected, undefined for all sites.
|
* Receives the ID of the site affected, undefined for all sites.
|
||||||
*
|
*
|
||||||
* @param {string} [siteId] ID of the site affected, undefined for all sites.
|
* @param {string} [siteId] ID of the site affected, undefined for all sites.
|
||||||
|
* @param {boolean} [force] Wether the execution is forced (manual sync).
|
||||||
* @return {Promise<any>} Promise resolved when done, rejected if failure.
|
* @return {Promise<any>} Promise resolved when done, rejected if failure.
|
||||||
*/
|
*/
|
||||||
execute(siteId?: string): Promise<any> {
|
execute(siteId?: string, force?: boolean): Promise<any> {
|
||||||
return this.assignSync.syncAllAssignments(siteId);
|
return this.assignSync.syncAllAssignments(siteId, force);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { Injectable } from '@angular/core';
|
import { Injectable, Injector } from '@angular/core';
|
||||||
import { TranslateService } from '@ngx-translate/core';
|
import { TranslateService } from '@ngx-translate/core';
|
||||||
import { CoreAppProvider } from '@providers/app';
|
import { CoreAppProvider } from '@providers/app';
|
||||||
import { CoreFilepoolProvider } from '@providers/filepool';
|
import { CoreFilepoolProvider } from '@providers/filepool';
|
||||||
|
@ -22,6 +22,7 @@ import { CoreUtilsProvider } from '@providers/utils/utils';
|
||||||
import { CoreCourseProvider } from '@core/course/providers/course';
|
import { CoreCourseProvider } from '@core/course/providers/course';
|
||||||
import { CoreCourseActivityPrefetchHandlerBase } from '@core/course/classes/activity-prefetch-handler';
|
import { CoreCourseActivityPrefetchHandlerBase } from '@core/course/classes/activity-prefetch-handler';
|
||||||
import { CoreUserProvider } from '@core/user/providers/user';
|
import { CoreUserProvider } from '@core/user/providers/user';
|
||||||
|
import { AddonModChoiceSyncProvider } from './sync';
|
||||||
import { AddonModChoiceProvider } from './choice';
|
import { AddonModChoiceProvider } from './choice';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -34,10 +35,12 @@ export class AddonModChoicePrefetchHandler extends CoreCourseActivityPrefetchHan
|
||||||
component = AddonModChoiceProvider.COMPONENT;
|
component = AddonModChoiceProvider.COMPONENT;
|
||||||
updatesNames = /^configuration$|^.*files$|^answers$/;
|
updatesNames = /^configuration$|^.*files$|^answers$/;
|
||||||
|
|
||||||
|
protected syncProvider: AddonModChoiceSyncProvider; // It will be injected later to prevent circular dependencies.
|
||||||
|
|
||||||
constructor(translate: TranslateService, appProvider: CoreAppProvider, utils: CoreUtilsProvider,
|
constructor(translate: TranslateService, appProvider: CoreAppProvider, utils: CoreUtilsProvider,
|
||||||
courseProvider: CoreCourseProvider, filepoolProvider: CoreFilepoolProvider, sitesProvider: CoreSitesProvider,
|
courseProvider: CoreCourseProvider, filepoolProvider: CoreFilepoolProvider, sitesProvider: CoreSitesProvider,
|
||||||
domUtils: CoreDomUtilsProvider, protected choiceProvider: AddonModChoiceProvider,
|
domUtils: CoreDomUtilsProvider, protected choiceProvider: AddonModChoiceProvider,
|
||||||
protected userProvider: CoreUserProvider) {
|
protected userProvider: CoreUserProvider, protected injector: Injector) {
|
||||||
|
|
||||||
super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils);
|
super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils);
|
||||||
}
|
}
|
||||||
|
@ -133,4 +136,20 @@ export class AddonModChoicePrefetchHandler extends CoreCourseActivityPrefetchHan
|
||||||
invalidateModule(module: any, courseId: number): Promise<any> {
|
invalidateModule(module: any, courseId: number): Promise<any> {
|
||||||
return this.choiceProvider.invalidateChoiceData(courseId);
|
return this.choiceProvider.invalidateChoiceData(courseId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sync a module.
|
||||||
|
*
|
||||||
|
* @param {any} module Module.
|
||||||
|
* @param {number} courseId Course ID the module belongs to
|
||||||
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
|
* @return {Promise<any>} Promise resolved when done.
|
||||||
|
*/
|
||||||
|
sync(module: any, courseId: number, siteId?: any): Promise<any> {
|
||||||
|
if (!this.syncProvider) {
|
||||||
|
this.syncProvider = this.injector.get(AddonModChoiceSyncProvider);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.syncProvider.syncChoice(module.instance, undefined, siteId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,10 +30,11 @@ export class AddonModChoiceSyncCronHandler implements CoreCronHandler {
|
||||||
* Receives the ID of the site affected, undefined for all sites.
|
* Receives the ID of the site affected, undefined for all sites.
|
||||||
*
|
*
|
||||||
* @param {string} [siteId] ID of the site affected, undefined for all sites.
|
* @param {string} [siteId] ID of the site affected, undefined for all sites.
|
||||||
|
* @param {boolean} [force] Wether the execution is forced (manual sync).
|
||||||
* @return {Promise<any>} Promise resolved when done, rejected if failure.
|
* @return {Promise<any>} Promise resolved when done, rejected if failure.
|
||||||
*/
|
*/
|
||||||
execute(siteId?: string): Promise<any> {
|
execute(siteId?: string, force?: boolean): Promise<any> {
|
||||||
return this.choiceSync.syncAllChoices(siteId);
|
return this.choiceSync.syncAllChoices(siteId, force);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -68,25 +68,28 @@ export class AddonModChoiceSyncProvider extends CoreCourseActivitySyncBaseProvid
|
||||||
* Try to synchronize all the choices in a certain site or in all sites.
|
* Try to synchronize all the choices in a certain site or in all sites.
|
||||||
*
|
*
|
||||||
* @param {string} [siteId] Site ID to sync. If not defined, sync all sites.
|
* @param {string} [siteId] Site ID to sync. If not defined, sync all sites.
|
||||||
|
* @param {boolean} force Wether to force sync not depending on last execution.
|
||||||
* @return {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
* @return {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
||||||
*/
|
*/
|
||||||
syncAllChoices(siteId?: string): Promise<any> {
|
syncAllChoices(siteId?: string, force?: boolean): Promise<any> {
|
||||||
return this.syncOnSites('choices', this.syncAllChoicesFunc.bind(this), undefined, siteId);
|
return this.syncOnSites('choices', this.syncAllChoicesFunc.bind(this), [force], siteId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sync all pending choices on a site.
|
* Sync all pending choices on a site.
|
||||||
*
|
*
|
||||||
* @param {string} [siteId] Site ID to sync. If not defined, sync all sites.
|
* @param {string} [siteId] Site ID to sync. If not defined, sync all sites.
|
||||||
|
* @param {boolean} force Wether to force sync not depending on last execution.
|
||||||
* @return {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
* @return {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
||||||
*/
|
*/
|
||||||
protected syncAllChoicesFunc(siteId?: string): Promise<any> {
|
protected syncAllChoicesFunc(siteId?: string, force?: boolean): Promise<any> {
|
||||||
return this.choiceOffline.getResponses(siteId).then((responses) => {
|
return this.choiceOffline.getResponses(siteId).then((responses) => {
|
||||||
const promises = [];
|
|
||||||
|
|
||||||
// Sync all responses.
|
// Sync all responses.
|
||||||
responses.forEach((response) => {
|
const promises = responses.map((response) => {
|
||||||
promises.push(this.syncChoiceIfNeeded(response.choiceid, response.userid, siteId).then((result) => {
|
const promise = force ? this.syncChoice(response.choiceid, response.userid, siteId) :
|
||||||
|
this.syncChoiceIfNeeded(response.choiceid, response.userid, siteId);
|
||||||
|
|
||||||
|
return promise.then((result) => {
|
||||||
if (result && result.updated) {
|
if (result && result.updated) {
|
||||||
// Sync successful, send event.
|
// Sync successful, send event.
|
||||||
this.eventsProvider.trigger(AddonModChoiceSyncProvider.AUTO_SYNCED, {
|
this.eventsProvider.trigger(AddonModChoiceSyncProvider.AUTO_SYNCED, {
|
||||||
|
@ -95,9 +98,11 @@ export class AddonModChoiceSyncProvider extends CoreCourseActivitySyncBaseProvid
|
||||||
warnings: result.warnings
|
warnings: result.warnings
|
||||||
}, siteId);
|
}, siteId);
|
||||||
}
|
}
|
||||||
}));
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
return Promise.all(promises);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -122,12 +127,14 @@ export class AddonModChoiceSyncProvider extends CoreCourseActivitySyncBaseProvid
|
||||||
* Synchronize a choice.
|
* Synchronize a choice.
|
||||||
*
|
*
|
||||||
* @param {number} choiceId Choice ID to be synced.
|
* @param {number} choiceId Choice ID to be synced.
|
||||||
* @param {number} userId User the answers belong to.
|
* @param {number} [userId] User the answers belong to.
|
||||||
* @param {string} [siteId] Site ID. If not defined, current site.
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
* @return {Promise<any>} Promise resolved if sync is successful, rejected otherwise.
|
* @return {Promise<any>} Promise resolved if sync is successful, rejected otherwise.
|
||||||
*/
|
*/
|
||||||
syncChoice(choiceId: number, userId: number, siteId?: string): Promise<any> {
|
syncChoice(choiceId: number, userId?: number, siteId?: string): Promise<any> {
|
||||||
siteId = siteId || this.sitesProvider.getCurrentSiteId();
|
return this.sitesProvider.getSite(siteId).then((site) => {
|
||||||
|
userId = userId || site.getUserId();
|
||||||
|
siteId = site.getId();
|
||||||
|
|
||||||
const syncId = this.getSyncId(choiceId, userId);
|
const syncId = this.getSyncId(choiceId, userId);
|
||||||
if (this.isSyncing(syncId, siteId)) {
|
if (this.isSyncing(syncId, siteId)) {
|
||||||
|
@ -215,5 +222,6 @@ export class AddonModChoiceSyncProvider extends CoreCourseActivitySyncBaseProvid
|
||||||
});
|
});
|
||||||
|
|
||||||
return this.addOngoingSync(syncId, syncPromise, siteId);
|
return this.addOngoingSync(syncId, syncPromise, siteId);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,6 +27,7 @@ import { AddonModDataHelperProvider } from '../../providers/helper';
|
||||||
import { AddonModDataOfflineProvider } from '../../providers/offline';
|
import { AddonModDataOfflineProvider } from '../../providers/offline';
|
||||||
import { AddonModDataSyncProvider } from '../../providers/sync';
|
import { AddonModDataSyncProvider } from '../../providers/sync';
|
||||||
import { AddonModDataComponentsModule } from '../components.module';
|
import { AddonModDataComponentsModule } from '../components.module';
|
||||||
|
import { AddonModDataPrefetchHandler } from '../../providers/prefetch-handler';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Component that displays a data index page.
|
* Component that displays a data index page.
|
||||||
|
@ -82,7 +83,7 @@ export class AddonModDataIndexComponent extends CoreCourseModuleMainActivityComp
|
||||||
|
|
||||||
constructor(injector: Injector, private dataProvider: AddonModDataProvider, private dataHelper: AddonModDataHelperProvider,
|
constructor(injector: Injector, private dataProvider: AddonModDataProvider, private dataHelper: AddonModDataHelperProvider,
|
||||||
private dataOffline: AddonModDataOfflineProvider, @Optional() content: Content,
|
private dataOffline: AddonModDataOfflineProvider, @Optional() content: Content,
|
||||||
private dataSync: AddonModDataSyncProvider, private timeUtils: CoreTimeUtilsProvider,
|
private prefetchHandler: AddonModDataPrefetchHandler, private timeUtils: CoreTimeUtilsProvider,
|
||||||
private groupsProvider: CoreGroupsProvider, private commentsProvider: CoreCommentsProvider,
|
private groupsProvider: CoreGroupsProvider, private commentsProvider: CoreCommentsProvider,
|
||||||
private modalCtrl: ModalController, private utils: CoreUtilsProvider, protected navCtrl: NavController,
|
private modalCtrl: ModalController, private utils: CoreUtilsProvider, protected navCtrl: NavController,
|
||||||
private ratingOffline: CoreRatingOfflineProvider) {
|
private ratingOffline: CoreRatingOfflineProvider) {
|
||||||
|
@ -520,17 +521,7 @@ export class AddonModDataIndexComponent extends CoreCourseModuleMainActivityComp
|
||||||
* @return {Promise<any>} Promise resolved when done.
|
* @return {Promise<any>} Promise resolved when done.
|
||||||
*/
|
*/
|
||||||
protected sync(): Promise<any> {
|
protected sync(): Promise<any> {
|
||||||
const promises = [
|
return this.prefetchHandler.sync(this.module, this.courseId);
|
||||||
this.dataSync.syncDatabase(this.data.id),
|
|
||||||
this.dataSync.syncRatings(this.data.coursemodule)
|
|
||||||
];
|
|
||||||
|
|
||||||
return Promise.all(promises).then((results) => {
|
|
||||||
return results.reduce((a, b) => ({
|
|
||||||
updated: a.updated || b.updated,
|
|
||||||
warnings: (a.warnings || []).concat(b.warnings || []),
|
|
||||||
}), {updated: false});
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -26,6 +26,7 @@ import { CoreCourseProvider } from '@core/course/providers/course';
|
||||||
import { CoreCourseActivityPrefetchHandlerBase } from '@core/course/classes/activity-prefetch-handler';
|
import { CoreCourseActivityPrefetchHandlerBase } from '@core/course/classes/activity-prefetch-handler';
|
||||||
import { CoreRatingProvider } from '@core/rating/providers/rating';
|
import { CoreRatingProvider } from '@core/rating/providers/rating';
|
||||||
import { AddonModDataProvider } from './data';
|
import { AddonModDataProvider } from './data';
|
||||||
|
import { AddonModDataSyncProvider } from './sync';
|
||||||
import { AddonModDataHelperProvider } from './helper';
|
import { AddonModDataHelperProvider } from './helper';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -43,7 +44,7 @@ export class AddonModDataPrefetchHandler extends CoreCourseActivityPrefetchHandl
|
||||||
domUtils: CoreDomUtilsProvider, protected dataProvider: AddonModDataProvider,
|
domUtils: CoreDomUtilsProvider, protected dataProvider: AddonModDataProvider,
|
||||||
protected timeUtils: CoreTimeUtilsProvider, protected dataHelper: AddonModDataHelperProvider,
|
protected timeUtils: CoreTimeUtilsProvider, protected dataHelper: AddonModDataHelperProvider,
|
||||||
protected groupsProvider: CoreGroupsProvider, protected commentsProvider: CoreCommentsProvider,
|
protected groupsProvider: CoreGroupsProvider, protected commentsProvider: CoreCommentsProvider,
|
||||||
private ratingProvider: CoreRatingProvider) {
|
private ratingProvider: CoreRatingProvider, protected syncProvider: AddonModDataSyncProvider) {
|
||||||
|
|
||||||
super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils);
|
super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils);
|
||||||
}
|
}
|
||||||
|
@ -301,4 +302,26 @@ export class AddonModDataPrefetchHandler extends CoreCourseActivityPrefetchHandl
|
||||||
return Promise.all(promises);
|
return Promise.all(promises);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sync a module.
|
||||||
|
*
|
||||||
|
* @param {any} module Module.
|
||||||
|
* @param {number} courseId Course ID the module belongs to
|
||||||
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
|
* @return {Promise<any>} Promise resolved when done.
|
||||||
|
*/
|
||||||
|
sync(module: any, courseId: number, siteId?: any): Promise<any> {
|
||||||
|
const promises = [
|
||||||
|
this.syncProvider.syncDatabase(module.instance, siteId),
|
||||||
|
this.syncProvider.syncRatings(module.id, true, siteId)
|
||||||
|
];
|
||||||
|
|
||||||
|
return Promise.all(promises).then((results) => {
|
||||||
|
return results.reduce((a, b) => ({
|
||||||
|
updated: a.updated || b.updated,
|
||||||
|
warnings: (a.warnings || []).concat(b.warnings || []),
|
||||||
|
}), {updated: false});
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,10 +30,11 @@ export class AddonModDataSyncCronHandler implements CoreCronHandler {
|
||||||
* Receives the ID of the site affected, undefined for all sites.
|
* Receives the ID of the site affected, undefined for all sites.
|
||||||
*
|
*
|
||||||
* @param {string} [siteId] ID of the site affected, undefined for all sites.
|
* @param {string} [siteId] ID of the site affected, undefined for all sites.
|
||||||
|
* @param {boolean} [force] Wether the execution is forced (manual sync).
|
||||||
* @return {Promise<any>} Promise resolved when done, rejected if failure.
|
* @return {Promise<any>} Promise resolved when done, rejected if failure.
|
||||||
*/
|
*/
|
||||||
execute(siteId?: string): Promise<any> {
|
execute(siteId?: string, force?: boolean): Promise<any> {
|
||||||
return this.dataSync.syncAllDatabases(siteId);
|
return this.dataSync.syncAllDatabases(siteId, force);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -67,18 +67,21 @@ export class AddonModDataSyncProvider extends CoreSyncBaseProvider {
|
||||||
* Try to synchronize all the databases in a certain site or in all sites.
|
* Try to synchronize all the databases in a certain site or in all sites.
|
||||||
*
|
*
|
||||||
* @param {string} [siteId] Site ID to sync. If not defined, sync all sites.
|
* @param {string} [siteId] Site ID to sync. If not defined, sync all sites.
|
||||||
|
* @param {boolean} force Wether to force sync not depending on last execution.
|
||||||
* @return {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
* @return {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
||||||
*/
|
*/
|
||||||
syncAllDatabases(siteId?: string): Promise<any> {
|
syncAllDatabases(siteId?: string, force?: boolean): Promise<any> {
|
||||||
return this.syncOnSites('all databases', this.syncAllDatabasesFunc.bind(this), undefined, siteId);
|
return this.syncOnSites('all databases', this.syncAllDatabasesFunc.bind(this), [force], siteId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sync all pending databases on a site.
|
* Sync all pending databases on a site.
|
||||||
|
*
|
||||||
* @param {string} [siteId] Site ID to sync. If not defined, sync all sites.
|
* @param {string} [siteId] Site ID to sync. If not defined, sync all sites.
|
||||||
|
* @param {boolean} force Wether to force sync not depending on last execution.
|
||||||
* @param {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
* @param {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
||||||
*/
|
*/
|
||||||
protected syncAllDatabasesFunc(siteId?: string): Promise<any> {
|
protected syncAllDatabasesFunc(siteId?: string, force?: boolean): Promise<any> {
|
||||||
siteId = siteId || this.sitesProvider.getCurrentSiteId();
|
siteId = siteId || this.sitesProvider.getCurrentSiteId();
|
||||||
|
|
||||||
const promises = [];
|
const promises = [];
|
||||||
|
@ -93,8 +96,10 @@ export class AddonModDataSyncProvider extends CoreSyncBaseProvider {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
promises[action.dataid] = this.syncDatabaseIfNeeded(action.dataid, siteId)
|
promises[action.dataid] = force ? this.syncDatabase(action.dataid, siteId) :
|
||||||
.then((result) => {
|
this.syncDatabaseIfNeeded(action.dataid, siteId);
|
||||||
|
|
||||||
|
promises[action.dataid].then((result) => {
|
||||||
if (result && result.updated) {
|
if (result && result.updated) {
|
||||||
// Sync done. Send event.
|
// Sync done. Send event.
|
||||||
this.eventsProvider.trigger(AddonModDataSyncProvider.AUTO_SYNCED, {
|
this.eventsProvider.trigger(AddonModDataSyncProvider.AUTO_SYNCED, {
|
||||||
|
@ -109,7 +114,7 @@ export class AddonModDataSyncProvider extends CoreSyncBaseProvider {
|
||||||
return Promise.all(this.utils.objectToArray(promises));
|
return Promise.all(this.utils.objectToArray(promises));
|
||||||
}));
|
}));
|
||||||
|
|
||||||
promises.push(this.syncRatings(undefined, siteId));
|
promises.push(this.syncRatings(undefined, force, siteId));
|
||||||
|
|
||||||
return Promise.all(promises);
|
return Promise.all(promises);
|
||||||
}
|
}
|
||||||
|
@ -357,13 +362,14 @@ export class AddonModDataSyncProvider extends CoreSyncBaseProvider {
|
||||||
* Synchronize offline ratings.
|
* Synchronize offline ratings.
|
||||||
*
|
*
|
||||||
* @param {number} [cmId] Course module to be synced. If not defined, sync all databases.
|
* @param {number} [cmId] Course module to be synced. If not defined, sync all databases.
|
||||||
|
* @param {boolean} [force] Wether to force sync not depending on last execution.
|
||||||
* @param {string} [siteId] Site ID. If not defined, current site.
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
* @return {Promise<any>} Promise resolved if sync is successful, rejected otherwise.
|
* @return {Promise<any>} Promise resolved if sync is successful, rejected otherwise.
|
||||||
*/
|
*/
|
||||||
syncRatings(cmId?: number, siteId?: string): Promise<any> {
|
syncRatings(cmId?: number, force?: boolean, siteId?: string): Promise<any> {
|
||||||
siteId = siteId || this.sitesProvider.getCurrentSiteId();
|
siteId = siteId || this.sitesProvider.getCurrentSiteId();
|
||||||
|
|
||||||
return this.ratingSync.syncRatings('mod_data', 'entry', 'module', cmId, 0, siteId).then((results) => {
|
return this.ratingSync.syncRatings('mod_data', 'entry', 'module', cmId, 0, force, siteId).then((results) => {
|
||||||
let updated = false;
|
let updated = false;
|
||||||
const warnings = [];
|
const warnings = [];
|
||||||
const promises = [];
|
const promises = [];
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { Injectable } from '@angular/core';
|
import { Injectable, Injector } from '@angular/core';
|
||||||
import { TranslateService } from '@ngx-translate/core';
|
import { TranslateService } from '@ngx-translate/core';
|
||||||
import { CoreAppProvider } from '@providers/app';
|
import { CoreAppProvider } from '@providers/app';
|
||||||
import { CoreFilepoolProvider } from '@providers/filepool';
|
import { CoreFilepoolProvider } from '@providers/filepool';
|
||||||
|
@ -25,6 +25,7 @@ import { AddonModFeedbackProvider } from './feedback';
|
||||||
import { AddonModFeedbackHelperProvider } from './helper';
|
import { AddonModFeedbackHelperProvider } from './helper';
|
||||||
import { CoreTimeUtilsProvider } from '@providers/utils/time';
|
import { CoreTimeUtilsProvider } from '@providers/utils/time';
|
||||||
import { CoreGroupsProvider } from '@providers/groups';
|
import { CoreGroupsProvider } from '@providers/groups';
|
||||||
|
import { AddonModFeedbackSyncProvider } from './sync';
|
||||||
import { CoreUserProvider } from '@core/user/providers/user';
|
import { CoreUserProvider } from '@core/user/providers/user';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -37,11 +38,14 @@ export class AddonModFeedbackPrefetchHandler extends CoreCourseActivityPrefetchH
|
||||||
component = AddonModFeedbackProvider.COMPONENT;
|
component = AddonModFeedbackProvider.COMPONENT;
|
||||||
updatesNames = /^configuration$|^.*files$|^attemptsfinished|^attemptsunfinished$/;
|
updatesNames = /^configuration$|^.*files$|^attemptsfinished|^attemptsunfinished$/;
|
||||||
|
|
||||||
|
protected syncProvider: AddonModFeedbackSyncProvider; // It will be injected later to prevent circular dependencies.
|
||||||
|
|
||||||
constructor(translate: TranslateService, appProvider: CoreAppProvider, utils: CoreUtilsProvider,
|
constructor(translate: TranslateService, appProvider: CoreAppProvider, utils: CoreUtilsProvider,
|
||||||
courseProvider: CoreCourseProvider, filepoolProvider: CoreFilepoolProvider, sitesProvider: CoreSitesProvider,
|
courseProvider: CoreCourseProvider, filepoolProvider: CoreFilepoolProvider, sitesProvider: CoreSitesProvider,
|
||||||
domUtils: CoreDomUtilsProvider, protected feedbackProvider: AddonModFeedbackProvider,
|
domUtils: CoreDomUtilsProvider, protected feedbackProvider: AddonModFeedbackProvider,
|
||||||
protected userProvider: CoreUserProvider, protected feedbackHelper: AddonModFeedbackHelperProvider,
|
protected userProvider: CoreUserProvider, protected feedbackHelper: AddonModFeedbackHelperProvider,
|
||||||
protected timeUtils: CoreTimeUtilsProvider, protected groupsProvider: CoreGroupsProvider) {
|
protected timeUtils: CoreTimeUtilsProvider, protected groupsProvider: CoreGroupsProvider,
|
||||||
|
protected injector: Injector) {
|
||||||
|
|
||||||
super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils);
|
super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils);
|
||||||
}
|
}
|
||||||
|
@ -239,4 +243,20 @@ export class AddonModFeedbackPrefetchHandler extends CoreCourseActivityPrefetchH
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sync a module.
|
||||||
|
*
|
||||||
|
* @param {any} module Module.
|
||||||
|
* @param {number} courseId Course ID the module belongs to
|
||||||
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
|
* @return {Promise<any>} Promise resolved when done.
|
||||||
|
*/
|
||||||
|
sync(module: any, courseId: number, siteId?: any): Promise<any> {
|
||||||
|
if (!this.syncProvider) {
|
||||||
|
this.syncProvider = this.injector.get(AddonModFeedbackSyncProvider);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.syncProvider.syncFeedback(module.instance, siteId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,10 +30,11 @@ export class AddonModFeedbackSyncCronHandler implements CoreCronHandler {
|
||||||
* Receives the ID of the site affected, undefined for all sites.
|
* Receives the ID of the site affected, undefined for all sites.
|
||||||
*
|
*
|
||||||
* @param {string} [siteId] ID of the site affected, undefined for all sites.
|
* @param {string} [siteId] ID of the site affected, undefined for all sites.
|
||||||
|
* @param {boolean} [force] Wether the execution is forced (manual sync).
|
||||||
* @return {Promise<any>} Promise resolved when done, rejected if failure.
|
* @return {Promise<any>} Promise resolved when done, rejected if failure.
|
||||||
*/
|
*/
|
||||||
execute(siteId?: string): Promise<any> {
|
execute(siteId?: string, force?: boolean): Promise<any> {
|
||||||
return this.feedbackSync.syncAllFeedbacks(siteId);
|
return this.feedbackSync.syncAllFeedbacks(siteId, force);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -72,19 +72,21 @@ export class AddonModFeedbackSyncProvider extends CoreCourseActivitySyncBaseProv
|
||||||
* Try to synchronize all the feedbacks in a certain site or in all sites.
|
* Try to synchronize all the feedbacks in a certain site or in all sites.
|
||||||
*
|
*
|
||||||
* @param {string} [siteId] Site ID to sync. If not defined, sync all sites.
|
* @param {string} [siteId] Site ID to sync. If not defined, sync all sites.
|
||||||
|
* @param {boolean} force Wether to force sync not depending on last execution.
|
||||||
* @return {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
* @return {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
||||||
*/
|
*/
|
||||||
syncAllFeedbacks(siteId?: string): Promise<any> {
|
syncAllFeedbacks(siteId?: string, force?: boolean): Promise<any> {
|
||||||
return this.syncOnSites('all feedbacks', this.syncAllFeedbacksFunc.bind(this), undefined, siteId);
|
return this.syncOnSites('all feedbacks', this.syncAllFeedbacksFunc.bind(this), [force], siteId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sync all pending feedbacks on a site.
|
* Sync all pending feedbacks on a site.
|
||||||
*
|
*
|
||||||
* @param {string} [siteId] Site ID to sync. If not defined, sync all sites.
|
* @param {string} [siteId] Site ID to sync. If not defined, sync all sites.
|
||||||
|
* @param {boolean} force Wether to force sync not depending on last execution.
|
||||||
* @param {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
* @param {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
||||||
*/
|
*/
|
||||||
protected syncAllFeedbacksFunc(siteId?: string): Promise<any> {
|
protected syncAllFeedbacksFunc(siteId?: string, force?: boolean): Promise<any> {
|
||||||
// Sync all new responses.
|
// Sync all new responses.
|
||||||
return this.feedbackOffline.getAllFeedbackResponses(siteId).then((responses) => {
|
return this.feedbackOffline.getAllFeedbackResponses(siteId).then((responses) => {
|
||||||
const promises = {};
|
const promises = {};
|
||||||
|
@ -97,7 +99,10 @@ export class AddonModFeedbackSyncProvider extends CoreCourseActivitySyncBaseProv
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
promises[response.feedbackid] = this.syncFeedbackIfNeeded(response.feedbackid, siteId).then((result) => {
|
promises[response.feedbackid] = force ? this.syncFeedback(response.feedbackid, siteId) :
|
||||||
|
this.syncFeedbackIfNeeded(response.feedbackid, siteId);
|
||||||
|
|
||||||
|
promises[response.feedbackid].then((result) => {
|
||||||
if (result && result.updated) {
|
if (result && result.updated) {
|
||||||
// Sync successful, send event.
|
// Sync successful, send event.
|
||||||
this.eventsProvider.trigger(AddonModFeedbackSyncProvider.AUTO_SYNCED, {
|
this.eventsProvider.trigger(AddonModFeedbackSyncProvider.AUTO_SYNCED, {
|
||||||
|
|
|
@ -376,18 +376,7 @@ export class AddonModForumIndexComponent extends CoreCourseModuleMainActivityCom
|
||||||
* @return {Promise<any>} Promise resolved when done.
|
* @return {Promise<any>} Promise resolved when done.
|
||||||
*/
|
*/
|
||||||
protected sync(): Promise<boolean> {
|
protected sync(): Promise<boolean> {
|
||||||
const promises = [];
|
return this.prefetchHandler.sync(this.module, this.courseId);
|
||||||
|
|
||||||
promises.push(this.forumSync.syncForumDiscussions(this.forum.id));
|
|
||||||
promises.push(this.forumSync.syncForumReplies(this.forum.id));
|
|
||||||
promises.push(this.forumSync.syncRatings(this.forum.cmid));
|
|
||||||
|
|
||||||
return Promise.all(promises).then((results) => {
|
|
||||||
return results.reduce((a, b) => ({
|
|
||||||
updated: a.updated || b.updated,
|
|
||||||
warnings: (a.warnings || []).concat(b.warnings || []),
|
|
||||||
}), {updated: false});
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -24,6 +24,7 @@ import { CoreCourseActivityPrefetchHandlerBase } from '@core/course/classes/acti
|
||||||
import { CoreGroupsProvider } from '@providers/groups';
|
import { CoreGroupsProvider } from '@providers/groups';
|
||||||
import { CoreUserProvider } from '@core/user/providers/user';
|
import { CoreUserProvider } from '@core/user/providers/user';
|
||||||
import { AddonModForumProvider } from './forum';
|
import { AddonModForumProvider } from './forum';
|
||||||
|
import { AddonModForumSyncProvider } from './sync';
|
||||||
import { CoreRatingProvider } from '@core/rating/providers/rating';
|
import { CoreRatingProvider } from '@core/rating/providers/rating';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -46,7 +47,8 @@ export class AddonModForumPrefetchHandler extends CoreCourseActivityPrefetchHand
|
||||||
private groupsProvider: CoreGroupsProvider,
|
private groupsProvider: CoreGroupsProvider,
|
||||||
private userProvider: CoreUserProvider,
|
private userProvider: CoreUserProvider,
|
||||||
private forumProvider: AddonModForumProvider,
|
private forumProvider: AddonModForumProvider,
|
||||||
private ratingProvider: CoreRatingProvider) {
|
private ratingProvider: CoreRatingProvider,
|
||||||
|
private syncProvider: AddonModForumSyncProvider) {
|
||||||
|
|
||||||
super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils);
|
super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils);
|
||||||
}
|
}
|
||||||
|
@ -264,4 +266,27 @@ export class AddonModForumPrefetchHandler extends CoreCourseActivityPrefetchHand
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sync a module.
|
||||||
|
*
|
||||||
|
* @param {any} module Module.
|
||||||
|
* @param {number} courseId Course ID the module belongs to
|
||||||
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
|
* @return {Promise<any>} Promise resolved when done.
|
||||||
|
*/
|
||||||
|
sync(module: any, courseId: number, siteId?: any): Promise<any> {
|
||||||
|
const promises = [];
|
||||||
|
|
||||||
|
promises.push(this.syncProvider.syncForumDiscussions(module.instance, undefined, siteId));
|
||||||
|
promises.push(this.syncProvider.syncForumReplies(module.instance, undefined, siteId));
|
||||||
|
promises.push(this.syncProvider.syncRatings(module.id, undefined, true, siteId));
|
||||||
|
|
||||||
|
return Promise.all(promises).then((results) => {
|
||||||
|
return results.reduce((a, b) => ({
|
||||||
|
updated: a.updated || b.updated,
|
||||||
|
warnings: (a.warnings || []).concat(b.warnings || []),
|
||||||
|
}), {updated: false});
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,10 +30,11 @@ export class AddonModForumSyncCronHandler implements CoreCronHandler {
|
||||||
* Receives the ID of the site affected, undefined for all sites.
|
* Receives the ID of the site affected, undefined for all sites.
|
||||||
*
|
*
|
||||||
* @param {string} [siteId] ID of the site affected, undefined for all sites.
|
* @param {string} [siteId] ID of the site affected, undefined for all sites.
|
||||||
|
* @param {boolean} [force] Wether the execution is forced (manual sync).
|
||||||
* @return {Promise<any>} Promise resolved when done, rejected if failure.
|
* @return {Promise<any>} Promise resolved when done, rejected if failure.
|
||||||
*/
|
*/
|
||||||
execute(siteId?: string): Promise<any> {
|
execute(siteId?: string, force?: boolean): Promise<any> {
|
||||||
return this.forumSync.syncAllForums(siteId);
|
return this.forumSync.syncAllForums(siteId, force);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -69,19 +69,21 @@ export class AddonModForumSyncProvider extends CoreSyncBaseProvider {
|
||||||
* Try to synchronize all the forums in a certain site or in all sites.
|
* Try to synchronize all the forums in a certain site or in all sites.
|
||||||
*
|
*
|
||||||
* @param {string} [siteId] Site ID to sync. If not defined, sync all sites.
|
* @param {string} [siteId] Site ID to sync. If not defined, sync all sites.
|
||||||
|
* @param {boolean} [force] Wether to force sync not depending on last execution.
|
||||||
* @return {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
* @return {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
||||||
*/
|
*/
|
||||||
syncAllForums(siteId?: string): Promise<any> {
|
syncAllForums(siteId?: string, force?: boolean): Promise<any> {
|
||||||
return this.syncOnSites('all forums', this.syncAllForumsFunc.bind(this), [], siteId);
|
return this.syncOnSites('all forums', this.syncAllForumsFunc.bind(this), [force], siteId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sync all forums on a site.
|
* Sync all forums on a site.
|
||||||
*
|
*
|
||||||
* @param {string} [siteId] Site ID to sync. If not defined, sync all sites.
|
* @param {string} siteId Site ID to sync.
|
||||||
|
* @param {boolean} [force] Wether to force sync not depending on last execution.
|
||||||
* @return {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
* @return {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
||||||
*/
|
*/
|
||||||
protected syncAllForumsFunc(siteId?: string): Promise<any> {
|
protected syncAllForumsFunc(siteId: string, force?: boolean): Promise<any> {
|
||||||
const sitePromises = [];
|
const sitePromises = [];
|
||||||
|
|
||||||
// Sync all new discussions.
|
// Sync all new discussions.
|
||||||
|
@ -94,8 +96,10 @@ export class AddonModForumSyncProvider extends CoreSyncBaseProvider {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
promises[discussion.forumid] = this.syncForumDiscussionsIfNeeded(discussion.forumid, discussion.userid, siteId)
|
promises[discussion.forumid] = force ? this.syncForumDiscussions(discussion.forumid, discussion.userid, siteId) :
|
||||||
.then((result) => {
|
this.syncForumDiscussionsIfNeeded(discussion.forumid, discussion.userid, siteId);
|
||||||
|
|
||||||
|
promises[discussion.forumid].then((result) => {
|
||||||
if (result && result.updated) {
|
if (result && result.updated) {
|
||||||
// Sync successful, send event.
|
// Sync successful, send event.
|
||||||
this.eventsProvider.trigger(AddonModForumSyncProvider.AUTO_SYNCED, {
|
this.eventsProvider.trigger(AddonModForumSyncProvider.AUTO_SYNCED, {
|
||||||
|
@ -120,8 +124,10 @@ export class AddonModForumSyncProvider extends CoreSyncBaseProvider {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
promises[reply.discussionid] = this.syncDiscussionRepliesIfNeeded(reply.discussionid, reply.userid, siteId)
|
promises[reply.discussionid] = force ? this.syncDiscussionReplies(reply.discussionid, reply.userid, siteId) :
|
||||||
.then((result) => {
|
this.syncDiscussionRepliesIfNeeded(reply.discussionid, reply.userid, siteId);
|
||||||
|
|
||||||
|
promises[reply.discussionid].then((result) => {
|
||||||
if (result && result.updated) {
|
if (result && result.updated) {
|
||||||
// Sync successful, send event.
|
// Sync successful, send event.
|
||||||
this.eventsProvider.trigger(AddonModForumSyncProvider.AUTO_SYNCED, {
|
this.eventsProvider.trigger(AddonModForumSyncProvider.AUTO_SYNCED, {
|
||||||
|
@ -137,7 +143,7 @@ export class AddonModForumSyncProvider extends CoreSyncBaseProvider {
|
||||||
return Promise.all(this.utils.objectToArray(promises));
|
return Promise.all(this.utils.objectToArray(promises));
|
||||||
}));
|
}));
|
||||||
|
|
||||||
sitePromises.push(this.syncRatings(undefined, undefined, siteId));
|
sitePromises.push(this.syncRatings(undefined, undefined, force, siteId));
|
||||||
|
|
||||||
return Promise.all(sitePromises);
|
return Promise.all(sitePromises);
|
||||||
}
|
}
|
||||||
|
@ -282,13 +288,14 @@ export class AddonModForumSyncProvider extends CoreSyncBaseProvider {
|
||||||
*
|
*
|
||||||
* @param {number} [cmId] Course module to be synced. If not defined, sync all forums.
|
* @param {number} [cmId] Course module to be synced. If not defined, sync all forums.
|
||||||
* @param {number} [discussionId] Discussion id to be synced. If not defined, sync all discussions.
|
* @param {number} [discussionId] Discussion id to be synced. If not defined, sync all discussions.
|
||||||
|
* @param {boolean} [force] Wether to force sync not depending on last execution.
|
||||||
* @param {string} [siteId] Site ID. If not defined, current site.
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
* @return {Promise<any>} Promise resolved if sync is successful, rejected otherwise.
|
* @return {Promise<any>} Promise resolved if sync is successful, rejected otherwise.
|
||||||
*/
|
*/
|
||||||
syncRatings(cmId?: number, discussionId?: number, siteId?: string): Promise<any> {
|
syncRatings(cmId?: number, discussionId?: number, force?: boolean, siteId?: string): Promise<any> {
|
||||||
siteId = siteId || this.sitesProvider.getCurrentSiteId();
|
siteId = siteId || this.sitesProvider.getCurrentSiteId();
|
||||||
|
|
||||||
return this.ratingSync.syncRatings('mod_forum', 'post', 'module', cmId, discussionId, siteId).then((results) => {
|
return this.ratingSync.syncRatings('mod_forum', 'post', 'module', cmId, discussionId, force, siteId).then((results) => {
|
||||||
let updated = false;
|
let updated = false;
|
||||||
const warnings = [];
|
const warnings = [];
|
||||||
const promises = [];
|
const promises = [];
|
||||||
|
|
|
@ -23,6 +23,7 @@ import { AddonModGlossaryProvider } from '../../providers/glossary';
|
||||||
import { AddonModGlossaryOfflineProvider } from '../../providers/offline';
|
import { AddonModGlossaryOfflineProvider } from '../../providers/offline';
|
||||||
import { AddonModGlossarySyncProvider } from '../../providers/sync';
|
import { AddonModGlossarySyncProvider } from '../../providers/sync';
|
||||||
import { AddonModGlossaryModePickerPopoverComponent } from '../mode-picker/mode-picker';
|
import { AddonModGlossaryModePickerPopoverComponent } from '../mode-picker/mode-picker';
|
||||||
|
import { AddonModGlossaryPrefetchHandler } from '../../providers/prefetch-handler';
|
||||||
|
|
||||||
type FetchMode = 'author_all' | 'cat_all' | 'newest_first' | 'recently_updated' | 'search' | 'letter_all';
|
type FetchMode = 'author_all' | 'cat_all' | 'newest_first' | 'recently_updated' | 'search' | 'letter_all';
|
||||||
|
|
||||||
|
@ -68,7 +69,7 @@ export class AddonModGlossaryIndexComponent extends CoreCourseModuleMainActivity
|
||||||
private popoverCtrl: PopoverController,
|
private popoverCtrl: PopoverController,
|
||||||
private glossaryProvider: AddonModGlossaryProvider,
|
private glossaryProvider: AddonModGlossaryProvider,
|
||||||
private glossaryOffline: AddonModGlossaryOfflineProvider,
|
private glossaryOffline: AddonModGlossaryOfflineProvider,
|
||||||
private glossarySync: AddonModGlossarySyncProvider,
|
private prefetchHandler: AddonModGlossaryPrefetchHandler,
|
||||||
private ratingOffline: CoreRatingOfflineProvider) {
|
private ratingOffline: CoreRatingOfflineProvider) {
|
||||||
super(injector);
|
super(injector);
|
||||||
}
|
}
|
||||||
|
@ -219,17 +220,7 @@ export class AddonModGlossaryIndexComponent extends CoreCourseModuleMainActivity
|
||||||
* @return {Promise<any>} Promise resolved when done.
|
* @return {Promise<any>} Promise resolved when done.
|
||||||
*/
|
*/
|
||||||
protected sync(): Promise<boolean> {
|
protected sync(): Promise<boolean> {
|
||||||
const promises = [
|
return this.prefetchHandler.sync(this.module, this.courseId);
|
||||||
this.glossarySync.syncGlossaryEntries(this.glossary.id),
|
|
||||||
this.glossarySync.syncRatings(this.glossary.coursemodule)
|
|
||||||
];
|
|
||||||
|
|
||||||
return Promise.all(promises).then((results) => {
|
|
||||||
return results.reduce((a, b) => ({
|
|
||||||
updated: a.updated || b.updated,
|
|
||||||
warnings: (a.warnings || []).concat(b.warnings || []),
|
|
||||||
}), {updated: false});
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -24,6 +24,7 @@ import { CoreCourseActivityPrefetchHandlerBase } from '@core/course/classes/acti
|
||||||
import { CoreUserProvider } from '@core/user/providers/user';
|
import { CoreUserProvider } from '@core/user/providers/user';
|
||||||
import { AddonModGlossaryProvider } from './glossary';
|
import { AddonModGlossaryProvider } from './glossary';
|
||||||
import { CoreRatingProvider } from '@core/rating/providers/rating';
|
import { CoreRatingProvider } from '@core/rating/providers/rating';
|
||||||
|
import { AddonModGlossarySyncProvider } from './sync';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handler to prefetch forums.
|
* Handler to prefetch forums.
|
||||||
|
@ -44,7 +45,8 @@ export class AddonModGlossaryPrefetchHandler extends CoreCourseActivityPrefetchH
|
||||||
domUtils: CoreDomUtilsProvider,
|
domUtils: CoreDomUtilsProvider,
|
||||||
private userProvider: CoreUserProvider,
|
private userProvider: CoreUserProvider,
|
||||||
private ratingProvider: CoreRatingProvider,
|
private ratingProvider: CoreRatingProvider,
|
||||||
private glossaryProvider: AddonModGlossaryProvider) {
|
private glossaryProvider: AddonModGlossaryProvider,
|
||||||
|
private syncProvider: AddonModGlossarySyncProvider) {
|
||||||
|
|
||||||
super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils);
|
super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils);
|
||||||
}
|
}
|
||||||
|
@ -187,4 +189,26 @@ export class AddonModGlossaryPrefetchHandler extends CoreCourseActivityPrefetchH
|
||||||
return Promise.all(promises);
|
return Promise.all(promises);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sync a module.
|
||||||
|
*
|
||||||
|
* @param {any} module Module.
|
||||||
|
* @param {number} courseId Course ID the module belongs to
|
||||||
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
|
* @return {Promise<any>} Promise resolved when done.
|
||||||
|
*/
|
||||||
|
sync(module: any, courseId: number, siteId?: any): Promise<any> {
|
||||||
|
const promises = [
|
||||||
|
this.syncProvider.syncGlossaryEntries(module.instance, undefined, siteId),
|
||||||
|
this.syncProvider.syncRatings(module.id, undefined, siteId)
|
||||||
|
];
|
||||||
|
|
||||||
|
return Promise.all(promises).then((results) => {
|
||||||
|
return results.reduce((a, b) => ({
|
||||||
|
updated: a.updated || b.updated,
|
||||||
|
warnings: (a.warnings || []).concat(b.warnings || []),
|
||||||
|
}), {updated: false});
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,10 +30,11 @@ export class AddonModGlossarySyncCronHandler implements CoreCronHandler {
|
||||||
* Receives the ID of the site affected, undefined for all sites.
|
* Receives the ID of the site affected, undefined for all sites.
|
||||||
*
|
*
|
||||||
* @param {string} [siteId] ID of the site affected, undefined for all sites.
|
* @param {string} [siteId] ID of the site affected, undefined for all sites.
|
||||||
|
* @param {boolean} [force] Wether the execution is forced (manual sync).
|
||||||
* @return {Promise<any>} Promise resolved when done, rejected if failure.
|
* @return {Promise<any>} Promise resolved when done, rejected if failure.
|
||||||
*/
|
*/
|
||||||
execute(siteId?: string): Promise<any> {
|
execute(siteId?: string, force?: boolean): Promise<any> {
|
||||||
return this.glossarySync.syncAllGlossaries(siteId);
|
return this.glossarySync.syncAllGlossaries(siteId, force);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -68,19 +68,21 @@ export class AddonModGlossarySyncProvider extends CoreSyncBaseProvider {
|
||||||
* Try to synchronize all the glossaries in a certain site or in all sites.
|
* Try to synchronize all the glossaries in a certain site or in all sites.
|
||||||
*
|
*
|
||||||
* @param {string} [siteId] Site ID to sync. If not defined, sync all sites.
|
* @param {string} [siteId] Site ID to sync. If not defined, sync all sites.
|
||||||
|
* @param {boolean} [force] Wether to force sync not depending on last execution.
|
||||||
* @return {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
* @return {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
||||||
*/
|
*/
|
||||||
syncAllGlossaries(siteId?: string): Promise<any> {
|
syncAllGlossaries(siteId?: string, force?: boolean): Promise<any> {
|
||||||
return this.syncOnSites('all glossaries', this.syncAllGlossariesFunc.bind(this), [], siteId);
|
return this.syncOnSites('all glossaries', this.syncAllGlossariesFunc.bind(this), [force], siteId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sync all glossaries on a site.
|
* Sync all glossaries on a site.
|
||||||
*
|
*
|
||||||
* @param {string} [siteId] Site ID to sync. If not defined, sync all sites.
|
* @param {string} siteId Site ID to sync.
|
||||||
|
* @param {boolean} [force] Wether to force sync not depending on last execution.
|
||||||
* @return {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
* @return {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
||||||
*/
|
*/
|
||||||
protected syncAllGlossariesFunc(siteId?: string): Promise<any> {
|
protected syncAllGlossariesFunc(siteId: string, force?: boolean): Promise<any> {
|
||||||
siteId = siteId || this.sitesProvider.getCurrentSiteId();
|
siteId = siteId || this.sitesProvider.getCurrentSiteId();
|
||||||
|
|
||||||
const promises = [];
|
const promises = [];
|
||||||
|
@ -97,8 +99,10 @@ export class AddonModGlossarySyncProvider extends CoreSyncBaseProvider {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
promises[entry.glossaryid] = this.syncGlossaryEntriesIfNeeded(entry.glossaryid, entry.userid, siteId)
|
promises[entry.glossaryid] = force ? this.syncGlossaryEntries(entry.glossaryid, entry.userid, siteId) :
|
||||||
.then((result) => {
|
this.syncGlossaryEntriesIfNeeded(entry.glossaryid, entry.userid, siteId);
|
||||||
|
|
||||||
|
promises[entry.glossaryid].then((result) => {
|
||||||
if (result && result.updated) {
|
if (result && result.updated) {
|
||||||
// Sync successful, send event.
|
// Sync successful, send event.
|
||||||
this.eventsProvider.trigger(AddonModGlossarySyncProvider.AUTO_SYNCED, {
|
this.eventsProvider.trigger(AddonModGlossarySyncProvider.AUTO_SYNCED, {
|
||||||
|
@ -114,7 +118,7 @@ export class AddonModGlossarySyncProvider extends CoreSyncBaseProvider {
|
||||||
return Promise.all(this.utils.objectToArray(promises));
|
return Promise.all(this.utils.objectToArray(promises));
|
||||||
}));
|
}));
|
||||||
|
|
||||||
promises.push(this.syncRatings(undefined, siteId));
|
promises.push(this.syncRatings(undefined, force, siteId));
|
||||||
|
|
||||||
return Promise.all(promises);
|
return Promise.all(promises);
|
||||||
}
|
}
|
||||||
|
@ -255,13 +259,14 @@ export class AddonModGlossarySyncProvider extends CoreSyncBaseProvider {
|
||||||
* Synchronize offline ratings.
|
* Synchronize offline ratings.
|
||||||
*
|
*
|
||||||
* @param {number} [cmId] Course module to be synced. If not defined, sync all glossaries.
|
* @param {number} [cmId] Course module to be synced. If not defined, sync all glossaries.
|
||||||
|
* @param {boolean} [force] Wether to force sync not depending on last execution.
|
||||||
* @param {string} [siteId] Site ID. If not defined, current site.
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
* @return {Promise<any>} Promise resolved if sync is successful, rejected otherwise.
|
* @return {Promise<any>} Promise resolved if sync is successful, rejected otherwise.
|
||||||
*/
|
*/
|
||||||
syncRatings(cmId?: number, siteId?: string): Promise<any> {
|
syncRatings(cmId?: number, force?: boolean, siteId?: string): Promise<any> {
|
||||||
siteId = siteId || this.sitesProvider.getCurrentSiteId();
|
siteId = siteId || this.sitesProvider.getCurrentSiteId();
|
||||||
|
|
||||||
return this.ratingSync.syncRatings('mod_glossary', 'entry', 'module', cmId, 0, siteId).then((results) => {
|
return this.ratingSync.syncRatings('mod_glossary', 'entry', 'module', cmId, 0, force, siteId).then((results) => {
|
||||||
let updated = false;
|
let updated = false;
|
||||||
const warnings = [];
|
const warnings = [];
|
||||||
const promises = [];
|
const promises = [];
|
||||||
|
|
|
@ -186,26 +186,31 @@ export class AddonModLessonSyncProvider extends CoreCourseActivitySyncBaseProvid
|
||||||
* Try to synchronize all the lessons in a certain site or in all sites.
|
* Try to synchronize all the lessons in a certain site or in all sites.
|
||||||
*
|
*
|
||||||
* @param {string} [siteId] Site ID to sync. If not defined, sync all sites.
|
* @param {string} [siteId] Site ID to sync. If not defined, sync all sites.
|
||||||
|
* @param {boolean} [force] Wether to force sync not depending on last execution.
|
||||||
* @return {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
* @return {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
||||||
*/
|
*/
|
||||||
syncAllLessons(siteId?: string): Promise<any> {
|
syncAllLessons(siteId?: string, force?: boolean): Promise<any> {
|
||||||
return this.syncOnSites('all lessons', this.syncAllLessonsFunc.bind(this), [], siteId);
|
return this.syncOnSites('all lessons', this.syncAllLessonsFunc.bind(this), [force], siteId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sync all lessons on a site.
|
* Sync all lessons on a site.
|
||||||
*
|
*
|
||||||
* @param {string} [siteId] Site ID to sync. If not defined, sync all sites.
|
* @param {string} siteId Site ID to sync.
|
||||||
|
* @param {boolean} [force] Wether to force sync not depending on last execution.
|
||||||
* @param {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
* @param {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
||||||
*/
|
*/
|
||||||
protected syncAllLessonsFunc(siteId?: string): Promise<any> {
|
protected syncAllLessonsFunc(siteId: string, force?: boolean): Promise<any> {
|
||||||
// Get all the lessons that have something to be synchronized.
|
// Get all the lessons that have something to be synchronized.
|
||||||
return this.lessonOfflineProvider.getAllLessonsWithData(siteId).then((lessons) => {
|
return this.lessonOfflineProvider.getAllLessonsWithData(siteId).then((lessons) => {
|
||||||
// Sync all lessons that haven't been synced for a while.
|
// Sync all lessons that haven't been synced for a while.
|
||||||
const promises = [];
|
const promises = [];
|
||||||
|
|
||||||
lessons.forEach((lesson) => {
|
lessons.map((lesson) => {
|
||||||
promises.push(this.syncLessonIfNeeded(lesson.id, false, siteId).then((result) => {
|
const promise = force ? this.syncLesson(lesson.id, false, false, siteId) :
|
||||||
|
this.syncLessonIfNeeded(lesson.id, false, siteId);
|
||||||
|
|
||||||
|
return promise.then((result) => {
|
||||||
if (result && result.updated) {
|
if (result && result.updated) {
|
||||||
// Sync successful, send event.
|
// Sync successful, send event.
|
||||||
this.eventsProvider.trigger(AddonModLessonSyncProvider.AUTO_SYNCED, {
|
this.eventsProvider.trigger(AddonModLessonSyncProvider.AUTO_SYNCED, {
|
||||||
|
@ -213,7 +218,7 @@ export class AddonModLessonSyncProvider extends CoreCourseActivitySyncBaseProvid
|
||||||
warnings: result.warnings
|
warnings: result.warnings
|
||||||
}, siteId);
|
}, siteId);
|
||||||
}
|
}
|
||||||
}));
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
return Promise.all(promises);
|
return Promise.all(promises);
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { Injectable } from '@angular/core';
|
import { Injectable, Injector } from '@angular/core';
|
||||||
import { ModalController } from 'ionic-angular';
|
import { ModalController } from 'ionic-angular';
|
||||||
import { TranslateService } from '@ngx-translate/core';
|
import { TranslateService } from '@ngx-translate/core';
|
||||||
import { CoreAppProvider } from '@providers/app';
|
import { CoreAppProvider } from '@providers/app';
|
||||||
|
@ -24,6 +24,7 @@ import { CoreCourseProvider } from '@core/course/providers/course';
|
||||||
import { CoreGroupsProvider } from '@providers/groups';
|
import { CoreGroupsProvider } from '@providers/groups';
|
||||||
import { CoreCourseActivityPrefetchHandlerBase } from '@core/course/classes/activity-prefetch-handler';
|
import { CoreCourseActivityPrefetchHandlerBase } from '@core/course/classes/activity-prefetch-handler';
|
||||||
import { AddonModLessonProvider } from './lesson';
|
import { AddonModLessonProvider } from './lesson';
|
||||||
|
import { AddonModLessonSyncProvider } from './lesson-sync';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handler to prefetch lessons.
|
* Handler to prefetch lessons.
|
||||||
|
@ -36,10 +37,12 @@ export class AddonModLessonPrefetchHandler extends CoreCourseActivityPrefetchHan
|
||||||
// Don't check timers to decrease positives. If a user performs some action it will be reflected in other items.
|
// Don't check timers to decrease positives. If a user performs some action it will be reflected in other items.
|
||||||
updatesNames = /^configuration$|^.*files$|^grades$|^gradeitems$|^pages$|^answers$|^questionattempts$|^pagesviewed$/;
|
updatesNames = /^configuration$|^.*files$|^grades$|^gradeitems$|^pages$|^answers$|^questionattempts$|^pagesviewed$/;
|
||||||
|
|
||||||
|
protected syncProvider: AddonModLessonSyncProvider; // It will be injected later to prevent circular dependencies.
|
||||||
|
|
||||||
constructor(translate: TranslateService, appProvider: CoreAppProvider, utils: CoreUtilsProvider,
|
constructor(translate: TranslateService, appProvider: CoreAppProvider, utils: CoreUtilsProvider,
|
||||||
courseProvider: CoreCourseProvider, filepoolProvider: CoreFilepoolProvider, sitesProvider: CoreSitesProvider,
|
courseProvider: CoreCourseProvider, filepoolProvider: CoreFilepoolProvider, sitesProvider: CoreSitesProvider,
|
||||||
domUtils: CoreDomUtilsProvider, protected modalCtrl: ModalController, protected groupsProvider: CoreGroupsProvider,
|
domUtils: CoreDomUtilsProvider, protected modalCtrl: ModalController, protected groupsProvider: CoreGroupsProvider,
|
||||||
protected lessonProvider: AddonModLessonProvider) {
|
protected lessonProvider: AddonModLessonProvider, protected injector: Injector) {
|
||||||
|
|
||||||
super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils);
|
super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils);
|
||||||
}
|
}
|
||||||
|
@ -429,4 +432,20 @@ export class AddonModLessonPrefetchHandler extends CoreCourseActivityPrefetchHan
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sync a module.
|
||||||
|
*
|
||||||
|
* @param {any} module Module.
|
||||||
|
* @param {number} courseId Course ID the module belongs to
|
||||||
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
|
* @return {Promise<any>} Promise resolved when done.
|
||||||
|
*/
|
||||||
|
sync(module: any, courseId: number, siteId?: any): Promise<any> {
|
||||||
|
if (!this.syncProvider) {
|
||||||
|
this.syncProvider = this.injector.get(AddonModLessonSyncProvider);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.syncProvider.syncLesson(module.instance, false, false, siteId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,10 +30,11 @@ export class AddonModLessonSyncCronHandler implements CoreCronHandler {
|
||||||
* Receives the ID of the site affected, undefined for all sites.
|
* Receives the ID of the site affected, undefined for all sites.
|
||||||
*
|
*
|
||||||
* @param {string} [siteId] ID of the site affected, undefined for all sites.
|
* @param {string} [siteId] ID of the site affected, undefined for all sites.
|
||||||
|
* @param {boolean} [force] Wether the execution is forced (manual sync).
|
||||||
* @return {Promise<any>} Promise resolved when done, rejected if failure.
|
* @return {Promise<any>} Promise resolved when done, rejected if failure.
|
||||||
*/
|
*/
|
||||||
execute(siteId?: string): Promise<any> {
|
execute(siteId?: string, force?: boolean): Promise<any> {
|
||||||
return this.lessonSync.syncAllLessons(siteId);
|
return this.lessonSync.syncAllLessons(siteId, force);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -54,7 +54,7 @@ export class AddonModQuizHelperProvider {
|
||||||
getAndCheckPreflightData(quiz: any, accessInfo: any, preflightData: any, attempt: any, offline?: boolean, prefetch?: boolean,
|
getAndCheckPreflightData(quiz: any, accessInfo: any, preflightData: any, attempt: any, offline?: boolean, prefetch?: boolean,
|
||||||
title?: string, siteId?: string, retrying?: boolean): Promise<any> {
|
title?: string, siteId?: string, retrying?: boolean): Promise<any> {
|
||||||
|
|
||||||
const rules = accessInfo.activerulenames;
|
const rules = accessInfo && accessInfo.activerulenames;
|
||||||
let isPreflightCheckRequired = false;
|
let isPreflightCheckRequired = false;
|
||||||
|
|
||||||
// Check if the user needs to input preflight data.
|
// Check if the user needs to input preflight data.
|
||||||
|
|
|
@ -239,7 +239,16 @@ export class AddonModQuizPrefetchHandler extends CoreCourseActivityPrefetchHandl
|
||||||
* @return {Promise<any>} Promise resolved when done.
|
* @return {Promise<any>} Promise resolved when done.
|
||||||
*/
|
*/
|
||||||
prefetch(module: any, courseId?: number, single?: boolean, dirPath?: string, canStart: boolean = true): Promise<any> {
|
prefetch(module: any, courseId?: number, single?: boolean, dirPath?: string, canStart: boolean = true): Promise<any> {
|
||||||
|
if (module.attemptFinished) {
|
||||||
|
// Delete the value so it does not block anything if true.
|
||||||
|
delete module.attemptFinished;
|
||||||
|
|
||||||
|
// Quiz got synced recently and an attempt has finished. Do not prefetch.
|
||||||
|
return Promise.resolve();
|
||||||
|
}
|
||||||
|
|
||||||
return this.prefetchPackage(module, courseId, single, this.prefetchQuiz.bind(this), undefined, canStart);
|
return this.prefetchPackage(module, courseId, single, this.prefetchQuiz.bind(this), undefined, canStart);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -554,4 +563,30 @@ export class AddonModQuizPrefetchHandler extends CoreCourseActivityPrefetchHandl
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sync a module.
|
||||||
|
*
|
||||||
|
* @param {any} module Module.
|
||||||
|
* @param {number} courseId Course ID the module belongs to
|
||||||
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
|
* @return {Promise<any>} Promise resolved when done.
|
||||||
|
*/
|
||||||
|
sync(module: any, courseId: number, siteId?: any): Promise<any> {
|
||||||
|
if (!this.syncProvider) {
|
||||||
|
this.syncProvider = this.injector.get(AddonModQuizSyncProvider);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.quizProvider.getQuiz(courseId, module.id).then((quiz) => {
|
||||||
|
return this.syncProvider.syncQuiz(quiz, false, siteId).then((results) => {
|
||||||
|
module.attemptFinished = (results && results.attemptFinished) || false;
|
||||||
|
|
||||||
|
return results;
|
||||||
|
}).catch(() => {
|
||||||
|
// Ignore errors.
|
||||||
|
|
||||||
|
module.attemptFinished = false;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -190,19 +190,21 @@ export class AddonModQuizSyncProvider extends CoreCourseActivitySyncBaseProvider
|
||||||
* Try to synchronize all the quizzes in a certain site or in all sites.
|
* Try to synchronize all the quizzes in a certain site or in all sites.
|
||||||
*
|
*
|
||||||
* @param {string} [siteId] Site ID to sync. If not defined, sync all sites.
|
* @param {string} [siteId] Site ID to sync. If not defined, sync all sites.
|
||||||
|
* @param {boolean} [force] Wether to force sync not depending on last execution.
|
||||||
* @return {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
* @return {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
||||||
*/
|
*/
|
||||||
syncAllQuizzes(siteId?: string): Promise<any> {
|
syncAllQuizzes(siteId?: string, force?: boolean): Promise<any> {
|
||||||
return this.syncOnSites('all quizzes', this.syncAllQuizzesFunc.bind(this), [], siteId);
|
return this.syncOnSites('all quizzes', this.syncAllQuizzesFunc.bind(this), [force], siteId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sync all quizzes on a site.
|
* Sync all quizzes on a site.
|
||||||
*
|
*
|
||||||
* @param {string} [siteId] Site ID to sync. If not defined, sync all sites.
|
* @param {string} siteId Site ID to sync.
|
||||||
|
* @param {boolean} [force] Wether to force sync not depending on last execution.
|
||||||
* @param {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
* @param {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
||||||
*/
|
*/
|
||||||
protected syncAllQuizzesFunc(siteId?: string): Promise<any> {
|
protected syncAllQuizzesFunc(siteId?: string, force?: boolean): Promise<any> {
|
||||||
// Get all offline attempts.
|
// Get all offline attempts.
|
||||||
return this.quizOfflineProvider.getAllAttempts(siteId).then((attempts) => {
|
return this.quizOfflineProvider.getAllAttempts(siteId).then((attempts) => {
|
||||||
const quizzes = [],
|
const quizzes = [],
|
||||||
|
@ -227,7 +229,9 @@ export class AddonModQuizSyncProvider extends CoreCourseActivitySyncBaseProvider
|
||||||
|
|
||||||
// Quiz not blocked, try to synchronize it.
|
// Quiz not blocked, try to synchronize it.
|
||||||
promises.push(this.quizProvider.getQuizById(quiz.courseid, quiz.id, false, false, siteId).then((quiz) => {
|
promises.push(this.quizProvider.getQuizById(quiz.courseid, quiz.id, false, false, siteId).then((quiz) => {
|
||||||
return this.syncQuizIfNeeded(quiz, false, siteId).then((data) => {
|
const promise = force ? this.syncQuiz(quiz, false, siteId) : this.syncQuizIfNeeded(quiz, false, siteId);
|
||||||
|
|
||||||
|
return promise.then((data) => {
|
||||||
if (data && data.warnings && data.warnings.length) {
|
if (data && data.warnings && data.warnings.length) {
|
||||||
// Store the warnings to show them when the user opens the quiz.
|
// Store the warnings to show them when the user opens the quiz.
|
||||||
return this.setSyncWarnings(quiz.id, data.warnings, siteId).then(() => {
|
return this.setSyncWarnings(quiz.id, data.warnings, siteId).then(() => {
|
||||||
|
|
|
@ -30,10 +30,11 @@ export class AddonModQuizSyncCronHandler implements CoreCronHandler {
|
||||||
* Receives the ID of the site affected, undefined for all sites.
|
* Receives the ID of the site affected, undefined for all sites.
|
||||||
*
|
*
|
||||||
* @param {string} [siteId] ID of the site affected, undefined for all sites.
|
* @param {string} [siteId] ID of the site affected, undefined for all sites.
|
||||||
|
* @param {boolean} [force] Wether the execution is forced (manual sync).
|
||||||
* @return {Promise<any>} Promise resolved when done, rejected if failure.
|
* @return {Promise<any>} Promise resolved when done, rejected if failure.
|
||||||
*/
|
*/
|
||||||
execute(siteId?: string): Promise<any> {
|
execute(siteId?: string, force?: boolean): Promise<any> {
|
||||||
return this.quizSync.syncAllQuizzes(siteId);
|
return this.quizSync.syncAllQuizzes(siteId, force);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { Injectable } from '@angular/core';
|
import { Injectable, Injector } from '@angular/core';
|
||||||
import { TranslateService } from '@ngx-translate/core';
|
import { TranslateService } from '@ngx-translate/core';
|
||||||
import { CoreAppProvider } from '@providers/app';
|
import { CoreAppProvider } from '@providers/app';
|
||||||
import { CoreFilepoolProvider } from '@providers/filepool';
|
import { CoreFilepoolProvider } from '@providers/filepool';
|
||||||
|
@ -24,6 +24,7 @@ import { CoreFileProvider } from '@providers/file';
|
||||||
import { CoreTextUtilsProvider } from '@providers/utils/text';
|
import { CoreTextUtilsProvider } from '@providers/utils/text';
|
||||||
import { CoreCourseActivityPrefetchHandlerBase } from '@core/course/classes/activity-prefetch-handler';
|
import { CoreCourseActivityPrefetchHandlerBase } from '@core/course/classes/activity-prefetch-handler';
|
||||||
import { AddonModScormProvider } from './scorm';
|
import { AddonModScormProvider } from './scorm';
|
||||||
|
import { AddonModScormSyncProvider } from './scorm-sync';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Progress event used when downloading a SCORM.
|
* Progress event used when downloading a SCORM.
|
||||||
|
@ -58,10 +59,12 @@ export class AddonModScormPrefetchHandler extends CoreCourseActivityPrefetchHand
|
||||||
component = AddonModScormProvider.COMPONENT;
|
component = AddonModScormProvider.COMPONENT;
|
||||||
updatesNames = /^configuration$|^.*files$|^tracks$/;
|
updatesNames = /^configuration$|^.*files$|^tracks$/;
|
||||||
|
|
||||||
|
protected syncProvider: AddonModScormSyncProvider; // It will be injected later to prevent circular dependencies.
|
||||||
|
|
||||||
constructor(translate: TranslateService, appProvider: CoreAppProvider, utils: CoreUtilsProvider,
|
constructor(translate: TranslateService, appProvider: CoreAppProvider, utils: CoreUtilsProvider,
|
||||||
courseProvider: CoreCourseProvider, filepoolProvider: CoreFilepoolProvider, sitesProvider: CoreSitesProvider,
|
courseProvider: CoreCourseProvider, filepoolProvider: CoreFilepoolProvider, sitesProvider: CoreSitesProvider,
|
||||||
domUtils: CoreDomUtilsProvider, protected fileProvider: CoreFileProvider, protected textUtils: CoreTextUtilsProvider,
|
domUtils: CoreDomUtilsProvider, protected fileProvider: CoreFileProvider, protected textUtils: CoreTextUtilsProvider,
|
||||||
protected scormProvider: AddonModScormProvider) {
|
protected scormProvider: AddonModScormProvider, protected injector: Injector) {
|
||||||
|
|
||||||
super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils);
|
super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils);
|
||||||
}
|
}
|
||||||
|
@ -423,4 +426,20 @@ export class AddonModScormPrefetchHandler extends CoreCourseActivityPrefetchHand
|
||||||
return Promise.all(promises);
|
return Promise.all(promises);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sync a module.
|
||||||
|
*
|
||||||
|
* @param {any} module Module.
|
||||||
|
* @param {number} courseId Course ID the module belongs to
|
||||||
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
|
* @return {Promise<any>} Promise resolved when done.
|
||||||
|
*/
|
||||||
|
sync(module: any, courseId: number, siteId?: any): Promise<any> {
|
||||||
|
if (!this.syncProvider) {
|
||||||
|
this.syncProvider = this.injector.get(AddonModScormSyncProvider);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.syncProvider.syncScorm(module.instance, siteId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -444,19 +444,21 @@ export class AddonModScormSyncProvider extends CoreCourseActivitySyncBaseProvide
|
||||||
* Try to synchronize all the SCORMs in a certain site or in all sites.
|
* Try to synchronize all the SCORMs in a certain site or in all sites.
|
||||||
*
|
*
|
||||||
* @param {string} [siteId] Site ID to sync. If not defined, sync all sites.
|
* @param {string} [siteId] Site ID to sync. If not defined, sync all sites.
|
||||||
|
* @param {boolean} force Wether to force sync not depending on last execution.
|
||||||
* @return {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
* @return {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
||||||
*/
|
*/
|
||||||
syncAllScorms(siteId?: string): Promise<any> {
|
syncAllScorms(siteId?: string, force?: boolean): Promise<any> {
|
||||||
return this.syncOnSites('all SCORMs', this.syncAllScormsFunc.bind(this), [], siteId);
|
return this.syncOnSites('all SCORMs', this.syncAllScormsFunc.bind(this), [force], siteId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sync all SCORMs on a site.
|
* Sync all SCORMs on a site.
|
||||||
*
|
*
|
||||||
* @param {string} [siteId] Site ID to sync. If not defined, sync all sites.
|
* @param {string} siteId Site ID to sync.
|
||||||
|
* @param {boolean} [force] Wether to force sync not depending on last execution.
|
||||||
* @param {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
* @param {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
||||||
*/
|
*/
|
||||||
protected syncAllScormsFunc(siteId?: string): Promise<any> {
|
protected syncAllScormsFunc(siteId: string, force?: boolean): Promise<any> {
|
||||||
|
|
||||||
// Get all offline attempts.
|
// Get all offline attempts.
|
||||||
return this.scormOfflineProvider.getAllAttempts(siteId).then((attempts) => {
|
return this.scormOfflineProvider.getAllAttempts(siteId).then((attempts) => {
|
||||||
|
@ -481,7 +483,9 @@ export class AddonModScormSyncProvider extends CoreCourseActivitySyncBaseProvide
|
||||||
if (!this.syncProvider.isBlocked(AddonModScormProvider.COMPONENT, scorm.id, siteId)) {
|
if (!this.syncProvider.isBlocked(AddonModScormProvider.COMPONENT, scorm.id, siteId)) {
|
||||||
|
|
||||||
promises.push(this.scormProvider.getScormById(scorm.courseId, scorm.id, '', false, siteId).then((scorm) => {
|
promises.push(this.scormProvider.getScormById(scorm.courseId, scorm.id, '', false, siteId).then((scorm) => {
|
||||||
return this.syncScormIfNeeded(scorm, siteId).then((data) => {
|
const promise = force ? this.syncScorm(scorm, siteId) : this.syncScormIfNeeded(scorm, siteId);
|
||||||
|
|
||||||
|
return promise.then((data) => {
|
||||||
if (typeof data != 'undefined') {
|
if (typeof data != 'undefined') {
|
||||||
// We tried to sync. Send event.
|
// We tried to sync. Send event.
|
||||||
this.eventsProvider.trigger(AddonModScormSyncProvider.AUTO_SYNCED, {
|
this.eventsProvider.trigger(AddonModScormSyncProvider.AUTO_SYNCED, {
|
||||||
|
|
|
@ -30,10 +30,11 @@ export class AddonModScormSyncCronHandler implements CoreCronHandler {
|
||||||
* Receives the ID of the site affected, undefined for all sites.
|
* Receives the ID of the site affected, undefined for all sites.
|
||||||
*
|
*
|
||||||
* @param {string} [siteId] ID of the site affected, undefined for all sites.
|
* @param {string} [siteId] ID of the site affected, undefined for all sites.
|
||||||
|
* @param {boolean} [force] Wether the execution is forced (manual sync).
|
||||||
* @return {Promise<any>} Promise resolved when done, rejected if failure.
|
* @return {Promise<any>} Promise resolved when done, rejected if failure.
|
||||||
*/
|
*/
|
||||||
execute(siteId?: string): Promise<any> {
|
execute(siteId?: string, force?: boolean): Promise<any> {
|
||||||
return this.scormSync.syncAllScorms(siteId);
|
return this.scormSync.syncAllScorms(siteId, force);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { Injectable } from '@angular/core';
|
import { Injectable, Injector } from '@angular/core';
|
||||||
import { TranslateService } from '@ngx-translate/core';
|
import { TranslateService } from '@ngx-translate/core';
|
||||||
import { CoreAppProvider } from '@providers/app';
|
import { CoreAppProvider } from '@providers/app';
|
||||||
import { CoreFilepoolProvider } from '@providers/filepool';
|
import { CoreFilepoolProvider } from '@providers/filepool';
|
||||||
|
@ -22,6 +22,7 @@ import { CoreUtilsProvider } from '@providers/utils/utils';
|
||||||
import { CoreCourseProvider } from '@core/course/providers/course';
|
import { CoreCourseProvider } from '@core/course/providers/course';
|
||||||
import { CoreCourseActivityPrefetchHandlerBase } from '@core/course/classes/activity-prefetch-handler';
|
import { CoreCourseActivityPrefetchHandlerBase } from '@core/course/classes/activity-prefetch-handler';
|
||||||
import { AddonModSurveyProvider } from './survey';
|
import { AddonModSurveyProvider } from './survey';
|
||||||
|
import { AddonModSurveySyncProvider } from './sync';
|
||||||
import { AddonModSurveyHelperProvider } from './helper';
|
import { AddonModSurveyHelperProvider } from './helper';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -34,10 +35,12 @@ export class AddonModSurveyPrefetchHandler extends CoreCourseActivityPrefetchHan
|
||||||
component = AddonModSurveyProvider.COMPONENT;
|
component = AddonModSurveyProvider.COMPONENT;
|
||||||
updatesNames = /^configuration$|^.*files$|^answers$/;
|
updatesNames = /^configuration$|^.*files$|^answers$/;
|
||||||
|
|
||||||
|
protected syncProvider: AddonModSurveySyncProvider; // It will be injected later to prevent circular dependencies.
|
||||||
|
|
||||||
constructor(translate: TranslateService, appProvider: CoreAppProvider, utils: CoreUtilsProvider,
|
constructor(translate: TranslateService, appProvider: CoreAppProvider, utils: CoreUtilsProvider,
|
||||||
courseProvider: CoreCourseProvider, filepoolProvider: CoreFilepoolProvider, sitesProvider: CoreSitesProvider,
|
courseProvider: CoreCourseProvider, filepoolProvider: CoreFilepoolProvider, sitesProvider: CoreSitesProvider,
|
||||||
domUtils: CoreDomUtilsProvider, protected surveyProvider: AddonModSurveyProvider,
|
domUtils: CoreDomUtilsProvider, protected surveyProvider: AddonModSurveyProvider,
|
||||||
protected surveyHelper: AddonModSurveyHelperProvider) {
|
protected surveyHelper: AddonModSurveyHelperProvider, protected injector: Injector) {
|
||||||
|
|
||||||
super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils);
|
super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils);
|
||||||
}
|
}
|
||||||
|
@ -126,4 +129,20 @@ export class AddonModSurveyPrefetchHandler extends CoreCourseActivityPrefetchHan
|
||||||
return Promise.all(promises);
|
return Promise.all(promises);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sync a module.
|
||||||
|
*
|
||||||
|
* @param {any} module Module.
|
||||||
|
* @param {number} courseId Course ID the module belongs to
|
||||||
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
|
* @return {Promise<any>} Promise resolved when done.
|
||||||
|
*/
|
||||||
|
sync(module: any, courseId: number, siteId?: any): Promise<any> {
|
||||||
|
if (!this.syncProvider) {
|
||||||
|
this.syncProvider = this.injector.get(AddonModSurveySyncProvider);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.syncProvider.syncSurvey(module.instance, undefined, siteId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,10 +30,11 @@ export class AddonModSurveySyncCronHandler implements CoreCronHandler {
|
||||||
* Receives the ID of the site affected, undefined for all sites.
|
* Receives the ID of the site affected, undefined for all sites.
|
||||||
*
|
*
|
||||||
* @param {string} [siteId] ID of the site affected, undefined for all sites.
|
* @param {string} [siteId] ID of the site affected, undefined for all sites.
|
||||||
|
* @param {boolean} [force] Wether the execution is forced (manual sync).
|
||||||
* @return {Promise<any>} Promise resolved when done, rejected if failure.
|
* @return {Promise<any>} Promise resolved when done, rejected if failure.
|
||||||
*/
|
*/
|
||||||
execute(siteId?: string): Promise<any> {
|
execute(siteId?: string, force?: boolean): Promise<any> {
|
||||||
return this.surveySync.syncAllSurveys(siteId);
|
return this.surveySync.syncAllSurveys(siteId, force);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -68,23 +68,29 @@ export class AddonModSurveySyncProvider extends CoreCourseActivitySyncBaseProvid
|
||||||
* Try to synchronize all the surveys in a certain site or in all sites.
|
* Try to synchronize all the surveys in a certain site or in all sites.
|
||||||
*
|
*
|
||||||
* @param {string} [siteId] Site ID to sync. If not defined, sync all sites.
|
* @param {string} [siteId] Site ID to sync. If not defined, sync all sites.
|
||||||
|
* @param {boolean} [force] Wether to force sync not depending on last execution.
|
||||||
* @return {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
* @return {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
||||||
*/
|
*/
|
||||||
syncAllSurveys(siteId?: string): Promise<any> {
|
syncAllSurveys(siteId?: string, force?: boolean): Promise<any> {
|
||||||
return this.syncOnSites('all surveys', this.syncAllSurveysFunc.bind(this), undefined, siteId);
|
return this.syncOnSites('all surveys', this.syncAllSurveysFunc.bind(this), [force], siteId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sync all pending surveys on a site.
|
* Sync all pending surveys on a site.
|
||||||
* @param {string} [siteId] Site ID to sync. If not defined, sync all sites.
|
*
|
||||||
|
* @param {string} siteId Site ID to sync.
|
||||||
|
* @param {boolean} [force] Wether to force sync not depending on last execution.
|
||||||
* @param {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
* @param {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
||||||
*/
|
*/
|
||||||
protected syncAllSurveysFunc(siteId?: string): Promise<any> {
|
protected syncAllSurveysFunc(siteId: string, force?: boolean): Promise<any> {
|
||||||
// Get all survey answers pending to be sent in the site.
|
// Get all survey answers pending to be sent in the site.
|
||||||
return this.surveyOffline.getAllData(siteId).then((entries) => {
|
return this.surveyOffline.getAllData(siteId).then((entries) => {
|
||||||
// Sync all surveys.
|
// Sync all surveys.
|
||||||
const promises = entries.map((entry) => {
|
const promises = entries.map((entry) => {
|
||||||
return this.syncSurveyIfNeeded(entry.surveyid, entry.userid, siteId).then((result) => {
|
const promise = force ? this.syncSurvey(entry.surveyid, entry.userid, siteId) :
|
||||||
|
this.syncSurveyIfNeeded(entry.surveyid, entry.userid, siteId);
|
||||||
|
|
||||||
|
return promise.then((result) => {
|
||||||
if (result && result.answersSent) {
|
if (result && result.answersSent) {
|
||||||
// Sync successful, send event.
|
// Sync successful, send event.
|
||||||
this.eventsProvider.trigger(AddonModSurveySyncProvider.AUTO_SYNCED, {
|
this.eventsProvider.trigger(AddonModSurveySyncProvider.AUTO_SYNCED, {
|
||||||
|
@ -124,12 +130,14 @@ export class AddonModSurveySyncProvider extends CoreCourseActivitySyncBaseProvid
|
||||||
* Synchronize a survey.
|
* Synchronize a survey.
|
||||||
*
|
*
|
||||||
* @param {number} surveyId Survey ID.
|
* @param {number} surveyId Survey ID.
|
||||||
* @param {number} userId User the answers belong to.
|
* @param {number} [userId] User the answers belong to. If not defined, current user.
|
||||||
* @param {string} [siteId] Site ID. If not defined, current site.
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
* @return {Promise<any>} Promise resolved if sync is successful, rejected otherwise.
|
* @return {Promise<any>} Promise resolved if sync is successful, rejected otherwise.
|
||||||
*/
|
*/
|
||||||
syncSurvey(surveyId: number, userId: number, siteId?: string): Promise<any> {
|
syncSurvey(surveyId: number, userId?: number, siteId?: string): Promise<any> {
|
||||||
siteId = siteId || this.sitesProvider.getCurrentSiteId();
|
return this.sitesProvider.getSite(siteId).then((site) => {
|
||||||
|
userId = userId || site.getUserId();
|
||||||
|
siteId = site.getId();
|
||||||
|
|
||||||
const syncId = this.getSyncId(surveyId, userId);
|
const syncId = this.getSyncId(surveyId, userId);
|
||||||
if (this.isSyncing(syncId, siteId)) {
|
if (this.isSyncing(syncId, siteId)) {
|
||||||
|
@ -209,6 +217,7 @@ export class AddonModSurveySyncProvider extends CoreCourseActivitySyncBaseProvid
|
||||||
});
|
});
|
||||||
|
|
||||||
return this.addOngoingSync(syncId, syncPromise, siteId);
|
return this.addOngoingSync(syncId, syncPromise, siteId);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,6 +27,7 @@ import { CoreCourseHelperProvider } from '@core/course/providers/helper';
|
||||||
import { CoreGradesHelperProvider } from '@core/grades/providers/helper';
|
import { CoreGradesHelperProvider } from '@core/grades/providers/helper';
|
||||||
import { CoreUserProvider } from '@core/user/providers/user';
|
import { CoreUserProvider } from '@core/user/providers/user';
|
||||||
import { AddonModWikiProvider } from './wiki';
|
import { AddonModWikiProvider } from './wiki';
|
||||||
|
import { AddonModWikiSyncProvider } from './wiki-sync';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handler to prefetch wikis.
|
* Handler to prefetch wikis.
|
||||||
|
@ -42,7 +43,8 @@ export class AddonModWikiPrefetchHandler extends CoreCourseActivityPrefetchHandl
|
||||||
courseProvider: CoreCourseProvider, filepoolProvider: CoreFilepoolProvider, sitesProvider: CoreSitesProvider,
|
courseProvider: CoreCourseProvider, filepoolProvider: CoreFilepoolProvider, sitesProvider: CoreSitesProvider,
|
||||||
domUtils: CoreDomUtilsProvider, protected wikiProvider: AddonModWikiProvider, protected userProvider: CoreUserProvider,
|
domUtils: CoreDomUtilsProvider, protected wikiProvider: AddonModWikiProvider, protected userProvider: CoreUserProvider,
|
||||||
protected textUtils: CoreTextUtilsProvider, protected courseHelper: CoreCourseHelperProvider,
|
protected textUtils: CoreTextUtilsProvider, protected courseHelper: CoreCourseHelperProvider,
|
||||||
protected groupsProvider: CoreGroupsProvider, protected gradesHelper: CoreGradesHelperProvider) {
|
protected groupsProvider: CoreGroupsProvider, protected gradesHelper: CoreGradesHelperProvider,
|
||||||
|
protected syncProvider: AddonModWikiSyncProvider) {
|
||||||
|
|
||||||
super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils);
|
super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils);
|
||||||
}
|
}
|
||||||
|
@ -210,4 +212,16 @@ export class AddonModWikiPrefetchHandler extends CoreCourseActivityPrefetchHandl
|
||||||
return Promise.all(promises);
|
return Promise.all(promises);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sync a module.
|
||||||
|
*
|
||||||
|
* @param {any} module Module.
|
||||||
|
* @param {number} courseId Course ID the module belongs to
|
||||||
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
|
* @return {Promise<any>} Promise resolved when done.
|
||||||
|
*/
|
||||||
|
sync(module: any, courseId: number, siteId?: any): Promise<any> {
|
||||||
|
return this.syncProvider.syncWiki(module.instance, module.course, module.id, siteId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,10 +30,11 @@ export class AddonModWikiSyncCronHandler implements CoreCronHandler {
|
||||||
* Receives the ID of the site affected, undefined for all sites.
|
* Receives the ID of the site affected, undefined for all sites.
|
||||||
*
|
*
|
||||||
* @param {string} [siteId] ID of the site affected, undefined for all sites.
|
* @param {string} [siteId] ID of the site affected, undefined for all sites.
|
||||||
|
* @param {boolean} [force] Wether the execution is forced (manual sync).
|
||||||
* @return {Promise<any>} Promise resolved when done, rejected if failure.
|
* @return {Promise<any>} Promise resolved when done, rejected if failure.
|
||||||
*/
|
*/
|
||||||
execute(siteId?: string): Promise<any> {
|
execute(siteId?: string, force?: boolean): Promise<any> {
|
||||||
return this.wikiSync.syncAllWikis(siteId);
|
return this.wikiSync.syncAllWikis(siteId, force);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -143,19 +143,21 @@ export class AddonModWikiSyncProvider extends CoreSyncBaseProvider {
|
||||||
* Try to synchronize all the wikis in a certain site or in all sites.
|
* Try to synchronize all the wikis in a certain site or in all sites.
|
||||||
*
|
*
|
||||||
* @param {string} [siteId] Site ID to sync. If not defined, sync all sites.
|
* @param {string} [siteId] Site ID to sync. If not defined, sync all sites.
|
||||||
|
* @param {boolean} [force] Wether to force sync not depending on last execution.
|
||||||
* @return {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
* @return {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
||||||
*/
|
*/
|
||||||
syncAllWikis(siteId?: string): Promise<any> {
|
syncAllWikis(siteId?: string, force?: boolean): Promise<any> {
|
||||||
return this.syncOnSites('all wikis', this.syncAllWikisFunc.bind(this), [], siteId);
|
return this.syncOnSites('all wikis', this.syncAllWikisFunc.bind(this), [force], siteId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sync all wikis on a site.
|
* Sync all wikis on a site.
|
||||||
*
|
*
|
||||||
* @param {string} [siteId] Site ID to sync. If not defined, sync all sites.
|
* @param {string} siteId Site ID to sync.
|
||||||
|
* @param {boolean} [force] Wether to force sync not depending on last execution.
|
||||||
* @param {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
* @param {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
||||||
*/
|
*/
|
||||||
protected syncAllWikisFunc(siteId?: string): Promise<any> {
|
protected syncAllWikisFunc(siteId: string, force?: boolean): Promise<any> {
|
||||||
// Get all the pages created in offline.
|
// Get all the pages created in offline.
|
||||||
return this.wikiOfflineProvider.getAllNewPages(siteId).then((pages) => {
|
return this.wikiOfflineProvider.getAllNewPages(siteId).then((pages) => {
|
||||||
const promises = [],
|
const promises = [],
|
||||||
|
@ -171,8 +173,10 @@ export class AddonModWikiSyncProvider extends CoreSyncBaseProvider {
|
||||||
for (const id in subwikis) {
|
for (const id in subwikis) {
|
||||||
const subwiki = subwikis[id];
|
const subwiki = subwikis[id];
|
||||||
|
|
||||||
promises.push(this.syncSubwikiIfNeeded(subwiki.subwikiid, subwiki.wikiid, subwiki.userid, subwiki.groupid,
|
const promise = force ? this.syncSubwiki(subwiki.subwikiid, subwiki.wikiid, subwiki.userid, subwiki.groupid, siteId)
|
||||||
siteId).then((result) => {
|
: this.syncSubwikiIfNeeded(subwiki.subwikiid, subwiki.wikiid, subwiki.userid, subwiki.groupid, siteId);
|
||||||
|
|
||||||
|
promises.push(promise.then((result) => {
|
||||||
|
|
||||||
if (result && result.updated) {
|
if (result && result.updated) {
|
||||||
// Sync successful, send event.
|
// Sync successful, send event.
|
||||||
|
|
|
@ -24,6 +24,7 @@ import { CoreCourseActivityPrefetchHandlerBase } from '@core/course/classes/acti
|
||||||
import { CoreGroupsProvider } from '@providers/groups';
|
import { CoreGroupsProvider } from '@providers/groups';
|
||||||
import { CoreUserProvider } from '@core/user/providers/user';
|
import { CoreUserProvider } from '@core/user/providers/user';
|
||||||
import { AddonModWorkshopProvider } from './workshop';
|
import { AddonModWorkshopProvider } from './workshop';
|
||||||
|
import { AddonModWorkshopSyncProvider } from './sync';
|
||||||
import { AddonModWorkshopHelperProvider } from './helper';
|
import { AddonModWorkshopHelperProvider } from './helper';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -47,7 +48,8 @@ export class AddonModWorkshopPrefetchHandler extends CoreCourseActivityPrefetchH
|
||||||
private groupsProvider: CoreGroupsProvider,
|
private groupsProvider: CoreGroupsProvider,
|
||||||
private userProvider: CoreUserProvider,
|
private userProvider: CoreUserProvider,
|
||||||
private workshopProvider: AddonModWorkshopProvider,
|
private workshopProvider: AddonModWorkshopProvider,
|
||||||
private workshopHelper: AddonModWorkshopHelperProvider) {
|
private workshopHelper: AddonModWorkshopHelperProvider,
|
||||||
|
private syncProvider: AddonModWorkshopSyncProvider) {
|
||||||
|
|
||||||
super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils);
|
super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils);
|
||||||
}
|
}
|
||||||
|
@ -365,4 +367,16 @@ export class AddonModWorkshopPrefetchHandler extends CoreCourseActivityPrefetchH
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sync a module.
|
||||||
|
*
|
||||||
|
* @param {any} module Module.
|
||||||
|
* @param {number} courseId Course ID the module belongs to
|
||||||
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
|
* @return {Promise<any>} Promise resolved when done.
|
||||||
|
*/
|
||||||
|
sync(module: any, courseId: number, siteId?: any): Promise<any> {
|
||||||
|
return this.syncProvider.syncWorkshop(module.instance, siteId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,10 +30,11 @@ export class AddonModWorkshopSyncCronHandler implements CoreCronHandler {
|
||||||
* Receives the ID of the site affected, undefined for all sites.
|
* Receives the ID of the site affected, undefined for all sites.
|
||||||
*
|
*
|
||||||
* @param {string} [siteId] ID of the site affected, undefined for all sites.
|
* @param {string} [siteId] ID of the site affected, undefined for all sites.
|
||||||
|
* @param {boolean} [force] Wether the execution is forced (manual sync).
|
||||||
* @return {Promise<any>} Promise resolved when done, rejected if failure.
|
* @return {Promise<any>} Promise resolved when done, rejected if failure.
|
||||||
*/
|
*/
|
||||||
execute(siteId?: string): Promise<any> {
|
execute(siteId?: string, force?: boolean): Promise<any> {
|
||||||
return this.workshopSync.syncAllWorkshops(siteId);
|
return this.workshopSync.syncAllWorkshops(siteId, force);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -76,25 +76,27 @@ export class AddonModWorkshopSyncProvider extends CoreSyncBaseProvider {
|
||||||
* Try to synchronize all workshops that need it and haven't been synchronized in a while.
|
* Try to synchronize all workshops that need it and haven't been synchronized in a while.
|
||||||
*
|
*
|
||||||
* @param {string} [siteId] Site ID to sync. If not defined, sync all sites.
|
* @param {string} [siteId] Site ID to sync. If not defined, sync all sites.
|
||||||
|
* @param {boolean} [force] Wether to force sync not depending on last execution.
|
||||||
* @return {Promise<any>} Promise resolved when the sync is done.
|
* @return {Promise<any>} Promise resolved when the sync is done.
|
||||||
*/
|
*/
|
||||||
syncAllWorkshops(siteId?: string): Promise<any> {
|
syncAllWorkshops(siteId?: string, force?: boolean): Promise<any> {
|
||||||
return this.syncOnSites('all workshops', this.syncAllWorkshopsFunc.bind(this), [], siteId);
|
return this.syncOnSites('all workshops', this.syncAllWorkshopsFunc.bind(this), [force], siteId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sync all workshops on a site.
|
* Sync all workshops on a site.
|
||||||
*
|
*
|
||||||
* @param {string} [siteId] Site ID to sync. If not defined, sync all sites.
|
* @param {string} siteId Site ID to sync.
|
||||||
|
* @param {boolean} [force] Wether to force sync not depending on last execution.
|
||||||
* @return {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
* @return {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
||||||
*/
|
*/
|
||||||
protected syncAllWorkshopsFunc(siteId?: string): Promise<any> {
|
protected syncAllWorkshopsFunc(siteId: string, force?: boolean): Promise<any> {
|
||||||
return this.workshopOffline.getAllWorkshops(siteId).then((workshopIds) => {
|
return this.workshopOffline.getAllWorkshops(siteId).then((workshopIds) => {
|
||||||
const promises = [];
|
|
||||||
|
|
||||||
// Sync all workshops that haven't been synced for a while.
|
// Sync all workshops that haven't been synced for a while.
|
||||||
workshopIds.forEach((workshopId) => {
|
const promises = workshopIds.map((workshopId) => {
|
||||||
promises.push(this.syncWorkshopIfNeeded(workshopId, siteId).then((data) => {
|
const promise = force ? this.syncWorkshop(workshopId, siteId) : this.syncWorkshopIfNeeded(workshopId, siteId);
|
||||||
|
|
||||||
|
return promise.then((data) => {
|
||||||
if (data && data.updated) {
|
if (data && data.updated) {
|
||||||
// Sync done. Send event.
|
// Sync done. Send event.
|
||||||
this.eventsProvider.trigger(AddonModWorkshopSyncProvider.AUTO_SYNCED, {
|
this.eventsProvider.trigger(AddonModWorkshopSyncProvider.AUTO_SYNCED, {
|
||||||
|
@ -102,7 +104,7 @@ export class AddonModWorkshopSyncProvider extends CoreSyncBaseProvider {
|
||||||
warnings: data.warnings
|
warnings: data.warnings
|
||||||
}, siteId);
|
}, siteId);
|
||||||
}
|
}
|
||||||
}));
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
return Promise.all(promises);
|
return Promise.all(promises);
|
||||||
|
|
|
@ -48,19 +48,21 @@ export class AddonNotesSyncProvider extends CoreSyncBaseProvider {
|
||||||
* Try to synchronize all the notes in a certain site or in all sites.
|
* Try to synchronize all the notes in a certain site or in all sites.
|
||||||
*
|
*
|
||||||
* @param {string} [siteId] Site ID to sync. If not defined, sync all sites.
|
* @param {string} [siteId] Site ID to sync. If not defined, sync all sites.
|
||||||
|
* @param {boolean} [force] Wether to force sync not depending on last execution.
|
||||||
* @return {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
* @return {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
||||||
*/
|
*/
|
||||||
syncAllNotes(siteId?: string): Promise<any> {
|
syncAllNotes(siteId?: string, force?: boolean): Promise<any> {
|
||||||
return this.syncOnSites('all notes', this.syncAllNotesFunc.bind(this), [], siteId);
|
return this.syncOnSites('all notes', this.syncAllNotesFunc.bind(this), [force], siteId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Synchronize all the notes in a certain site
|
* Synchronize all the notes in a certain site
|
||||||
*
|
*
|
||||||
* @param {string} siteId Site ID to sync.
|
* @param {string} siteId Site ID to sync.
|
||||||
|
* @param {boolean} force Wether to force sync not depending on last execution.
|
||||||
* @return {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
* @return {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
||||||
*/
|
*/
|
||||||
private syncAllNotesFunc(siteId: string): Promise<any> {
|
private syncAllNotesFunc(siteId: string, force: boolean): Promise<any> {
|
||||||
return this.notesOffline.getAllNotes(siteId).then((notes) => {
|
return this.notesOffline.getAllNotes(siteId).then((notes) => {
|
||||||
// Get all the courses to be synced.
|
// Get all the courses to be synced.
|
||||||
const courseIds = [];
|
const courseIds = [];
|
||||||
|
@ -72,7 +74,9 @@ export class AddonNotesSyncProvider extends CoreSyncBaseProvider {
|
||||||
|
|
||||||
// Sync all courses.
|
// Sync all courses.
|
||||||
const promises = courseIds.map((courseId) => {
|
const promises = courseIds.map((courseId) => {
|
||||||
return this.syncNotesIfNeeded(courseId, siteId).then((warnings) => {
|
const promise = force ? this.syncNotes(courseId, siteId) : this.syncNotesIfNeeded(courseId, siteId);
|
||||||
|
|
||||||
|
return promise.then((warnings) => {
|
||||||
if (typeof warnings != 'undefined') {
|
if (typeof warnings != 'undefined') {
|
||||||
// Sync successful, send event.
|
// Sync successful, send event.
|
||||||
this.eventsProvider.trigger(AddonNotesSyncProvider.AUTO_SYNCED, {
|
this.eventsProvider.trigger(AddonNotesSyncProvider.AUTO_SYNCED, {
|
||||||
|
|
|
@ -30,10 +30,11 @@ export class AddonNotesSyncCronHandler implements CoreCronHandler {
|
||||||
* Receives the ID of the site affected, undefined for all sites.
|
* Receives the ID of the site affected, undefined for all sites.
|
||||||
*
|
*
|
||||||
* @param {string} [siteId] ID of the site affected, undefined for all sites.
|
* @param {string} [siteId] ID of the site affected, undefined for all sites.
|
||||||
|
* @param {boolean} [force] Wether the execution is forced (manual sync).
|
||||||
* @return {Promise<any>} Promise resolved when done, rejected if failure.
|
* @return {Promise<any>} Promise resolved when done, rejected if failure.
|
||||||
*/
|
*/
|
||||||
execute(siteId?: string): Promise<any> {
|
execute(siteId?: string, force?: boolean): Promise<any> {
|
||||||
return this.notesSync.syncAllNotes(siteId);
|
return this.notesSync.syncAllNotes(siteId, force);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -66,12 +66,14 @@ export class AddonNotificationsCronHandler implements CoreCronHandler {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Execute the process.
|
* Execute the process.
|
||||||
|
* Receives the ID of the site affected, undefined for all sites.
|
||||||
*
|
*
|
||||||
* @param {string} [siteId] ID of the site affected. If not defined, all sites.
|
* @param {string} [siteId] ID of the site affected, undefined for all sites.
|
||||||
* @return {Promise<any>} Promise resolved when done. If the promise is rejected, this function will be called again often,
|
* @param {boolean} [force] Wether the execution is forced (manual sync).
|
||||||
* it shouldn't be abused.
|
* @return {Promise<any>} Promise resolved when done, rejected if failure. If the promise is rejected, this function
|
||||||
|
* will be called again often, it shouldn't be abused.
|
||||||
*/
|
*/
|
||||||
execute(siteId?: string): Promise<any> {
|
execute(siteId?: string, force?: boolean): Promise<any> {
|
||||||
if (this.sitesProvider.isCurrentSite(siteId)) {
|
if (this.sitesProvider.isCurrentSite(siteId)) {
|
||||||
this.eventsProvider.trigger(AddonNotificationsProvider.READ_CRON_EVENT, {}, this.sitesProvider.getCurrentSiteId());
|
this.eventsProvider.trigger(AddonNotificationsProvider.READ_CRON_EVENT, {}, this.sitesProvider.getCurrentSiteId());
|
||||||
}
|
}
|
||||||
|
|
|
@ -291,6 +291,7 @@ export class CoreCourseHelperProvider {
|
||||||
}
|
}
|
||||||
|
|
||||||
return promise.then((sections) => {
|
return promise.then((sections) => {
|
||||||
|
|
||||||
// Confirm the download.
|
// Confirm the download.
|
||||||
return this.confirmDownloadSizeSection(course.id, undefined, sections, true).then(() => {
|
return this.confirmDownloadSizeSection(course.id, undefined, sections, true).then(() => {
|
||||||
// User confirmed, get the course handlers if needed.
|
// User confirmed, get the course handlers if needed.
|
||||||
|
@ -1268,7 +1269,7 @@ export class CoreCourseHelperProvider {
|
||||||
return promise.catch(() => {
|
return promise.catch(() => {
|
||||||
// Ignore errors.
|
// Ignore errors.
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
return handler.prefetch(module, courseId, true);
|
return this.prefetchDelegate.prefetchModule(module, courseId, true);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -1341,11 +1342,14 @@ export class CoreCourseHelperProvider {
|
||||||
|
|
||||||
section.isDownloading = true;
|
section.isDownloading = true;
|
||||||
|
|
||||||
|
// Sync the modules first.
|
||||||
|
promises.push(this.prefetchDelegate.syncModules(section.modules, courseId).then(() => {
|
||||||
// Validate the section needs to be downloaded and calculate amount of modules that need to be downloaded.
|
// Validate the section needs to be downloaded and calculate amount of modules that need to be downloaded.
|
||||||
promises.push(this.prefetchDelegate.getModulesStatus(section.modules, courseId, section.id).then((result) => {
|
return this.prefetchDelegate.getModulesStatus(section.modules, courseId, section.id).then((result) => {
|
||||||
if (result.status == CoreConstants.DOWNLOADED || result.status == CoreConstants.NOT_DOWNLOADABLE) {
|
if (result.status == CoreConstants.DOWNLOADED || result.status == CoreConstants.NOT_DOWNLOADABLE) {
|
||||||
// Section is downloaded or not downloadable, nothing to do.
|
// Section is downloaded or not downloadable, nothing to do.
|
||||||
return;
|
|
||||||
|
return ;
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.prefetchSingleSection(section, result, courseId);
|
return this.prefetchSingleSection(section, result, courseId);
|
||||||
|
@ -1353,6 +1357,7 @@ export class CoreCourseHelperProvider {
|
||||||
section.isDownloading = false;
|
section.isDownloading = false;
|
||||||
|
|
||||||
return Promise.reject(error);
|
return Promise.reject(error);
|
||||||
|
});
|
||||||
}));
|
}));
|
||||||
|
|
||||||
// Download the files in the section description.
|
// Download the files in the section description.
|
||||||
|
|
|
@ -28,12 +28,13 @@ export class CoreCourseLogCronHandler implements CoreCronHandler {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Execute the process.
|
* Execute the process.
|
||||||
* Receives the ID of the site affected, undefined for the current site.
|
* Receives the ID of the site affected, undefined for all sites.
|
||||||
*
|
*
|
||||||
* @param {string} [siteId] ID of the site affected, undefined for the current site.
|
* @param {string} [siteId] ID of the site affected, undefined for all sites.
|
||||||
|
* @param {boolean} [force] Wether the execution is forced (manual sync).
|
||||||
* @return {Promise<any>} Promise resolved when done, rejected if failure.
|
* @return {Promise<any>} Promise resolved when done, rejected if failure.
|
||||||
*/
|
*/
|
||||||
execute(siteId?: string): Promise<any> {
|
execute(siteId?: string, force?: boolean): Promise<any> {
|
||||||
return this.sitesProvider.getSite(siteId).then((site) => {
|
return this.sitesProvider.getSite(siteId).then((site) => {
|
||||||
return this.courseProvider.logView(site.getSiteHomeId(), undefined, site.getId());
|
return this.courseProvider.logView(site.getSiteHomeId(), undefined, site.getId());
|
||||||
});
|
});
|
||||||
|
|
|
@ -227,7 +227,7 @@ export class CoreCourseLogHelperProvider {
|
||||||
* @param {string} [siteId] Site ID. If not defined, current site.
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
* @return {Promise<any>} Promise resolved when done.
|
* @return {Promise<any>} Promise resolved when done.
|
||||||
*/
|
*/
|
||||||
syncAll(siteId?: string): Promise<any> {
|
syncSite(siteId?: string): Promise<any> {
|
||||||
return this.sitesProvider.getSite(siteId).then((site) => {
|
return this.sitesProvider.getSite(siteId).then((site) => {
|
||||||
const siteId = site.getId();
|
const siteId = site.getId();
|
||||||
|
|
||||||
|
|
|
@ -206,6 +206,16 @@ export interface CoreCourseModulePrefetchHandler extends CoreDelegateHandler {
|
||||||
* @return {Promise<any>} Promise resolved when done.
|
* @return {Promise<any>} Promise resolved when done.
|
||||||
*/
|
*/
|
||||||
removeFiles?(module: any, courseId: number): Promise<any>;
|
removeFiles?(module: any, courseId: number): Promise<any>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sync a module.
|
||||||
|
*
|
||||||
|
* @param {any} module Module.
|
||||||
|
* @param {number} courseId Course ID the module belongs to
|
||||||
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
|
* @return {Promise<any>} Promise resolved when done.
|
||||||
|
*/
|
||||||
|
sync?(module: any, courseId: number, siteId?: any): Promise<any>;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1139,12 +1149,44 @@ export class CoreCourseModulePrefetchDelegate extends CoreDelegate {
|
||||||
|
|
||||||
// Check if the module has a prefetch handler.
|
// Check if the module has a prefetch handler.
|
||||||
if (handler) {
|
if (handler) {
|
||||||
|
return this.syncModule(module, courseId).then(() => {
|
||||||
return handler.prefetch(module, courseId, single);
|
return handler.prefetch(module, courseId, single);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return Promise.resolve();
|
return Promise.resolve();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sync a group of modules.
|
||||||
|
*
|
||||||
|
* @param {any[]} modules Array of modules to sync.
|
||||||
|
* @param {number} courseId Course ID the module belongs to.
|
||||||
|
* @return {Promise<any>} Promise resolved when finished.
|
||||||
|
*/
|
||||||
|
syncModules(modules: any[], courseId: number): Promise<any> {
|
||||||
|
return Promise.all(modules.map((module) => {
|
||||||
|
return this.syncModule(module, courseId);
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sync a module.
|
||||||
|
*
|
||||||
|
* @param {any} module Module to sync.
|
||||||
|
* @param {number} courseId Course ID the module belongs to.
|
||||||
|
* @return {Promise<any>} Promise resolved when finished.
|
||||||
|
*/
|
||||||
|
syncModule(module: any, courseId: number): Promise<any> {
|
||||||
|
const handler = this.getPrefetchHandlerFor(module);
|
||||||
|
|
||||||
|
const promise = handler && handler.sync ? handler.sync(module, courseId) : Promise.resolve();
|
||||||
|
|
||||||
|
return promise.catch(() => {
|
||||||
|
// Ignore errors.
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Prefetches a list of modules using their prefetch handlers.
|
* Prefetches a list of modules using their prefetch handlers.
|
||||||
* If a prefetch already exists for this site and id, returns the current promise.
|
* If a prefetch already exists for this site and id, returns the current promise.
|
||||||
|
|
|
@ -15,7 +15,6 @@
|
||||||
import { Injectable } from '@angular/core';
|
import { Injectable } from '@angular/core';
|
||||||
import { CoreCronHandler } from '@providers/cron';
|
import { CoreCronHandler } from '@providers/cron';
|
||||||
import { CoreCourseSyncProvider } from './sync';
|
import { CoreCourseSyncProvider } from './sync';
|
||||||
import { CoreCourseLogHelperProvider } from './log-helper';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Synchronization cron handler.
|
* Synchronization cron handler.
|
||||||
|
@ -24,24 +23,18 @@ import { CoreCourseLogHelperProvider } from './log-helper';
|
||||||
export class CoreCourseSyncCronHandler implements CoreCronHandler {
|
export class CoreCourseSyncCronHandler implements CoreCronHandler {
|
||||||
name = 'CoreCourseSyncCronHandler';
|
name = 'CoreCourseSyncCronHandler';
|
||||||
|
|
||||||
constructor(private courseSync: CoreCourseSyncProvider, private logHelper: CoreCourseLogHelperProvider) {}
|
constructor(private courseSync: CoreCourseSyncProvider) {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Execute the process.
|
* Execute the process.
|
||||||
* Receives the ID of the site affected, undefined for all sites.
|
* Receives the ID of the site affected, undefined for all sites.
|
||||||
*
|
*
|
||||||
* @param {string} [siteId] ID of the site affected, undefined for all sites.
|
* @param {string} [siteId] ID of the site affected, undefined for all sites.
|
||||||
|
* @param {boolean} [force] Wether the execution is forced (manual sync).
|
||||||
* @return {Promise<any>} Promise resolved when done, rejected if failure.
|
* @return {Promise<any>} Promise resolved when done, rejected if failure.
|
||||||
*/
|
*/
|
||||||
execute(siteId?: string): Promise<any> {
|
execute(siteId?: string, force?: boolean): Promise<any> {
|
||||||
const promises = [];
|
return this.courseSync.syncAllCourses(siteId);
|
||||||
// Sync activity logs even if the activity does not have sync handler.
|
|
||||||
// This will sync all the activity logs even if there's nothing else to sync and also recources.
|
|
||||||
promises.push(this.logHelper.syncAll(siteId));
|
|
||||||
|
|
||||||
promises.push(this.courseSync.syncAllCourses(siteId));
|
|
||||||
|
|
||||||
return Promise.all(promises);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -13,18 +13,19 @@
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { Injectable } from '@angular/core';
|
import { Injectable } from '@angular/core';
|
||||||
import { CoreLoggerProvider } from '@providers/logger';
|
import { TranslateService } from '@ngx-translate/core';
|
||||||
import { CoreSyncBaseProvider } from '@classes/base-sync';
|
import { CoreSyncBaseProvider } from '@classes/base-sync';
|
||||||
|
import { CoreLoggerProvider } from '@providers/logger';
|
||||||
import { CoreSitesProvider } from '@providers/sites';
|
import { CoreSitesProvider } from '@providers/sites';
|
||||||
import { CoreAppProvider } from '@providers/app';
|
import { CoreAppProvider } from '@providers/app';
|
||||||
import { CoreUtilsProvider } from '@providers/utils/utils';
|
import { CoreUtilsProvider } from '@providers/utils/utils';
|
||||||
import { CoreTextUtilsProvider } from '@providers/utils/text';
|
import { CoreTextUtilsProvider } from '@providers/utils/text';
|
||||||
import { CoreTimeUtilsProvider } from '@providers/utils/time';
|
import { CoreTimeUtilsProvider } from '@providers/utils/time';
|
||||||
|
import { CoreEventsProvider } from '@providers/events';
|
||||||
|
import { CoreSyncProvider } from '@providers/sync';
|
||||||
import { CoreCourseOfflineProvider } from './course-offline';
|
import { CoreCourseOfflineProvider } from './course-offline';
|
||||||
import { CoreCourseProvider } from './course';
|
import { CoreCourseProvider } from './course';
|
||||||
import { CoreEventsProvider } from '@providers/events';
|
import { CoreCourseLogHelperProvider } from './log-helper';
|
||||||
import { TranslateService } from '@ngx-translate/core';
|
|
||||||
import { CoreSyncProvider } from '@providers/sync';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Service to sync course offline data. This only syncs the offline data of the course itself, not the offline data of
|
* Service to sync course offline data. This only syncs the offline data of the course itself, not the offline data of
|
||||||
|
@ -39,7 +40,7 @@ export class CoreCourseSyncProvider extends CoreSyncBaseProvider {
|
||||||
protected appProvider: CoreAppProvider, private courseOffline: CoreCourseOfflineProvider,
|
protected appProvider: CoreAppProvider, private courseOffline: CoreCourseOfflineProvider,
|
||||||
private eventsProvider: CoreEventsProvider, private courseProvider: CoreCourseProvider,
|
private eventsProvider: CoreEventsProvider, private courseProvider: CoreCourseProvider,
|
||||||
translate: TranslateService, private utils: CoreUtilsProvider, protected textUtils: CoreTextUtilsProvider,
|
translate: TranslateService, private utils: CoreUtilsProvider, protected textUtils: CoreTextUtilsProvider,
|
||||||
syncProvider: CoreSyncProvider, timeUtils: CoreTimeUtilsProvider) {
|
syncProvider: CoreSyncProvider, timeUtils: CoreTimeUtilsProvider, protected logHelper: CoreCourseLogHelperProvider) {
|
||||||
|
|
||||||
super('CoreCourseSyncProvider', loggerProvider, sitesProvider, appProvider, syncProvider, textUtils, translate, timeUtils);
|
super('CoreCourseSyncProvider', loggerProvider, sitesProvider, appProvider, syncProvider, textUtils, translate, timeUtils);
|
||||||
}
|
}
|
||||||
|
@ -48,25 +49,32 @@ export class CoreCourseSyncProvider extends CoreSyncBaseProvider {
|
||||||
* Try to synchronize all the courses in a certain site or in all sites.
|
* Try to synchronize all the courses in a certain site or in all sites.
|
||||||
*
|
*
|
||||||
* @param {string} [siteId] Site ID to sync. If not defined, sync all sites.
|
* @param {string} [siteId] Site ID to sync. If not defined, sync all sites.
|
||||||
|
* @param {boolean} [force] Wether the execution is forced (manual sync).
|
||||||
* @return {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
* @return {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
||||||
*/
|
*/
|
||||||
syncAllCourses(siteId?: string): Promise<any> {
|
syncAllCourses(siteId?: string, force?: boolean): Promise<any> {
|
||||||
return this.syncOnSites('courses', this.syncAllCoursesFunc.bind(this), undefined, siteId);
|
return this.syncOnSites('courses', this.syncAllCoursesFunc.bind(this), [force], siteId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sync all courses on a site.
|
* Sync all courses on a site.
|
||||||
*
|
*
|
||||||
* @param {string} [siteId] Site ID to sync. If not defined, sync all sites.
|
* @param {string} siteId Site ID to sync. If not defined, sync all sites.
|
||||||
|
* @param {boolean} force Wether the execution is forced (manual sync).
|
||||||
* @return {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
* @return {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
||||||
*/
|
*/
|
||||||
protected syncAllCoursesFunc(siteId?: string): Promise<any> {
|
protected syncAllCoursesFunc(siteId: string, force: boolean): Promise<any> {
|
||||||
return this.courseOffline.getAllManualCompletions(siteId).then((completions) => {
|
const p1 = [];
|
||||||
const promises = [];
|
|
||||||
|
|
||||||
|
p1.push(this.logHelper.syncSite(siteId));
|
||||||
|
|
||||||
|
p1.push(this.courseOffline.getAllManualCompletions(siteId).then((completions) => {
|
||||||
// Sync all courses.
|
// Sync all courses.
|
||||||
completions.forEach((completion) => {
|
const p2 = completions.map((completion) => {
|
||||||
promises.push(this.syncCourseIfNeeded(completion.courseid, siteId).then((result) => {
|
const promise = force ? this.syncCourse(completion.courseid, siteId) :
|
||||||
|
this.syncCourseIfNeeded(completion.courseid, siteId);
|
||||||
|
|
||||||
|
return promise.then((result) => {
|
||||||
if (result && result.updated) {
|
if (result && result.updated) {
|
||||||
// Sync successful, send event.
|
// Sync successful, send event.
|
||||||
this.eventsProvider.trigger(CoreCourseSyncProvider.AUTO_SYNCED, {
|
this.eventsProvider.trigger(CoreCourseSyncProvider.AUTO_SYNCED, {
|
||||||
|
@ -74,9 +82,13 @@ export class CoreCourseSyncProvider extends CoreSyncBaseProvider {
|
||||||
warnings: result.warnings
|
warnings: result.warnings
|
||||||
}, siteId);
|
}, siteId);
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
return Promise.all(p2);
|
||||||
}));
|
}));
|
||||||
});
|
|
||||||
});
|
return Promise.all(p1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -17,4 +17,20 @@ ion-app.app-root page-core-mainmenu {
|
||||||
font-size: 23px;
|
font-size: 23px;
|
||||||
height: 23px;
|
height: 23px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.ion-md-fa-newspaper-o,
|
||||||
|
.ion-ios-fa-newspaper-o,
|
||||||
|
.ion-ios-fa-newspaper-o-outline,
|
||||||
|
.ion-wp-fa-newspaper-o,
|
||||||
|
.ion-fa-newspaper-o {
|
||||||
|
@extend .fa-newspaper-o;
|
||||||
|
@extend .fa;
|
||||||
|
font-size: 22px;
|
||||||
|
height: 22px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ion-ios-fa-newspaper-o-outline {
|
||||||
|
font-size: 23px;
|
||||||
|
height: 23px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,19 +59,23 @@ export class CoreRatingSyncProvider extends CoreSyncBaseProvider {
|
||||||
* @param {string} [contextLevel] Context level: course, module, user, etc.
|
* @param {string} [contextLevel] Context level: course, module, user, etc.
|
||||||
* @param {numnber} [instanceId] Context instance id.
|
* @param {numnber} [instanceId] Context instance id.
|
||||||
* @param {number} [itemSetId] Item set id.
|
* @param {number} [itemSetId] Item set id.
|
||||||
|
* @param {boolean} [force] Wether to force sync not depending on last execution.
|
||||||
* @param {string} [siteId] Site ID. If not defined, current site.
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
* @return {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
* @return {Promise<any>} Promise resolved if sync is successful, rejected if sync fails.
|
||||||
*/
|
*/
|
||||||
syncRatings(component: string, ratingArea: string, contextLevel?: string, instanceId?: number, itemSetId?: number,
|
syncRatings(component: string, ratingArea: string, contextLevel?: string, instanceId?: number, itemSetId?: number,
|
||||||
siteId?: string): Promise<{itemSet: CoreRatingItemSet, updated: number[], warnings: string[]}[]> {
|
force?: boolean, siteId?: string): Promise<{itemSet: CoreRatingItemSet, updated: number[], warnings: string[]}[]> {
|
||||||
siteId = siteId || this.sitesProvider.getCurrentSiteId();
|
siteId = siteId || this.sitesProvider.getCurrentSiteId();
|
||||||
|
|
||||||
return this.ratingOffline.getItemSets(component, ratingArea, contextLevel, instanceId, itemSetId, siteId)
|
return this.ratingOffline.getItemSets(component, ratingArea, contextLevel, instanceId, itemSetId, siteId)
|
||||||
.then((itemSets) => {
|
.then((itemSets) => {
|
||||||
const results = [];
|
const results = [];
|
||||||
const promises = itemSets.map((itemSet) => {
|
const promises = itemSets.map((itemSet) => {
|
||||||
return this.syncItemSetIfNeeded(component, ratingArea, itemSet.contextLevel, itemSet.instanceId,
|
const promise = force ? this.syncItemSet(component, ratingArea, itemSet.contextLevel, itemSet.instanceId,
|
||||||
itemSet.itemSetId, siteId).then((result) => {
|
itemSet.itemSetId, siteId) : this.syncItemSetIfNeeded(component, ratingArea, itemSet.contextLevel,
|
||||||
|
itemSet.instanceId, itemSet.itemSetId, siteId);
|
||||||
|
|
||||||
|
return promise.then((result) => {
|
||||||
if (result.updated) {
|
if (result.updated) {
|
||||||
// Sync successful, send event.
|
// Sync successful, send event.
|
||||||
this.eventsProvider.trigger(CoreRatingSyncProvider.SYNCED_EVENT, {
|
this.eventsProvider.trigger(CoreRatingSyncProvider.SYNCED_EVENT, {
|
||||||
|
|
|
@ -63,10 +63,11 @@ export interface CoreCronHandler {
|
||||||
* Execute the process.
|
* Execute the process.
|
||||||
*
|
*
|
||||||
* @param {string} [siteId] ID of the site affected. If not defined, all sites.
|
* @param {string} [siteId] ID of the site affected. If not defined, all sites.
|
||||||
|
* @param {boolean} [force] Determines if it's a forced execution.
|
||||||
* @return {Promise<any>} Promise resolved when done. If the promise is rejected, this function will be called again often,
|
* @return {Promise<any>} Promise resolved when done. If the promise is rejected, this function will be called again often,
|
||||||
* it shouldn't be abused.
|
* it shouldn't be abused.
|
||||||
*/
|
*/
|
||||||
execute?(siteId?: string): Promise<any>;
|
execute?(siteId?: string, force?: boolean): Promise<any>;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Whether the handler is running. Used internally by the provider, there's no need to set it.
|
* Whether the handler is running. Used internally by the provider, there's no need to set it.
|
||||||
|
@ -181,7 +182,7 @@ export class CoreCronDelegate {
|
||||||
this.queuePromise = this.queuePromise.catch(() => {
|
this.queuePromise = this.queuePromise.catch(() => {
|
||||||
// Ignore errors in previous handlers.
|
// Ignore errors in previous handlers.
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
return this.executeHandler(name, siteId).then(() => {
|
return this.executeHandler(name, force, siteId).then(() => {
|
||||||
this.logger.debug(`Execution of handler '${name}' was a success.`);
|
this.logger.debug(`Execution of handler '${name}' was a success.`);
|
||||||
|
|
||||||
return this.setHandlerLastExecutionTime(name, Date.now()).then(() => {
|
return this.setHandlerLastExecutionTime(name, Date.now()).then(() => {
|
||||||
|
@ -204,16 +205,18 @@ export class CoreCronDelegate {
|
||||||
* Run a handler, cancelling the execution if it takes more than MAX_TIME_PROCESS.
|
* Run a handler, cancelling the execution if it takes more than MAX_TIME_PROCESS.
|
||||||
*
|
*
|
||||||
* @param {string} name Name of the handler.
|
* @param {string} name Name of the handler.
|
||||||
|
* @param {boolean} [force] Wether the execution is forced (manual sync).
|
||||||
* @param {string} [siteId] Site ID. If not defined, all sites.
|
* @param {string} [siteId] Site ID. If not defined, all sites.
|
||||||
* @return {Promise<any>} Promise resolved when the handler finishes or reaches max time, rejected if it fails.
|
* @return {Promise<any>} Promise resolved when the handler finishes or reaches max time, rejected if it fails.
|
||||||
*/
|
*/
|
||||||
protected executeHandler(name: string, siteId?: string): Promise<any> {
|
protected executeHandler(name: string, force?: boolean, siteId?: string): Promise<any> {
|
||||||
return new Promise((resolve, reject): void => {
|
return new Promise((resolve, reject): void => {
|
||||||
let cancelTimeout;
|
let cancelTimeout;
|
||||||
|
|
||||||
this.logger.debug('Executing handler: ' + name);
|
this.logger.debug('Executing handler: ' + name);
|
||||||
|
|
||||||
// Wrap the call in Promise.resolve to make sure it's a promise.
|
// Wrap the call in Promise.resolve to make sure it's a promise.
|
||||||
Promise.resolve(this.handlers[name].execute(siteId)).then(resolve).catch(reject).finally(() => {
|
Promise.resolve(this.handlers[name].execute(siteId, force)).then(resolve).catch(reject).finally(() => {
|
||||||
clearTimeout(cancelTimeout);
|
clearTimeout(cancelTimeout);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue