@@ -55,12 +55,16 @@ export const useBackupRestoreStore = defineStore('backupRestoreStore', {
55
55
const filePath = `${ input . backupFolder } /${ input . backupFileName } .${ input . backupFileType } ` ;
56
56
let searchAfter : any [ ] | undefined = undefined ;
57
57
let hasMore = true ;
58
+ let appendFile = false ;
58
59
59
60
try {
60
61
this . backupProgress = {
61
62
complete : 0 ,
62
63
total : ( await client . get ( `/${ input . index } /_count` ) ) . count ,
63
64
} ;
65
+ const { [ input . index ] : backupIndexMapping } = await client . get ( `/${ input . index } /_mapping` ) ;
66
+ const csvHeaders = buildCsvHeaders ( backupIndexMapping ) ;
67
+ let dataToWrite = input . backupFileType === 'json' ? '' : csvHeaders . join ( ',' ) + '\r\n' ;
64
68
65
69
while ( hasMore ) {
66
70
const response = await client . get (
@@ -90,11 +94,13 @@ export const useBackupRestoreStore = defineStore('backupRestoreStore', {
90
94
hasMore = false ;
91
95
} else {
92
96
searchAfter = hits [ hits . length - 1 ] . sort ;
93
- const dataToWrite =
97
+ dataToWrite + =
94
98
input . backupFileType === 'json'
95
99
? JSON . stringify ( hits )
96
- : JSON . stringify ( convertToCsv ( hits ) ) ;
97
- await sourceFileApi . saveFile ( filePath , dataToWrite , true ) ;
100
+ : convertToCsv ( csvHeaders , hits ) ;
101
+ await sourceFileApi . saveFile ( filePath , dataToWrite , appendFile ) ;
102
+ dataToWrite = '' ;
103
+ appendFile = true ;
98
104
}
99
105
}
100
106
return filePath ;
@@ -108,28 +114,29 @@ export const useBackupRestoreStore = defineStore('backupRestoreStore', {
108
114
} ,
109
115
} ) ;
110
116
111
- const flattenObject = ( obj : any , parent : string = '' , res : any = { } ) => {
112
- for ( let key in obj ) {
113
- const propName = parent ? ` ${ parent } . ${ key } ` : key ;
114
- if ( typeof obj [ key ] === 'object' && obj [ key ] !== null ) {
115
- flattenObject ( obj [ key ] , propName , res ) ;
116
- } else {
117
- res [ propName ] = obj [ key ] ;
118
- }
119
- }
120
- return res ;
117
+ const buildCsvHeaders = ( {
118
+ mappings ,
119
+ } : {
120
+ mappings : {
121
+ properties : {
122
+ [ key : string ] : unknown ;
123
+ } ;
124
+ } ;
125
+ } ) => {
126
+ return Object . keys ( mappings . properties ) ;
121
127
} ;
122
128
123
- const convertToCsv = ( data : any [ ] ) => {
124
- if ( data . length === 0 ) {
125
- return { headers : [ ] , data : [ ] } ;
126
- }
127
-
128
- const flattenedData = data . map ( row => flattenObject ( row ) ) ;
129
- const headers = Array . from ( new Set ( flattenedData . flatMap ( row => Object . keys ( row ) ) ) ) ;
130
- const csvRows = flattenedData . map ( row =>
131
- headers . map ( header => JSON . stringify ( row [ header ] ?? '' ) ) . join ( ',' ) ,
132
- ) ;
133
-
134
- return { headers, data : csvRows } ;
129
+ const convertToCsv = ( headers : Array < string > , data : unknown [ ] ) => {
130
+ return data
131
+ . map ( item =>
132
+ headers
133
+ . map ( header => {
134
+ const data = get ( item , `_source.${ header } ` , null ) ;
135
+ return data === null || ! [ 'object' , 'symbol' , 'function' ] . includes ( typeof data )
136
+ ? data
137
+ : JSON . stringify ( data ) ;
138
+ } )
139
+ . join ( ',' ) ,
140
+ )
141
+ . join ( '\r\n' ) ;
135
142
} ;
0 commit comments