From cd2bcbb41da4cc44057eb3730e257391b9b96355 Mon Sep 17 00:00:00 2001 From: ayaanqui Date: Tue, 9 Jan 2024 16:42:44 -0600 Subject: [PATCH] fix: product controller params --- src/controllers/products_controller.go | 14 ++++++++++---- src/database/product.sql.go | 14 ++++++-------- src/database/queries/product.sql | 4 ++-- src/types/dto.go | 4 ++-- 4 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/controllers/products_controller.go b/src/controllers/products_controller.go index 0a5244f8..29a07c20 100644 --- a/src/controllers/products_controller.go +++ b/src/controllers/products_controller.go @@ -1,6 +1,7 @@ package controllers import ( + "database/sql" "strconv" "strings" @@ -12,16 +13,21 @@ import ( // [GET] /products func (ctr Controller) FindAllProducts(c *fiber.Ctx) error { - var filter types.ProductFilter - if c.BodyParser(&filter) != nil { - return utils.FailResponse(c, "could not parse body data") + search_query := c.Query("search") + filter := types.ProductFilter{ + Search: &search_query, + Limit: int32(c.QueryInt("limit")), + Page: int32(c.QueryInt("page")), } if err := ctr.Validator.Struct(filter); err != nil { return utils.FailResponse(c, err.Error()) } products, err := ctr.Querier.FilterProducts(c.Context(), database.FilterProductsParams{ - Search: filter.Search, + Search: sql.NullString{ + Valid: filter.Search != nil && *filter.Search != "", + String: *filter.Search, + }, Limit: filter.Limit, Page: filter.Page, }) diff --git a/src/database/product.sql.go b/src/database/product.sql.go index 34423a1e..87124cea 100644 --- a/src/database/product.sql.go +++ b/src/database/product.sql.go @@ -86,19 +86,17 @@ FROM "product" INNER JOIN "category" ON "category"."id" = "product"."category_id" WHERE - "product"."product_ts" @@ to_tsquery('english', $2) -ORDER BY - "weight" DESC, - "product"."rating" DESC, - "product"."total_reviews" DESC + ($2::TEXT IS NULL) OR + "product"."product_ts" @@ to_tsquery('english', $2::TEXT) +ORDER BY "weight" DESC LIMIT $1 OFFSET $1 * ($3::INTEGER - 1) ` type FilterProductsParams struct { - Limit int32 `db:"limit" json:"limit"` - Search string `db:"search" json:"search"` - Page int32 `db:"page" json:"page"` + Limit int32 `db:"limit" json:"limit"` + Search sql.NullString `db:"search" json:"search"` + Page int32 `db:"page" json:"page"` } type FilterProductsRow struct { diff --git a/src/database/queries/product.sql b/src/database/queries/product.sql index d2448b89..b64e9caa 100644 --- a/src/database/queries/product.sql +++ b/src/database/queries/product.sql @@ -32,8 +32,8 @@ FROM "product" INNER JOIN "category" ON "category"."id" = "product"."category_id" WHERE - (sqlc.narg(search) IS NULL) OR - "product"."product_ts" @@ to_tsquery('english', sqlc.narg(search)) + (sqlc.narg(search)::TEXT IS NULL) OR + "product"."product_ts" @@ to_tsquery('english', sqlc.narg(search)::TEXT) ORDER BY "weight" DESC LIMIT $1 OFFSET $1 * (sqlc.arg(page)::INTEGER - 1); diff --git a/src/types/dto.go b/src/types/dto.go index 1d2b1865..323aa9b7 100644 --- a/src/types/dto.go +++ b/src/types/dto.go @@ -85,12 +85,12 @@ type CreateProduct struct { } type ProductFilter struct { - Search string `json:"search,omitempty" validate:"omitempty"` + Search *string `json:"search,omitempty" validate:"omitempty"` Limit int32 `json:"limit" validate:"required,min=1,max=200"` Page int32 `json:"page" validate:"required,gte=1"` MinPrice float32 `json:"minPrice,omitempty" validate:"omitempty,gte=1,ltefield=MaxPrice"` MaxPrice float32 `json:"maxPrice,omitempty" validate:"omitempty,gtefield=MinPrice"` - Sort string `json:"sort,omitempty" validate:"omitempty"` + Sort *string `json:"sort,omitempty" validate:"omitempty"` } type Wish struct {