From 73e5548e3219491657acef6d729f83fff88a8a51 Mon Sep 17 00:00:00 2001 From: alex Date: Sun, 3 Sep 2023 21:14:30 +0200 Subject: [PATCH] added notification pagination --- modules/equipment/equipment.go | 7 +++-- modules/grouptasks/grouptasks.go | 7 +++-- modules/notification/notification.go | 27 ++++++++++++------- modules/structs/notification.go | 1 + modules/utils/globals.go | 1 + modules/utils/utils.go | 10 +++---- .../router/api/v1/grouptasks/grouptasks.go | 5 +++- .../api/v1/notification/notification.go | 17 +++++++++++- 8 files changed, 55 insertions(+), 20 deletions(-) diff --git a/modules/equipment/equipment.go b/modules/equipment/equipment.go index cad253b..0576022 100644 --- a/modules/equipment/equipment.go +++ b/modules/equipment/equipment.go @@ -178,7 +178,7 @@ func GetEquipmentDocumentations(stockItemId string, query structs.PageQuery, c * utils.DbPageQuery(query, utils.EquipmentDocumentationsPaginationLimit, &documentations, - "created_at", + "created_at DESC", "stock_item_id = ?", stockItemId) @@ -196,7 +196,10 @@ func GetEquipmentDocumentations(stockItemId string, query structs.PageQuery, c * return c.SendStatus(fiber.StatusInternalServerError) } } else { - totalPages = utils.GetTotalPages(&documentations, "stock_item_id = ?", stockItemId) + totalPages = utils.GetTotalPages(utils.EquipmentDocumentationsPaginationLimit, + &documentations, + "stock_item_id = ?", + stockItemId) } logger.AddSystemLog(structs.LogMessage{ diff --git a/modules/grouptasks/grouptasks.go b/modules/grouptasks/grouptasks.go index 0695aab..53b285a 100644 --- a/modules/grouptasks/grouptasks.go +++ b/modules/grouptasks/grouptasks.go @@ -958,8 +958,11 @@ func StartGroupTask(userId string, groupTask structs.GroupTasks) { GroupTask structs.GroupTasks TotalPages int }{ - GroupTask: groupTask, - TotalPages: utils.GetTotalPages([]structs.GroupTasks{}, "category = ?", groupTask.Category), + GroupTask: groupTask, + TotalPages: utils.GetTotalPages(utils.GroupTasksPaginationLimit, + []structs.GroupTasks{}, + "category = ?", + groupTask.Category), }, }) diff --git a/modules/notification/notification.go b/modules/notification/notification.go index 7ed5e24..e5e7dac 100644 --- a/modules/notification/notification.go +++ b/modules/notification/notification.go @@ -9,7 +9,6 @@ import ( "github.com/gofiber/fiber/v2" "github.com/google/uuid" - "github.com/rs/zerolog/log" ) func GetTotalNotifications(userId string) int { @@ -20,17 +19,20 @@ func GetTotalNotifications(userId string) int { return int(totalNotifications) } -func GetNotifications(userId string) []structs.Notification { +func GetNotifications(query structs.PageQuery, userId string) []structs.Notification { var notifications []structs.Notification - database.DB.Model(&structs.Notification{}).Where("user_id = ?", userId).Find(¬ifications) + utils.DbPageQuery(query, + utils.NotificationsPaginationLimit, + ¬ifications, + "created_at DESC", + "user_id = ?", + userId) return notifications } func AddNotification(c *fiber.Ctx, body structs.AddNotificationRequest) error { - log.Info().Msgf("body %v", body) - var userIds []string if len(body.UserIds) == 0 && body.NeededPermission == "" && len(body.RoleIds) == 0 { @@ -85,13 +87,20 @@ func AddNotification(c *fiber.Ctx, body structs.AddNotificationRequest) error { // send notification to user socketclients.SendMessageToUser(userId, "", structs.SendSocketMessage{ - Cmd: utils.SentCmdNewNotification, - Body: notify, + Cmd: utils.SentCmdNewNotification, + Body: struct { + Notification structs.Notification + TotalPages int + }{ + Notification: notify, + TotalPages: utils.GetTotalPages(utils.NotificationsPaginationLimit, + []structs.Notification{}, + "user_id = ?", + userId), + }, }) } - log.Info().Msgf("ids %v", userIds) - return c.SendStatus(fiber.StatusOK) } diff --git a/modules/structs/notification.go b/modules/structs/notification.go index 2baf79c..16586c7 100644 --- a/modules/structs/notification.go +++ b/modules/structs/notification.go @@ -26,4 +26,5 @@ type AddNotificationRequest struct { // swagger:model NotificationsResponse type NotificationsResponse struct { Notifications []Notification + TotalPages int } diff --git a/modules/utils/globals.go b/modules/utils/globals.go index 17046a3..c6083c9 100644 --- a/modules/utils/globals.go +++ b/modules/utils/globals.go @@ -38,6 +38,7 @@ const ( EquipmentDocumentationsPaginationLimit = 3 GroupTasksPaginationLimit = 5 + NotificationsPaginationLimit = 10 ) var ( diff --git a/modules/utils/utils.go b/modules/utils/utils.go index ab58b4c..a1e097a 100644 --- a/modules/utils/utils.go +++ b/modules/utils/utils.go @@ -116,23 +116,23 @@ func QueryParserHelper(c *fiber.Ctx, query interface{}) error { // GetTotalPages returns total pages for pagination // Example whereQuery = "stock_item_id = ?" and args = stockItemId is Where("stock_item_id = ?", stockItemId) -func GetTotalPages(any interface{}, whereQuery interface{}, args ...interface{}) int { +func GetTotalPages(paginationLimit int, any interface{}, 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))) + return int(math.Ceil(float64(totalPages) / float64(paginationLimit))) } -func GetPageOffset(page int) int { - return (page - 1) * EquipmentDocumentationsPaginationLimit +func GetPageOffset(page int, paginationLimit int) int { + return (page - 1) * paginationLimit } func DbPageQuery(query structs.PageQuery, paginationLimit int, result any, orderBy, whereQuery interface{}, args ...interface{}) *gorm.DB { return database.DB.Limit(paginationLimit). - Offset(GetPageOffset(query.Page)). + Offset(GetPageOffset(query.Page, paginationLimit)). Where(whereQuery, args). Order(orderBy). Find(result) diff --git a/routers/router/api/v1/grouptasks/grouptasks.go b/routers/router/api/v1/grouptasks/grouptasks.go index 1108af0..a62d79b 100644 --- a/routers/router/api/v1/grouptasks/grouptasks.go +++ b/routers/router/api/v1/grouptasks/grouptasks.go @@ -70,7 +70,10 @@ func GetGroupTasks(c *fiber.Ctx) error { return c.JSON(structs.GroupTasksResponse{ CategoryGroup: categoryGroup, GroupTasks: grouptasks.GetAllGroupTasks(params.Category, query), - TotalPages: utils.GetTotalPages([]structs.GroupTasks{}, "category = ?", params.Category), + TotalPages: utils.GetTotalPages(utils.GroupTasksPaginationLimit, + []structs.GroupTasks{}, + "category = ?", + params.Category), }) } diff --git a/routers/router/api/v1/notification/notification.go b/routers/router/api/v1/notification/notification.go index 2bfc139..781e716 100644 --- a/routers/router/api/v1/notification/notification.go +++ b/routers/router/api/v1/notification/notification.go @@ -57,6 +57,9 @@ func GetNotifications(c *fiber.Ctx) error { // - name: X-Api-Key // in: header // description: You can create a new api key in your user profile + // - name: page + // in: query + // description: Page number // responses: // '200': // description: Notifications @@ -67,7 +70,19 @@ func GetNotifications(c *fiber.Ctx) error { // '500': // description: Failed to get notifications + var query structs.PageQuery + + if err := utils.QueryParserHelper(c, &query); err != nil { + return c.SendStatus(fiber.StatusBadRequest) + } + + userId := c.Locals("userId").(string) + return c.JSON(structs.NotificationsResponse{ - Notifications: notification.GetNotifications(c.Locals("userId").(string)), + Notifications: notification.GetNotifications(query, userId), + TotalPages: utils.GetTotalPages(utils.NotificationsPaginationLimit, + []structs.Notification{}, + "user_id = ?", + userId), }) }