Skip to content

Commit

Permalink
fix(mongo-s3): library.json can be retrieved with GET
Browse files Browse the repository at this point in the history
  • Loading branch information
sr258 committed Jun 10, 2023
1 parent eaa2b65 commit b73e4f5
Show file tree
Hide file tree
Showing 5 changed files with 87 additions and 4 deletions.
20 changes: 18 additions & 2 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
7 changes: 7 additions & 0 deletions packages/h5p-mongos3/src/MongoLibraryStorage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -402,6 +402,13 @@ export default class MongoLibraryStorage implements ILibraryStorage {
file: string
): Promise<IFileStats> {
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(
Expand Down
6 changes: 6 additions & 0 deletions packages/h5p-mongos3/src/MongoS3LibraryStorage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -431,6 +431,12 @@ export default class MongoS3LibraryStorage implements ILibraryStorage {
): Promise<IFileStats> {
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({
Expand Down
29 changes: 28 additions & 1 deletion packages/h5p-mongos3/test/MongoLibraryStorage.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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', () => {
Expand Down Expand Up @@ -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`
Expand Down
29 changes: 28 additions & 1 deletion packages/h5p-mongos3/test/MongoS3LibraryStorage.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -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`
Expand Down

0 comments on commit b73e4f5

Please sign in to comment.