package repository import ( "context" "database/sql" ) type LayananListParams struct { Page int PerPage int } 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"` Harga *string `json:"Harga"` } func (r MySQLLayananRepository) ListLayanan(ctx context.Context, params LayananListParams) (LayananPage, error) { var total int if err := r.db.QueryRowContext(ctx, ` SELECT COUNT(*) FROM layanandepartemen WHERE NA = 'N' AND DepartemenID = 'MCU' `).Scan(&total); err != nil { return LayananPage{}, err } rows, err := r.db.QueryContext(ctx, ` SELECT ld.GroupLayananID, d.Nama, ld.LayananDepartemenID, ld.LayananID, ml.Nama, CAST(ld.Harga AS CHAR) 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 ld.DepartemenID = 'MCU' ORDER BY ld.TanggalBuat DESC LIMIT ? OFFSET ? `, 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, namaLayanan, harga sql.NullString if err := rows.Scan(&groupLayananID, &departemen, &item.LayananDepartemenID, &layananID, &namaLayanan, &harga); err != nil { return LayananPage{}, err } item.GroupLayananID = nullStringPtr(groupLayananID) item.Departemen = nullStringPtr(departemen) item.LayananID = nullStringPtr(layananID) item.NamaLayanan = nullStringPtr(namaLayanan) item.Harga = nullStringPtr(harga) items = append(items, item) } if err := rows.Err(); err != nil { return LayananPage{}, err } return LayananPage{Items: items, Total: total}, nil }