diff --git a/pkg/api/org.go b/pkg/api/org.go index c32a88eac44..2c9e8895131 100644 --- a/pkg/api/org.go +++ b/pkg/api/org.go @@ -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) } diff --git a/pkg/models/org.go b/pkg/models/org.go index b2d18be9537..30958688ae3 100644 --- a/pkg/models/org.go +++ b/pkg/models/org.go @@ -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 { diff --git a/pkg/services/sqlstore/org.go b/pkg/services/sqlstore/org.go index 6109faad92e..6ef0a4de91a 100644 --- a/pkg/services/sqlstore/org.go +++ b/pkg/services/sqlstore/org.go @@ -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(), diff --git a/public/app/features/org/partials/newOrg.html b/public/app/features/org/partials/newOrg.html index 56d08da701e..9171cb55e06 100644 --- a/public/app/features/org/partials/newOrg.html +++ b/public/app/features/org/partials/newOrg.html @@ -10,20 +10,18 @@

Add Organization

-
-
-
    -
  • - Org. name -
  • -
  • - -
  • -
  • -
  • -
-
-
+
+
    +
  • + Org. name +
  • +
  • + +
  • +
  • +
  • +
+