From 06c5153e0e228a01ddab508da64aa200a14c291c Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Thu, 17 Dec 2020 08:44:28 +0100 Subject: [PATCH] MOBILE-3666 h5p: Store library metadata in database --- src/core/features/h5p/classes/framework.ts | 9 ++++-- src/core/features/h5p/classes/metadata.ts | 6 +++- src/core/features/h5p/classes/storage.ts | 2 +- .../features/h5p/services/database/h5p.ts | 30 ++++++++++++++++++- 4 files changed, 42 insertions(+), 5 deletions(-) diff --git a/src/core/features/h5p/classes/framework.ts b/src/core/features/h5p/classes/framework.ts index 47cdea7ae..d10eeafcd 100644 --- a/src/core/features/h5p/classes/framework.ts +++ b/src/core/features/h5p/classes/framework.ts @@ -40,7 +40,8 @@ import { import { CoreError } from '@classes/errors/error'; import { CoreH5PSemantics } from './content-validator'; import { CoreH5PContentBeingSaved, CoreH5PLibraryBeingSaved } from './storage'; -import { CoreH5PLibraryAddTo } from './validator'; +import { CoreH5PLibraryAddTo, CoreH5PLibraryMetadataSettings } from './validator'; +import { CoreH5PMetadata } from './metadata'; /** * Equivalent to Moodle's implementation of H5PFrameworkInterface. @@ -625,6 +626,7 @@ export class CoreH5PFramework { return Object.assign(library, { semantics: library.semantics ? CoreTextUtils.instance.parseJSON(library.semantics, null) : null, addto: library.addto ? CoreTextUtils.instance.parseJSON(library.addto, null) : null, + metadatasettings: library.metadatasettings ? CoreTextUtils.instance.parseJSON(library.metadatasettings, null) : null, }); } @@ -712,6 +714,8 @@ export class CoreH5PFramework { droplibrarycss: dropLibraryCSS, semantics: typeof libraryData.semantics != 'undefined' ? JSON.stringify(libraryData.semantics) : null, addto: typeof libraryData.addTo != 'undefined' ? JSON.stringify(libraryData.addTo) : null, + metadatasettings: typeof libraryData.metadataSettings != 'undefined' ? + CoreH5PMetadata.boolifyAndEncodeSettings(libraryData.metadataSettings) : null, }; if (libraryData.libraryId) { @@ -898,9 +902,10 @@ export type CoreH5PFrameworkContentData = { metadata: unknown; // Content metadata. }; -export type CoreH5PLibraryParsedDBRecord = Omit & { +export type CoreH5PLibraryParsedDBRecord = Omit & { semantics: CoreH5PSemantics[] | null; addto: CoreH5PLibraryAddTo | null; + metadatasettings: CoreH5PLibraryMetadataSettings | null; }; type LibraryDependency = { diff --git a/src/core/features/h5p/classes/metadata.ts b/src/core/features/h5p/classes/metadata.ts index 69c44054c..359b0af26 100644 --- a/src/core/features/h5p/classes/metadata.ts +++ b/src/core/features/h5p/classes/metadata.ts @@ -26,7 +26,11 @@ export class CoreH5PMetadata { * @param metadataSettings Settings. * @return Stringified settings. */ - static boolifyAndEncodeSettings(metadataSettings: CoreH5PLibraryMetadataSettings): string { + static boolifyAndEncodeSettings(metadataSettings: CoreH5PLibraryMetadataSettings | string): string { + if (typeof metadataSettings == 'string') { + return metadataSettings; + } + // Convert metadataSettings values to boolean. if (typeof metadataSettings.disable != 'undefined') { metadataSettings.disable = metadataSettings.disable === 1; diff --git a/src/core/features/h5p/classes/storage.ts b/src/core/features/h5p/classes/storage.ts index 91b32aa07..049e2efab 100644 --- a/src/core/features/h5p/classes/storage.ts +++ b/src/core/features/h5p/classes/storage.ts @@ -77,7 +77,7 @@ export class CoreH5PStorage { // Convert metadataSettings values to boolean and json_encode it before saving. libraryData.metadataSettings = libraryData.metadataSettings ? - CoreH5PMetadata.boolifyAndEncodeSettings( libraryData.metadataSettings) : undefined; + CoreH5PMetadata.boolifyAndEncodeSettings(libraryData.metadataSettings) : undefined; // Save the library data in DB. await this.h5pFramework.saveLibraryData(libraryData, siteId); diff --git a/src/core/features/h5p/services/database/h5p.ts b/src/core/features/h5p/services/database/h5p.ts index 027e848a1..0564cdb75 100644 --- a/src/core/features/h5p/services/database/h5p.ts +++ b/src/core/features/h5p/services/database/h5p.ts @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +import { SQLiteDB } from '@classes/sqlitedb'; import { CoreSiteSchema } from '@services/sites'; /** @@ -19,7 +20,7 @@ import { CoreSiteSchema } from '@services/sites'; */ // DB table names. export const CONTENT_TABLE_NAME = 'h5p_content'; // H5P content. -export const LIBRARIES_TABLE_NAME = 'h5p_libraries'; // Installed libraries. +export const LIBRARIES_TABLE_NAME = 'h5p_libraries_2'; // Installed libraries. export const LIBRARY_DEPENDENCIES_TABLE_NAME = 'h5p_library_dependencies'; // Library dependencies. export const CONTENTS_LIBRARIES_TABLE_NAME = 'h5p_contents_libraries'; // Which library is used in which content. export const LIBRARIES_CACHEDASSETS_TABLE_NAME = 'h5p_libraries_cachedassets'; // H5P cached library assets. @@ -148,6 +149,10 @@ export const SITE_SCHEMA: CoreSiteSchema = { name: 'addto', type: 'TEXT', }, + { + name: 'metadatasettings', + type: 'TEXT', + }, ], }, { @@ -239,6 +244,28 @@ export const SITE_SCHEMA: CoreSiteSchema = { ], }, ], + // eslint-disable-next-line @typescript-eslint/no-unused-vars + async migrate(db: SQLiteDB, oldVersion: number, siteId: string): Promise { + if (oldVersion >= 2) { + return; + } + + const newTable = LIBRARIES_TABLE_NAME; + const oldTable = 'h5p_libraries'; + + try { + await db.tableExists(oldTable); + + // Move the records from the old table. + const entries = await db.getAllRecords(oldTable); + + await Promise.all(entries.map((entry) => db.insertRecord(newTable, entry))); + + await db.dropTable(oldTable); + } catch { + // Old table does not exist, ignore. + } + }, }; /** @@ -273,6 +300,7 @@ export type CoreH5PLibraryDBRecord = { droplibrarycss?: string | null; // Libraries that should not have CSS included if this lib is used. Comma separated list. semantics?: string | null; // The semantics definition. addto?: string | null; // Plugin configuration data. + metadatasettings?: string | null; // Metadata settings. }; /**