Skip to content

Commit ad86701

Browse files
handle versioning semantically
1 parent 411553e commit ad86701

File tree

1 file changed

+59
-4
lines changed

1 file changed

+59
-4
lines changed

src/app.js

Lines changed: 59 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,16 @@ const express = require('express');
22
const apiDataGovFilter = require('./api-data-gov-filter');
33
const db = require('./db');
44
const logger = require('./logger');
5+
const router = express.Router();
6+
const routesVersioning = require('express-routes-versioning')();
57

68
const app = express();
79

810
if (process.env.NODE_ENV != 'test') {
911
app.use(logger);
1012
}
1113
app.use(apiDataGovFilter);
14+
app.use(router);
1215

1316
const formatDateForDataPoint = (dataPoint) => {
1417
if (dataPoint.date) {
@@ -51,7 +54,8 @@ const fetchData = (req, res) => {
5154
id: dataPoint.id,
5255
date: formatDateForDataPoint(dataPoint),
5356
report_name: dataPoint.report_name,
54-
report_agency: dataPoint.report_agency
57+
report_agency: dataPoint.report_agency,
58+
version: dataPoint.version
5559
}, dataPoint.data));
5660
const filteredResponse = filterDownloadResponse(response, params);
5761
res.json(filteredResponse);
@@ -70,8 +74,59 @@ app.get('/', (req, res) => {
7074
current_time: new Date()
7175
});
7276
});
73-
app.get('/v1.1/domain/:domain/reports/:reportName/data', checkDomainFilter);
74-
app.get('/v1.1/agencies/:reportAgency/reports/:reportName/data', fetchData);
75-
app.get('/v1.1/reports/:reportName/data', fetchData);
77+
78+
// we need to support legacy route
79+
// app.get('/v1.1/domain/:domain/reports/:reportName/data', checkDomainFilter);
80+
// app.get('/v1.1/agencies/:reportAgency/reports/:reportName/data', fetchData);
81+
// app.get('/v1.1/reports/:reportName/data', fetchData);
82+
83+
// We need a way to set versions without breaking the request
84+
// Right now if we update '/v1/reports/:reportName/data' to '/v2/reports/:reportName/data' anyone requesting from '/v1/reports/:reportName/data' will have a broken application
85+
86+
// middleware
87+
router.use('/v:version/', function(req, res, next) {
88+
console.log('req', req.params.version)
89+
const version = req.params.version;
90+
req.version = version
91+
next();
92+
});
93+
94+
router.get('/v:version/reports/:reportName/data',
95+
routesVersioning({
96+
"1.1.0": respondV1, // legacy
97+
"~1.2.0": fetchData,
98+
}, NoMatchFoundCallback));
99+
100+
router.get('/v:version/:domain/reports/:reportName/data',
101+
routesVersioning({
102+
"1.1.0": respondDomainV1, // legacy
103+
"~1.2.0": checkDomainFilter,
104+
}, NoMatchFoundCallback));
105+
106+
router.get('/v:version/:reportAgency/reports/:reportName/data',
107+
routesVersioning({
108+
"1.1.0": respondV1, // legacy
109+
"~1.2.0": fetchData,
110+
}, NoMatchFoundCallback));
111+
112+
function NoMatchFoundCallback(req, res) {
113+
res.status(404).send("Version not found. See https://analytics.usa.gov/developer");
114+
}
115+
116+
// v1
117+
function respondV1(req, res) {
118+
req.params.version = '1.1'
119+
// TODO - report this message to response
120+
console.log('v1 is deprecated. Use v2 instead. See https://analytics.usa.gov/developer')
121+
return fetchData(req, res)
122+
}
123+
124+
function respondDomainV1(req, res) {
125+
req.params.version = '1.1'
126+
// TODO - report this message to response
127+
console.log('v1 is deprecated. Use v2 instead. See https://analytics.usa.gov/developer')
128+
return checkDomainFilter(req, res)
129+
}
130+
76131

77132
module.exports = app;

0 commit comments

Comments
 (0)