diff options
| author | Vidhu Kant Sharma <vidhukant@vidhukant.com> | 2023-09-03 22:29:46 +0530 | 
|---|---|---|
| committer | Vidhu Kant Sharma <vidhukant@vidhukant.com> | 2023-09-03 22:29:46 +0530 | 
| commit | 46083ff15e16b0b49132af9466bcab7c2ae71322 (patch) | |
| tree | bc29d36293c459342c90d6f89b19c8be666ed327 | |
| parent | 620fb2f89b5acd70af4ed075b4797f81a3f1d109 (diff) | |
validating phone number and website
| -rw-r--r-- | customer/validators.go | 25 | ||||
| -rw-r--r-- | errors/errors.go | 2 | ||||
| -rw-r--r-- | errors/status.go | 3 | ||||
| -rw-r--r-- | main.go | 2 | 
4 files changed, 30 insertions, 2 deletions
diff --git a/customer/validators.go b/customer/validators.go index 482d532..086750f 100644 --- a/customer/validators.go +++ b/customer/validators.go @@ -21,10 +21,17 @@ import (  	"regexp"  	"strings"  	"net/mail" +	"net/url"  	"vidhukant.com/openbills/errors"  	e "errors"  ) +var phoneRegex, gstinRegex, urlRegex *regexp.Regexp +func init() { +	phoneRegex = regexp.MustCompile(`^(?:(?:\(?(?:00|\+)([1-4]\d\d|[1-9]\d?)\)?)?[\-\.\ \\\/]?)?((?:\(?\d{1,}\)?[\-\.\ \\\/]?){0,})(?:[\-\.\ \\\/]?(?:#|ext\.?|extension|x)[\-\.\ \\\/]?(\d+))?$`) +	gstinRegex = regexp.MustCompile(`^[0-9]{2}[A-Z]{5}[0-9]{4}[A-Z]{1}[1-9A-Z]{1}Z[0-9A-Z]{1}$`) +} +  // NOTE: very inefficient and really really really dumb but it works  // TODO: find a better (or even a remotely good) way  func checkDuplicate(field, value string, userId uint) error { @@ -69,7 +76,7 @@ func (c *Customer) validate() error {  	// don't validate if GSTIN is empty  	if c.Gstin != "" {  	  // GSTIN regex validation -		match, _ := regexp.MatchString("^[0-9]{2}[A-Z]{5}[0-9]{4}[A-Z]{1}[1-9A-Z]{1}Z[0-9A-Z]{1}$", c.Gstin) +		match := gstinRegex.MatchString(c.Gstin)  		if (!match) {  			return errors.ErrInvalidGSTIN  		} @@ -99,6 +106,22 @@ func (c *Customer) validate() error {  		}  	} +	// don't validate phone if empty +	if c.Phone != "" { +		match := phoneRegex.MatchString(c.Phone) +		if (!match) { +			return errors.ErrInvalidPhone +		} +	} + +	// don't validate website if empty +	if c.Website != "" { +		_, err := url.ParseRequestURI(c.Website) +		if err != nil { +			return errors.ErrInvalidWebsite +		} +	} +  	var err error  	for _, i := range [][]string{{"phone", c.Phone}, {"email", c.Email}, {"website", c.Website}} {  		err = checkDuplicate(i[0], i[1], c.UserID) diff --git a/errors/errors.go b/errors/errors.go index 77d4d8c..3f1efc5 100644 --- a/errors/errors.go +++ b/errors/errors.go @@ -31,6 +31,8 @@ var (  	ErrEmptyContactName     = errors.New("Contact Name Cannot Be Empty")  	ErrInvalidGSTIN         = errors.New("Invalid GSTIN")  	ErrInvalidEmail         = errors.New("Invalid E-Mail Address") +	ErrInvalidPhone         = errors.New("Invalid Phone Number") +	ErrInvalidWebsite       = errors.New("Invalid Website URL")  	ErrEmptyBrandName       = errors.New("Brand Name Cannot Be Empty")  	ErrInvalidUnitPrice     = errors.New("Invalid Unit Price")  	ErrInvalidGSTPercentage = errors.New("Invalid GST Percentage") diff --git a/errors/status.go b/errors/status.go index 1fa33d1..7a23ddf 100644 --- a/errors/status.go +++ b/errors/status.go @@ -33,6 +33,9 @@ func StatusCodeFromErr(err error) int {  		errors.Is (err, ErrInvalidID) ||  		errors.Is (err, ErrEmptyContactName) ||  		errors.Is(err, ErrInvalidGSTIN) || +		errors.Is(err, ErrInvalidEmail) || +		errors.Is(err, ErrInvalidPhone) || +		errors.Is(err, ErrInvalidWebsite) ||  		errors.Is(err, ErrEmptyBrandName) ||  		errors.Is(err, ErrInvalidUnitPrice) ||  		errors.Is(err, ErrPasswordTooShort) || @@ -37,7 +37,7 @@ import (  	"log"  ) -const OPENBILLS_VERSION = "v0.0.3" +const OPENBILLS_VERSION = "v0.0.4"  func init() {  	if viper.GetBool("production_mode") {  |