fix(api): Added error handling to create and update org http apis and sql update handlers, now checks for org name taken scenarios and returns correct http error code and message, fixes #2686

This commit is contained in:
Torkel Ödegaard
2015-09-08 13:06:18 +02:00
parent fa3329271d
commit daf64421f2
4 changed files with 49 additions and 16 deletions

View File

@@ -41,11 +41,14 @@ func getOrgHelper(orgId int64) Response {
// POST /api/orgs
func CreateOrg(c *middleware.Context, cmd m.CreateOrgCommand) Response {
if !c.IsSignedIn || (!setting.AllowUserOrgCreate && !c.IsGrafanaAdmin) {
return ApiError(401, "Access denied", nil)
return ApiError(403, "Access denied", nil)
}
cmd.UserId = c.UserId
if err := bus.Dispatch(&cmd); err != nil {
if err == m.ErrOrgNameTaken {
return ApiError(400, "Organization name taken", err)
}
return ApiError(500, "Failed to create organization", err)
}
@@ -71,6 +74,9 @@ func UpdateOrg(c *middleware.Context, cmd m.UpdateOrgCommand) Response {
func updateOrgHelper(cmd m.UpdateOrgCommand) Response {
if err := bus.Dispatch(&cmd); err != nil {
if err == m.ErrOrgNameTaken {
return ApiError(400, "Organization name taken", err)
}
return ApiError(500, "Failed to update organization", err)
}

View File

@@ -7,7 +7,8 @@ import (
// Typed errors
var (
ErrOrgNotFound = errors.New("Organization not found")
ErrOrgNotFound = errors.New("Organization not found")
ErrOrgNameTaken = errors.New("Organization name is taken")
)
type Org struct {

View File

@@ -62,9 +62,31 @@ func GetOrgByName(query *m.GetOrgByNameQuery) error {
return nil
}
func isOrgNameTaken(name string, existingId int64, sess *session) (bool, error) {
// check if org name is taken
var org m.Org
exists, err := sess.Where("name=?", name).Get(&org)
if err != nil {
return false, nil
}
if exists && existingId != org.Id {
return true, nil
}
return false, nil
}
func CreateOrg(cmd *m.CreateOrgCommand) error {
return inTransaction2(func(sess *session) error {
if isNameTaken, err := isOrgNameTaken(cmd.Name, 0, sess); err != nil {
return err
} else if isNameTaken {
return m.ErrOrgNameTaken
}
org := m.Org{
Name: cmd.Name,
Created: time.Now(),
@@ -99,6 +121,12 @@ func CreateOrg(cmd *m.CreateOrgCommand) error {
func UpdateOrg(cmd *m.UpdateOrgCommand) error {
return inTransaction2(func(sess *session) error {
if isNameTaken, err := isOrgNameTaken(cmd.Name, cmd.OrgId, sess); err != nil {
return err
} else if isNameTaken {
return m.ErrOrgNameTaken
}
org := m.Org{
Name: cmd.Name,
Updated: time.Now(),