package repository import ( "context" "database/sql" ) type LayananListParams struct { Page int PerPage int Search string DepartemenID string } type LayananPage struct { Items []LayananDepartemen Total int } type LayananDepartemen struct { GroupLayananID *string `json:"GroupLayananID"` Departemen *string `json:"Departemen"` LayananDepartemenID int64 `json:"LayananDepartemenID"` LayananID *string `json:"LayananID"` NamaLayanan *string `json:"NamaLayanan"` LayananCode *string `json:"LayananCode"` } func (r MySQLLayananRepository) ListLayanan(ctx context.Context, params LayananListParams) (LayananPage, error) { var total int if err := r.db.QueryRowContext(ctx, ` SELECT COUNT(*) FROM layanandepartemen ld LEFT JOIN masterlayanan ml ON ml.LayananID = ld.LayananID WHERE ld.NA = 'N' AND (? = '' OR ld.DepartemenID = ?) AND (? = '' OR ld.LayananID LIKE ? OR ml.LayananKode LIKE ? OR ml.Nama LIKE ?) `, params.DepartemenID, params.DepartemenID, params.Search, "%"+params.Search+"%", "%"+params.Search+"%", "%"+params.Search+"%").Scan(&total); err != nil { return LayananPage{}, err } rows, err := r.db.QueryContext(ctx, ` SELECT ld.GroupLayananID, d.Nama, ld.LayananDepartemenID, ld.LayananID, ml.LayananKode, ml.Nama FROM layanandepartemen ld LEFT JOIN departemen d ON d.DepartemenID = ld.DepartemenID LEFT JOIN masterlayanan ml ON ml.LayananID = ld.LayananID WHERE ld.NA = 'N' AND (? = '' OR ld.DepartemenID = ?) AND (? = '' OR ld.LayananID LIKE ? OR ml.LayananKode LIKE ? OR ml.Nama LIKE ?) ORDER BY ld.TanggalBuat DESC LIMIT ? OFFSET ? `, params.DepartemenID, params.DepartemenID, params.Search, "%"+params.Search+"%", "%"+params.Search+"%", "%"+params.Search+"%", params.PerPage, (params.Page-1)*params.PerPage) if err != nil { return LayananPage{}, err } defer rows.Close() items := make([]LayananDepartemen, 0) for rows.Next() { var item LayananDepartemen var groupLayananID, departemen, layananID, layananCode, namaLayanan sql.NullString if err := rows.Scan(&groupLayananID, &departemen, &item.LayananDepartemenID, &layananID, &layananCode, &namaLayanan); err != nil { return LayananPage{}, err } item.GroupLayananID = nullStringPtr(groupLayananID) item.Departemen = nullStringPtr(departemen) item.LayananID = nullStringPtr(layananID) item.LayananCode = nullStringPtr(layananCode) item.NamaLayanan = nullStringPtr(namaLayanan) items = append(items, item) } if err := rows.Err(); err != nil { return LayananPage{}, err } return LayananPage{Items: items, Total: total}, nil }