diff --git a/db/clans.go b/db/clans.go index f7209d2..927abdd 100644 --- a/db/clans.go +++ b/db/clans.go @@ -105,6 +105,21 @@ func GetClanByName(name string) (*Clan, error) { return clan, nil } +// GetClanByTag Gets a clan from the db by its tag (case-sensitive) +func GetClanByTag(tag string) (*Clan, error) { + var clan *Clan + + result := SQL. + Preload("Stats"). + Where("BINARY clans.tag = ?", tag).First(&clan) + + if result.Error != nil { + return nil, result.Error + } + + return clan, nil +} + // GetClansCount Gets the total amount of clans func GetClansCount() (int, error) { var count int @@ -185,6 +200,16 @@ func DoesClanExistByName(name string) (bool, error) { return clan != nil, nil } +func DoesClanExistByTag(tag string) (bool, *Clan, error) { + clan, err := GetClanByTag(tag) + + if err != nil && err != gorm.ErrRecordNotFound { + return false, nil, err + } + + return clan != nil, clan, nil +} + // IsValidClanName Checks a string to see if it is a valid clan name func IsValidClanName(name string) bool { result, _ := regexp.MatchString("^[a-zA-Z0-9][a-zA-Z0-9 ]{2,29}$", name) diff --git a/handlers/clans.go b/handlers/clans.go index b426b4d..96c3c6c 100644 --- a/handlers/clans.go +++ b/handlers/clans.go @@ -20,6 +20,7 @@ const ( errClanFavoriteModeInvalid string = "Your clan `favorite_mode` must be a valid mode id." errClanAccentColorInvalid string = "Your clan `accent_color` must be a valid hex code." errClanNameExists string = "A clan with that name already exists. Please choose a different name." + errClanTagExists string = "A clan with that tag already exists. Please choose a different tag." ) // CreateClan Creates a new clan if the user is eligible to. @@ -52,16 +53,26 @@ func CreateClan(c *gin.Context) *APIError { return APIErrorBadRequest(errClanTagInvalid) } - exists, err := db.DoesClanExistByName(body.Name) + nameExists, err := db.DoesClanExistByName(body.Name) if err != nil { return APIErrorServerError("Error checking if clan exists by name", err) } - if exists { + if nameExists { return APIErrorBadRequest(errClanNameExists) } + tagExists, _, err := db.DoesClanExistByTag(body.Tag) + + if err != nil { + return APIErrorServerError("Error checking if clan exists by tag", err) + } + + if tagExists { + return APIErrorBadRequest(errClanTagExists) + } + clan := db.Clan{ OwnerId: user.Id, Name: body.Name, @@ -191,7 +202,15 @@ func UpdateClan(c *gin.Context) *APIError { return APIErrorBadRequest(errClanTagInvalid) } - clan.Tag = *body.Tag + tagExists, existingClan, err := db.DoesClanExistByTag(*body.Tag) + + if err != nil { + return APIErrorServerError("Error checking if clan exists by tag", err) + } + + if tagExists && existingClan.Id != clan.Id { + return APIErrorBadRequest(errClanTagExists) + } if err := clan.UpdateTag(*body.Tag); err != nil { return APIErrorServerError("Error updating clan tag", err)