@@ -2,13 +2,16 @@ const express = require('express');
2
2
const apiDataGovFilter = require ( './api-data-gov-filter' ) ;
3
3
const db = require ( './db' ) ;
4
4
const logger = require ( './logger' ) ;
5
+ const router = express . Router ( ) ;
6
+ const routesVersioning = require ( 'express-routes-versioning' ) ( ) ;
5
7
6
8
const app = express ( ) ;
7
9
8
10
if ( process . env . NODE_ENV != 'test' ) {
9
11
app . use ( logger ) ;
10
12
}
11
13
app . use ( apiDataGovFilter ) ;
14
+ app . use ( router ) ;
12
15
13
16
const formatDateForDataPoint = ( dataPoint ) => {
14
17
if ( dataPoint . date ) {
@@ -51,7 +54,8 @@ const fetchData = (req, res) => {
51
54
id : dataPoint . id ,
52
55
date : formatDateForDataPoint ( dataPoint ) ,
53
56
report_name : dataPoint . report_name ,
54
- report_agency : dataPoint . report_agency
57
+ report_agency : dataPoint . report_agency ,
58
+ version : dataPoint . version
55
59
} , dataPoint . data ) ) ;
56
60
const filteredResponse = filterDownloadResponse ( response , params ) ;
57
61
res . json ( filteredResponse ) ;
@@ -70,8 +74,59 @@ app.get('/', (req, res) => {
70
74
current_time : new Date ( )
71
75
} ) ;
72
76
} ) ;
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
+
76
131
77
132
module . exports = app ;
0 commit comments