diff --git a/products/app/api/router.go b/products/app/api/router.go index 765e37a..18638e7 100644 --- a/products/app/api/router.go +++ b/products/app/api/router.go @@ -24,7 +24,22 @@ func handlePing(c *gin.Context) { func handleGetProducts(dbConn *gorm.DB) gin.HandlerFunc { return func(c *gin.Context) { - products := db.GetProducts(dbConn) + var ( + machineId *int = nil + err error + mId int + ) + + machineIdStr, ok := c.GetQuery("machineId") + if ok && len(machineIdStr) > 0 { + if mId, err = strconv.Atoi(machineIdStr); err != nil { + raiseBadRequestError(c, "Invalid machineId filter") + return + } + machineId = &mId + } + + products := db.GetProducts(dbConn, machineId) c.JSON( http.StatusOK, diff --git a/products/app/db/repository.go b/products/app/db/repository.go index d340a01..84db9bb 100644 --- a/products/app/db/repository.go +++ b/products/app/db/repository.go @@ -2,10 +2,19 @@ package db import "gorm.io/gorm" -func GetProducts(dbConn *gorm.DB) *[]Product { - var products []Product +func GetProducts(dbConn *gorm.DB, machineId *int) *[]Product { + var ( + products []Product + query = dbConn + ) - dbConn.Order("name").Find(&products) + if machineId != nil { + query = query. + Joins("LEFT JOIN machine_products mp ON mp.product_id = products.id"). + Where("mp.machine_id = ?", machineId) + } + + query.Order("name").Find(&products) return &products }