All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
64 lines
1.4 KiB
Go
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
|
|
}
|