refactor: Change constructor so it is supported by Components.js

This commit is contained in:
Joachim Van Herwegen 2020-11-02 14:52:04 +01:00
parent 712a690904
commit dee4eef131
2 changed files with 21 additions and 11 deletions

View File

@ -29,17 +29,20 @@ export class RepresentationConvertingStore<T extends ResourceStore = ResourceSto
private readonly inConverter?: RepresentationConverter; private readonly inConverter?: RepresentationConverter;
private readonly outConverter?: RepresentationConverter; private readonly outConverter?: RepresentationConverter;
private readonly inPreferences?: RepresentationPreferences; private readonly inType?: string;
/**
* TODO: This should take RepresentationPreferences instead of a type string when supported by Components.js.
*/
public constructor(source: T, options: { public constructor(source: T, options: {
outConverter?: RepresentationConverter; outConverter?: RepresentationConverter;
inConverter?: RepresentationConverter; inConverter?: RepresentationConverter;
inPreferences?: RepresentationPreferences; inType?: string;
}) { }) {
super(source); super(source);
this.inConverter = options.inConverter; this.inConverter = options.inConverter;
this.outConverter = options.outConverter; this.outConverter = options.outConverter;
this.inPreferences = options.inPreferences; this.inType = options.inType;
} }
public async getRepresentation(identifier: ResourceIdentifier, preferences: RepresentationPreferences, public async getRepresentation(identifier: ResourceIdentifier, preferences: RepresentationPreferences,
@ -56,13 +59,13 @@ export class RepresentationConvertingStore<T extends ResourceStore = ResourceSto
conditions?: Conditions): Promise<ResourceIdentifier> { conditions?: Conditions): Promise<ResourceIdentifier> {
// We can potentially run into problems here if we convert a turtle document where the base IRI is required, // We can potentially run into problems here if we convert a turtle document where the base IRI is required,
// since we don't know the resource IRI yet at this point. // since we don't know the resource IRI yet at this point.
representation = await this.convertRepresentation(container, representation); representation = await this.convertInRepresentation(container, representation);
return this.source.addResource(container, representation, conditions); return this.source.addResource(container, representation, conditions);
} }
public async setRepresentation(identifier: ResourceIdentifier, representation: Representation, public async setRepresentation(identifier: ResourceIdentifier, representation: Representation,
conditions?: Conditions): Promise<void> { conditions?: Conditions): Promise<void> {
representation = await this.convertRepresentation(identifier, representation); representation = await this.convertInRepresentation(identifier, representation);
return this.source.setRepresentation(identifier, representation, conditions); return this.source.setRepresentation(identifier, representation, conditions);
} }
@ -79,11 +82,15 @@ export class RepresentationConvertingStore<T extends ResourceStore = ResourceSto
); );
} }
private async convertRepresentation(identifier: ResourceIdentifier, representation: Representation): private async convertInRepresentation(identifier: ResourceIdentifier, representation: Representation):
Promise<Representation> { Promise<Representation> {
if (!this.inPreferences || !this.inConverter || this.matchesPreferences(representation, this.inPreferences)) { if (!this.inType) {
return representation; return representation;
} }
return this.inConverter.handleSafe({ identifier, representation, preferences: this.inPreferences }); const inPreferences: RepresentationPreferences = { type: [{ value: this.inType, weight: 1 }]};
if (!inPreferences || !this.inConverter || this.matchesPreferences(representation, inPreferences)) {
return representation;
}
return this.inConverter.handleSafe({ identifier, representation, preferences: inPreferences });
} }
} }

View File

@ -1,6 +1,5 @@
import type { Representation } from '../../../src/ldp/representation/Representation'; import type { Representation } from '../../../src/ldp/representation/Representation';
import { RepresentationMetadata } from '../../../src/ldp/representation/RepresentationMetadata'; import { RepresentationMetadata } from '../../../src/ldp/representation/RepresentationMetadata';
import type { RepresentationPreferences } from '../../../src/ldp/representation/RepresentationPreferences';
import type { RepresentationConverter } from '../../../src/storage/conversion/RepresentationConverter'; import type { RepresentationConverter } from '../../../src/storage/conversion/RepresentationConverter';
import { RepresentationConvertingStore } from '../../../src/storage/RepresentationConvertingStore'; import { RepresentationConvertingStore } from '../../../src/storage/RepresentationConvertingStore';
import type { ResourceStore } from '../../../src/storage/ResourceStore'; import type { ResourceStore } from '../../../src/storage/ResourceStore';
@ -11,7 +10,7 @@ describe('A RepresentationConvertingStore', (): void => {
let source: ResourceStore; let source: ResourceStore;
let inConverter: RepresentationConverter; let inConverter: RepresentationConverter;
let outConverter: RepresentationConverter; let outConverter: RepresentationConverter;
const inPreferences: RepresentationPreferences = { type: [{ value: 'text/turtle', weight: 1 }]}; const inType = 'text/turtle';
const metadata = new RepresentationMetadata({ [CONTENT_TYPE]: 'text/turtle' }); const metadata = new RepresentationMetadata({ [CONTENT_TYPE]: 'text/turtle' });
let representation: Representation; let representation: Representation;
@ -25,7 +24,7 @@ describe('A RepresentationConvertingStore', (): void => {
inConverter = { handleSafe: jest.fn(async(): Promise<any> => 'inConvert') } as any; inConverter = { handleSafe: jest.fn(async(): Promise<any> => 'inConvert') } as any;
outConverter = { handleSafe: jest.fn(async(): Promise<any> => 'outConvert') } as any; outConverter = { handleSafe: jest.fn(async(): Promise<any> => 'outConvert') } as any;
store = new RepresentationConvertingStore(source, { inPreferences, inConverter, outConverter }); store = new RepresentationConvertingStore(source, { inType, inConverter, outConverter });
representation = { binary: true, data: 'data', metadata } as any; representation = { binary: true, data: 'data', metadata } as any;
}); });
@ -81,6 +80,10 @@ describe('A RepresentationConvertingStore', (): void => {
await expect(store.setRepresentation(id, representation, 'conditions' as any)).resolves.toBeUndefined(); await expect(store.setRepresentation(id, representation, 'conditions' as any)).resolves.toBeUndefined();
expect(inConverter.handleSafe).toHaveBeenCalledTimes(0); expect(inConverter.handleSafe).toHaveBeenCalledTimes(0);
expect(source.setRepresentation).toHaveBeenLastCalledWith(id, representation, 'conditions'); expect(source.setRepresentation).toHaveBeenLastCalledWith(id, representation, 'conditions');
store = new RepresentationConvertingStore(source, {});
await expect(store.addResource(id, representation, 'conditions' as any)).resolves.toBeUndefined();
expect(source.addResource).toHaveBeenLastCalledWith(id, representation, 'conditions');
}); });
it('converts the data if it is required.', async(): Promise<void> => { it('converts the data if it is required.', async(): Promise<void> => {