forked from EVOgeek/Vmeda.Online
		
	Merge pull request #2253 from dpalou/MOBILE-3299
MOBILE-3299 core: Let site plugins use canBeCleared in site schemas
This commit is contained in:
		
						commit
						cdc54432db
					
				@ -22,6 +22,7 @@ import { CoreSitesProvider } from '@providers/sites';
 | 
				
			|||||||
import { CoreDomUtilsProvider } from '@providers/utils/dom';
 | 
					import { CoreDomUtilsProvider } from '@providers/utils/dom';
 | 
				
			||||||
import { CoreCourseProvider } from '@core/course/providers/course';
 | 
					import { CoreCourseProvider } from '@core/course/providers/course';
 | 
				
			||||||
import { CoreFilterProvider } from '@core/filter/providers/filter';
 | 
					import { CoreFilterProvider } from '@core/filter/providers/filter';
 | 
				
			||||||
 | 
					import { CoreSite } from '@classes/site';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Page that displays the space usage settings.
 | 
					 * Page that displays the space usage settings.
 | 
				
			||||||
@ -145,8 +146,8 @@ export class CoreSettingsSpaceUsagePage {
 | 
				
			|||||||
     * @param site Site object.
 | 
					     * @param site Site object.
 | 
				
			||||||
     * @return If there are rows to delete or not.
 | 
					     * @return If there are rows to delete or not.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    protected calcSiteClearRows(site: any): Promise<number> {
 | 
					    protected calcSiteClearRows(site: CoreSite): Promise<number> {
 | 
				
			||||||
        const clearTables = this.sitesProvider.getSiteTableSchemasToClear();
 | 
					        const clearTables = this.sitesProvider.getSiteTableSchemasToClear(site);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let totalEntries = 0;
 | 
					        let totalEntries = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -178,7 +179,7 @@ export class CoreSettingsSpaceUsagePage {
 | 
				
			|||||||
            }).then((site) => {
 | 
					            }).then((site) => {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                // Clear cache tables.
 | 
					                // Clear cache tables.
 | 
				
			||||||
                const cleanSchemas = this.sitesProvider.getSiteTableSchemasToClear();
 | 
					                const cleanSchemas = this.sitesProvider.getSiteTableSchemasToClear(site);
 | 
				
			||||||
                const promises = cleanSchemas.map((name) => {
 | 
					                const promises = cleanSchemas.map((name) => {
 | 
				
			||||||
                    return site.getDb().deleteRecords(name);
 | 
					                    return site.getDb().deleteRecords(name);
 | 
				
			||||||
                });
 | 
					                });
 | 
				
			||||||
 | 
				
			|||||||
@ -140,6 +140,12 @@ export interface CoreSiteSchema {
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    canBeCleared?: string[];
 | 
					    canBeCleared?: string[];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * If true, the schema will only be applied to the current site. Otherwise it will be applied to all sites.
 | 
				
			||||||
 | 
					     * If you're implementing a site plugin, please set it to true.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    onlyCurrentSite?: boolean;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Tables to create when installing or upgrading the schema.
 | 
					     * Tables to create when installing or upgrading the schema.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
@ -158,6 +164,16 @@ export interface CoreSiteSchema {
 | 
				
			|||||||
    migrate?(db: SQLiteDB, oldVersion: number, siteId: string): Promise<any> | void;
 | 
					    migrate?(db: SQLiteDB, oldVersion: number, siteId: string): Promise<any> | void;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Registered site schema.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export interface CoreRegisteredSiteSchema extends CoreSiteSchema {
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Site ID to apply the schema to. If not defined, all sites.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    siteId?: string;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const enum CoreSitesReadingStrategy {
 | 
					export const enum CoreSitesReadingStrategy {
 | 
				
			||||||
    OnlyCache,
 | 
					    OnlyCache,
 | 
				
			||||||
    PreferCache,
 | 
					    PreferCache,
 | 
				
			||||||
@ -287,7 +303,7 @@ export class CoreSitesProvider {
 | 
				
			|||||||
    protected siteSchemasMigration: { [siteId: string]: Promise<any> } = {};
 | 
					    protected siteSchemasMigration: { [siteId: string]: Promise<any> } = {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Schemas for site tables. Other providers can add schemas in here.
 | 
					    // Schemas for site tables. Other providers can add schemas in here.
 | 
				
			||||||
    protected siteSchemas: { [name: string]: CoreSiteSchema } = {};
 | 
					    protected siteSchemas: { [name: string]: CoreRegisteredSiteSchema } = {};
 | 
				
			||||||
    protected siteTablesSchemas: SQLiteDBTableSchema[] = [
 | 
					    protected siteTablesSchemas: SQLiteDBTableSchema[] = [
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            name: CoreSitesProvider.SCHEMA_VERSIONS_TABLE,
 | 
					            name: CoreSitesProvider.SCHEMA_VERSIONS_TABLE,
 | 
				
			||||||
@ -1717,16 +1733,39 @@ export class CoreSitesProvider {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Register a site schema.
 | 
					     * Register a site schema.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param schema The schema to register.
 | 
				
			||||||
 | 
					     * @return Promise resolved when done.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    registerSiteSchema(schema: CoreSiteSchema): void {
 | 
					    async registerSiteSchema(schema: CoreSiteSchema): Promise<void> {
 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (this.currentSite) {
 | 
					        if (this.currentSite) {
 | 
				
			||||||
            // Site has already been created, it's a schema probably added by site plugins. Add it only to current site.
 | 
					            try {
 | 
				
			||||||
            const schemas: {[name: string]: CoreSiteSchema} = {};
 | 
					                // Site has already been created, apply the schema directly.
 | 
				
			||||||
 | 
					                const schemas: {[name: string]: CoreRegisteredSiteSchema} = {};
 | 
				
			||||||
                schemas[schema.name] = schema;
 | 
					                schemas[schema.name] = schema;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            this.applySiteSchemas(this.currentSite, schemas);
 | 
					                if (!schema.onlyCurrentSite) {
 | 
				
			||||||
 | 
					                    // Apply it to all sites.
 | 
				
			||||||
 | 
					                    const siteIds = await this.getSitesIds();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    await Promise.all(siteIds.map(async (siteId) => {
 | 
				
			||||||
 | 
					                        const site = await this.getSite(siteId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        return this.applySiteSchemas(site, schemas);
 | 
				
			||||||
 | 
					                    }));
 | 
				
			||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
 | 
					                    // Apply it to the specified site only.
 | 
				
			||||||
 | 
					                    (schema as CoreRegisteredSiteSchema).siteId = this.currentSite.getId();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    await this.applySiteSchemas(this.currentSite, schemas);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            } finally {
 | 
				
			||||||
 | 
					                // Add the schema to the list. It's done in the end to prevent a schema being applied twice.
 | 
				
			||||||
 | 
					                this.siteSchemas[schema.name] = schema;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        } else if (!schema.onlyCurrentSite) {
 | 
				
			||||||
 | 
					            // Add the schema to the list, it will be applied when the sites are created.
 | 
				
			||||||
            this.siteSchemas[schema.name] = schema;
 | 
					            this.siteSchemas[schema.name] = schema;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -1764,7 +1803,7 @@ export class CoreSitesProvider {
 | 
				
			|||||||
     * @param schemas Schemas to migrate.
 | 
					     * @param schemas Schemas to migrate.
 | 
				
			||||||
     * @return Promise resolved when done.
 | 
					     * @return Promise resolved when done.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    protected applySiteSchemas(site: CoreSite, schemas: {[name: string]: CoreSiteSchema}): Promise<any> {
 | 
					    protected applySiteSchemas(site: CoreSite, schemas: {[name: string]: CoreRegisteredSiteSchema}): Promise<any> {
 | 
				
			||||||
        const db = site.getDb();
 | 
					        const db = site.getDb();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Fetch installed versions of the schema.
 | 
					        // Fetch installed versions of the schema.
 | 
				
			||||||
@ -1778,7 +1817,8 @@ export class CoreSitesProvider {
 | 
				
			|||||||
            for (const name in schemas) {
 | 
					            for (const name in schemas) {
 | 
				
			||||||
                const schema = schemas[name];
 | 
					                const schema = schemas[name];
 | 
				
			||||||
                const oldVersion = versions[name] || 0;
 | 
					                const oldVersion = versions[name] || 0;
 | 
				
			||||||
                if (oldVersion >= schema.version) {
 | 
					                if (oldVersion >= schema.version || (schema.siteId && site.getId() != schema.siteId)) {
 | 
				
			||||||
 | 
					                    // Version already applied or the schema shouldn't be registered to this site.
 | 
				
			||||||
                    continue;
 | 
					                    continue;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1840,12 +1880,15 @@ export class CoreSitesProvider {
 | 
				
			|||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Returns the Site Schema names that can be cleared on space storage.
 | 
					     * Returns the Site Schema names that can be cleared on space storage.
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
 | 
					     * @param site The site that will be cleared.
 | 
				
			||||||
     * @return Name of the site schemas.
 | 
					     * @return Name of the site schemas.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    getSiteTableSchemasToClear(): string[] {
 | 
					    getSiteTableSchemasToClear(site: CoreSite): string[] {
 | 
				
			||||||
        let reset = [];
 | 
					        let reset = [];
 | 
				
			||||||
        for (const name in this.siteSchemas) {
 | 
					        for (const name in this.siteSchemas) {
 | 
				
			||||||
            if (this.siteSchemas[name].canBeCleared) {
 | 
					            const schema = this.siteSchemas[name];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (schema.canBeCleared && (!schema.siteId || site.getId() == schema.siteId)) {
 | 
				
			||||||
                reset = reset.concat(this.siteSchemas[name].canBeCleared);
 | 
					                reset = reset.concat(this.siteSchemas[name].canBeCleared);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user