@@ -28,6 +28,7 @@ export default function ApiAction(props: Props) {
28
28
const [ sendingRequest , setSendingRequest ] = useState ( false ) ;
29
29
const [ queryParams , setQueryParams ] = useState ( '' ) ;
30
30
const [ bodyParams , setBodyParams ] = useState ( '' ) ;
31
+ const [ fileParams , setFileParams ] = useState ( null ) ;
31
32
const [ responseData , setResponseData ] = useState ( "" ) ;
32
33
const [ sqlQueriesCount , setSqlQueriesCount ] = useState ( 0 ) ;
33
34
const [ sqlData , setSqlData ] = useState ( "" ) ;
@@ -37,13 +38,20 @@ export default function ApiAction(props: Props) {
37
38
const [ responseHeaders , setResponseHeaders ] = useState ( "" ) ;
38
39
const [ activeTab , setActiveTab ] = useState ( 'info' ) ;
39
40
40
- const handleFileChange = ( files : any ) => {
41
- const bodyAppend = JSON . parse ( bodyParams )
42
- bodyAppend [ "avatar" ] = files [ 0 ]
43
- setBodyParams ( JSON . stringify ( bodyAppend ) )
41
+ const handleFileChange = ( files : any , file : any ) => {
42
+ const formData : any = new FormData ( )
43
+ if ( file . includes ( '.*' ) ) {
44
+ const fileParam = file . replace ( '.*' , '' )
45
+ for ( let i = 0 ; i < files . length ; i ++ ) {
46
+ formData . append ( `${ fileParam } [${ i } ]` , files [ i ] ) ;
47
+ }
48
+ } else {
49
+ formData . append ( file , files [ 0 ] )
50
+ }
51
+ setFileParams ( formData )
44
52
}
45
53
46
- // // update localstorage
54
+ // // update localstorage
47
55
const updateLocalStorage = ( ) => {
48
56
const jsonAllParamsRegistry = JSON . parse ( allParamsRegistry )
49
57
if ( method == 'GET' || method == 'HEAD' || method == 'DELETE' ) {
@@ -57,7 +65,6 @@ export default function ApiAction(props: Props) {
57
65
}
58
66
59
67
const handleSendRequest = ( ) => {
60
- updateLocalStorage ( )
61
68
try {
62
69
JSON . parse ( requestHeaders )
63
70
} catch ( error : any ) {
@@ -66,6 +73,10 @@ export default function ApiAction(props: Props) {
66
73
}
67
74
const headers = JSON . parse ( requestHeaders )
68
75
headers [ 'X-Request-LRD' ] = true
76
+ if ( fileParams != null ) {
77
+ delete headers [ 'Content-Type' ]
78
+ headers [ 'Accept' ] = 'multipart/form-data'
79
+ }
69
80
70
81
const options : any = {
71
82
credentials : "include" ,
@@ -76,11 +87,22 @@ export default function ApiAction(props: Props) {
76
87
if ( method == 'POST' || method == 'PUT' || method == 'PATCH' ) {
77
88
try {
78
89
JSON . parse ( bodyParams )
90
+ if ( fileParams != null ) {
91
+ for ( const [ key , value ] of Object . entries ( JSON . parse ( bodyParams ) ) ) {
92
+ fileParams . append ( key , value )
93
+ }
94
+ }
95
+
79
96
} catch ( error : any ) {
80
97
setError ( "Request body incorrect: " + error . message )
81
98
return
82
99
}
83
- options [ 'body' ] = bodyParams
100
+
101
+ if ( fileParams != null ) {
102
+ options [ 'body' ] = fileParams // includes body as well
103
+ } else {
104
+ options [ 'body' ] = bodyParams // just the body
105
+ }
84
106
}
85
107
86
108
const startTime = performance . now ( ) ;
@@ -93,51 +115,53 @@ export default function ApiAction(props: Props) {
93
115
setError ( null )
94
116
95
117
fetch ( `${ host } /${ requestUri } ${ queryParams } ` , options )
96
- . then ( ( response ) => {
97
- let timeTaken = performance . now ( ) - startTime
98
- // round to 3 decimals
99
- timeTaken = Math . round ( ( timeTaken + Number . EPSILON ) * 1000 ) / 1000
100
- setTimeTaken ( timeTaken )
101
- setResponseStatus ( response . status )
102
- setResponseHeaders ( JSON . stringify ( Object . fromEntries ( response . headers ) , null , 2 ) )
103
- setSendingRequest ( false )
104
- return response . json ( ) ;
105
- } ) . then ( ( data ) => {
106
-
107
- if ( data && data . _lrd && data . _lrd . queries ) {
108
- const sqlQueries = data . _lrd . queries . map ( ( query : any ) => {
109
- return "Connection: "
110
- + query . connection_name
111
- + " Time taken: "
112
- + query . time
113
- + "ms: \n"
114
- + query . sql + "\n"
115
- } ) . join ( "\n" )
116
- setSqlData ( sqlQueries )
117
- setSqlQueriesCount ( data . _lrd . queries . length )
118
- }
119
- if ( data && data . _lrd && data . _lrd . logs ) {
120
- let logs = ""
121
- for ( const value of data . _lrd . logs ) {
122
- logs += value . level + ": " + value . message + "\n"
118
+ . then ( ( response ) => {
119
+ let timeTaken = performance . now ( ) - startTime
120
+ // round to 3 decimals
121
+ timeTaken = Math . round ( ( timeTaken + Number . EPSILON ) * 1000 ) / 1000
122
+ setTimeTaken ( timeTaken )
123
+ setResponseStatus ( response . status )
124
+ setResponseHeaders ( JSON . stringify ( Object . fromEntries ( response . headers ) , null , 2 ) )
125
+ setSendingRequest ( false )
126
+ return response . json ( ) ;
127
+ } ) . then ( ( data ) => {
128
+
129
+ if ( data && data . _lrd && data . _lrd . queries ) {
130
+ const sqlQueries = data . _lrd . queries . map ( ( query : any ) => {
131
+ return "Connection: "
132
+ + query . connection_name
133
+ + " Time taken: "
134
+ + query . time
135
+ + "ms: \n"
136
+ + query . sql + "\n"
137
+ } ) . join ( "\n" )
138
+ setSqlData ( sqlQueries )
139
+ setSqlQueriesCount ( data . _lrd . queries . length )
123
140
}
124
- setLogData ( logs )
125
- }
126
- if ( data && data . _lrd && data . _lrd . memory ) {
127
- setServerMemory ( data . _lrd . memory )
128
- }
129
- // remove key _lrd from response
130
- if ( data && data . _lrd ) {
131
- delete data . _lrd
132
- }
133
- setResponseData ( JSON . stringify ( data , null , 2 ) )
134
- setActiveTab ( 'response' )
135
- } ) . catch ( ( error ) => {
136
- setError ( "Response error: " + error )
137
- setResponseStatus ( 500 )
138
- setSendingRequest ( false )
139
- setActiveTab ( 'response' )
140
- } )
141
+ if ( data && data . _lrd && data . _lrd . logs ) {
142
+ let logs = ""
143
+ for ( const value of data . _lrd . logs ) {
144
+ logs += value . level + ": " + value . message + "\n"
145
+ }
146
+ setLogData ( logs )
147
+ }
148
+ if ( data && data . _lrd && data . _lrd . memory ) {
149
+ setServerMemory ( data . _lrd . memory )
150
+ }
151
+ // remove key _lrd from response
152
+ if ( data && data . _lrd ) {
153
+ delete data . _lrd
154
+ }
155
+ setResponseData ( JSON . stringify ( data , null , 2 ) )
156
+ setActiveTab ( 'response' )
157
+ updateLocalStorage ( )
158
+ } ) . catch ( ( error ) => {
159
+ setError ( "Response error: " + error )
160
+ setResponseStatus ( 500 )
161
+ setSendingRequest ( false )
162
+ setActiveTab ( 'response' )
163
+ updateLocalStorage ( )
164
+ } )
141
165
142
166
}
143
167
@@ -176,7 +200,27 @@ export default function ApiAction(props: Props) {
176
200
return
177
201
}
178
202
const body : any = { }
179
- for ( const [ key ] of Object . entries ( lrdDocsItem . rules ) ) {
203
+ for ( const [ key , rule ] of Object . entries ( lrdDocsItem . rules ) ) {
204
+ if ( rule . length == 0 ) {
205
+ continue
206
+ }
207
+ const theRule = rule [ 0 ] . split ( "|" )
208
+ if ( theRule . includes ( 'file' ) || theRule . includes ( 'image' ) ) {
209
+ continue
210
+ }
211
+ if ( key . includes ( ".*" ) ) {
212
+ body [ key ] = [ ]
213
+ continue
214
+ }
215
+ if ( key . includes ( "." ) ) {
216
+ const keys = key . split ( "." )
217
+ if ( keys . length == 2 ) {
218
+ body [ keys [ 0 ] ] = { }
219
+ body [ keys [ 0 ] ] [ keys [ 1 ] ] = ""
220
+ }
221
+ continue
222
+ }
223
+
180
224
body [ key ] = ""
181
225
}
182
226
const jsonBody = JSON . stringify ( body , null , 2 )
@@ -213,6 +257,7 @@ export default function ApiAction(props: Props) {
213
257
) }
214
258
{ activeTab == 'request' && (
215
259
< ApiActionRequest
260
+ lrdDocsItem = { lrdDocsItem }
216
261
requestUri = { requestUri }
217
262
method = { method }
218
263
sendingRequest = { sendingRequest }
0 commit comments