@@ -103,6 +103,10 @@ module.exports = class Flattener {
103103 }
104104
105105 static requestUnflattener ( request , response , next ) {
106+ if ( request . originalUrl . includes ( '.csv?' ) ) {
107+ return next ( ) ;
108+ }
109+
106110 try {
107111 if ( ! _ . isEmpty ( request . body ?. data ?. attributes ) ) {
108112 Flattener . _unflattenAttributes ( request ) ;
@@ -117,8 +121,23 @@ module.exports = class Flattener {
117121 if ( ! _ . isEmpty ( request . query ?. context ) ) {
118122 request . query . context . field = Flattener . unflattenFieldName ( request . query . context . field ) ;
119123 }
120- next ( ) ;
121- } catch ( error ) { next ( error ) ; }
124+ return next ( ) ;
125+ } catch ( error ) { return next ( error ) ; }
126+ }
127+
128+ static unflattenParams ( params ) {
129+ const unflattenedParams = JSON . parse ( JSON . stringify ( params ) ) ;
130+
131+ if ( unflattenedParams . fields ) {
132+ Object . entries ( unflattenedParams . fields ) . forEach ( ( [ collection , requestedFields ] ) => {
133+ if ( Flattener . _isFieldFlattened ( requestedFields ) ) {
134+ unflattenedParams
135+ . fields [ collection ] = Flattener . _unflattenCollectionFields ( requestedFields ) ;
136+ }
137+ } ) ;
138+ }
139+
140+ return unflattenedParams ;
122141 }
123142
124143 validateOptions ( ) {
@@ -249,4 +268,35 @@ module.exports = class Flattener {
249268 return flattenedReferences . filter ( ( flattenedReference ) =>
250269 collectionReferenceFields . some ( ( { field } ) => field === flattenedReference ) ) ;
251270 }
271+
272+ static generateNestedPathsFromModelName ( modelName ) {
273+ if ( ! modelName ) return [ ] ;
274+
275+ const modelFields = ( Interface . Schemas . schemas [ modelName ] ?. fields || [ ] ) ;
276+ const flattenedFields = modelFields
277+ . filter ( ( field ) => this . _isFieldFlattened ( field . field ) && ! Array . isArray ( field . type ) ) ;
278+
279+ return flattenedFields . map ( ( field ) => this . splitOnSeparator ( field . field ) ) ;
280+ }
281+
282+ static flattenRecordsForExport ( modelName , records ) {
283+ const nestedPaths = this . generateNestedPathsFromModelName ( modelName ) ;
284+
285+ if ( ! nestedPaths || nestedPaths . length === 0 ) return records ;
286+
287+ records . forEach ( ( record ) => {
288+ const flattenedFields = new Set ( ) ;
289+
290+ nestedPaths . forEach ( ( nestedPath ) => {
291+ const flattenFieldName = nestedPath . join ( FLATTEN_SEPARATOR ) ;
292+ record [ flattenFieldName ] = nestedPath
293+ . reduce ( ( embedded , attribute ) => ( embedded ? embedded [ attribute ] : null ) , record ) ;
294+ flattenedFields . add ( nestedPath [ 0 ] ) ;
295+ } ) ;
296+
297+ flattenedFields . forEach ( ( flattenedField ) => delete record [ flattenedField ] ) ;
298+ } ) ;
299+
300+ return records ;
301+ }
252302} ;
0 commit comments