func (c Contributor) Update(id, name, handle, email, privilege string) revel.Result { c.Validation.Required(name).Message(c.Message("contributor.validation.name")) c.Validation.Required(handle).Message(c.Message("contributor.validation.handle.required")) c.Validation.Match(handle, regexp.MustCompile(`^\w*$`)).Message(c.Message("contributor.validation.handle.invalid")) c.Validation.Required(email).Message("contributor.validation.email.required") c.Validation.Email(email).Message("contributor.validation.email.invalid") c.Validation.Required(privilege).Message("contributor.validation.privilege") cType, err := strconv.ParseInt(privilege, 10, 64) realID, iderr := strconv.ParseInt(id, 10, 64) if err != nil || iderr != nil { revel.ERROR.Printf("[LGWRD] Privilege parse error. Value: %s, should be valid int64 value. Parser Error: %s", privilege, err, ) c.Flash.Error(c.Message("contributor.privilege.parseerror")) return c.Redirect(routes.Contributor.Edit(realID)) } if c.Validation.HasErrors() { c.Validation.Keep() c.FlashParams() return c.Redirect(routes.Contributor.Edit(realID)) } var contributor models.Contributor if err = c.Trx.Preload("Type").Where("id = ?", id).First(&contributor).Error; err != nil { revel.ERROR.Printf("[LGFATAL] Failed to get Contributor ID %d data. Error: %s", id, err, ) c.Flash.Error(c.Message("errors.db.generic")) return c.Redirect(routes.Contributor.Edit(realID)) } contributor.Name = name contributor.Handle = handle contributor.Email = email contributor.TypeID = cType if err := c.Trx.Save(&contributor).Error; err != nil { revel.ERROR.Printf("[LGFATAL] Error in updating new contributor %s. Error: %s", email, err, ) // Gorm appears to have no concept of error code. // We'll have to transfer the direct SQL Error so user // can have more clue of what's happening in case of // duplicate email error leaking here. c.Flash.Error(err.Error()) return c.Redirect(routes.Contributor.Edit(realID)) } return c.Redirect(routes.Contributor.List()) }