diff --git a/modules/equipment/equipment.go b/modules/equipment/equipment.go index 5bc7c5c..227ee38 100644 --- a/modules/equipment/equipment.go +++ b/modules/equipment/equipment.go @@ -172,12 +172,18 @@ func CreateEquipmentDocumentation(c *fiber.Ctx, body structs.CreateEquipmentDocu return c.JSON(fiber.Map{"message": "ok"}) } -func GetEquipmentDocumentations(stockItemId string, c *fiber.Ctx) error { +func GetEquipmentDocumentations(stockItemId string, query structs.PageQuery, c *fiber.Ctx) error { var documentations []structs.EquipmentDocumentation - database.DB.Where("stock_item_id = ?", stockItemId).Find(&documentations) + offset := (query.Page - 1) * utils.EquipmentDocumentationsPaginationLimit + + database.DB.Limit(utils.EquipmentDocumentationsPaginationLimit). + Offset(offset). + Where("stock_item_id = ?", stockItemId). + Find(&documentations) var err error + totalPages := 0 statusCode := 200 if len(documentations) == 0 { @@ -189,6 +195,8 @@ func GetEquipmentDocumentations(stockItemId string, c *fiber.Ctx) error { log.Error().Msgf("Invex api request error: %s", err) return c.SendStatus(fiber.StatusInternalServerError) } + } else { + totalPages = utils.GetTotalPages(&documentations, stockItemId, "stock_item_id = ?", stockItemId) } logger.AddSystemLog(structs.LogMessage{ @@ -203,7 +211,8 @@ func GetEquipmentDocumentations(stockItemId string, c *fiber.Ctx) error { return c.JSON(structs.EquipmentDocumentationResponse{ Status: statusCode, - Documentations: documentations}) + Documentations: documentations, + TotalPages: totalPages}) } func GetEquipmentDocumentation(stockItemId string, documentationId string, c *fiber.Ctx) error { diff --git a/modules/structs/equipment.go b/modules/structs/equipment.go index 8ddc5d1..d7ef6c7 100644 --- a/modules/structs/equipment.go +++ b/modules/structs/equipment.go @@ -18,7 +18,7 @@ type EquipmentDocumentation struct { } type EquipmentRequest struct { - StockItemId string `json:"stockItemId"` + StockItemId string } type GetDocumentationEquipmentRequest struct { @@ -38,6 +38,7 @@ type CreateEquipmentDocumentationRequest struct { type EquipmentDocumentationResponse struct { Status int Documentations []EquipmentDocumentation + TotalPages int } // swagger:model EditEquipmentDocumentationRequest diff --git a/modules/structs/query.go b/modules/structs/query.go new file mode 100644 index 0000000..b8a764f --- /dev/null +++ b/modules/structs/query.go @@ -0,0 +1,5 @@ +package structs + +type PageQuery struct { + Page int +} diff --git a/modules/utils/globals.go b/modules/utils/globals.go index 2bc1ade..2d198c7 100644 --- a/modules/utils/globals.go +++ b/modules/utils/globals.go @@ -35,6 +35,8 @@ const ( ConnectionStateOffline = 0 ConnectionStateOnline = 1 + + EquipmentDocumentationsPaginationLimit = 3 ) var ( diff --git a/modules/utils/utils.go b/modules/utils/utils.go index 58555c4..4abeaa1 100644 --- a/modules/utils/utils.go +++ b/modules/utils/utils.go @@ -4,6 +4,8 @@ import ( "crypto/rand" "encoding/json" "errors" + "jannex/admin-dashboard-backend/modules/database" + "math" "math/big" "time" @@ -95,3 +97,29 @@ func BodyParserHelper(c *fiber.Ctx, body interface{}) error { return nil } + +func QueryParserHelper(c *fiber.Ctx, query interface{}) error { + if err := c.QueryParser(query); err != nil { + log.Error().Msgf("Failed to parse query, err: %s", err.Error()) + return errors.New("Failed to parse query") + } + + if errValidation := ValidateStruct(query); errValidation != nil { + log.Error().Msgf("Failed to validate query, err: %v", errValidation) + return errors.New("Failed to validate query") + } + + return nil +} + +// GetTotalPages returns total pages for pagination +// Example Where("stock_item_id = ?", stockItemId) -> whereQuery = "stock_item_id = ?" and whereQuery = stockItemId +func GetTotalPages(any interface{}, stockItemId string, whereQuery interface{}, args ...interface{}) int { + var totalPages int64 + + database.DB.Model(any). + Where(whereQuery, args). + Count(&totalPages) + + return int(math.Ceil(float64(totalPages) / float64(EquipmentDocumentationsPaginationLimit))) +} diff --git a/routers/router/api/v1/equipment/equipment.go b/routers/router/api/v1/equipment/equipment.go index ae3b670..b5fa5ea 100644 --- a/routers/router/api/v1/equipment/equipment.go +++ b/routers/router/api/v1/equipment/equipment.go @@ -87,7 +87,13 @@ func GetEquipmentDocumentations(c *fiber.Ctx) error { return c.SendStatus(fiber.StatusBadRequest) } - return equipment.GetEquipmentDocumentations(params.StockItemId, c) + var query structs.PageQuery + + if err := utils.QueryParserHelper(c, &query); err != nil { + return c.SendStatus(fiber.StatusBadRequest) + } + + return equipment.GetEquipmentDocumentations(params.StockItemId, query, c) } func GetEquipmentDocumentation(c *fiber.Ctx) error {