diff --git a/src/addon/mod/data/providers/offline.ts b/src/addon/mod/data/providers/offline.ts index 76ca2556d..df54530ff 100644 --- a/src/addon/mod/data/providers/offline.ts +++ b/src/addon/mod/data/providers/offline.ts @@ -17,6 +17,7 @@ import { CoreLoggerProvider } from '@providers/logger'; import { CoreSitesProvider } from '@providers/sites'; import { CoreTextUtilsProvider } from '@providers/utils/text'; import { CoreFileProvider } from '@providers/file'; +import { CoreFileUploaderProvider } from '@core/fileuploader/providers/fileuploader'; /** * Service to handle Offline data. @@ -66,7 +67,7 @@ export class AddonModDataOfflineProvider { ]; constructor(logger: CoreLoggerProvider, private sitesProvider: CoreSitesProvider, private textUtils: CoreTextUtilsProvider, - private fileProvider: CoreFileProvider) { + private fileProvider: CoreFileProvider, private fileUploaderProvider: CoreFileUploaderProvider) { this.logger = logger.getInstance('AddonModDataOfflineProvider'); this.sitesProvider.createTablesFromSchema(this.tablesSchema); } @@ -102,8 +103,52 @@ export class AddonModDataOfflineProvider { */ deleteEntry(dataId: number, entryId: number, action: string, siteId?: string): Promise { return this.sitesProvider.getSite(siteId).then((site) => { - return site.getDb().deleteRecords(AddonModDataOfflineProvider.DATA_ENTRY_TABLE, {dataid: dataId, entryid: entryId, + return this.deleteEntryFiles(dataId, entryId, action, site.id).then(() => { + return site.getDb().deleteRecords(AddonModDataOfflineProvider.DATA_ENTRY_TABLE, {dataid: dataId, entryid: entryId, action: action}); + }); + }); + } + + /** + * Delete entry offline files. + * + * @param {number} dataId Database ID. + * @param {number} entryId Database entry ID. + * @param {string} action Action to be done. + * @param {string} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved if deleted, rejected if failure. + */ + protected deleteEntryFiles(dataId: number, entryId: number, action: string, siteId?: string): Promise { + return this.sitesProvider.getSite(siteId).then((site) => { + return this.getEntry(dataId, entryId, action, site.id).then((entry) => { + if (!entry.fields) { + return; + } + + const promises = []; + + entry.fields.forEach((field) => { + const value = this.textUtils.parseJSON(field.value); + if (!value.offline) { + return; + } + + const promise = this.getEntryFieldFolder(dataId, entryId, field.fieldid, site.id).then((folderPath) => { + return this.fileUploaderProvider.getStoredFiles(folderPath); + }).then((files) => { + return this.fileUploaderProvider.clearTmpFiles(files); + }).catch(() => { + // Files not found, ignore. + }); + + promises.push(promise); + }); + + return Promise.all(promises); + }).catch(() => { + // Entry not found, ignore. + }); }); }