From 32efec31e2d50b0e0b1821065b8f4872d1b13321 Mon Sep 17 00:00:00 2001 From: Ernest Litvinenko Date: Mon, 18 Mar 2024 05:58:15 +0300 Subject: [PATCH] Add filtration for GET /catalog EP. Filtration enables where passing in template like this isFilter=1&=, --- handlers/catalog/endpoints/catalog.go | 7 ++++-- services/catalog.go | 35 +++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/handlers/catalog/endpoints/catalog.go b/handlers/catalog/endpoints/catalog.go index cce3555..7b40954 100644 --- a/handlers/catalog/endpoints/catalog.go +++ b/handlers/catalog/endpoints/catalog.go @@ -12,8 +12,11 @@ func (h *handlers) GetCatalogItems(c *gin.Context) { limit, _ := strconv.Atoi(c.DefaultQuery("limit", "10")) page, _ := strconv.Atoi(c.DefaultQuery("page", "1")) offset := (page - 1) * limit - - c.JSON(200, services.GetCatalogItems(limit, offset)) + if c.DefaultQuery("isFilter", "0") == "0" { + c.JSON(200, services.GetCatalogItems(limit, offset)) + return + } + c.JSON(200, services.FilterCatalogItems(c.Request.URL.Query())) } func (h *handlers) GetCatalogItem(c *gin.Context) { diff --git a/services/catalog.go b/services/catalog.go index 0a45c5d..4ec1905 100644 --- a/services/catalog.go +++ b/services/catalog.go @@ -5,6 +5,7 @@ import ( "fmt" "relynolli-server/internal" "relynolli-server/models" + "strings" ) func retrieveItems(stmt string, structure interface{}) { @@ -55,3 +56,37 @@ func GetCatalogItemById(id int) (models.CatalogStructWeb, error) { } return retrieveCatalogItems(stmt)[0], nil } + +func FilterCatalogItems(filters map[string][]string) []models.CatalogStructWeb { + // Generate stmt + propertiesSubStmt := "properties->>'$.%s' = '%s'" + + stmt := "select * from api_catalog where %s" + + sample := "(%s)" + + filterList := [][]string{} + + for key, filter := range filters { + if key == "isFilter" { + continue + } + subFilterArr := []string{} + values := strings.Split(filter[0], ",") + for _, val := range values { + subFilterArr = append(subFilterArr, fmt.Sprintf(propertiesSubStmt, key, val)) + } + filterList = append(filterList, subFilterArr) + } + + samples := []string{} + + for _, arr := range filterList { + samples = append(samples, fmt.Sprintf(sample, strings.Join(arr, " or "))) + } + + stmt = fmt.Sprintf(stmt, strings.Join(samples, " and ")) + println(stmt) + + return retrieveCatalogItems(stmt) +}