cargo-platform/pkg/datatable/datatable.go
teguh nugroho 622045f3fc
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
province list
2026-08-17 12:58:23 +07:00

64 lines
1.4 KiB
Go

package datatable
import (
"cargo-erp-backend/internal/handlers/dto"
"fmt"
"gorm.io/gorm"
)
type DatatableInterface interface {
Render(coldef []dto.DataTableColDef) dto.DataTableResponse
}
type Datatable struct {
DB *gorm.DB
Req dto.DataTableRequest
}
func NewDatatable(db *gorm.DB, table_request dto.DataTableRequest) DatatableInterface {
return &Datatable{
DB: db,
Req: table_request,
}
}
func (d *Datatable) SetTable(db *gorm.DB) {
d.DB = db
}
func (d *Datatable) Render(coldef []dto.DataTableColDef) dto.DataTableResponse {
var totaldata int64 = 0
d.DB.Count(&totaldata)
//select
selectAlias := make([]string, 0)
for _, v := range coldef {
selectAlias = append(selectAlias, fmt.Sprintf("%v AS %v", v.Field, v.Alias))
}
d.DB.Select(selectAlias)
//global filter
if len(d.Req.Search.Value) > 0 {
for _, vcol := range d.Req.Columns {
if vcol.Searchable {
for _, v := range coldef {
d.DB.Or(fmt.Sprintf("%v::TEXT ILIKE '%%%v%%'", v.Field, d.Req.Search.Value))
}
}
}
}
var totalFiltered int64 = 0
d.DB.Count(&totalFiltered)
start := d.Req.Start
if start == 0 {
start = 1
}
limit := d.Req.Length
d.DB.Limit(limit).Offset(start*limit - limit)
output := make([]map[string]interface{}, 0)
d.DB.Scan(&output)
result := dto.DataTableResponse{
Draw: 1,
RecordsTotal: totaldata,
RecordsFiltered: totalFiltered,
Data: output,
}
return result
}