Skip to content

Commit 35d3588

Browse files
authored
feat: [MC-1035] Pass through enableRankByRegion (#75)
* fix: openapi-typescript failed to run TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension .mts for scripts/generateOpenAPITypes.mts * feat: pass enableRankingByRegion to recommendation-api * fix: pass enableRankingByRegion to query
1 parent 16b2275 commit 35d3588

File tree

12 files changed

+413
-143
lines changed

12 files changed

+413
-143
lines changed

.eslintrc.js

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
module.exports = {
22
extends: ['@pocket-tools/eslint-config'],
3+
ignorePatterns: ['src/generated/**'],
34
};

openapi.yml

+7
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,13 @@ paths:
309309
description: This region string is Fx domain language, and built from Fx expectations. Parameter values are not case sensitive. See [Firefox Home & New Tab Regional Differences](https://mozilla-hub.atlassian.net/wiki/spaces/FPS/pages/80448805/Regional+Differences).
310310
schema:
311311
type: string
312+
- name: enableRankingByRegion
313+
in: query
314+
required: false
315+
description: Returns recommendations specific to the region if set to 1.
316+
schema:
317+
type: integer
318+
enum: [0, 1]
312319
responses:
313320
'200':
314321
description: OK

package-lock.json

+48-33
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
"build": "rm -rf dist && tsc",
88
"codegen": "npm run codegen:graphql-types",
99
"codegen:graphql-types": "graphql-codegen",
10-
"codegen:openapi-types": "npm run lint-openapi && ts-node-esm -P scripts/tsconfig.openapi-typescript.json scripts/generateOpenAPITypes.mts",
10+
"codegen:openapi-types": "openapi-typescript ./openapi.yml -o ./src/generated/openapi/types.ts",
1111
"docs": "redocly preview-docs openapi.yml",
1212
"watch": "tsc -w & nodemon",
1313
"start": "node dist/main.js",
@@ -68,7 +68,7 @@
6868
"jest": "29.7.0",
6969
"nock": "13.2.4",
7070
"nodemon": "2.0.20",
71-
"openapi-typescript": "^6.0.3",
71+
"openapi-typescript": "^6.7.5",
7272
"supertest": "6.3.3",
7373
"ts-jest": "29.1.2",
7474
"ts-node": "^10.9.2"

scripts/README.md

-12
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,3 @@
33
These files are scripts intended to be run during local development, or during CI/CD.
44

55
These are not transpiled into `dist`, and cannot be executed in production environments.
6-
7-
## generateOpenAPITypes.mts
8-
9-
To execute this script:
10-
11-
```bash
12-
npm run codegen
13-
```
14-
15-
This script generates `src/generated/openapi/types.ts`. This requires a separate tsconfig that permits the usage of ESModules, which lives in `tsconfig.openapi-typescript.json`.
16-
17-
This script does not validate `openapi.yml`. It is recommended to lint that file after changing its contents.

scripts/generateOpenAPITypes.mts

-24
This file was deleted.

scripts/tsconfig.openapi-typescript.json

-11
This file was deleted.

src/api/desktop/recommendations/inputs.spec.ts

+45
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,12 @@ describe('input.ts recommendations query parameters', () => {
177177
});
178178
});
179179

180+
it('sets enableRankingByRegion to false if no default is provided', () => {
181+
const res = setDefaultsAndCoerceTypes({});
182+
// validation should return an error in this case, validating defaults though
183+
expect(res.enableRankingByRegion).toStrictEqual(false);
184+
});
185+
180186
describe('handleQueryParameters', () => {
181187
it('returns errors if invalid query parameters', () => {
182188
const params: RecommendationsQueryParameterStrings = {
@@ -198,6 +204,44 @@ describe('input.ts recommendations query parameters', () => {
198204
);
199205
});
200206

207+
it('returns enableRankingByRegion as true when set to 1', () => {
208+
const params: RecommendationsQueryParameterStrings = {
209+
count: faker.datatype.number({ min: 1, max: 30 }).toString(),
210+
locale: 'fr',
211+
region: 'FR',
212+
enableRankingByRegion: '1',
213+
};
214+
215+
const variables = handleQueryParameters(params);
216+
expect(variables).toStrictEqual(
217+
expect.objectContaining<NewTabRecommendationsQueryVariables>({
218+
count: parseInt(params.count, 10),
219+
locale: params.locale,
220+
region: params.region,
221+
enableRankingByRegion: true,
222+
})
223+
);
224+
});
225+
226+
it('returns enableRankingByRegion as false when set to 0', () => {
227+
const params: RecommendationsQueryParameterStrings = {
228+
count: faker.datatype.number({ min: 1, max: 30 }).toString(),
229+
locale: 'fr',
230+
region: 'FR',
231+
enableRankingByRegion: '0',
232+
};
233+
234+
const variables = handleQueryParameters(params);
235+
expect(variables).toStrictEqual(
236+
expect.objectContaining<NewTabRecommendationsQueryVariables>({
237+
count: parseInt(params.count, 10),
238+
locale: params.locale,
239+
region: params.region,
240+
enableRankingByRegion: false,
241+
})
242+
);
243+
});
244+
201245
it('returns GraphQL query variables on success', () => {
202246
const params: RecommendationsQueryParameterStrings = {
203247
count: faker.datatype.number({ min: 1, max: 30 }).toString(),
@@ -211,6 +255,7 @@ describe('input.ts recommendations query parameters', () => {
211255
count: parseInt(params.count, 10),
212256
locale: params.locale,
213257
region: params.region,
258+
enableRankingByRegion: false,
214259
})
215260
);
216261
});

src/api/desktop/recommendations/inputs.ts

+4-2
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ export type RecommendationsQueryParameterStrings = Partial<
2525
* This type captures that uncertainty.
2626
*/
2727
type PreValidatedQueryParameters = {
28+
enableRankingByRegion?: boolean;
2829
count: number;
2930
locale?: string;
3031
region?: string;
@@ -120,6 +121,7 @@ export const setDefaultsAndCoerceTypes = (
120121
return {
121122
...withDefaults,
122123
count: parseInt(withDefaults.count, 10),
124+
enableRankingByRegion: withDefaults.enableRankingByRegion == '1',
123125
};
124126
};
125127

@@ -132,7 +134,7 @@ export const setDefaultsAndCoerceTypes = (
132134
*/
133135
export const validate = (
134136
query: PreValidatedQueryParameters
135-
): BFFFxErrorInstanceType | RecommendationsQueryParameters => {
137+
): BFFFxErrorInstanceType | PreValidatedQueryParameters => {
136138
// errorDetails is empty if all fields are valid
137139
const errorDetails = [
138140
isValidCount(query.count),
@@ -160,7 +162,7 @@ export const validate = (
160162
return error;
161163
}
162164

163-
return query as RecommendationsQueryParameters;
165+
return query as PreValidatedQueryParameters;
164166
};
165167

166168
/**

0 commit comments

Comments
 (0)