feat: improve layanan search and pagination

This commit is contained in:
2026-09-02 09:28:54 +07:00
parent 181d53af45
commit 10fa7a6e38
3 changed files with 63 additions and 23 deletions

View File

@@ -6,8 +6,10 @@ import (
)
type LayananListParams struct {
Page int
PerPage int
Page int
PerPage int
Search string
DepartemenID string
}
type LayananPage struct {
@@ -21,29 +23,34 @@ type LayananDepartemen struct {
LayananDepartemenID int64 `json:"LayananDepartemenID"`
LayananID *string `json:"LayananID"`
NamaLayanan *string `json:"NamaLayanan"`
Harga *string `json:"Harga"`
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
WHERE NA = 'N' AND DepartemenID = 'MCU'
`).Scan(&total); err != nil {
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.Nama, CAST(ld.Harga AS CHAR)
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 ld.DepartemenID = 'MCU'
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.PerPage, (params.Page-1)*params.PerPage)
`, 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
}
@@ -52,16 +59,16 @@ func (r MySQLLayananRepository) ListLayanan(ctx context.Context, params LayananL
items := make([]LayananDepartemen, 0)
for rows.Next() {
var item LayananDepartemen
var groupLayananID, departemen, layananID, namaLayanan, harga sql.NullString
var groupLayananID, departemen, layananID, layananCode, namaLayanan sql.NullString
if err := rows.Scan(&groupLayananID, &departemen, &item.LayananDepartemenID,
&layananID, &namaLayanan, &harga); err != nil {
&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)
item.Harga = nullStringPtr(harga)
items = append(items, item)
}
if err := rows.Err(); err != nil {