Skip to content

Commit 8cab936

Browse files
committed
Add version parameter support to report data endpoints
1 parent f9023cc commit 8cab936

File tree

3 files changed

+31
-12
lines changed

3 files changed

+31
-12
lines changed

README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,7 @@ Provides technology adoption data.
208208
- `rank` (required): Filter by rank
209209
- `start` (optional): Filter by date range start (YYYY-MM-DD or 'latest')
210210
- `end` (optional): Filter by date range end (YYYY-MM-DD)
211+
- `version` (optional): Filter by version name(s) - comma-separated list (only when single technology is specified)
211212
212213
#### Adoption Response
213214
@@ -243,6 +244,7 @@ Provides Core Web Vitals metrics for technologies.
243244
- `rank` (required): Filter by rank
244245
- `start` (optional): Filter by date range start (YYYY-MM-DD or 'latest')
245246
- `end` (optional): Filter by date range end (YYYY-MM-DD)
247+
- `version` (optional): Filter by version name(s) - comma-separated list (only when single technology is specified)
246248
247249
#### CWV Response
248250
@@ -286,6 +288,7 @@ Provides Lighthouse scores for technologies.
286288
- `rank` (required): Filter by rank
287289
- `start` (optional): Filter by date range start (YYYY-MM-DD or 'latest')
288290
- `end` (optional): Filter by date range end (YYYY-MM-DD)
291+
- `version` (optional): Filter by version name(s) - comma-separated list (only when single technology is specified)
289292
290293
#### Lighthouse Response
291294
@@ -333,6 +336,7 @@ Provides Page Weight metrics for technologies.
333336
- `rank` (required): Filter by rank
334337
- `start` (optional): Filter by date range start (YYYY-MM-DD or 'latest')
335338
- `end` (optional): Filter by date range end (YYYY-MM-DD)
339+
- `version` (optional): Filter by version name(s) - comma-separated list (only when single technology is specified)
336340
337341
#### Page Weight Response
338342
@@ -394,6 +398,7 @@ Provides Lighthouse audits for technologies.
394398
- `rank` (required): Filter by rank
395399
- `start` (optional): Filter by date range start (YYYY-MM-DD or 'latest')
396400
- `end` (optional): Filter by date range end (YYYY-MM-DD)
401+
- `version` (optional): Filter by version name(s) - comma-separated list (only when single technology is specified)
397402
398403
#### Audits Response
399404

src/__tests__/routes.test.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,12 @@ describe('API Routes', () => {
233233
expect(Array.isArray(res.body)).toBe(true);
234234
});
235235

236+
it('should return adoption data with version parameter', async () => {
237+
const res = await request(app).get('/v1/adoption?technology=WordPress&geo=ALL&rank=ALL&start=latest&version=5.0');
238+
expect(res.statusCode).toEqual(200);
239+
expect(Array.isArray(res.body)).toBe(true);
240+
});
241+
236242
it('should handle missing required parameters', async () => {
237243
const res = await request(app).get('/v1/adoption');
238244
expect(res.statusCode).toEqual(400);

src/controllers/reportController.js

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ const createReportController = (reportType) => {
5454

5555
/*
5656
// Validate supported parameters
57-
const supportedParams = ['technology', 'geo', 'rank', 'start', 'end'];
57+
const supportedParams = ['technology', 'geo', 'rank', 'start', 'end', 'version'];
5858
const providedParams = Object.keys(params);
5959
const unsupportedParams = providedParams.filter(param => !supportedParams.includes(param));
6060
@@ -77,8 +77,15 @@ const createReportController = (reportType) => {
7777
return;
7878
}
7979

80-
// Validate and process technology array
81-
const techArray = validateArrayParameter(params.technology, 'technology');
80+
// Validate and process technologies
81+
const technologiesArray = validateArrayParameter(params.technology, 'technology');
82+
83+
// Validate and process versions
84+
// Apply version filter with special handling for 'ALL' case
85+
let versionsArray = ['ALL'];
86+
if (technologiesArray.length === 1 && params.version) {
87+
versionsArray = validateArrayParameter(params.version, 'version');
88+
}
8289

8390
// Handle 'latest' date substitution
8491
let startDate = params.start;
@@ -90,7 +97,8 @@ const createReportController = (reportType) => {
9097
const queryFilters = {
9198
geo: params.geo,
9299
rank: params.rank,
93-
technology: techArray,
100+
technology: technologiesArray,
101+
version: versionsArray,
94102
startDate: startDate,
95103
endDate: params.end
96104
};
@@ -112,21 +120,21 @@ const createReportController = (reportType) => {
112120
query = query.where('rank', '==', params.rank);
113121

114122
// Apply technology filter with batch processing
115-
query = query.where('technology', 'in', techArray);
123+
query = query.where('technology', 'in', technologiesArray);
116124

117-
// Apply version filter with special handling for 'ALL' case
118-
if (params.version && techArray.length === 1) {
119-
query = query.where('version', '==', params.version);
120-
} else {
121-
query = query.where('version', '==', 'ALL');
122-
}
125+
// Apply version filter with batch processing
126+
query = query.where('version', 'in', versionsArray);
123127

124128
// Apply date filters
125129
if (startDate) query = query.where('date', '>=', startDate);
126130
if (params.end) query = query.where('date', '<=', params.end);
127131

128132
// Apply field projection to optimize query
129-
query = query.select('date', 'technology', config.dataField);
133+
const selectFields = ['date', 'technology', config.dataField];
134+
if (!(versionsArray.length === 1 && versionsArray[0] === 'ALL')) {
135+
selectFields.push('version');
136+
}
137+
query = query.select(...selectFields);
130138

131139
// Execute query
132140
const snapshot = await query.get();

0 commit comments

Comments
 (0)