@@ -5,6 +5,11 @@ const semver = require('semver');
5
5
const FormData = require ( 'form-data' ) ;
6
6
const { Cookie} = require ( 'tough-cookie' ) ;
7
7
8
+ const { promisify} = require ( 'util' ) ;
9
+ const stream = require ( 'stream' ) ;
10
+ const pipeline = promisify ( stream . pipeline ) ;
11
+ const fsp = require ( 'fs' ) . promises ;
12
+
8
13
const { SystemError} = require ( '../../errors' ) ;
9
14
10
15
const bases = {
@@ -15,6 +20,16 @@ const bases = {
15
20
5 : '/ghost/api/admin'
16
21
} ;
17
22
23
+ function streamFile ( url , options , filePath ) {
24
+ return pipeline (
25
+ got . stream ( url , { ...options } ) ,
26
+ fs . createWriteStream ( filePath )
27
+ ) . catch ( ( err ) => {
28
+ fsp . unlink ( filePath ) ;
29
+ throw err ;
30
+ } ) ;
31
+ }
32
+
18
33
function getBaseUrl ( version , url ) {
19
34
const basePath = bases [ semver . major ( version ) ] ;
20
35
@@ -128,26 +143,27 @@ async function runImport(version, url, auth, exportFile) {
128
143
129
144
async function downloadContentExport ( version , url , auth , outputFile ) {
130
145
const authOpts = await getAuthOpts ( version , url , auth ) ;
146
+ let endpoint = '/db/' ;
131
147
132
- await new Promise ( ( resolve , reject ) => {
133
- const ws = fs . createWriteStream ( outputFile ) ;
134
- const resp = got . stream ( '/db/' , { ...authOpts } ) . pipe ( ws ) ;
135
-
136
- resp . on ( 'finish' , ( ) => resolve ( ) ) . on ( 'error' , reject ) ;
137
- } ) ;
148
+ await streamFile ( endpoint , authOpts , outputFile ) ;
138
149
}
139
150
140
151
async function downloadMembersExport ( version , url , auth , outputFile ) {
141
152
const authOpts = await getAuthOpts ( version , url , auth ) ;
153
+ let endpoint = '/members/upload/' ;
142
154
143
- await new Promise ( ( resolve , reject ) => {
144
- const ws = fs . createWriteStream ( outputFile ) ;
145
- got
146
- . stream ( '/members/upload/' , { ...authOpts } )
147
- . on ( 'finish' , ( ) => resolve ( ) )
148
- . on ( 'error' , reject )
149
- . pipe ( ws ) ;
150
- } ) ;
155
+ if ( semver . lt ( version , '3.20.0' ) ) {
156
+ endpoint = '/members/csv/' ;
157
+ }
158
+
159
+ try {
160
+ await streamFile ( endpoint , authOpts , outputFile ) ;
161
+ } catch ( error ) {
162
+ // Members endpoint may not exist, we can ignore this
163
+ if ( error . statusCode !== 404 ) {
164
+ throw error ;
165
+ }
166
+ }
151
167
}
152
168
153
169
module . exports = {
0 commit comments