MOBILE-2310 core: Remove revision and timemodified from packages

Now the default way to check if a package is outdated is using the check updates WS. If a package needs to store some data they can use the new extra param
main
Dani Palou 2018-01-16 11:59:18 +01:00
parent 0960ce92d4
commit 9b6295e97c
1 changed files with 48 additions and 141 deletions

View File

@ -201,18 +201,6 @@ export interface CoreFilepoolPackageEntry {
*/ */
previous?: string; previous?: string;
/**
* Package revision.
* @type {string}
*/
revision?: string;
/**
* Package timemodified.
* @type {number}
*/
timemodified?: number;
/** /**
* Timestamp when this package was updated. * Timestamp when this package was updated.
* @type {number} * @type {number}
@ -230,6 +218,12 @@ export interface CoreFilepoolPackageEntry {
* @type {number} * @type {number}
*/ */
previousDownloadTime?: number; previousDownloadTime?: number;
/**
* Extra data stored by the package.
* @type {string}
*/
extra?: string;
}; };
/* /*
@ -401,14 +395,6 @@ export class CoreFilepoolProvider {
name: 'previous', name: 'previous',
type: 'TEXT' type: 'TEXT'
}, },
{
name: 'revision',
type: 'TEXT'
},
{
name: 'timemodified',
type: 'INTEGER'
},
{ {
name: 'updated', name: 'updated',
type: 'INTEGER' type: 'INTEGER'
@ -420,6 +406,10 @@ export class CoreFilepoolProvider {
{ {
name: 'previousDownloadTime', name: 'previousDownloadTime',
type: 'INTEGER' type: 'INTEGER'
},
{
name: 'extra',
type: 'TEXT'
} }
] ]
}, },
@ -991,23 +981,21 @@ export class CoreFilepoolProvider {
} }
/** /**
* Downloads or prefetches a list of files. * Downloads or prefetches a list of files as a "package".
* *
* @param {string} siteId The site ID. * @param {string} siteId The site ID.
* @param {any[]} fileList List of files to download. * @param {any[]} fileList List of files to download.
* @param {boolean} [prefetch] True if should prefetch the contents (queue), false if they should be downloaded right now. * @param {boolean} [prefetch] True if should prefetch the contents (queue), false if they should be downloaded right now.
* @param {string} [component] The component to link the file to. * @param {string} [component] The component to link the file to.
* @param {string|number} [componentId] An ID to use in conjunction with the component. * @param {string|number} [componentId] An ID to use in conjunction with the component.
* @param {string} [revision] Package's revision. If not defined, it will be calculated using the list of files. * @param {string} [extra] Extra data to store for the package.
* @param {number} [timemod] Package's timemodified. If not defined, it will be calculated using the list of files.
* @param {string} [dirPath] Name of the directory where to store the files (inside filepool dir). If not defined, store * @param {string} [dirPath] Name of the directory where to store the files (inside filepool dir). If not defined, store
* the files directly inside the filepool folder. * the files directly inside the filepool folder.
* @param {Function} [onProgress] Function to call on progress. * @param {Function} [onProgress] Function to call on progress.
* @return {Promise<any>} Promise resolved when the package is downloaded. * @return {Promise<any>} Promise resolved when the package is downloaded.
*/ */
protected downloadOrPrefetchPackage(siteId: string, fileList: any[], prefetch?: boolean, component?: string, protected downloadOrPrefetchPackage(siteId: string, fileList: any[], prefetch?: boolean, component?: string,
componentId?: string|number, revision?: string, timemodified?: number, dirPath?: string, componentId?: string|number, extra?: string, dirPath?: string, onProgress?: (event: any) => any) : Promise<any> {
onProgress?: (event: any) => any) : Promise<any> {
let packageId = this.getPackageId(component, componentId), let packageId = this.getPackageId(component, componentId),
promise; promise;
@ -1019,9 +1007,6 @@ export class CoreFilepoolProvider {
this.packagesPromises[siteId] = {}; this.packagesPromises[siteId] = {};
} }
revision = revision || String(this.getRevisionFromFileList(fileList));
timemodified = timemodified || this.getTimemodifiedFromFileList(fileList);
// Set package as downloading. // Set package as downloading.
promise = this.storePackageStatus(siteId, CoreConstants.DOWNLOADING, component, componentId).then(() => { promise = this.storePackageStatus(siteId, CoreConstants.DOWNLOADING, component, componentId).then(() => {
let promises = [], let promises = [],
@ -1077,7 +1062,7 @@ export class CoreFilepoolProvider {
return Promise.all(promises).then(() => { return Promise.all(promises).then(() => {
// Success prefetching, store package as downloaded. // Success prefetching, store package as downloaded.
return this.storePackageStatus(siteId, CoreConstants.DOWNLOADED, component, componentId, revision, timemodified); return this.storePackageStatus(siteId, CoreConstants.DOWNLOADED, component, componentId, extra);
}).catch(() => { }).catch(() => {
// Error downloading, go back to previous status and reject the promise. // Error downloading, go back to previous status and reject the promise.
return this.setPackagePreviousStatus(siteId, component, componentId).then(() => { return this.setPackagePreviousStatus(siteId, component, componentId).then(() => {
@ -1101,17 +1086,15 @@ export class CoreFilepoolProvider {
* @param {any[]} fileList List of files to download. * @param {any[]} fileList List of files to download.
* @param {string} component The component to link the file to. * @param {string} component The component to link the file to.
* @param {string|number} [componentId] An ID to identify the download. * @param {string|number} [componentId] An ID to identify the download.
* @param {string} [revision] Package's revision. If not defined, it will be calculated using the list of files. * @param {string} [extra] Extra data to store for the package.
* @param {number} [timemodified] Package's timemodified. If not defined, it will be calculated using the list of files.
* @param {string} [dirPath] Name of the directory where to store the files (inside filepool dir). If not defined, store * @param {string} [dirPath] Name of the directory where to store the files (inside filepool dir). If not defined, store
* the files directly inside the filepool folder. * the files directly inside the filepool folder.
* @param {Function} [onProgress] Function to call on progress. * @param {Function} [onProgress] Function to call on progress.
* @return {Promise<any>} Promise resolved when all files are downloaded. * @return {Promise<any>} Promise resolved when all files are downloaded.
*/ */
downloadPackage(siteId: string, fileList: any[], component: string, componentId?: string|number, revision?: string, downloadPackage(siteId: string, fileList: any[], component: string, componentId?: string|number, extra?: string,
timemodified?: number, dirPath?: string, onProgress?: (event: any) => any) : Promise<any> { dirPath?: string, onProgress?: (event: any) => any) : Promise<any> {
return this.downloadOrPrefetchPackage( return this.downloadOrPrefetchPackage(siteId, fileList, false, component, componentId, extra, dirPath, onProgress);
siteId, fileList, false, component, componentId, revision, timemodified, dirPath, onProgress);
} }
/** /**
@ -1732,22 +1715,6 @@ export class CoreFilepoolProvider {
return Promise.reject(null); return Promise.reject(null);
} }
/**
* Get a package current status.
*
* @param {string} siteId Site ID.
* @param {string} component Package's component.
* @param {string|number} [componentId] An ID to use in conjunction with the component.
* @return {Promise<string>} Promise resolved with the status.
*/
getPackageCurrentStatus(siteId: string, component: string, componentId?: string|number) : Promise<string> {
return this.getPackageData(siteId, component, componentId).then((entry) => {
return entry.status || CoreConstants.NOT_DOWNLOADED;
}).catch(() => {
return CoreConstants.NOT_DOWNLOADED;
});
}
/** /**
* Get the data stored for a package. * Get the data stored for a package.
* *
@ -1841,6 +1808,19 @@ export class CoreFilepoolProvider {
return this.packagesPromises[siteId][packageId]; return this.packagesPromises[siteId][packageId];
} }
} }
/**
* Get a package extra data.
*
* @param {string} siteId Site ID.
* @param {string} component Package's component.
* @param {string|number} [componentId] An ID to use in conjunction with the component.
* @return {Promise<string>} Promise resolved with the extra data.
*/
getPackageExtra(siteId: string, component: string, componentId?: string|number) : Promise<string> {
return this.getPackageData(siteId, component, componentId).then((entry) => {
return entry.extra;
});
}
/** /**
* Get the ID of a package. * Get the ID of a package.
@ -1869,85 +1849,19 @@ export class CoreFilepoolProvider {
}); });
} }
/**
* Get a package revision.
*
* @param {string} siteId Site ID.
* @param {string} component Package's component.
* @param {string|number} [componentId] An ID to use in conjunction with the component.
* @return {Promise} Promise resolved with the revision.
*/
getPackageRevision(siteId: string, component: string, componentId?: string|number) : Promise<string> {
return this.getPackageData(siteId, component, componentId).then((entry) => {
return entry.revision;
});
}
/** /**
* Get a package status. * Get a package status.
* *
* @param {string} siteId Site ID. * @param {string} siteId Site ID.
* @param {string} component Package's component. * @param {string} component Package's component.
* @param {string|number} [componentId] An ID to use in conjunction with the component. * @param {string|number} [componentId] An ID to use in conjunction with the component.
* @param {string} [revision='0'] Package's revision.
* @param {number} [timemodified=0] Package's time modified.
* @return {Promise<string>} Promise resolved with the status. * @return {Promise<string>} Promise resolved with the status.
*/ */
getPackageStatus(siteId: string, component: string, componentId?: string|number, revision = '0', timemodified = 0) getPackageStatus(siteId: string, component: string, componentId?: string|number) : Promise<string> {
: Promise<string> {
componentId = this.fixComponentId(componentId);
return this.sitesProvider.getSite(siteId).then((site) => {
const packageId = this.getPackageId(component, componentId),
conditions = {id: packageId};
// Get status.
return site.getDb().getRecord(this.PACKAGES_TABLE, conditions).then((entry: CoreFilepoolPackageEntry) => {
if (entry.status === CoreConstants.DOWNLOADED) {
if (revision != entry.revision || timemodified > entry.timemodified) {
// File is outdated. Let's change its status.
let newData: CoreFilepoolPackageEntry = {
status: CoreConstants.OUTDATED,
updated: Date.now()
};
site.getDb().updateRecords(this.PACKAGES_TABLE, newData, conditions).then(() => {
// Success inserting, trigger event.
this.triggerPackageStatusChanged(siteId, CoreConstants.OUTDATED, component, componentId);
});
}
} else if (entry.status === CoreConstants.OUTDATED) {
if (revision === entry.revision && timemodified === entry.timemodified) {
// File isn't outdated anymore. Let's change its status.
let newData: CoreFilepoolPackageEntry = {
status: CoreConstants.DOWNLOADED,
updated: Date.now()
};
site.getDb().updateRecords(this.PACKAGES_TABLE, newData, conditions).then(() => {
// Success inserting, trigger event.
this.triggerPackageStatusChanged(siteId, CoreConstants.DOWNLOADED, component, componentId);
});
}
}
return entry.status;
}, () => {
return CoreConstants.NOT_DOWNLOADED;
});
});
}
/**
* Get a package timemodified.
*
* @param {string} siteId Site ID.
* @param {string} component Package's component.
* @param {string|number} [componentId] An ID to use in conjunction with the component.
* @return {Promise<number>} Promise resolved with the time modified.
*/
getPackageTimemodified(siteId: string, component: string, componentId?: string|number) : Promise<number> {
return this.getPackageData(siteId, component, componentId).then((entry) => { return this.getPackageData(siteId, component, componentId).then((entry) => {
return entry.timemodified; return entry.status || CoreConstants.NOT_DOWNLOADED;
}).catch(() => { }).catch(() => {
return -1; return CoreConstants.NOT_DOWNLOADED;
}); });
} }
@ -2032,10 +1946,10 @@ export class CoreFilepoolProvider {
} }
/** /**
* Get package revision number from a list of files. * Get a revision number from a list of files (highest revision).
* *
* @param {any[]} files Package files. * @param {any[]} files Package files.
* @return {number} Package revision. * @return {number} Highest revision.
*/ */
getRevisionFromFileList(files: any[]) : number { getRevisionFromFileList(files: any[]) : number {
let revision = 0; let revision = 0;
@ -2105,7 +2019,7 @@ export class CoreFilepoolProvider {
* Get time modified from a list of files. * Get time modified from a list of files.
* *
* @param {any[]} files List of files. * @param {any[]} files List of files.
* @return {number} Rime modified. * @return {number} Time modified.
*/ */
getTimemodifiedFromFileList(files: any[]) : number { getTimemodifiedFromFileList(files: any[]) : number {
let timemodified = 0; let timemodified = 0;
@ -2383,17 +2297,15 @@ export class CoreFilepoolProvider {
* @param {any[]} fileList List of files to download. * @param {any[]} fileList List of files to download.
* @param {string} component The component to link the file to. * @param {string} component The component to link the file to.
* @param {string|number} [componentId] An ID to identify the download. * @param {string|number} [componentId] An ID to identify the download.
* @param {string} [revision] Package's revision. If not defined, it will be calculated using the list of files. * @param {string} [extra] Extra data to store for the package.
* @param {number} [timemodified] Package's time modified. If not defined, it will be calculated using the list of files.
* @param {string} [dirPath] Name of the directory where to store the files (inside filepool dir). If not defined, store * @param {string} [dirPath] Name of the directory where to store the files (inside filepool dir). If not defined, store
* the files directly inside the filepool folder. * the files directly inside the filepool folder.
* @param {Function} [onProgress] Function to call on progress. * @param {Function} [onProgress] Function to call on progress.
* @return {Promise<any>} Promise resolved when all files are downloaded. * @return {Promise<any>} Promise resolved when all files are downloaded.
*/ */
prefetchPackage(siteId: string, fileList: any[], component: string, componentId?: string|number, revision?: string, prefetchPackage(siteId: string, fileList: any[], component: string, componentId?: string|number, extra?: string,
timemodified?: number, dirPath?: string, onProgress?: (event: any) => any) : Promise<any> { dirPath?: string, onProgress?: (event: any) => any) : Promise<any> {
return this.downloadOrPrefetchPackage( return this.downloadOrPrefetchPackage(siteId, fileList, true, component, componentId, extra, dirPath, onProgress);
siteId, fileList, true, component, componentId, revision, timemodified, dirPath, onProgress);
} }
/** /**
@ -2726,12 +2638,11 @@ export class CoreFilepoolProvider {
* @param {string} status New package status. * @param {string} status New package status.
* @param {string} component Package's component. * @param {string} component Package's component.
* @param {string|number} [componentId] An ID to use in conjunction with the component. * @param {string|number} [componentId] An ID to use in conjunction with the component.
* @param {string} [revision] Package's revision. If not provided, try to use the current value. * @param {string} [extra] Extra data to store for the package. If you want to store more than 1 value, use JSON.stringify.
* @param {number} [timemodified] Package's time modified. If not provided, try to use the current value.
* @return {Promise<any>} Promise resolved when status is stored. * @return {Promise<any>} Promise resolved when status is stored.
*/ */
storePackageStatus(siteId: string, status: string, component: string, componentId?: string|number, revision?: string, storePackageStatus(siteId: string, status: string, component: string, componentId?: string|number, extra?: string)
timemodified?: number) : Promise<any> { : Promise<any> {
this.logger.debug(`Set status '${status}'' for package ${component} ${componentId}`); this.logger.debug(`Set status '${status}'' for package ${component} ${componentId}`);
componentId = this.fixComponentId(componentId); componentId = this.fixComponentId(componentId);
@ -2747,11 +2658,8 @@ export class CoreFilepoolProvider {
// Search current status to set it as previous status. // Search current status to set it as previous status.
return site.getDb().getRecord(this.PACKAGES_TABLE, {id: packageId}).then((entry: CoreFilepoolPackageEntry) => { return site.getDb().getRecord(this.PACKAGES_TABLE, {id: packageId}).then((entry: CoreFilepoolPackageEntry) => {
if (typeof revision == 'undefined' || revision === null) { if (typeof extra == 'undefined' || extra === null) {
revision = entry.revision; extra = entry.extra;
}
if (typeof timemodified == 'undefined' || timemodified === null) {
timemodified = entry.timemodified;
} }
if (typeof downloadTime == 'undefined') { if (typeof downloadTime == 'undefined') {
// Keep previous download time. // Keep previous download time.
@ -2772,11 +2680,10 @@ export class CoreFilepoolProvider {
componentId: componentId, componentId: componentId,
status: status, status: status,
previous: previousStatus, previous: previousStatus,
revision: revision || '0',
timemodified: timemodified || 0,
updated: Date.now(), updated: Date.now(),
downloadTime: downloadTime, downloadTime: downloadTime,
previousDownloadTime: previousDownloadTime previousDownloadTime: previousDownloadTime,
extra: extra
}, },
promise; promise;