Membuat pagination di Gofiber

Langkah-langkah Implementasi Pagination

  1. Update Model Product untuk Mendukung Pagination:

    • Tambahkan parameter limit dan offset pada fungsi SelectAllProducts untuk mendukung pagination.

    • Gunakan parameter limit untuk menentukan jumlah item yang akan ditampilkan per halaman.

    • Gunakan parameter offset untuk menentukan posisi awal data yang akan diambil.

    // src/models/Products.go
    
    package models
    
    import (
        "gofiber/src/configs"
    
        "gorm.io/gorm"
    )
    
    type Product struct {
        gorm.Model
        Name       string  `json:"name" validate:"required,min=3,max=100"`
        Price      float64 `json:"price" validate:"required,min=0"`
        Stock      int     `json:"stock" validate:"required,min=0"`
        CategoryID uint    `json:"category_id"`
        Category   Category `json:"category"`
    }
    
    func SelectAllProducts(sort, name string, limit, offset int) []*Product {
        var items []*Product
        name = "%" + name + "%"
        configs.DB.Preload("Category").Order(sort).Limit(limit).Offset(offset).Where("name LIKE ?", name).Find(&items)
        return items
    }
    
    func CountData() int64 {
        var result int64
        configs.DB.Table("products").Count(&result)
        return result
    }
  2. Update Controller Product untuk Mendukung Pagination:

    • Ambil parameter page dan limit dari query URL menggunakan c.Query.

    • Hitung offset berdasarkan nilai page dan limit.

    • Panggil fungsi SelectAllProducts di model dengan parameter yang telah diambil.

    • Hitung jumlah total data dengan menggunakan fungsi CountData.

    • Hitung jumlah total halaman (totalPage) dengan membagi total data dengan limit.

    • Kembalikan respons JSON yang berisi data produk, informasi halaman, dan informasi total data.

    // src/controllers/ProductController.go
    
    package controllers
    
    import (
        "gofiber/src/models"
        "math"
        "strconv"
        "strings"
    
        "github.com/gofiber/fiber/v2"
    )
    
    func GetAllProducts(c *fiber.Ctx) error {
        pageOld := c.Query("page")
        limitOld := c.Query("limit")
        page, _ := strconv.Atoi(pageOld)
        if page == 0 {
            page = 1
        }
        limit, _ := strconv.Atoi(limitOld)
        if limit == 0 {
            limit = 5
        }
        offset := (page - 1) * limit
        sort := c.Query("sorting")
        if sort == "" {
            sort = "ASC"
        }
        sortby := c.Query("orderBy")
        if sortby == "" {
            sortby = "name"
        }
        sort = sortby + " " + strings.ToLower(sort)
        keyword := c.Query("search")
        products := models.SelectAllProducts(sort, keyword, limit, offset)
        totalData := models.CountData()
        totalPage := math.Ceil(float64(totalData) / float64(limit))
        result := map[string]interface{}{
            "data":        products,
            "currentPage": page,
            "limit":       limit,
            "totalData":   totalData,
            "totalPage":   totalPage,
        }
        return c.JSON(result)
    }

Penjelasan Langkah-langkah

  1. Update Model Product:

    • Di dalam model Product, tambahkan fungsi CountData untuk menghitung total data produk dalam database.

    • Modifikasi fungsi SelectAllProducts untuk menerima parameter limit dan offset yang digunakan untuk pagination.

  2. Update Controller Product:

    • Di dalam controller, ambil parameter page dan limit dari query URL menggunakan c.Query.

    • Hitung offset berdasarkan nilai page dan limit.

    • Panggil fungsi SelectAllProducts di model dengan parameter yang telah diambil.

    • Hitung jumlah total data dengan menggunakan fungsi CountData.

    • Hitung jumlah total halaman (totalPage) dengan membagi total data dengan limit.

    • Kembalikan respons JSON yang berisi data produk, informasi halaman, dan informasi total data.

Dengan langkah-langkah ini, Anda telah berhasil mengimplementasikan fitur pagination pada daftar produk dalam aplikasi Anda. Hal ini memungkinkan pengguna untuk menavigasi antara berbagai halaman data dengan lebih efisien.

Last updated