diff --git a/.vscode/launch.json b/.vscode/launch.json index b0ab7529d..357c14ded 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -9,11 +9,27 @@ { "type": "node", "request": "launch", - "name": "Launch Program", + "name": "Debug with Mongo / S3 / Redis", "program": "${workspaceFolder}/packages/h5p-examples/build/express.js", "runtimeArgs": ["-r", "source-map-support/register"], "env": { - "DEBUG": "h5p*" + "DEBUG": "h5p*", + "LOG_LEVEL": "debug", + "DOTENV_CONFIG_PATH": "${workspaceFolder}/packages/h5p-examples/mongo+s3+redis.env" + }, + "outputCapture": "std", + "console": "integratedTerminal" + }, + { + "type": "node", + "request": "launch", + "name": "Debug with pure mongo library storage + mongo/s3 content storage", + "program": "${workspaceFolder}/packages/h5p-examples/build/express.js", + "runtimeArgs": ["-r", "source-map-support/register"], + "env": { + "DEBUG": "h5p*", + "LOG_LEVEL": "debug", + "DOTENV_CONFIG_PATH": "${workspaceFolder}/packages/h5p-examples/mongo+mongos3.env" }, "outputCapture": "std", "console": "integratedTerminal" diff --git a/packages/h5p-mongos3/src/MongoLibraryStorage.ts b/packages/h5p-mongos3/src/MongoLibraryStorage.ts index c7682b123..cee92a79a 100644 --- a/packages/h5p-mongos3/src/MongoLibraryStorage.ts +++ b/packages/h5p-mongos3/src/MongoLibraryStorage.ts @@ -402,6 +402,13 @@ export default class MongoLibraryStorage implements ILibraryStorage { file: string ): Promise { this.validateFilename(file); + + // The metadata is not saved as a file + if (file === 'library.json') { + const metadata = JSON.stringify(await this.getMetadata(library)); + return { size: metadata.length, birthtime: new Date() }; + } + let fileStats: any; try { fileStats = await this.mongodb.findOne( diff --git a/packages/h5p-mongos3/src/MongoS3LibraryStorage.ts b/packages/h5p-mongos3/src/MongoS3LibraryStorage.ts index 8461a746c..d06a94476 100644 --- a/packages/h5p-mongos3/src/MongoS3LibraryStorage.ts +++ b/packages/h5p-mongos3/src/MongoS3LibraryStorage.ts @@ -431,6 +431,12 @@ export default class MongoS3LibraryStorage implements ILibraryStorage { ): Promise { validateFilename(file, this.options?.invalidCharactersRegexp); + // As the metadata is not S3, we need to get it from MongoDB. + if (file === 'library.json') { + const metadata = JSON.stringify(await this.getMetadata(library)); + return { size: metadata.length, birthtime: new Date() }; + } + try { const head = await this.s3 .headObject({ diff --git a/packages/h5p-mongos3/test/MongoLibraryStorage.test.ts b/packages/h5p-mongos3/test/MongoLibraryStorage.test.ts index d7ea85df8..2a4c366dd 100644 --- a/packages/h5p-mongos3/test/MongoLibraryStorage.test.ts +++ b/packages/h5p-mongos3/test/MongoLibraryStorage.test.ts @@ -6,7 +6,7 @@ import { Db, MongoClient, Collection, ObjectId } from 'mongodb'; import fsExtra from 'fs-extra'; import path from 'path'; -import { ILibraryMetadata } from '@lumieducation/h5p-server'; +import { ILibraryMetadata, streamToString } from '@lumieducation/h5p-server'; import MongoLibraryStorage from '../src/MongoLibraryStorage'; describe('MongoS3LibraryStorage', () => { @@ -199,6 +199,33 @@ describe('MongoS3LibraryStorage', () => { ).rejects.toThrowError('mongo-library-storage:library-not-found'); }); + it('gets the metadata and its stats as a file (simulates GET on library.json) ', async () => { + const metadata = await fsExtra.readJSON( + `${__dirname}/../../../test/data/libraries/H5P.Example1-1.1/library.json` + ); + + await storage.addLibrary(metadata, false); + const retrievedStats = await storage.getFileStats( + { + machineName: 'H5P.Example1', + majorVersion: 1, + minorVersion: 1 + }, + 'library.json' + ); + const retrievedStream = await storage.getFileStream( + { + machineName: 'H5P.Example1', + majorVersion: 1, + minorVersion: 1 + }, + 'library.json' + ); + const retrievedMetadata = await streamToString(retrievedStream); + expect(JSON.parse(retrievedMetadata)).toMatchObject(metadata); + expect(retrievedMetadata.length).toEqual(retrievedStats.size); + }); + it('update additional metadata', async () => { const metadata = await fsExtra.readJSON( `${__dirname}/../../../test/data/libraries/H5P.Example1-1.1/library.json` diff --git a/packages/h5p-mongos3/test/MongoS3LibraryStorage.test.ts b/packages/h5p-mongos3/test/MongoS3LibraryStorage.test.ts index d40214afe..30784182f 100644 --- a/packages/h5p-mongos3/test/MongoS3LibraryStorage.test.ts +++ b/packages/h5p-mongos3/test/MongoS3LibraryStorage.test.ts @@ -7,7 +7,7 @@ import { Db, Collection, MongoClient, ObjectId } from 'mongodb'; import fsExtra from 'fs-extra'; import path from 'path'; -import { ILibraryMetadata } from '@lumieducation/h5p-server'; +import { ILibraryMetadata, streamToString } from '@lumieducation/h5p-server'; import MongoS3LibraryStorage from '../src/MongoS3LibraryStorage'; import initS3 from '../src/initS3'; import { emptyAndDeleteBucket } from './s3-utils'; @@ -205,6 +205,33 @@ describe('MongoS3LibraryStorage', () => { }); }); + it('gets the metadata and its stats as a file (simulates GET on library.json) ', async () => { + const metadata = await fsExtra.readJSON( + `${__dirname}/../../../test/data/libraries/H5P.Example1-1.1/library.json` + ); + + await storage.addLibrary(metadata, false); + const retrievedStats = await storage.getFileStats( + { + machineName: 'H5P.Example1', + majorVersion: 1, + minorVersion: 1 + }, + 'library.json' + ); + const retrievedStream = await storage.getFileStream( + { + machineName: 'H5P.Example1', + majorVersion: 1, + minorVersion: 1 + }, + 'library.json' + ); + const retrievedMetadata = await streamToString(retrievedStream); + expect(JSON.parse(retrievedMetadata)).toMatchObject(metadata); + expect(retrievedMetadata.length).toEqual(retrievedStats.size); + }); + it('update additional metadata', async () => { const metadata = await fsExtra.readJSON( `${__dirname}/../../../test/data/libraries/H5P.Example1-1.1/library.json`