diff --git a/src/core/h5p/providers/h5p.ts b/src/core/h5p/providers/h5p.ts index 75fe4b2b9..821509cda 100644 --- a/src/core/h5p/providers/h5p.ts +++ b/src/core/h5p/providers/h5p.ts @@ -27,6 +27,7 @@ import { CoreH5PUtilsProvider } from './utils'; import { CoreH5PContentValidator } from '../classes/content-validator'; import { TranslateService } from '@ngx-translate/core'; import { FileEntry } from '@ionic-native/file'; +import { makeSingleton } from '@singletons/core.singletons'; /** * Service to provide H5P functionalities. @@ -410,7 +411,7 @@ export class CoreH5PProvider { * @return Promise resolved with all of the files content in one string. */ protected concatenateFiles(assets: CoreH5PDependencyAsset[], type: string): Promise { - const basePath = this.fileProvider.getBasePathInstant(); + const basePath = this.fileProvider.convertFileSrc(this.fileProvider.getBasePathInstant()); let content = '', promise = Promise.resolve(); // Use a chain of promises so the order is kept. @@ -495,7 +496,8 @@ export class CoreH5PProvider { const contentId = this.getContentId(id), basePath = this.fileProvider.getBasePathInstant(), - contentUrl = this.textUtils.concatenatePaths(basePath, this.getContentFolderPath(content.folderName, site.getId())); + contentUrl = this.fileProvider.convertFileSrc(this.textUtils.concatenatePaths( + basePath, this.getContentFolderPath(content.folderName, site.getId()))); // Create the settings needed for the content. const contentSettings = { @@ -560,6 +562,40 @@ export class CoreH5PProvider { }); } + /** + * Delete all content indexes of all sites from filesystem. + * + * @return Promise resolved when done. + */ + async deleteAllContentIndexes(): Promise { + const siteIds = await this.sitesProvider.getSitesIds(); + + await Promise.all(siteIds.map((siteId) => this.deleteAllContentIndexesForSite(siteId))); + } + + /** + * Delete all content indexes for a certain site from filesystem. + * + * @param siteId Site ID. If not defined, current site. + * @return Promise resolved when done. + */ + async deleteAllContentIndexesForSite(siteId?: string): Promise { + + const site = await this.sitesProvider.getSite(siteId); + + const records = await site.getDb().getAllRecords(this.CONTENT_TABLE); + + const promises = records.map(async (record) => { + try { + await this.fileProvider.removeFile(this.getContentIndexPath(record.foldername, site.getId())); + } catch (err) { + // Ignore errors, maybe the file doesn't exist. + } + }); + + await Promise.all(promises); + } + /** * Delete cached assets from DB and filesystem. * @@ -1033,12 +1069,11 @@ export class CoreH5PProvider { settings.loadedJs = []; settings.loadedCss = []; - const libUrl = this.getCoreH5PPath(), - relPath = this.urlUtils.removeProtocolAndWWW(libUrl); + const libUrl = this.getCoreH5PPath(); // Add core stylesheets. CoreH5PProvider.STYLES.forEach((style) => { - settings.core.styles.push(relPath + style); + settings.core.styles.push(libUrl + style); cssRequires.push(libUrl + style); }); @@ -1279,8 +1314,10 @@ export class CoreH5PProvider { return { baseUrl: this.fileProvider.getWWWPath(), - url: this.textUtils.concatenatePaths(basePath, this.getExternalH5PFolderPath(site.getId())), - urlLibraries: this.textUtils.concatenatePaths(basePath, this.getLibrariesFolderPath(site.getId())), + url: this.fileProvider.convertFileSrc(this.textUtils.concatenatePaths( + basePath, this.getExternalH5PFolderPath(site.getId()))), + urlLibraries: this.fileProvider.convertFileSrc(this.textUtils.concatenatePaths( + basePath, this.getLibrariesFolderPath(site.getId()))), postUserStatistics: false, ajax: ajaxPaths, saveFreq: false, @@ -2623,6 +2660,8 @@ export class CoreH5PProvider { } } +export class CoreH5P extends makeSingleton(CoreH5PProvider) {} + /** * Display options behaviour constants. */ diff --git a/src/providers/update-manager.ts b/src/providers/update-manager.ts index cbf493127..bf76dec22 100644 --- a/src/providers/update-manager.ts +++ b/src/providers/update-manager.ts @@ -17,6 +17,7 @@ import { CoreConfigProvider } from './config'; import { CoreInitHandler, CoreInitDelegate } from './init'; import { CoreLoggerProvider } from './logger'; import { CoreConfigConstants } from '../configconstants'; +import { CoreH5P } from '@core/h5p/providers/h5p'; import { makeSingleton } from '@singletons/core.singletons'; /** @@ -34,7 +35,8 @@ export class CoreUpdateManagerProvider implements CoreInitHandler { protected VERSION_APPLIED = 'version_applied'; protected logger; - constructor(logger: CoreLoggerProvider, private configProvider: CoreConfigProvider) { + constructor(logger: CoreLoggerProvider, + protected configProvider: CoreConfigProvider) { this.logger = logger.getInstance('CoreUpdateManagerProvider'); } @@ -44,21 +46,24 @@ export class CoreUpdateManagerProvider implements CoreInitHandler { * * @return Promise resolved when the update process finishes. */ - load(): Promise { - const promises = [], - versionCode = CoreConfigConstants.versioncode; + async load(): Promise { + const promises = []; + const versionCode = CoreConfigConstants.versioncode; - return this.configProvider.get(this.VERSION_APPLIED, 0).then((versionApplied: number) => { + const versionApplied: number = await this.configProvider.get(this.VERSION_APPLIED, 0); - // Put here the code to treat app updates. + if (versionCode >= 3900 && versionApplied < 3900 && versionApplied > 0) { + promises.push(CoreH5P.instance.deleteAllContentIndexes()); + } - return Promise.all(promises).then(() => { - return this.configProvider.set(this.VERSION_APPLIED, versionCode); - }).catch((error) => { - this.logger.error(`Error applying update from ${versionApplied} to ${versionCode}`, error); - }); - }); + try { + await Promise.all(promises); + + await this.configProvider.set(this.VERSION_APPLIED, versionCode); + } catch (error) { + this.logger.error(`Error applying update from ${versionApplied} to ${versionCode}`, error); + } } } -export class CoreUpdateManager extends makeSingleton(CoreUpdateManagerProvider) {} +export class CoreUpdateManager extends makeSingleton(CoreUpdateManagerProvider) {}