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 }