diff options
Diffstat (limited to 'customer')
| -rw-r--r-- | customer/controller.go | 12 | ||||
| -rw-r--r-- | customer/validators.go | 44 | 
2 files changed, 52 insertions, 4 deletions
diff --git a/customer/controller.go b/customer/controller.go index 2bacd02..f2704bd 100644 --- a/customer/controller.go +++ b/customer/controller.go @@ -98,7 +98,17 @@ func handleSaveCustomer (ctx *gin.Context) {  	}  	userId := uId.(uint) -	customer.UserID = userId +	customer.UserID = userId // necessary even when editing, just in case if UserID was ommitted in the request + +	if customer.ID != 0 { +		// if customer is being edited, check ownership +		err := checkCustomerOwnership(customer.ID, userId) +	  if err != nil { +	  	ctx.Error(err) +	  	ctx.Abort() +	  	return +	  } +  }  	err := customer.upsert()  	if err != nil { diff --git a/customer/validators.go b/customer/validators.go index 17ca2ae..ea2a9d5 100644 --- a/customer/validators.go +++ b/customer/validators.go @@ -57,6 +57,37 @@ func checkDuplicate(field, value string, userId uint) error {  	return nil  } +func checkDuplicateExisting(field, value string, userId, customerId uint) error { +	if value != "" { +		var count int64 +		err := db.Model(&Customer{}). +			Where("user_id = ? and id != ? and" + field + " = ?", userId, customerId, value). +			Count(&count). +			Error + +		if err != nil { +			return err +		} + +		if count > 0 { +			switch(field) { +			case "phone": +				return errors.ErrNonUniquePhone +			case "email": +				return errors.ErrNonUniqueEmail +			case "website": +				return errors.ErrNonUniqueWebsite +			case "gstin": +        return errors.ErrNonUniqueGSTIN +			default: +				return e.New(field + " is not unique") +			} +		} +	} + +	return nil +} +  func (c *Customer) validate() error {  	// trim whitespaces  	c.FirmName = strings.TrimSpace(c.FirmName) @@ -96,9 +127,16 @@ func (c *Customer) validate() error {  	var err error  	for _, i := range [][]string{{"phone", c.Phone}, {"email", c.Email}, {"website", c.Website}, {"gstin", c.Gstin}} { -		err = checkDuplicate(i[0], i[1], c.UserID) -		if err != nil { -			return err +		if c.ID != 0 { +		  err = checkDuplicateExisting(i[0], i[1], c.UserID, c.ID) +		  if err != nil { +		  	return err +		  } +		} else { +		  err = checkDuplicate(i[0], i[1], c.UserID) +		  if err != nil { +		  	return err +		  }  		}  	}  |