@@ -33,25 +33,27 @@ var fields = {
33
33
34
34
35
35
// Base url for Google Books API
36
- var API_BASE_URL = 'https://www.googleapis.com/books/v1/volumes? ' ;
36
+ var API_BASE_URL = 'https://www.googleapis.com/books/v1' ;
37
37
38
38
39
39
/**
40
40
* Search Google Books
41
41
*
42
+ * https://developers.google.com/books/docs/v1/reference/volumes/list
43
+ *
42
44
* @param {String } query
43
45
* @param {object } options
44
46
* @param {Function } callback
45
47
*/
46
48
var search = function ( query , options , callback ) {
47
49
48
50
// Make the options object optional
49
- if ( ! callback || typeof callback != 'function' ) {
51
+ if ( ! _ . isFunction ( callback ) ) {
50
52
callback = options ;
51
- options = undefined ;
53
+ options = { } ;
52
54
}
53
55
54
- var options = _ . extend ( { } , defaultOptions , options || { } ) ;
56
+ var options = _ . extend ( { } , defaultOptions , options ) ;
55
57
56
58
// Validate options
57
59
if ( ! query ) {
@@ -85,7 +87,7 @@ var search = function(query, options, callback) {
85
87
query . key = options . key ;
86
88
}
87
89
88
- sendRequest ( query , function ( err , response ) {
90
+ sendRequest ( '/volumes' , query , function ( err , response ) {
89
91
if ( err ) {
90
92
return callback ( err ) ;
91
93
}
@@ -104,13 +106,62 @@ var search = function(query, options, callback) {
104
106
} ;
105
107
106
108
109
+ /**
110
+ * Retrieves a Volume resource based on ID.
111
+ *
112
+ * https://developers.google.com/books/docs/v1/reference/volumes/get
113
+ *
114
+ * @param {String } volumeId
115
+ * @param {Function } callback
116
+ */
117
+ var lookup = function ( volumeId , options , callback ) {
118
+
119
+ var query = { } ;
120
+
121
+ // Make the options object optional
122
+ if ( ! _ . isFunction ( callback ) ) {
123
+ callback = options ;
124
+ options = { } ;
125
+ }
126
+
127
+ if ( ! volumeId ) {
128
+ return callback ( new Error ( 'Volume ID is required' ) ) ;
129
+ }
130
+
131
+ if ( options . key ) {
132
+ query . key = options . key ;
133
+ }
134
+
135
+ sendRequest ( '/volumes/' + volumeId , query , function ( err , response ) {
136
+ if ( err ) {
137
+ return callback ( err ) ;
138
+ }
139
+
140
+ if ( ! response . id || response . id !== volumeId ) {
141
+ return callback ( null , null ) ;
142
+ }
143
+
144
+ callback ( null , parseBook ( response ) , response ) ;
145
+ } ) ;
146
+ } ;
147
+
148
+
107
149
/**
108
150
* Send a Google Books API request
109
151
*
110
152
* @return {void }
111
153
*/
112
- var sendRequest = function ( params , callback ) {
113
- var url = API_BASE_URL + querystring . stringify ( params ) ;
154
+ var sendRequest = function ( path , params , callback ) {
155
+ var url = API_BASE_URL ;
156
+
157
+ if ( path ) {
158
+ url += path ;
159
+ }
160
+
161
+ if ( params ) {
162
+ url += '?' + querystring . stringify ( params ) ;
163
+ }
164
+
114
165
https . get ( url , function ( response ) {
115
166
if ( response . statusCode !== 200 ) {
116
167
return callback ( new Error ( 'Google Books API error. Status Code: ' + response . statusCode ) ) ;
@@ -125,7 +176,12 @@ var sendRequest = function(params, callback) {
125
176
response . on ( 'end' , function ( ) {
126
177
try {
127
178
var data = JSON . parse ( body ) ;
128
- callback ( null , data ) ;
179
+
180
+ if ( data . error ) {
181
+ callback ( new Error ( data . error . message ) ) ;
182
+ } else {
183
+ callback ( null , data ) ;
184
+ }
129
185
} catch ( e ) {
130
186
callback ( new Error ( 'Invalid response from Google Books API.' ) ) ;
131
187
}
@@ -162,3 +218,4 @@ var parseBook = function(data) {
162
218
163
219
164
220
module . exports . search = search ;
221
+ module . exports . lookup = lookup ;
0 commit comments