From bb6ee6558519e31f89f3d5984f5dec390c4875df Mon Sep 17 00:00:00 2001 From: AiAe Date: Tue, 1 Sep 2026 13:51:32 +0300 Subject: [PATCH] Add clan search by name or tag --- cmd/api/server.go | 1 + db/clans.go | 19 +++++++++++++++++++ handlers/clans.go | 19 +++++++++++++++++++ 3 files changed, 39 insertions(+) diff --git a/cmd/api/server.go b/cmd/api/server.go index 055774f..74c565f 100644 --- a/cmd/api/server.go +++ b/cmd/api/server.go @@ -100,6 +100,7 @@ func initializeRoutes(engine *gin.Engine) { // Clans engine.POST("/v2/clan", middleware.RequireAuth, handlers.CreateHandler(handlers.CreateClan)) + engine.GET("/v2/clan/search/:name", handlers.CreateHandler(handlers.SearchClans)) engine.GET("/v2/clan/:id", handlers.CreateHandler(handlers.GetClan)) engine.POST("/v2/clan/:id", middleware.RequireAuth, handlers.CreateHandler(handlers.UpdateClan)) engine.DELETE("/v2/clan/:id", middleware.RequireAuth, handlers.CreateHandler(handlers.DeleteClan)) diff --git a/db/clans.go b/db/clans.go index 0fada9f..f86d956 100644 --- a/db/clans.go +++ b/db/clans.go @@ -126,6 +126,25 @@ func GetClanByName(name string) (*Clan, error) { return clan, nil } +// SearchClansByName Searches for clans whose name or tag starts with the query +func SearchClansByName(searchQuery string) ([]*Clan, error) { + clans := make([]*Clan, 0) + likeQuery := fmt.Sprintf("%v%%", searchQuery) + + result := SQL. + Preload("Stats"). + Where("clans.name LIKE ? OR clans.tag LIKE ?", likeQuery, likeQuery). + Limit(50). + Order("id ASC"). + Find(&clans) + + if result.Error != nil { + return nil, result.Error + } + + return clans, nil +} + // GetClanByTag Gets a clan from the db by its tag (case-sensitive) func GetClanByTag(tag string) (*Clan, error) { var clan *Clan diff --git a/handlers/clans.go b/handlers/clans.go index ecbeba8..ac3b0b1 100644 --- a/handlers/clans.go +++ b/handlers/clans.go @@ -140,6 +140,25 @@ func GetClan(c *gin.Context) *APIError { return nil } +// SearchClans Searches for clans by name and returns them +// Endpoint: /v2/clan/search/:name +func SearchClans(c *gin.Context) *APIError { + name := c.Param("name") + + if name == "" { + return APIErrorBadRequest("You must supply a valid name to search.") + } + + clans, err := db.SearchClansByName(name) + + if err != nil { + return APIErrorServerError("Error searching for clans", err) + } + + c.JSON(http.StatusOK, gin.H{"clans": clans}) + return nil +} + // UpdateClan Updates data about a clan // Endpoint: PATCH /v2/clan/:id func UpdateClan(c *gin.Context) *APIError {