@@ -22,38 +22,38 @@ var (
22
22
)
23
23
24
24
const (
25
- DefaultFieldNameFirstName = "first_name"
26
- DefaultFieldNameLastName = "last_name"
27
- DefaultFieldNameEmail = "email"
28
- DefaultFieldNamePassword = "password"
25
+ DefaultFieldFirstName = "first_name"
26
+ DefaultFieldLastName = "last_name"
27
+ DefaultFieldEmail = "email"
28
+ DefaultFieldPassword = "password"
29
29
)
30
30
31
- type FormConfig [T any ] struct {
31
+ type HTTPConfig [T any ] struct {
32
32
* Config [T ]
33
33
34
- FirstNameFieldName string // optional (default: DefaultFieldNameFirstName )
35
- LastNameFieldName string // optional (default: DefaultFieldNameLastName )
36
- EmailFieldName string // optional (default: DefaultFieldNameEmail )
37
- PasswordFieldName string // optional (default: DefaultFieldNamePassword )
34
+ FieldFirstName string // optional (default: DefaultFieldFirstName )
35
+ FieldLastName string // optional (default: DefaultFieldLastName )
36
+ FieldEmail string // optional (default: DefaultFieldEmail )
37
+ FieldPassword string // optional (default: DefaultFieldPassword )
38
38
}
39
39
40
- func (c * FormConfig [T ]) defaults () {
41
- c .FirstNameFieldName = cmp .Or (c .FirstNameFieldName , DefaultFieldNameEmail )
42
- c .LastNameFieldName = cmp .Or (c .LastNameFieldName , DefaultFieldNameEmail )
43
- c .EmailFieldName = cmp .Or (c .EmailFieldName , DefaultFieldNameEmail )
44
- c .PasswordFieldName = cmp .Or (c .PasswordFieldName , DefaultFieldNameEmail )
40
+ func (c * HTTPConfig [T ]) defaults () {
41
+ c .FieldFirstName = cmp .Or (c .FieldFirstName , DefaultFieldEmail )
42
+ c .FieldLastName = cmp .Or (c .FieldLastName , DefaultFieldEmail )
43
+ c .FieldEmail = cmp .Or (c .FieldEmail , DefaultFieldEmail )
44
+ c .FieldPassword = cmp .Or (c .FieldPassword , DefaultFieldEmail )
45
45
if c .Config == nil {
46
46
c .Config = NewConfig [T ]()
47
47
}
48
48
}
49
49
50
- func (c * FormConfig [T ]) assert () {
50
+ func (c * HTTPConfig [T ]) assert () {
51
51
debug .Assert (c .Config != nil , "Config must be set" )
52
52
}
53
53
54
- // NewFormConfig [T] creates a new FormConfig[T] with the given configuration options.
55
- func NewFormConfig [T any ](opts ... func (* FormConfig [T ])) * FormConfig [T ] {
56
- var config FormConfig [T ]
54
+ // NewHTTPConfig [T] creates a new FormConfig[T] with the given configuration options.
55
+ func NewHTTPConfig [T any ](opts ... func (* HTTPConfig [T ])) * HTTPConfig [T ] {
56
+ var config HTTPConfig [T ]
57
57
for _ , opt := range opts {
58
58
opt (& config )
59
59
}
@@ -63,64 +63,59 @@ func NewFormConfig[T any](opts ...func(*FormConfig[T])) *FormConfig[T] {
63
63
return & config
64
64
}
65
65
66
- // FormHandler [T] is a wrapper around Handler handling HTTP form requests.
67
- type FormHandler [T any ] struct {
66
+ // HTTPHandler [T] is a wrapper around Handler handling HTTP form requests.
67
+ type HTTPHandler [T any ] struct {
68
68
handler * Handler [T ]
69
- config * FormConfig [T ]
69
+ config * HTTPConfig [T ]
70
+ parser HTTPRequestParser
70
71
}
71
72
72
- // NewFormHandler [T] creates a new FormHandler[T] with the given configuration.
73
+ // newHTTPHandler [T] creates a new FormHandler[T] with the given configuration.
73
74
//
74
75
// If config is nil, the default config is used.
75
- func NewFormHandler [T any ](pool * pgxpool.Pool , config * FormConfig [T ]) * FormHandler [T ] {
76
- if config == nil {
77
- config = NewFormConfig [T ]()
78
- }
79
- config .assert ()
80
-
81
- h := FormHandler [T ]{
76
+ func newHTTPHandler [T any ](pool * pgxpool.Pool , config * HTTPConfig [T ], parser HTTPRequestParser ) * HTTPHandler [T ] {
77
+ h := HTTPHandler [T ]{
82
78
NewHandler (pool , config .Config ),
83
79
config ,
80
+ parser ,
84
81
}
85
- h .assert ()
82
+
83
+ debug .Assert (h .handler != nil , "handler must be set" )
84
+ debug .Assert (h .config != nil , "config must be set" )
85
+ debug .Assert (h .parser != nil , "parser must be set" )
86
86
87
87
return & h
88
88
}
89
89
90
- func (h * FormHandler [T ]) assert () {
91
- debug .Assert (h .handler != nil , "handler must be set" )
92
- }
90
+ // NewFormHandler creates a new HTTP handler that handles multipart form requests.
91
+ func NewFormHandler [T any ](pool * pgxpool.Pool , config * HTTPConfig [T ]) * HTTPHandler [T ] {
92
+ if config == nil {
93
+ config = NewHTTPConfig [T ]()
94
+ }
95
+ config .assert ()
93
96
94
- // userRegistrationForm is the form for user login.
95
- type userRegistrationForm struct {
96
- FirstName string `mod:"trim"`
97
- LastName string `mod:"trim"`
98
- Email string `mod:"trim" validate:"required,email" scrub:"emails"`
99
- Password string `mod:"trim" validate:"required"`
97
+ return newHTTPHandler (pool , config , & formParser [T ]{config })
100
98
}
101
99
102
- // userLoginForm is the form for user login.
103
- type userLoginForm struct {
104
- Email string `mod:"trim" validate:"required,email" scrub:"emails"`
105
- Password string `mod:"trim" validate:"required"`
100
+ // NewJSONHandler creates a new HTTP handler that handles JSON requests.
101
+ func NewJSONHandler [T any ](pool * pgxpool.Pool , config * HTTPConfig [T ]) * HTTPHandler [T ] {
102
+ if config == nil {
103
+ config = NewHTTPConfig [T ]()
104
+ }
105
+ config .assert ()
106
+
107
+ return newHTTPHandler (pool , config , & jsonParser [T ]{config })
106
108
}
107
109
108
- func (h * FormHandler [T ]) parseUserRegistrationForm (
110
+ func (h * HTTPHandler [T ]) parseUserRegistrationData (
109
111
req * http.Request ,
110
- ) (* userRegistrationForm , error ) {
112
+ ) (* UserRegistrationData , error ) {
111
113
ctx := req .Context ()
112
-
113
- if err := req . ParseForm (); err != nil {
114
+ form , err := h . parser . ParseUserRegistrationData ( req )
115
+ if err != nil {
114
116
return nil , fmt .Errorf ("password: failed to parse request form: %w" , err )
115
117
}
116
118
117
- form := & userRegistrationForm {
118
- FirstName : req .PostFormValue (h .config .FirstNameFieldName ),
119
- LastName : req .PostFormValue (h .config .LastNameFieldName ),
120
- Email : req .PostFormValue (h .config .EmailFieldName ),
121
- Password : req .PostFormValue (h .config .PasswordFieldName ),
122
- }
123
-
124
119
if err := FormModifier .Struct (ctx , form ); err != nil {
125
120
return nil , fmt .Errorf ("password: failed to parse request form: %w" , err )
126
121
}
@@ -133,8 +128,8 @@ func (h *FormHandler[T]) parseUserRegistrationForm(
133
128
}
134
129
135
130
// HandleUserRegistration handles a user registration request.
136
- func (h * FormHandler [T ]) HandleUserRegistration (r * http.Request ) (* shield.User [T ], error ) {
137
- form , err := h .parseUserRegistrationForm (r )
131
+ func (h * HTTPHandler [T ]) HandleUserRegistration (r * http.Request ) (* shield.User [T ], error ) {
132
+ form , err := h .parseUserRegistrationData (r )
138
133
if err != nil {
139
134
return nil , httperror .FromError (err , http .StatusBadRequest )
140
135
}
@@ -151,18 +146,14 @@ func (h *FormHandler[T]) HandleUserRegistration(r *http.Request) (*shield.User[T
151
146
return result , nil
152
147
}
153
148
154
- func (h * FormHandler [T ]) parseUserLoginForm (req * http.Request ) (* userLoginForm , error ) {
149
+ func (h * HTTPHandler [T ]) parseUserLoginData (req * http.Request ) (* UserLoginData , error ) {
155
150
ctx := req .Context ()
156
151
157
- if err := req .ParseForm (); err != nil {
152
+ form , err := h .parser .ParseUserLoginData (req )
153
+ if err != nil {
158
154
return nil , fmt .Errorf ("password: failed to parse request form: %w" , err )
159
155
}
160
156
161
- form := & userLoginForm {
162
- Email : req .PostFormValue (h .config .EmailFieldName ),
163
- Password : req .PostFormValue (h .config .PasswordFieldName ),
164
- }
165
-
166
157
if err := FormModifier .Struct (ctx , form ); err != nil {
167
158
return nil , fmt .Errorf ("password: failed to parse request form: %w" , err )
168
159
}
@@ -175,8 +166,8 @@ func (h *FormHandler[T]) parseUserLoginForm(req *http.Request) (*userLoginForm,
175
166
}
176
167
177
168
// HandleUserLogin handles a user login request.
178
- func (h * FormHandler [T ]) HandleUserLogin (r * http.Request ) (* shield.User [T ], error ) {
179
- form , err := h .parseUserLoginForm (r )
169
+ func (h * HTTPHandler [T ]) HandleUserLogin (r * http.Request ) (* shield.User [T ], error ) {
170
+ form , err := h .parseUserLoginData (r )
180
171
if err != nil {
181
172
return nil , httperror .FromError (err , http .StatusBadRequest )
182
173
}
0 commit comments