MOBILE-2235 h5p: Delete index files when updating libs
parent
ea2aa48d77
commit
d5e12fb136
|
@ -15,6 +15,7 @@
|
|||
import { Component, Input, ElementRef, OnInit, OnDestroy, OnChanges, SimpleChange } from '@angular/core';
|
||||
import { CoreAppProvider } from '@providers/app';
|
||||
import { CoreEventsProvider } from '@providers/events';
|
||||
import { CoreFileProvider } from '@providers/file';
|
||||
import { CoreFilepoolProvider } from '@providers/filepool';
|
||||
import { CoreLoggerProvider } from '@providers/logger';
|
||||
import { CoreSitesProvider } from '@providers/sites';
|
||||
|
@ -62,7 +63,8 @@ export class CoreH5PPlayerComponent implements OnInit, OnChanges, OnDestroy {
|
|||
protected eventsProvider: CoreEventsProvider,
|
||||
protected appProvider: CoreAppProvider,
|
||||
protected domUtils: CoreDomUtilsProvider,
|
||||
protected pluginFileDelegate: CorePluginFileDelegate) {
|
||||
protected pluginFileDelegate: CorePluginFileDelegate,
|
||||
protected fileProvider: CoreFileProvider) {
|
||||
|
||||
this.logger = loggerProvider.getInstance('CoreH5PPlayerComponent');
|
||||
this.siteId = sitesProvider.getCurrentSiteId();
|
||||
|
@ -103,8 +105,19 @@ export class CoreH5PPlayerComponent implements OnInit, OnChanges, OnDestroy {
|
|||
|
||||
if (this.canDownload && (this.state == CoreConstants.DOWNLOADED || this.state == CoreConstants.OUTDATED)) {
|
||||
// Package is downloaded, use the local URL.
|
||||
promise = this.h5pProvider.getContentIndexFileUrl(this.urlParams.url).catch((error) => {
|
||||
// It seems there was something wrong when creating the index file. Delete the package?
|
||||
promise = this.h5pProvider.getContentIndexFileUrl(this.urlParams.url, this.siteId).catch(() => {
|
||||
|
||||
// Index file doesn't exist, probably deleted because a lib was updated. Try to create it again.
|
||||
return this.filepoolProvider.getInternalUrlByUrl(this.siteId, this.urlParams.url).then((path) => {
|
||||
return this.fileProvider.getFile(path);
|
||||
}).then((file) => {
|
||||
return this.h5pProvider.extractH5PFile(this.urlParams.url, file, this.siteId);
|
||||
}).then(() => {
|
||||
// File treated. Try to get the index file URL again.
|
||||
return this.h5pProvider.getContentIndexFileUrl(this.urlParams.url, this.siteId);
|
||||
});
|
||||
}).catch((error) => {
|
||||
// Still failing. Delete the H5P package?
|
||||
this.logger.error('Error loading downloaded index:', error, this.src);
|
||||
});
|
||||
} else {
|
||||
|
|
|
@ -25,6 +25,7 @@ import { CoreMimetypeUtilsProvider } from '@providers/utils/mimetype';
|
|||
import { CoreUrlUtilsProvider } from '@providers/utils/url';
|
||||
import { CoreUtilsProvider } from '@providers/utils/utils';
|
||||
import { CoreH5PUtilsProvider } from './utils';
|
||||
import { FileEntry } from '@ionic-native/file';
|
||||
|
||||
/**
|
||||
* Service to provide H5P functionalities.
|
||||
|
@ -279,6 +280,11 @@ export class CoreH5PProvider {
|
|||
name: 'hash',
|
||||
type: 'TEXT',
|
||||
notNull: true
|
||||
},
|
||||
{
|
||||
name: 'foldername',
|
||||
type: 'TEXT',
|
||||
notNull: true
|
||||
}
|
||||
]
|
||||
}
|
||||
|
@ -566,7 +572,8 @@ export class CoreH5PProvider {
|
|||
db.deleteRecords(this.CONTENT_TABLE),
|
||||
db.deleteRecords(this.LIBRARIES_TABLE),
|
||||
db.deleteRecords(this.LIBRARY_DEPENDENCIES_TABLE),
|
||||
db.deleteRecords(this.CONTENTS_LIBRARIES_TABLE)
|
||||
db.deleteRecords(this.CONTENTS_LIBRARIES_TABLE),
|
||||
db.deleteRecords(this.LIBRARIES_CACHEDASSETS_TABLE)
|
||||
]);
|
||||
});
|
||||
}
|
||||
|
@ -575,15 +582,13 @@ export class CoreH5PProvider {
|
|||
* Delete cached assets from DB and filesystem.
|
||||
*
|
||||
* @param libraryId Library identifier.
|
||||
* @param folderName Name of the folder of the H5P package.
|
||||
* @param siteId Site ID. If not defined, current site.
|
||||
* @return Promise resolved when done.
|
||||
*/
|
||||
protected deleteCachedAssets(libraryId: number, folderName: string, siteId?: string): Promise<any> {
|
||||
protected deleteCachedAssets(libraryId: number, siteId?: string): Promise<any> {
|
||||
|
||||
return this.sitesProvider.getSite(siteId).then((site) => {
|
||||
const db = site.getDb(),
|
||||
cachedAssetsFolder = this.getCachedAssetsFolderPath(folderName, site.getId());
|
||||
const db = site.getDb();
|
||||
|
||||
// Get all the hashes that use this library.
|
||||
return db.getRecords(this.LIBRARIES_CACHEDASSETS_TABLE, {libraryid: libraryId}).then((entries) => {
|
||||
|
@ -594,6 +599,8 @@ export class CoreH5PProvider {
|
|||
entries.forEach((entry) => {
|
||||
hashes.push(entry.hash);
|
||||
|
||||
const cachedAssetsFolder = this.getCachedAssetsFolderPath(entry.foldername, site.getId());
|
||||
|
||||
['js', 'css'].forEach((type) => {
|
||||
const path = this.textUtils.concatenatePaths(cachedAssetsFolder, entry.hash + '.' + type);
|
||||
|
||||
|
@ -603,11 +610,6 @@ export class CoreH5PProvider {
|
|||
});
|
||||
});
|
||||
|
||||
// Also, delete the index.html file.
|
||||
promises.push(this.fileProvider.removeFile(this.getContentIndexPath(folderName, site.getId())).catch(() => {
|
||||
// Ignore errors.
|
||||
}));
|
||||
|
||||
return Promise.all(promises).then(() => {
|
||||
return db.deleteRecordsList(this.LIBRARIES_CACHEDASSETS_TABLE, 'hash', hashes);
|
||||
});
|
||||
|
@ -636,6 +638,45 @@ export class CoreH5PProvider {
|
|||
return Promise.all(promises);
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete content indexes from filesystem.
|
||||
*
|
||||
* @param libraryId Library identifier.
|
||||
* @param siteId Site ID. If not defined, current site.
|
||||
* @return Promise resolved when done.
|
||||
*/
|
||||
protected deleteContentIndexesForLibrary(libraryId: number, siteId?: string): Promise<any> {
|
||||
|
||||
return this.sitesProvider.getSite(siteId).then((site) => {
|
||||
const db = site.getDb();
|
||||
|
||||
// Get the folder names of all the packages that use this library.
|
||||
const query = 'SELECT DISTINCT hc.foldername ' +
|
||||
'FROM ' + this.CONTENTS_LIBRARIES_TABLE + ' hcl ' +
|
||||
'JOIN ' + this.CONTENT_TABLE + ' hc ON hcl.h5pid = hc.id ' +
|
||||
'WHERE hcl.libraryid = ?',
|
||||
queryArgs = [];
|
||||
|
||||
queryArgs.push(libraryId);
|
||||
|
||||
return db.execute(query, queryArgs).then((result) => {
|
||||
const promises = [];
|
||||
|
||||
for (let i = 0; i < result.rows.length; i++) {
|
||||
const entry = result.rows.item(i);
|
||||
|
||||
// Delete the index.html file.
|
||||
promises.push(this.fileProvider.removeFile(this.getContentIndexPath(entry.foldername, site.getId()))
|
||||
.catch(() => {
|
||||
// Ignore errors.
|
||||
}));
|
||||
}
|
||||
|
||||
return Promise.all(promises);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete library data from DB.
|
||||
*
|
||||
|
@ -1796,6 +1837,27 @@ export class CoreH5PProvider {
|
|||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs actions required when a library has been installed.
|
||||
*
|
||||
* @param libraryId ID of library that was installed.
|
||||
* @param siteId Site ID.
|
||||
* @return Promise resolved when done.
|
||||
*/
|
||||
protected libraryInstalled(libraryId: number, siteId: string): Promise<any> {
|
||||
const promises = [];
|
||||
|
||||
// Remove all indexes of contents that use this library.
|
||||
promises.push(this.deleteContentIndexesForLibrary(libraryId, siteId));
|
||||
|
||||
if (this.aggregateAssets) {
|
||||
// Remove cached assets that use this library.
|
||||
promises.push(this.deleteCachedAssets(libraryId, siteId));
|
||||
}
|
||||
|
||||
return this.utils.allPromises(promises);
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes library data as string on the form {machineName} {majorVersion}.{minorVersion}.
|
||||
*
|
||||
|
@ -2198,9 +2260,8 @@ export class CoreH5PProvider {
|
|||
});
|
||||
});
|
||||
}).then(() => {
|
||||
// Remove cached assets that use this library.
|
||||
if (this.aggregateAssets && typeof libraryData.libraryId != 'undefined') {
|
||||
return this.deleteCachedAssets(libraryData.libraryId, folderName, siteId);
|
||||
if (typeof libraryData.libraryId != 'undefined') {
|
||||
return this.libraryInstalled(libraryData.libraryId, siteId);
|
||||
}
|
||||
});
|
||||
}));
|
||||
|
|
|
@ -21,6 +21,7 @@ import { CoreUrlUtilsProvider } from '@providers/utils/url';
|
|||
import { CoreUtilsProvider } from '@providers/utils/utils';
|
||||
import { CoreH5PProvider } from './h5p';
|
||||
import { CoreWSExternalFile } from '@providers/ws';
|
||||
import { FileEntry } from '@ionic-native/file';
|
||||
|
||||
/**
|
||||
* Handler to treat H5P files.
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
import { Injectable } from '@angular/core';
|
||||
import { CoreLoggerProvider } from './logger';
|
||||
import { CoreWSExternalFile } from '@providers/ws';
|
||||
import { FileEntry } from '@ionic-native/file';
|
||||
|
||||
/**
|
||||
* Interface that all plugin file handlers must implement.
|
||||
|
|
Loading…
Reference in New Issue