|
| 1 | +import { isObject } from '@guardian/libs'; |
1 | 2 | import type { Handler } from 'express'; |
2 | | -import { validateAsFEArticle } from '../../model/validate'; |
3 | 3 | import { logger } from './logging'; |
4 | 4 |
|
| 5 | +type AbServerSideTestType = { |
| 6 | + config: { |
| 7 | + serverSideABTests?: Record<string, string>; |
| 8 | + }; |
| 9 | +}; |
| 10 | + |
5 | 11 | const SAFE_AB_VALUE = /^[a-zA-Z0-9_-]+$/; |
6 | 12 | const MAX_LENGTH = 100; |
7 | 13 |
|
8 | | -export const getABTestsFromQueryParams: Handler = async (req, res, next) => { |
| 14 | +export const getABTestsFromQueryParams: Handler = (req, res, next) => { |
9 | 15 | try { |
10 | | - const frontendData = validateAsFEArticle(req.body); |
11 | | - const { config } = frontendData; |
12 | | - const queryParamsAb = req.query; |
13 | | - const filteredQuery: Record<string, string> = {}; |
| 16 | + if (isObject(req.body) && isObject(req.body.config)) { |
| 17 | + const { config } = req.body as AbServerSideTestType; |
| 18 | + const queryParamsAb = req.query; |
| 19 | + const filteredQuery: Record<string, string> = {}; |
14 | 20 |
|
15 | | - for (const [key, value] of Object.entries(queryParamsAb)) { |
16 | | - if (!key.startsWith('ab-') || typeof value !== 'string') { |
17 | | - continue; |
18 | | - } |
| 21 | + for (const [key, value] of Object.entries(queryParamsAb)) { |
| 22 | + if (!key.startsWith('ab-') || typeof value !== 'string') { |
| 23 | + continue; |
| 24 | + } |
19 | 25 |
|
20 | | - const testId = key.replace(/^ab-/, ''); |
| 26 | + const testId = key.replace(/^ab-/, ''); |
21 | 27 |
|
22 | | - if ( |
23 | | - testId.length > 0 && |
24 | | - testId.length <= MAX_LENGTH && |
25 | | - value.length > 0 && |
26 | | - value.length <= MAX_LENGTH && |
27 | | - SAFE_AB_VALUE.test(testId) && |
28 | | - SAFE_AB_VALUE.test(value) |
29 | | - ) { |
30 | | - filteredQuery[testId] = value; |
31 | | - } else { |
32 | | - logger.warn( |
33 | | - `Rejected invalid AB test parameter: ${key}=${value}`, |
34 | | - ); |
| 28 | + if ( |
| 29 | + testId.length > 0 && |
| 30 | + testId.length <= MAX_LENGTH && |
| 31 | + value.length > 0 && |
| 32 | + value.length <= MAX_LENGTH && |
| 33 | + SAFE_AB_VALUE.test(testId) && |
| 34 | + SAFE_AB_VALUE.test(value) |
| 35 | + ) { |
| 36 | + filteredQuery[testId] = value; |
| 37 | + } else { |
| 38 | + logger.warn( |
| 39 | + `Rejected invalid AB test parameter: ${key}=${value}`, |
| 40 | + ); |
| 41 | + } |
35 | 42 | } |
| 43 | + config.serverSideABTests = { |
| 44 | + ...config.serverSideABTests, |
| 45 | + ...filteredQuery, |
| 46 | + }; |
36 | 47 | } |
37 | | - |
38 | | - config.serverSideABTests = { |
39 | | - ...config.serverSideABTests, |
40 | | - ...filteredQuery, |
41 | | - }; |
42 | | - req.body = frontendData; |
43 | 48 | } catch (error) { |
| 49 | + logger.error('Error processing AB test query params', error); |
44 | 50 | return next(); |
45 | 51 | } |
46 | 52 | next(); |
|
0 commit comments