@financial-times/cp-content-pipeline-schema 3.7.1 → 3.7.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -0
- package/lib/model/Image.js +19 -10
- package/lib/model/Image.js.map +1 -1
- package/lib/model/Image.test.js +60 -24
- package/lib/model/Image.test.js.map +1 -1
- package/lib/resolvers/core.js +10 -0
- package/lib/resolvers/core.js.map +1 -1
- package/package.json +1 -1
- package/src/model/Image.test.ts +66 -37
- package/src/model/Image.ts +21 -13
- package/src/resolvers/core.ts +10 -0
- package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [3.7.3](https://github.com/Financial-Times/cp-content-pipeline/compare/cp-content-pipeline-schema-v3.7.2...cp-content-pipeline-schema-v3.7.3) (2024-11-15)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* send a 400 when CAPI returns a 400 for main content ([152e3eb](https://github.com/Financial-Times/cp-content-pipeline/commit/152e3ebb9ef0e610ea38afd6232b205ed3b95a89))
|
|
9
|
+
|
|
10
|
+
## [3.7.2](https://github.com/Financial-Times/cp-content-pipeline/compare/cp-content-pipeline-schema-v3.7.1...cp-content-pipeline-schema-v3.7.2) (2024-11-14)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Bug Fixes
|
|
14
|
+
|
|
15
|
+
* revert "Merge pull request [#1213](https://github.com/Financial-Times/cp-content-pipeline/issues/1213) from Financial-Times/no-fastcharts-metadata" ([fda6e63](https://github.com/Financial-Times/cp-content-pipeline/commit/fda6e6385b737927fd3f809cc47167927cf45fff))
|
|
16
|
+
* revert "Merge pull request [#1215](https://github.com/Financial-Times/cp-content-pipeline/issues/1215) from Financial-Times/no-image-service-for-u" ([c5998aa](https://github.com/Financial-Times/cp-content-pipeline/commit/c5998aab7d9fe848cbc7b1629b9291569e461981))
|
|
17
|
+
|
|
3
18
|
## [3.7.1](https://github.com/Financial-Times/cp-content-pipeline/compare/cp-content-pipeline-schema-v3.7.0...cp-content-pipeline-schema-v3.7.1) (2024-11-13)
|
|
4
19
|
|
|
5
20
|
|
package/lib/model/Image.js
CHANGED
|
@@ -8,6 +8,7 @@ const metadata_1 = require("../helpers/metadata");
|
|
|
8
8
|
const imageService_1 = __importDefault(require("../helpers/imageService"));
|
|
9
9
|
const literal_union_1 = require("../resolvers/literal-union");
|
|
10
10
|
const scalars_1 = require("../resolvers/scalars");
|
|
11
|
+
const isError_1 = __importDefault(require("../helpers/isError"));
|
|
11
12
|
const errors_1 = require("@dotcom-reliability-kit/errors");
|
|
12
13
|
class CAPIImage {
|
|
13
14
|
capiImage;
|
|
@@ -110,16 +111,24 @@ class CAPIImage {
|
|
|
110
111
|
height: this.capiImage.pixelHeight,
|
|
111
112
|
};
|
|
112
113
|
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
114
|
+
try {
|
|
115
|
+
const imageMetadata = await this.#dataSources.origami.getImageMetadata(this.capiImage.binaryUrl);
|
|
116
|
+
return imageMetadata;
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
if ((0, isError_1.default)(error)) {
|
|
120
|
+
this.context.logger.warn({
|
|
121
|
+
event: 'RECOVERABLE_ERROR',
|
|
122
|
+
error: new errors_1.OperationalError({
|
|
123
|
+
code: 'IMAGE_DIMENSIONS_ERROR',
|
|
124
|
+
message: `Failed to get dimensions for ${this.capiImage.binaryUrl}`,
|
|
125
|
+
url: this.capiImage.binaryUrl,
|
|
126
|
+
cause: error,
|
|
127
|
+
}),
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
123
132
|
}
|
|
124
133
|
credit() {
|
|
125
134
|
return this.capiImage.copyright?.notice ?? null;
|
package/lib/model/Image.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Image.js","sourceRoot":"","sources":["../../src/model/Image.ts"],"names":[],"mappings":";;;;;;AAAA,kDAAiD;AACjD,2EAAqD;AAOrD,8DAGmC;AACnC,kDAA6D;AAC7D,
|
|
1
|
+
{"version":3,"file":"Image.js","sourceRoot":"","sources":["../../src/model/Image.ts"],"names":[],"mappings":"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"}
|
package/lib/model/Image.test.js
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
const Image_1 = require("./Image");
|
|
7
|
-
const
|
|
4
|
+
const globals_1 = require("@jest/globals");
|
|
8
5
|
const imageService_1 = require("../helpers/imageService");
|
|
9
6
|
describe('Image', () => {
|
|
10
7
|
const mockImage = {
|
|
@@ -13,32 +10,40 @@ describe('Image', () => {
|
|
|
13
10
|
title: 'title',
|
|
14
11
|
description: 'description',
|
|
15
12
|
binaryUrl: 'cloudfront.com/image',
|
|
16
|
-
pixelWidth: 5000,
|
|
17
|
-
pixelHeight: 1000,
|
|
18
13
|
};
|
|
19
14
|
const graphic = {
|
|
20
15
|
...mockImage,
|
|
21
16
|
type: 'http://www.ft.com/ontology/content/Graphic',
|
|
22
17
|
};
|
|
18
|
+
const getImageMetadata = globals_1.jest.fn();
|
|
23
19
|
const context = {
|
|
24
|
-
|
|
20
|
+
dataSources: {
|
|
21
|
+
origami: {
|
|
22
|
+
getImageMetadata,
|
|
23
|
+
},
|
|
24
|
+
capi: {},
|
|
25
|
+
vanityUrls: {},
|
|
26
|
+
},
|
|
25
27
|
systemCode: 'image-test',
|
|
26
28
|
};
|
|
29
|
+
beforeEach(() => {
|
|
30
|
+
getImageMetadata.mockReset();
|
|
31
|
+
});
|
|
27
32
|
describe('sourceSet', () => {
|
|
28
33
|
describe('An image that is provided with a high resolution', () => {
|
|
29
|
-
|
|
34
|
+
let sourceSet;
|
|
35
|
+
beforeAll(async () => {
|
|
36
|
+
getImageMetadata.mockResolvedValue({ width: 5000, height: 1000 });
|
|
30
37
|
const model = new Image_1.CAPIImage(mockImage, context);
|
|
31
|
-
|
|
38
|
+
sourceSet = await model.sourceSet({ width: 1000 });
|
|
39
|
+
});
|
|
40
|
+
it('transforms the URL to use the Origami Image Service', () => {
|
|
32
41
|
expect(sourceSet.every((source) => source.url.startsWith('https://www.ft.com/__origami/service/image/v2'))).toBeTruthy();
|
|
33
42
|
});
|
|
34
|
-
it('resizes the image to the requested width',
|
|
35
|
-
const model = new Image_1.CAPIImage(mockImage, context);
|
|
36
|
-
const sourceSet = await model.sourceSet({ width: 1000 });
|
|
43
|
+
it('resizes the image to the requested width', () => {
|
|
37
44
|
expect(sourceSet.every((source) => source.width === 1000 && source.url.includes('width=1000'))).toBeTruthy();
|
|
38
45
|
});
|
|
39
|
-
it('includes sourceSet for all the possible resolutions we can display the image at, given the requested width and the original source width',
|
|
40
|
-
const model = new Image_1.CAPIImage(mockImage, context);
|
|
41
|
-
const sourceSet = await model.sourceSet({ width: 1000 });
|
|
46
|
+
it('includes sourceSet for all the possible resolutions we can display the image at, given the requested width and the original source width', () => {
|
|
42
47
|
expect(sourceSet.length).toEqual(5);
|
|
43
48
|
expect(sourceSet[0]?.dpr).toEqual(1);
|
|
44
49
|
expect(sourceSet[0]?.url).toMatch(/dpr=1/);
|
|
@@ -48,7 +53,8 @@ describe('Image', () => {
|
|
|
48
53
|
});
|
|
49
54
|
describe("An image that that isn't wide enough to generate high-resolution sourceSet for", () => {
|
|
50
55
|
it('returns an array with a single resolution iamge service UR', async () => {
|
|
51
|
-
|
|
56
|
+
getImageMetadata.mockResolvedValue({ width: 1500, height: 500 });
|
|
57
|
+
const model = new Image_1.CAPIImage(mockImage, context);
|
|
52
58
|
const sourceSet = await model.sourceSet({ width: 1000 });
|
|
53
59
|
expect(sourceSet.length).toEqual(1);
|
|
54
60
|
expect(sourceSet[0]).toEqual({
|
|
@@ -60,7 +66,8 @@ describe('Image', () => {
|
|
|
60
66
|
});
|
|
61
67
|
describe('An image that that is smaller than the width that was requested', () => {
|
|
62
68
|
it('returns the image at the same width as the original', async () => {
|
|
63
|
-
|
|
69
|
+
getImageMetadata.mockResolvedValue({ width: 500, height: 500 });
|
|
70
|
+
const model = new Image_1.CAPIImage(mockImage, context);
|
|
64
71
|
const sourceSet = await model.sourceSet({ width: 1000 });
|
|
65
72
|
expect(sourceSet.length).toEqual(1);
|
|
66
73
|
expect(sourceSet[0]).toEqual({
|
|
@@ -72,7 +79,8 @@ describe('Image', () => {
|
|
|
72
79
|
});
|
|
73
80
|
describe('An image that that is bigger than the maximum width that was requested', () => {
|
|
74
81
|
it('returns the image at the same width as the maximum width', async () => {
|
|
75
|
-
|
|
82
|
+
getImageMetadata.mockResolvedValue({ width: 4000, height: 4000 });
|
|
83
|
+
const model = new Image_1.CAPIImage(mockImage, context);
|
|
76
84
|
const sourceSet = await model.sourceSet({ width: imageService_1.MAX_IMAGE_WIDTH });
|
|
77
85
|
expect(sourceSet.length).toEqual(1);
|
|
78
86
|
expect(sourceSet[0]?.width).toEqual(imageService_1.MAX_IMAGE_WIDTH);
|
|
@@ -80,7 +88,8 @@ describe('Image', () => {
|
|
|
80
88
|
});
|
|
81
89
|
describe('A large image with the maxDpr argumet passed', () => {
|
|
82
90
|
it('only returns sourceSet up to and including the maxDpr', async () => {
|
|
83
|
-
|
|
91
|
+
getImageMetadata.mockResolvedValue({ width: 5000, height: 500 });
|
|
92
|
+
const model = new Image_1.CAPIImage(mockImage, context);
|
|
84
93
|
const sourceSet = await model.sourceSet({ width: 1000, maxDpr: 2 });
|
|
85
94
|
expect(sourceSet.length).toEqual(2);
|
|
86
95
|
expect(sourceSet[0]?.dpr).toEqual(1);
|
|
@@ -98,6 +107,31 @@ describe('Image', () => {
|
|
|
98
107
|
};
|
|
99
108
|
const model = new Image_1.CAPIImage(invalidImage, context);
|
|
100
109
|
await expect(model.sourceSet({ width: 1000, maxDpr: 2 })).rejects.toThrow('not-a-uuid is not a valid Content API Image ID');
|
|
110
|
+
expect(getImageMetadata).not.toHaveBeenCalled();
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
describe('When the image service fails to return metadata', () => {
|
|
114
|
+
let sourceSet;
|
|
115
|
+
beforeEach(async () => {
|
|
116
|
+
getImageMetadata.mockRejectedValue(null);
|
|
117
|
+
const model = new Image_1.CAPIImage(mockImage, context);
|
|
118
|
+
sourceSet = await model.sourceSet({ width: 3000 });
|
|
119
|
+
});
|
|
120
|
+
it('returns an image service URL with the requested width and max DPR 2', () => {
|
|
121
|
+
expect(sourceSet).toMatchInlineSnapshot(`
|
|
122
|
+
Array [
|
|
123
|
+
Object {
|
|
124
|
+
"dpr": 1,
|
|
125
|
+
"url": "https://www.ft.com/__origami/service/image/v2/images/raw/ftcms%3A00000000-0000-0000-0000-000000000001?source=image-test&fit=scale-down&quality=highest&width=3000&dpr=1",
|
|
126
|
+
"width": 3000,
|
|
127
|
+
},
|
|
128
|
+
Object {
|
|
129
|
+
"dpr": 2,
|
|
130
|
+
"url": "https://www.ft.com/__origami/service/image/v2/images/raw/ftcms%3A00000000-0000-0000-0000-000000000001?source=image-test&fit=scale-down&quality=highest&width=3000&dpr=2",
|
|
131
|
+
"width": 3000,
|
|
132
|
+
},
|
|
133
|
+
]
|
|
134
|
+
`);
|
|
101
135
|
});
|
|
102
136
|
});
|
|
103
137
|
});
|
|
@@ -145,14 +179,16 @@ describe('Image', () => {
|
|
|
145
179
|
});
|
|
146
180
|
});
|
|
147
181
|
describe('width/height', () => {
|
|
148
|
-
it('returns the original width and height from
|
|
182
|
+
it('returns the original width and height from the image service metadata', async () => {
|
|
183
|
+
getImageMetadata.mockResolvedValue({ width: 100, height: 200 });
|
|
149
184
|
const model = new Image_1.CAPIImage(mockImage, context);
|
|
150
185
|
const { width, height } = (await model.dimensions()) || {};
|
|
151
|
-
expect(width).toEqual(
|
|
152
|
-
expect(height).toEqual(
|
|
186
|
+
expect(width).toEqual(100);
|
|
187
|
+
expect(height).toEqual(200);
|
|
153
188
|
});
|
|
154
|
-
it('returns null if
|
|
155
|
-
|
|
189
|
+
it('returns null if the image service metadata call fails', async () => {
|
|
190
|
+
getImageMetadata.mockRejectedValue(null);
|
|
191
|
+
const model = new Image_1.CAPIImage(mockImage, context);
|
|
156
192
|
const dimensions = await model.dimensions();
|
|
157
193
|
expect(dimensions).toEqual(null);
|
|
158
194
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Image.test.js","sourceRoot":"","sources":["../../src/model/Image.test.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Image.test.js","sourceRoot":"","sources":["../../src/model/Image.test.ts"],"names":[],"mappings":";;AAAA,mCAAmC;AACnC,2CAAoC;AAIpC,0DAAyD;AAGzD,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;IACrB,MAAM,SAAS,GAAG;QAChB,EAAE,EAAE,iEAAiE;QACrE,IAAI,EAAE,0CAAmD;QACzD,KAAK,EAAE,OAAO;QACd,WAAW,EAAE,aAAa;QAC1B,SAAS,EAAE,sBAAsB;KAClC,CAAA;IAED,MAAM,OAAO,GAAG;QACd,GAAG,SAAS;QACZ,IAAI,EAAE,4CAAqD;KAC5D,CAAA;IAED,MAAM,gBAAgB,GAAG,cAAI,CAAC,EAAE,EAA8C,CAAA;IAE9E,MAAM,OAAO,GAAG;QACd,WAAW,EAAE;YACX,OAAO,EAAE;gBACP,gBAAgB;aACjB;YACD,IAAI,EAAE,EAAE;YACR,UAAU,EAAE,EAAE;SACf;QACD,UAAU,EAAE,YAAY;KACE,CAAA;IAE5B,UAAU,CAAC,GAAG,EAAE;QACd,gBAAgB,CAAC,SAAS,EAAE,CAAA;IAC9B,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;QACzB,QAAQ,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAChE,IAAI,SAAwB,CAAA;YAE5B,SAAS,CAAC,KAAK,IAAI,EAAE;gBACnB,gBAAgB,CAAC,iBAAiB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;gBACjE,MAAM,KAAK,GAAG,IAAI,iBAAS,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;gBAC/C,SAAS,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;YACpD,CAAC,CAAC,CAAA;YAEF,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;gBAC7D,MAAM,CACJ,SAAS,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CACzB,MAAM,CAAC,GAAG,CAAC,UAAU,CACnB,+CAA+C,CAChD,CACF,CACF,CAAC,UAAU,EAAE,CAAA;YAChB,CAAC,CAAC,CAAA;YAEF,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;gBAClD,MAAM,CACJ,SAAS,CAAC,KAAK,CACb,CAAC,MAAM,EAAE,EAAE,CACT,MAAM,CAAC,KAAK,KAAK,IAAI,IAAI,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAC7D,CACF,CAAC,UAAU,EAAE,CAAA;YAChB,CAAC,CAAC,CAAA;YAEF,EAAE,CAAC,0IAA0I,EAAE,GAAG,EAAE;gBAClJ,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;gBACnC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;gBACpC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;gBAC1C,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;gBACpC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;YAC5C,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,QAAQ,CAAC,gFAAgF,EAAE,GAAG,EAAE;YAC9F,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;gBAC1E,gBAAgB,CAAC,iBAAiB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;gBAChE,MAAM,KAAK,GAAG,IAAI,iBAAS,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;gBAC/C,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;gBACxD,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;gBACnC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;oBAC3B,GAAG,EAAE,CAAC;oBACN,GAAG,EAAE,yKAAyK;oBAC9K,KAAK,EAAE,IAAI;iBACZ,CAAC,CAAA;YACJ,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,QAAQ,CAAC,iEAAiE,EAAE,GAAG,EAAE;YAC/E,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;gBACnE,gBAAgB,CAAC,iBAAiB,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;gBAC/D,MAAM,KAAK,GAAG,IAAI,iBAAS,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;gBAC/C,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;gBACxD,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;gBACnC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;oBAC3B,GAAG,EAAE,CAAC;oBACN,GAAG,EAAE,wKAAwK;oBAC7K,KAAK,EAAE,GAAG;iBACX,CAAC,CAAA;YACJ,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,QAAQ,CAAC,wEAAwE,EAAE,GAAG,EAAE;YACtF,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;gBACxE,gBAAgB,CAAC,iBAAiB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;gBACjE,MAAM,KAAK,GAAG,IAAI,iBAAS,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;gBAC/C,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,8BAAe,EAAE,CAAC,CAAA;gBACnE,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;gBACnC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,8BAAe,CAAC,CAAA;YACtD,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,QAAQ,CAAC,8CAA8C,EAAE,GAAG,EAAE;YAC5D,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;gBACrE,gBAAgB,CAAC,iBAAiB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;gBAChE,MAAM,KAAK,GAAG,IAAI,iBAAS,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;gBAC/C,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAA;gBACnE,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;gBACnC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;gBACpC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;YACtC,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;YACvC,EAAE,CAAC,iBAAiB,EAAE,KAAK,IAAI,EAAE;gBAC/B,MAAM,YAAY,GAAG;oBACnB,IAAI,EAAE,0CAAmD;oBACzD,EAAE,EAAE,YAAY;oBAChB,KAAK,EAAE,EAAE;oBACT,WAAW,EAAE,EAAE;oBACf,SAAS,EAAE,EAAE;iBACd,CAAA;gBACD,MAAM,KAAK,GAAG,IAAI,iBAAS,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;gBAClD,MAAM,MAAM,CACV,KAAK,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAC5C,CAAC,OAAO,CAAC,OAAO,CAAC,gDAAgD,CAAC,CAAA;gBACnE,MAAM,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;YACjD,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,QAAQ,CAAC,iDAAiD,EAAE,GAAG,EAAE;YAC/D,IAAI,SAAwB,CAAA;YAC5B,UAAU,CAAC,KAAK,IAAI,EAAE;gBACpB,gBAAgB,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAA;gBACxC,MAAM,KAAK,GAAG,IAAI,iBAAS,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;gBAC/C,SAAS,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;YACpD,CAAC,CAAC,CAAA;YACF,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;gBAC7E,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;;;;SAavC,CAAC,CAAA;YACJ,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;QACtB,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,KAAK,GAAG,IAAI,iBAAS,CACzB;gBACE,GAAG,SAAS;gBACZ,MAAM,EAAE,SAAS;aAClB,EACD,OAAO,CACR,CAAA;YAED,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACxC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;YAClF,MAAM,KAAK,GAAG,IAAI,iBAAS,CACzB;gBACE,GAAG,SAAS;gBACZ,MAAM,EAAE,sBAAoD;aAC7D,EACD,OAAO,CACR,CAAA;YAED,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;QAChD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;YAC1E,MAAM,KAAK,GAAG,IAAI,iBAAS,CACzB;gBACE,GAAG,SAAS;gBACZ,MAAM,EAAE,gBAAgB;aACzB,EACD,OAAO,CACR,CAAA;YAED,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;QAChD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;YACnE,MAAM,KAAK,GAAG,IAAI,iBAAS,CACzB;gBACE,GAAG,SAAS;gBACZ,eAAe,EAAE,OAAO;aACzB,EACD,OAAO,CACR,CAAA;YAED,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACxC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;YAClE,MAAM,KAAK,GAAG,IAAI,iBAAS,CACzB;gBACE,GAAG,SAAS;gBACZ,eAAe,EAAE,OAAO;aACzB,EACD,OAAO,CACR,CAAA;YAED,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACvC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,KAAK,GAAG,IAAI,iBAAS,CACzB;gBACE,GAAG,SAAS;aACb,EACD,OAAO,CACR,CAAA;YAED,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;QAChD,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;YACrF,gBAAgB,CAAC,iBAAiB,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;YAC/D,MAAM,KAAK,GAAG,IAAI,iBAAS,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;YAC/C,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,KAAK,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,CAAA;YAC1D,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;YAC1B,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAC7B,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;YACrE,gBAAgB,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAA;YACxC,MAAM,KAAK,GAAG,IAAI,iBAAS,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;YAC/C,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,UAAU,EAAE,CAAA;YAC3C,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QAClC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;QACvB,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,KAAK,GAAG,IAAI,iBAAS,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;YAC/C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,CAAA;YAC/B,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC/B,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;QACtB,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,kBAAkB,GAAG;gBACzB,GAAG,SAAS;gBACZ,SAAS,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE;aAClC,CAAA;YACD,MAAM,KAAK,GAAG,IAAI,iBAAS,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAA;YACxD,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,CAAA;YAChC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACpC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,KAAK,GAAG,IAAI,iBAAS,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;YAC/C,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,CAAA;YAChC,MAAM,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAA;QAC9B,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE;QACnB,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,KAAK,GAAG,IAAI,iBAAS,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;YAC/C,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,CAAA;YACvB,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;QACjC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;YAC/B,MAAM,GAAG,GAAG,IAAI,iBAAS,CACvB;gBACE,GAAG,SAAS;gBACZ,WAAW,EAAE,gCAAgC;aAC9C,EACD,OAAO,CACR,CAAC,GAAG,EAAE,CAAA;YACP,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAA;QAC9D,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,kGAAkG,EAAE,GAAG,EAAE;YAC1G,MAAM,GAAG,GAAG,IAAI,iBAAS,CACvB;gBACE,GAAG,SAAS;gBACZ,WAAW,EAAE,EAAE;aAChB,EACD,OAAO,CACR,CAAC,GAAG,EAAE,CAAA;YACP,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACtB,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,yGAAyG,EAAE,GAAG,EAAE;YACjH,MAAM,GAAG,GAAG,IAAI,iBAAS,CACvB;gBACE,GAAG,OAAO;gBACV,WAAW,EAAE,EAAE;aAChB,EACD,OAAO,CACR,CAAC,GAAG,EAAE,CAAA;YACP,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAA;QACnD,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
package/lib/resolvers/core.js
CHANGED
|
@@ -12,6 +12,16 @@ const packageJson = JSON.parse(fs_1.default.readFileSync(path_1.default.resolve(
|
|
|
12
12
|
exports.version = packageJson.version;
|
|
13
13
|
function handleContentError(error, uuid) {
|
|
14
14
|
if (error instanceof errors_1.BaseError) {
|
|
15
|
+
if (error.data.upstreamStatusCode === 400) {
|
|
16
|
+
return new errors_1.HttpError({
|
|
17
|
+
code: 'CONTENT_BAD_REQUEST',
|
|
18
|
+
message: 'Bad request when requesting content from Content API',
|
|
19
|
+
cause: error,
|
|
20
|
+
uuid,
|
|
21
|
+
statusCode: 400,
|
|
22
|
+
relatesToSystems: ['up-ica'],
|
|
23
|
+
});
|
|
24
|
+
}
|
|
15
25
|
if (error.data.upstreamStatusCode === 404) {
|
|
16
26
|
return new errors_1.HttpError({
|
|
17
27
|
code: 'CONTENT_NOT_FOUND',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../src/resolvers/core.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAmB;AACnB,gDAAuB;AAEvB,wDAAoD;AACpD,2DAAqE;AAErE,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,YAAE,CAAC,YAAY,CAAC,cAAI,CAAC,OAAO,CAAC,SAAS,EAAE,oBAAoB,CAAC,EAAE,OAAO,CAAC,CACxE,CAAA;AAEY,QAAA,OAAO,GAAG,WAAW,CAAC,OAAO,CAAA;AAE1C,SAAS,kBAAkB,CAAC,KAAc,EAAE,IAAY;IACtD,IAAI,KAAK,YAAY,kBAAS,EAAE,CAAC;QAC/B,IAAI,KAAK,CAAC,IAAI,CAAC,kBAAkB,KAAK,GAAG,EAAE,CAAC;YAC1C,OAAO,IAAI,kBAAS,CAAC;gBACnB,IAAI,EAAE,mBAAmB;gBACzB,OAAO,EAAE,kCAAkC;gBAC3C,KAAK,EAAE,KAAK;gBACZ,IAAI;gBACJ,UAAU,EAAE,GAAG;gBACf,gBAAgB,EAAE,CAAC,QAAQ,CAAC;aAC7B,CAAC,CAAA;QACJ,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,yBAAyB,EAAE,CAAC;YAC7C,MAAM,IAAI,kBAAS,CAAC;gBAClB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,KAAK,EAAE,KAAK;gBACZ,OAAO,EAAE,0CAA0C;gBACnD,UAAU,EAAE,GAAG;aAChB,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,SAAS,GAAG;IAChB,KAAK,EAAE;QACL,OAAO,EAAE,GAAG,EAAE,CAAC,eAAO;QACtB,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO;YAC5B,IAAI,CAAC;gBACH,OAAO,MAAM,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC7D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;YAC5C,CAAC;QACH,CAAC;QACD,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO;YACnB,OAAO,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACpD,CAAC;QACD,eAAe,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,OAAO;YACrC,OAAO,2BAAY,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QAChD,CAAC;KACF;IACD,QAAQ,EAAE;QACR,oBAAoB,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;YAC/C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,MAAM,CAC9C,qDAAqD,IAAI,CAAC,IAAI,EAAE,CACjE,CAAA;YAED,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,qBAAqB,IAAI,CAAC,IAAI,EAAE,CAAA;YACzC,CAAC;iBAAM,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;gBAC5B,OAAO,WAAW,IAAI,CAAC,IAAI,SAAS,CAAA;YACtC,CAAC;iBAAM,CAAC;gBACN,OAAO,iBAAiB,CAAA;YAC1B,CAAC;QACH,CAAC;KACF;CAIF,CAAA;AAED,kBAAe,SAAS,CAAA"}
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../src/resolvers/core.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAmB;AACnB,gDAAuB;AAEvB,wDAAoD;AACpD,2DAAqE;AAErE,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,YAAE,CAAC,YAAY,CAAC,cAAI,CAAC,OAAO,CAAC,SAAS,EAAE,oBAAoB,CAAC,EAAE,OAAO,CAAC,CACxE,CAAA;AAEY,QAAA,OAAO,GAAG,WAAW,CAAC,OAAO,CAAA;AAE1C,SAAS,kBAAkB,CAAC,KAAc,EAAE,IAAY;IACtD,IAAI,KAAK,YAAY,kBAAS,EAAE,CAAC;QAC/B,IAAI,KAAK,CAAC,IAAI,CAAC,kBAAkB,KAAK,GAAG,EAAE,CAAC;YAC1C,OAAO,IAAI,kBAAS,CAAC;gBACnB,IAAI,EAAE,qBAAqB;gBAC3B,OAAO,EAAE,sDAAsD;gBAC/D,KAAK,EAAE,KAAK;gBACZ,IAAI;gBACJ,UAAU,EAAE,GAAG;gBACf,gBAAgB,EAAE,CAAC,QAAQ,CAAC;aAC7B,CAAC,CAAA;QACJ,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,CAAC,kBAAkB,KAAK,GAAG,EAAE,CAAC;YAC1C,OAAO,IAAI,kBAAS,CAAC;gBACnB,IAAI,EAAE,mBAAmB;gBACzB,OAAO,EAAE,kCAAkC;gBAC3C,KAAK,EAAE,KAAK;gBACZ,IAAI;gBACJ,UAAU,EAAE,GAAG;gBACf,gBAAgB,EAAE,CAAC,QAAQ,CAAC;aAC7B,CAAC,CAAA;QACJ,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,yBAAyB,EAAE,CAAC;YAC7C,MAAM,IAAI,kBAAS,CAAC;gBAClB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,KAAK,EAAE,KAAK;gBACZ,OAAO,EAAE,0CAA0C;gBACnD,UAAU,EAAE,GAAG;aAChB,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,SAAS,GAAG;IAChB,KAAK,EAAE;QACL,OAAO,EAAE,GAAG,EAAE,CAAC,eAAO;QACtB,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO;YAC5B,IAAI,CAAC;gBACH,OAAO,MAAM,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC7D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;YAC5C,CAAC;QACH,CAAC;QACD,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO;YACnB,OAAO,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACpD,CAAC;QACD,eAAe,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,OAAO;YACrC,OAAO,2BAAY,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QAChD,CAAC;KACF;IACD,QAAQ,EAAE;QACR,oBAAoB,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;YAC/C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,MAAM,CAC9C,qDAAqD,IAAI,CAAC,IAAI,EAAE,CACjE,CAAA;YAED,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,qBAAqB,IAAI,CAAC,IAAI,EAAE,CAAA;YACzC,CAAC;iBAAM,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;gBAC5B,OAAO,WAAW,IAAI,CAAC,IAAI,SAAS,CAAA;YACtC,CAAC;iBAAM,CAAC;gBACN,OAAO,iBAAiB,CAAA;YAC1B,CAAC;QACH,CAAC;KACF;CAIF,CAAA;AAED,kBAAe,SAAS,CAAA"}
|
package/package.json
CHANGED
package/src/model/Image.test.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { CAPIImage } from './Image'
|
|
2
|
-
import
|
|
2
|
+
import { jest } from '@jest/globals'
|
|
3
3
|
import type { QueryContext } from '..'
|
|
4
4
|
import { Image } from './schemas/capi/internal-content'
|
|
5
|
+
import { OrigamiImageDataSource } from '../datasources/origami-image'
|
|
5
6
|
import { MAX_IMAGE_WIDTH } from '../helpers/imageService'
|
|
7
|
+
import type { ImageSource } from '../generated'
|
|
6
8
|
|
|
7
9
|
describe('Image', () => {
|
|
8
10
|
const mockImage = {
|
|
@@ -11,8 +13,6 @@ describe('Image', () => {
|
|
|
11
13
|
title: 'title',
|
|
12
14
|
description: 'description',
|
|
13
15
|
binaryUrl: 'cloudfront.com/image',
|
|
14
|
-
pixelWidth: 5000,
|
|
15
|
-
pixelHeight: 1000,
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
const graphic = {
|
|
@@ -20,17 +20,34 @@ describe('Image', () => {
|
|
|
20
20
|
type: 'http://www.ft.com/ontology/content/Graphic' as const,
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
+
const getImageMetadata = jest.fn<OrigamiImageDataSource['getImageMetadata']>()
|
|
24
|
+
|
|
23
25
|
const context = {
|
|
24
|
-
|
|
26
|
+
dataSources: {
|
|
27
|
+
origami: {
|
|
28
|
+
getImageMetadata,
|
|
29
|
+
},
|
|
30
|
+
capi: {},
|
|
31
|
+
vanityUrls: {},
|
|
32
|
+
},
|
|
25
33
|
systemCode: 'image-test',
|
|
26
34
|
} as unknown as QueryContext
|
|
27
35
|
|
|
36
|
+
beforeEach(() => {
|
|
37
|
+
getImageMetadata.mockReset()
|
|
38
|
+
})
|
|
39
|
+
|
|
28
40
|
describe('sourceSet', () => {
|
|
29
41
|
describe('An image that is provided with a high resolution', () => {
|
|
30
|
-
|
|
42
|
+
let sourceSet: ImageSource[]
|
|
43
|
+
|
|
44
|
+
beforeAll(async () => {
|
|
45
|
+
getImageMetadata.mockResolvedValue({ width: 5000, height: 1000 })
|
|
31
46
|
const model = new CAPIImage(mockImage, context)
|
|
32
|
-
|
|
47
|
+
sourceSet = await model.sourceSet({ width: 1000 })
|
|
48
|
+
})
|
|
33
49
|
|
|
50
|
+
it('transforms the URL to use the Origami Image Service', () => {
|
|
34
51
|
expect(
|
|
35
52
|
sourceSet.every((source) =>
|
|
36
53
|
source.url.startsWith(
|
|
@@ -40,10 +57,7 @@ describe('Image', () => {
|
|
|
40
57
|
).toBeTruthy()
|
|
41
58
|
})
|
|
42
59
|
|
|
43
|
-
it('resizes the image to the requested width',
|
|
44
|
-
const model = new CAPIImage(mockImage, context)
|
|
45
|
-
const sourceSet = await model.sourceSet({ width: 1000 })
|
|
46
|
-
|
|
60
|
+
it('resizes the image to the requested width', () => {
|
|
47
61
|
expect(
|
|
48
62
|
sourceSet.every(
|
|
49
63
|
(source) =>
|
|
@@ -52,9 +66,7 @@ describe('Image', () => {
|
|
|
52
66
|
).toBeTruthy()
|
|
53
67
|
})
|
|
54
68
|
|
|
55
|
-
it('includes sourceSet for all the possible resolutions we can display the image at, given the requested width and the original source width',
|
|
56
|
-
const model = new CAPIImage(mockImage, context)
|
|
57
|
-
const sourceSet = await model.sourceSet({ width: 1000 })
|
|
69
|
+
it('includes sourceSet for all the possible resolutions we can display the image at, given the requested width and the original source width', () => {
|
|
58
70
|
expect(sourceSet.length).toEqual(5)
|
|
59
71
|
expect(sourceSet[0]?.dpr).toEqual(1)
|
|
60
72
|
expect(sourceSet[0]?.url).toMatch(/dpr=1/)
|
|
@@ -65,10 +77,8 @@ describe('Image', () => {
|
|
|
65
77
|
|
|
66
78
|
describe("An image that that isn't wide enough to generate high-resolution sourceSet for", () => {
|
|
67
79
|
it('returns an array with a single resolution iamge service UR', async () => {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
context
|
|
71
|
-
)
|
|
80
|
+
getImageMetadata.mockResolvedValue({ width: 1500, height: 500 })
|
|
81
|
+
const model = new CAPIImage(mockImage, context)
|
|
72
82
|
const sourceSet = await model.sourceSet({ width: 1000 })
|
|
73
83
|
expect(sourceSet.length).toEqual(1)
|
|
74
84
|
expect(sourceSet[0]).toEqual({
|
|
@@ -81,10 +91,8 @@ describe('Image', () => {
|
|
|
81
91
|
|
|
82
92
|
describe('An image that that is smaller than the width that was requested', () => {
|
|
83
93
|
it('returns the image at the same width as the original', async () => {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
context
|
|
87
|
-
)
|
|
94
|
+
getImageMetadata.mockResolvedValue({ width: 500, height: 500 })
|
|
95
|
+
const model = new CAPIImage(mockImage, context)
|
|
88
96
|
const sourceSet = await model.sourceSet({ width: 1000 })
|
|
89
97
|
expect(sourceSet.length).toEqual(1)
|
|
90
98
|
expect(sourceSet[0]).toEqual({
|
|
@@ -97,10 +105,8 @@ describe('Image', () => {
|
|
|
97
105
|
|
|
98
106
|
describe('An image that that is bigger than the maximum width that was requested', () => {
|
|
99
107
|
it('returns the image at the same width as the maximum width', async () => {
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
context
|
|
103
|
-
)
|
|
108
|
+
getImageMetadata.mockResolvedValue({ width: 4000, height: 4000 })
|
|
109
|
+
const model = new CAPIImage(mockImage, context)
|
|
104
110
|
const sourceSet = await model.sourceSet({ width: MAX_IMAGE_WIDTH })
|
|
105
111
|
expect(sourceSet.length).toEqual(1)
|
|
106
112
|
expect(sourceSet[0]?.width).toEqual(MAX_IMAGE_WIDTH)
|
|
@@ -109,10 +115,8 @@ describe('Image', () => {
|
|
|
109
115
|
|
|
110
116
|
describe('A large image with the maxDpr argumet passed', () => {
|
|
111
117
|
it('only returns sourceSet up to and including the maxDpr', async () => {
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
context
|
|
115
|
-
)
|
|
118
|
+
getImageMetadata.mockResolvedValue({ width: 5000, height: 500 })
|
|
119
|
+
const model = new CAPIImage(mockImage, context)
|
|
116
120
|
const sourceSet = await model.sourceSet({ width: 1000, maxDpr: 2 })
|
|
117
121
|
expect(sourceSet.length).toEqual(2)
|
|
118
122
|
expect(sourceSet[0]?.dpr).toEqual(1)
|
|
@@ -133,6 +137,32 @@ describe('Image', () => {
|
|
|
133
137
|
await expect(
|
|
134
138
|
model.sourceSet({ width: 1000, maxDpr: 2 })
|
|
135
139
|
).rejects.toThrow('not-a-uuid is not a valid Content API Image ID')
|
|
140
|
+
expect(getImageMetadata).not.toHaveBeenCalled()
|
|
141
|
+
})
|
|
142
|
+
})
|
|
143
|
+
|
|
144
|
+
describe('When the image service fails to return metadata', () => {
|
|
145
|
+
let sourceSet: ImageSource[]
|
|
146
|
+
beforeEach(async () => {
|
|
147
|
+
getImageMetadata.mockRejectedValue(null)
|
|
148
|
+
const model = new CAPIImage(mockImage, context)
|
|
149
|
+
sourceSet = await model.sourceSet({ width: 3000 })
|
|
150
|
+
})
|
|
151
|
+
it('returns an image service URL with the requested width and max DPR 2', () => {
|
|
152
|
+
expect(sourceSet).toMatchInlineSnapshot(`
|
|
153
|
+
Array [
|
|
154
|
+
Object {
|
|
155
|
+
"dpr": 1,
|
|
156
|
+
"url": "https://www.ft.com/__origami/service/image/v2/images/raw/ftcms%3A00000000-0000-0000-0000-000000000001?source=image-test&fit=scale-down&quality=highest&width=3000&dpr=1",
|
|
157
|
+
"width": 3000,
|
|
158
|
+
},
|
|
159
|
+
Object {
|
|
160
|
+
"dpr": 2,
|
|
161
|
+
"url": "https://www.ft.com/__origami/service/image/v2/images/raw/ftcms%3A00000000-0000-0000-0000-000000000001?source=image-test&fit=scale-down&quality=highest&width=3000&dpr=2",
|
|
162
|
+
"width": 3000,
|
|
163
|
+
},
|
|
164
|
+
]
|
|
165
|
+
`)
|
|
136
166
|
})
|
|
137
167
|
})
|
|
138
168
|
})
|
|
@@ -211,18 +241,17 @@ describe('Image', () => {
|
|
|
211
241
|
})
|
|
212
242
|
|
|
213
243
|
describe('width/height', () => {
|
|
214
|
-
it('returns the original width and height from
|
|
244
|
+
it('returns the original width and height from the image service metadata', async () => {
|
|
245
|
+
getImageMetadata.mockResolvedValue({ width: 100, height: 200 })
|
|
215
246
|
const model = new CAPIImage(mockImage, context)
|
|
216
247
|
const { width, height } = (await model.dimensions()) || {}
|
|
217
|
-
expect(width).toEqual(
|
|
218
|
-
expect(height).toEqual(
|
|
248
|
+
expect(width).toEqual(100)
|
|
249
|
+
expect(height).toEqual(200)
|
|
219
250
|
})
|
|
220
251
|
|
|
221
|
-
it('returns null if
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
context
|
|
225
|
-
)
|
|
252
|
+
it('returns null if the image service metadata call fails', async () => {
|
|
253
|
+
getImageMetadata.mockRejectedValue(null)
|
|
254
|
+
const model = new CAPIImage(mockImage, context)
|
|
226
255
|
const dimensions = await model.dimensions()
|
|
227
256
|
expect(dimensions).toEqual(null)
|
|
228
257
|
})
|
package/src/model/Image.ts
CHANGED
|
@@ -11,7 +11,8 @@ import {
|
|
|
11
11
|
validLiteralUnionValue,
|
|
12
12
|
} from '../resolvers/literal-union'
|
|
13
13
|
import { ImageFormat, ImageType } from '../resolvers/scalars'
|
|
14
|
-
import
|
|
14
|
+
import isError from '../helpers/isError'
|
|
15
|
+
import { BaseError, OperationalError } from '@dotcom-reliability-kit/errors'
|
|
15
16
|
import type { ImageSource } from '../generated'
|
|
16
17
|
|
|
17
18
|
export type ImageSourceArgs = {
|
|
@@ -156,18 +157,25 @@ export class CAPIImage implements Image {
|
|
|
156
157
|
height: this.capiImage.pixelHeight,
|
|
157
158
|
}
|
|
158
159
|
}
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
160
|
+
try {
|
|
161
|
+
const imageMetadata = await this.#dataSources.origami.getImageMetadata(
|
|
162
|
+
this.capiImage.binaryUrl
|
|
163
|
+
)
|
|
164
|
+
return imageMetadata
|
|
165
|
+
} catch (error) {
|
|
166
|
+
if (isError(error)) {
|
|
167
|
+
this.context.logger.warn({
|
|
168
|
+
event: 'RECOVERABLE_ERROR',
|
|
169
|
+
error: new OperationalError({
|
|
170
|
+
code: 'IMAGE_DIMENSIONS_ERROR',
|
|
171
|
+
message: `Failed to get dimensions for ${this.capiImage.binaryUrl}`,
|
|
172
|
+
url: this.capiImage.binaryUrl,
|
|
173
|
+
cause: error,
|
|
174
|
+
}),
|
|
175
|
+
})
|
|
176
|
+
}
|
|
177
|
+
return null
|
|
178
|
+
}
|
|
171
179
|
}
|
|
172
180
|
|
|
173
181
|
credit() {
|
package/src/resolvers/core.ts
CHANGED
|
@@ -12,6 +12,16 @@ export const version = packageJson.version
|
|
|
12
12
|
|
|
13
13
|
function handleContentError(error: unknown, uuid: string): Error | unknown {
|
|
14
14
|
if (error instanceof BaseError) {
|
|
15
|
+
if (error.data.upstreamStatusCode === 400) {
|
|
16
|
+
return new HttpError({
|
|
17
|
+
code: 'CONTENT_BAD_REQUEST',
|
|
18
|
+
message: 'Bad request when requesting content from Content API',
|
|
19
|
+
cause: error,
|
|
20
|
+
uuid,
|
|
21
|
+
statusCode: 400,
|
|
22
|
+
relatesToSystems: ['up-ica'],
|
|
23
|
+
})
|
|
24
|
+
}
|
|
15
25
|
if (error.data.upstreamStatusCode === 404) {
|
|
16
26
|
return new HttpError({
|
|
17
27
|
code: 'CONTENT_NOT_FOUND',
|