Skip to content

Commit ba4be86

Browse files
committed
feat: added password validation to validator service
* Added password validation to validator service * Added Birthdate and password validator options
1 parent c3c8179 commit ba4be86

File tree

5 files changed

+134
-17
lines changed

5 files changed

+134
-17
lines changed

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@ require github.com/ralvarezdev/go-flags v0.3.2 // indirect
66

77
require (
88
github.com/ralvarezdev/go-logger v0.4.6
9-
github.com/ralvarezdev/go-reflect v0.2.3
10-
github.com/ralvarezdev/go-strings v0.1.7
9+
github.com/ralvarezdev/go-reflect v0.2.4
10+
github.com/ralvarezdev/go-strings v0.1.9
1111
)

go.sum

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,8 @@
1-
github.com/ralvarezdev/go-flags v0.3.1 h1:YxGYUonmr0dwJL+9oDY/4GqCl1CYwYDJExpGXXMc9rU=
2-
github.com/ralvarezdev/go-flags v0.3.1/go.mod h1:R3yVBYvzwqfOp26LidaiJ/zftVAnPC3pKunVpV/vosE=
31
github.com/ralvarezdev/go-flags v0.3.2 h1:l3f62CD5NysLAJH5XqSRGiakU/dn4pTGdX4yaBlAmMw=
42
github.com/ralvarezdev/go-flags v0.3.2/go.mod h1:R3yVBYvzwqfOp26LidaiJ/zftVAnPC3pKunVpV/vosE=
5-
github.com/ralvarezdev/go-logger v0.4.5 h1:Lw7DdZUb4YSQDA7J9nv79soojw1eFHVVzO8wdE9d+Qg=
6-
github.com/ralvarezdev/go-logger v0.4.5/go.mod h1:vq47onxpED19/o3dh5/YbBKK0eZhqJENPgACYkqNNi8=
73
github.com/ralvarezdev/go-logger v0.4.6 h1:eZalm0WAdNuhzbaVh5D7gC6AFztdpqE/GQfjH2pipyE=
84
github.com/ralvarezdev/go-logger v0.4.6/go.mod h1:zxuMDHqtV2eoJYtmo219lima0ZSk4p/AGj/cCc390P8=
9-
github.com/ralvarezdev/go-reflect v0.1.0 h1:q0CypQURgOgxkLHilYVFazYi3nlSxNdkjSoYpuhFYOA=
10-
github.com/ralvarezdev/go-reflect v0.1.0/go.mod h1:jv3EqQfUixWtNeJd/Rnzf0IDcYZ1z3GApRdAGQHdHZQ=
11-
github.com/ralvarezdev/go-reflect v0.2.3 h1:WXtgMbZ1LFKjyzi2W3JetgQCJcT/N2erDv12ZZaaLBI=
12-
github.com/ralvarezdev/go-reflect v0.2.3/go.mod h1:jv3EqQfUixWtNeJd/Rnzf0IDcYZ1z3GApRdAGQHdHZQ=
13-
github.com/ralvarezdev/go-strings v0.1.0 h1:bE4eEkdfsHwpgUw+s8/EdLPkRTPki/FTGZx8iEOOQBQ=
14-
github.com/ralvarezdev/go-strings v0.1.0/go.mod h1:8sFOqmPJpqzS7bTjf91EzUCITnwpmkfifwY80GxV5r8=
15-
github.com/ralvarezdev/go-strings v0.1.7 h1:rO+4TJmHJTghRWl4Nq6gfnGSyNRerunJrkS03x1SLz4=
16-
github.com/ralvarezdev/go-strings v0.1.7/go.mod h1:8sFOqmPJpqzS7bTjf91EzUCITnwpmkfifwY80GxV5r8=
5+
github.com/ralvarezdev/go-reflect v0.2.4 h1:PLyzbrdNvUiRzpxSHuI9b7hJEhFes22gjNLZkbjn5AQ=
6+
github.com/ralvarezdev/go-reflect v0.2.4/go.mod h1:jv3EqQfUixWtNeJd/Rnzf0IDcYZ1z3GApRdAGQHdHZQ=
7+
github.com/ralvarezdev/go-strings v0.1.9 h1:FyYTJW+EnkWFp5C9GsK6wTt3rXIwPt3mUbsTAFUuAT8=
8+
github.com/ralvarezdev/go-strings v0.1.9/go.mod h1:8sFOqmPJpqzS7bTjf91EzUCITnwpmkfifwY80GxV5r8=

struct/field/birthdate/errors.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,6 @@ import (
66

77
var (
88
ErrInvalidBirthdate = errors.New("invalid birthdate")
9+
ErrMinimumAge = "age must be greater than or equal to %d"
10+
ErrMaximumAge = "age must be less than or equal to %d"
911
)

struct/field/password/errors.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package password
2+
3+
var (
4+
ErrMinimumLength = "password must be longer than %d"
5+
ErrMinimumSpecialCount = "password must have at least %d special characters"
6+
ErrMinimumNumbersCount = "password must have at least %d numbers"
7+
ErrMinimumCapsCount = "password must have at least %d capital letters"
8+
)

struct/mapper/validator/service.go

Lines changed: 118 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package validator
22

33
import (
4+
"fmt"
45
goreflect "github.com/ralvarezdev/go-reflect"
6+
gostringscount "github.com/ralvarezdev/go-strings/count"
57
govalidatorfieldbirthdate "github.com/ralvarezdev/go-validator/struct/field/birthdate"
68
govalidatorfieldmail "github.com/ralvarezdev/go-validator/struct/field/mail"
9+
govalidatorfieldpassword "github.com/ralvarezdev/go-validator/struct/field/password"
710
govalidatormapper "github.com/ralvarezdev/go-validator/struct/mapper"
811
govalidatormapperparser "github.com/ralvarezdev/go-validator/struct/mapper/parser"
912
govalidatormappervalidation "github.com/ralvarezdev/go-validator/struct/mapper/validation"
@@ -29,7 +32,14 @@ type (
2932
)
3033
Birthdate(
3134
birthdateField string,
32-
birthdate *time.Time,
35+
birthdate time.Time,
36+
options *BirthdateOptions,
37+
validations *govalidatormappervalidation.StructValidations,
38+
)
39+
Password(
40+
passwordField string,
41+
password string,
42+
options *PasswordOptions,
3343
validations *govalidatormappervalidation.StructValidations,
3444
)
3545
CreateValidateFn(
@@ -47,6 +57,20 @@ type (
4757
parser govalidatormapperparser.Parser
4858
validator Validator
4959
}
60+
61+
// BirthdateOptions is the birthdate options struct
62+
BirthdateOptions struct {
63+
MinimumAge int
64+
MaximumAge int
65+
}
66+
67+
// PasswordOptions is the password options struct
68+
PasswordOptions struct {
69+
MinimumLength int
70+
MinimumSpecialCount int
71+
MinimumNumbersCount int
72+
MinimumCapsCount int
73+
}
5074
)
5175

5276
// NewDefaultService creates a new default validator service
@@ -113,15 +137,106 @@ func (d *DefaultService) Email(
113137
// Birthdate validates the birthdate field
114138
func (d *DefaultService) Birthdate(
115139
birthdateField string,
116-
birthdate *time.Time,
140+
birthdate time.Time,
141+
options *BirthdateOptions,
117142
validations *govalidatormappervalidation.StructValidations,
118143
) {
119-
if birthdate == nil || birthdate.After(time.Now()) {
144+
// Check if the birthdate is after the current time
145+
if birthdate.After(time.Now()) {
120146
validations.AddFieldValidationError(
121147
birthdateField,
122148
govalidatorfieldbirthdate.ErrInvalidBirthdate,
123149
)
124150
}
151+
152+
// Check if the birthdate options are nil
153+
if options == nil {
154+
return
155+
}
156+
157+
// Check if the birthdate is before the minimum age
158+
if options.MinimumAge > 0 {
159+
if time.Now().AddDate(-options.MinimumAge, 0, 0).Before(birthdate) {
160+
validations.AddFieldValidationError(
161+
birthdateField,
162+
fmt.Errorf(
163+
govalidatorfieldbirthdate.ErrMinimumAge,
164+
options.MinimumAge,
165+
),
166+
)
167+
}
168+
}
169+
170+
// Check if the birthdate is after the maximum age
171+
if options.MaximumAge > 0 {
172+
if time.Now().AddDate(-options.MaximumAge, 0, 0).After(birthdate) {
173+
validations.AddFieldValidationError(
174+
birthdateField,
175+
fmt.Errorf(
176+
govalidatorfieldbirthdate.ErrMaximumAge,
177+
options.MaximumAge,
178+
),
179+
)
180+
}
181+
}
182+
}
183+
184+
// Password validates the password field
185+
func (d *DefaultService) Password(
186+
passwordField string,
187+
password string,
188+
options *PasswordOptions,
189+
validations *govalidatormappervalidation.StructValidations,
190+
) {
191+
// Check if the password length is less than the minimum length
192+
if options.MinimumLength > 0 && len(password) < options.MinimumLength {
193+
validations.AddFieldValidationError(
194+
passwordField,
195+
fmt.Errorf(
196+
govalidatorfieldpassword.ErrMinimumLength,
197+
options.MinimumLength,
198+
),
199+
)
200+
}
201+
202+
// Check if the password contains the minimum special characters
203+
if options.MinimumSpecialCount > 0 {
204+
if count := gostringscount.Special(password); count < options.MinimumSpecialCount {
205+
validations.AddFieldValidationError(
206+
passwordField,
207+
fmt.Errorf(
208+
govalidatorfieldpassword.ErrMinimumSpecialCount,
209+
options.MinimumSpecialCount,
210+
),
211+
)
212+
}
213+
}
214+
215+
// Check if the password contains the minimum numbers
216+
if options.MinimumNumbersCount > 0 {
217+
if count := gostringscount.Numbers(password); count < options.MinimumNumbersCount {
218+
validations.AddFieldValidationError(
219+
passwordField,
220+
fmt.Errorf(
221+
govalidatorfieldpassword.ErrMinimumNumbersCount,
222+
options.MinimumNumbersCount,
223+
),
224+
)
225+
}
226+
}
227+
228+
// Check if the password contains the minimum caps
229+
if options.MinimumCapsCount > 0 {
230+
if count := gostringscount.Caps(password); count < options.MinimumCapsCount {
231+
validations.AddFieldValidationError(
232+
passwordField,
233+
fmt.Errorf(
234+
govalidatorfieldpassword.ErrMinimumCapsCount,
235+
options.MinimumCapsCount,
236+
),
237+
)
238+
}
239+
}
125240
}
126241

127242
// CreateValidateFn creates a validate function for the request body using the validator

0 commit comments

Comments
 (0)