1
+ import FormData from "form-data" ;
2
+
1
3
const requestMetadataKey = "request" ;
4
+ const mpFormMetadataKey = "multipart_form" ;
2
5
3
- export function SerializeRequestBody ( request : any ) : [ string , unknown ] {
6
+ export function SerializeRequestBody (
7
+ request : any
8
+ ) : [ object , string | FormData ] {
4
9
const fieldNames : string [ ] = Object . getOwnPropertyNames ( request ) ;
5
- let [ mediaType , requestBody ] : [ string , unknown ] = [ "" , "" ] ;
10
+ let [ requestHeaders , requestBody ] : [ object , string | FormData ] = [ { } , "" ] ;
6
11
fieldNames . forEach ( ( fname ) => {
7
12
const requestAnn : string = Reflect . getMetadata (
8
13
requestMetadataKey ,
@@ -15,18 +20,121 @@ export function SerializeRequestBody(request: any): [string, unknown] {
15
20
switch ( requestDecorator . MediaType ) {
16
21
case "multipart/form-data" :
17
22
case "multipart/mixed" :
18
- [ mediaType , requestBody ] = [
19
- requestDecorator . MediaType ,
20
- EncodeMultipartFormData ( request [ fname ] ) ,
21
- ] ;
23
+ requestBody = EncodeMultipartFormData ( request [ fname ] ) ;
24
+ requestHeaders = requestBody . getHeaders ( ) ;
22
25
break ;
23
26
case "application/json" :
24
27
case "text/json" :
25
28
default :
26
- [ mediaType , requestBody ] = [ requestDecorator . MediaType , request [ fname ] ] ;
29
+ [ requestHeaders , requestBody ] = [
30
+ { "Content-Type" : `"${ requestDecorator . MediaType } "` } ,
31
+ request [ fname ] ,
32
+ ] ;
33
+ }
34
+ } ) ;
35
+ return [ requestHeaders , requestBody ] ;
36
+ }
37
+
38
+ function EncodeMultipartFormData ( form : any ) : FormData {
39
+ const formData : FormData = new FormData ( ) ;
40
+ const fieldNames : string [ ] = Object . getOwnPropertyNames ( form ) ;
41
+ fieldNames . forEach ( ( fname ) => {
42
+ const mpFormAnn : string = Reflect . getMetadata (
43
+ mpFormMetadataKey ,
44
+ form ,
45
+ fname
46
+ ) ;
47
+ if ( mpFormAnn == null ) return ;
48
+ const mpFormDecorator : MultipartFormDecorator =
49
+ ParseMultipartFormDecorator ( mpFormAnn ) ;
50
+ if ( mpFormDecorator . File )
51
+ return EncodeMultipartFormDataFile ( formData , form [ fname ] ) ;
52
+ else if ( mpFormDecorator . JSON ) {
53
+ formData . append ( mpFormDecorator . Name , JSON . stringify ( form [ fname ] ) ) ;
54
+ } else {
55
+ // let formData: FormData = new FormData();
56
+ // const val: unknown = form[fname];
57
+ // if (Array.isArray(form[fname]))
58
+ // formData.append(mpFormDecorator.Name + "[]", val);
59
+ // else
60
+ // formData.append(mpFormDecorator.Name, val)
61
+ }
62
+ } ) ;
63
+ return formData ;
64
+ }
65
+
66
+ function EncodeMultipartFormDataFile (
67
+ formData : FormData ,
68
+ file : any
69
+ ) : FormData | Error {
70
+ if ( typeof file !== "object" || Array . isArray ( file ) || file == null ) {
71
+ return new Error ( "invalid type for multipart/form-data file" ) ;
72
+ }
73
+ const fieldNames : string [ ] = Object . getOwnPropertyNames ( file ) ;
74
+ const content : string | undefined = undefined ;
75
+ let fileName : string | undefined = undefined ;
76
+ fieldNames . forEach ( ( fname ) => {
77
+ const mpFormAnn : string = Reflect . getMetadata (
78
+ mpFormMetadataKey ,
79
+ file ,
80
+ fname
81
+ ) ;
82
+ if ( mpFormAnn == null ) return ;
83
+ const mpFormDecorator : MultipartFormDecorator =
84
+ ParseMultipartFormDecorator ( mpFormAnn ) ;
85
+ let content = "" ;
86
+ if ( ! mpFormDecorator . Content && mpFormDecorator . Name == "" ) return ;
87
+ if ( mpFormDecorator . Content ) content = file [ fname ] ;
88
+ else fileName = file [ fname ] ;
89
+ } ) ;
90
+
91
+ if ( content == null || fileName == null )
92
+ return new Error ( "invalid multipart/form-data file" ) ;
93
+ formData . append ( fileName ! , content ! ) ;
94
+ return formData ;
95
+ }
96
+
97
+ function ParseMultipartFormDecorator (
98
+ mpFormAnn : string
99
+ ) : MultipartFormDecorator {
100
+ // example "name=file"
101
+ const mpFormDecorator : MultipartFormDecorator = new MultipartFormDecorator (
102
+ false ,
103
+ false ,
104
+ false ,
105
+ ""
106
+ ) ;
107
+ mpFormAnn . split ( ";" ) . forEach ( ( mpFormAnnPart ) => {
108
+ const [ mpFormKey , mpFormVal ] : string [ ] = mpFormAnnPart . split ( "=" ) ;
109
+ switch ( mpFormKey ) {
110
+ case "file" :
111
+ mpFormDecorator . File = mpFormVal == "true" ;
112
+ break ;
113
+ case "content" :
114
+ mpFormDecorator . Content = mpFormVal == "true" ;
115
+ break ;
116
+ case "name" :
117
+ mpFormDecorator . Name = mpFormVal ;
118
+ break ;
119
+ case "json" :
120
+ mpFormDecorator . JSON = mpFormVal == "true" ;
27
121
}
28
122
} ) ;
29
- return [ mediaType , requestBody ] ;
123
+
124
+ return mpFormDecorator ;
125
+ }
126
+
127
+ class MultipartFormDecorator {
128
+ File : boolean ;
129
+ Content : boolean ;
130
+ JSON : boolean ;
131
+ Name : string ;
132
+ constructor ( File : boolean , Content : boolean , JSON : boolean , Name : string ) {
133
+ this . File = File ;
134
+ this . Content = Content ;
135
+ this . JSON = JSON ;
136
+ this . Name = Name ;
137
+ }
30
138
}
31
139
32
140
function ParseRequestDecorator ( requestAnn : string ) : RequestDecorator {
0 commit comments