refactor list antrian query

This commit is contained in:
renaldybrada
2026-02-19 10:52:55 +07:00
parent 2969c903dc
commit 2ea0e4093b
3 changed files with 33 additions and 31 deletions
+7 -1
View File
@@ -100,7 +100,13 @@ func (h AntrianOperasiHandler) CreateAntrianOperasi(c *gin.Context) {
// @Failure 500 {object} shared.BaseErrorResponse
// @Router /antrian-operasi/ [get]
func (h AntrianOperasiHandler) GetListAntrianOperasi(c *gin.Context) {
res, err := h.repo.SearchableListAntrianOperasi(c)
var query AntrianQuery
if err := c.ShouldBindQuery(&query); err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
res, err := h.repo.SearchableListAntrianOperasi(c.Request.Context(), query)
if err != nil {
c.JSON(500, shared.BaseErrorResponse{
Success: false,
+17 -30
View File
@@ -6,10 +6,10 @@ import (
queryUtils "antrian-operasi/internal/utils/query"
"database/sql"
"log"
"slices"
"strconv"
"time"
"context"
"github.com/gin-gonic/gin"
"github.com/google/uuid"
)
@@ -23,7 +23,7 @@ const TBL_DOKTER_OPERASI = "data_pasien_operasi_data_pegawai_2"
type IAntrianOperasiRepository interface {
CreateAntrianOperasi(c *gin.Context, req CreatePasienOperasiRequest) (CreatePasienOperasiRequest, error)
SearchableListAntrianOperasi(c *gin.Context) (ListPasienOperasiPaginate, error)
SearchableListAntrianOperasi(c context.Context, q AntrianQuery) (ListPasienOperasiPaginate, error)
GetAntrianOperasiById(c *gin.Context, id string) (DetailPasienOperasiResultQuery, error)
UpdateAntrianOperasi(c *gin.Context, id string, req CreatePasienOperasiRequest) (CreatePasienOperasiRequest, error)
UpdateStatusAntrianOperasi(c *gin.Context, id string, req StatusPasienRequest) (StatusPasienRequest, error)
@@ -360,21 +360,8 @@ func (r antrianOperasiRepo) CreateAntrianOperasi(c *gin.Context, req CreatePasie
return req, nil
}
func (r antrianOperasiRepo) SearchableListAntrianOperasi(c *gin.Context) (ListPasienOperasiPaginate, error) {
func (r antrianOperasiRepo) SearchableListAntrianOperasi(c context.Context, q AntrianQuery) (ListPasienOperasiPaginate, error) {
var result ListPasienOperasiPaginate
search := c.Query("search")
availableType := []string{"all", "kategori", "spesialis", "sub-spesialis"}
antrianType := c.Query("type")
antrianTypeId, err := strconv.Atoi(c.Query("type_id"))
if err != nil {
antrianTypeId = 0
}
if !slices.Contains(availableType, antrianType) {
antrianType = "all"
}
limit := shared.ParseQueryLimit(c)
offset := shared.ParseQueryOffset(c)
statusOp := c.Query("status")
query := queryUtils.DynamicQuery{
From: TBL_NAME,
@@ -419,7 +406,7 @@ func (r antrianOperasiRepo) SearchableListAntrianOperasi(c *gin.Context) (ListPa
var selectFilter []queryUtils.DynamicFilter
typeIdColumn := ""
switch antrianType {
switch q.Type {
case "kategori":
typeIdColumn = "dko.id"
query.WindowFunctions = append(query.WindowFunctions, wfKategori, wfSpesialis, wfSubSpesialis)
@@ -436,8 +423,8 @@ func (r antrianOperasiRepo) SearchableListAntrianOperasi(c *gin.Context) (ListPa
query.WindowFunctions = append(query.WindowFunctions, wfKategori, wfSpesialis, wfSubSpesialis)
}
if antrianTypeId != 0 && antrianType != "all" {
selectFilter = append(selectFilter, queryUtils.DynamicFilter{Column: typeIdColumn, Operator: queryUtils.OpEqual, Value: antrianTypeId})
if q.TypeID != 0 && q.Type != "all" {
selectFilter = append(selectFilter, queryUtils.DynamicFilter{Column: typeIdColumn, Operator: queryUtils.OpEqual, Value: q.TypeID})
}
query.Joins = []queryUtils.Join{
@@ -480,18 +467,18 @@ func (r antrianOperasiRepo) SearchableListAntrianOperasi(c *gin.Context) (ListPa
}
// filtering search results
if search != "" {
if q.Search != "" {
searchFilters := []queryUtils.DynamicFilter{
{Column: "dpo.No_KTP", Operator: queryUtils.OpILike, Value: "%" + search + "%"},
{Column: "dpo.No_rekam_medis", Operator: queryUtils.OpILike, Value: "%" + search + "%"},
{Column: "dpo.Nama_pasien", Operator: queryUtils.OpILike, Value: "%" + search + "%"},
{Column: "dpo.No_KTP", Operator: queryUtils.OpILike, Value: "%" + q.Search + "%"},
{Column: "dpo.No_rekam_medis", Operator: queryUtils.OpILike, Value: "%" + q.Search + "%"},
{Column: "dpo.Nama_pasien", Operator: queryUtils.OpILike, Value: "%" + q.Search + "%"},
}
query.Filters = append(query.Filters, queryUtils.FilterGroup{Filters: searchFilters, LogicOp: "OR"})
}
if statusOp != "" {
selectFilter = append(selectFilter, queryUtils.DynamicFilter{Column: "dpo.Status_operasi", Operator: queryUtils.OpEqual, Value: statusOp})
if q.Status != "" {
selectFilter = append(selectFilter, queryUtils.DynamicFilter{Column: "dpo.Status_operasi", Operator: queryUtils.OpEqual, Value: q.Status})
}
// wiring all select filter
@@ -509,15 +496,15 @@ func (r antrianOperasiRepo) SearchableListAntrianOperasi(c *gin.Context) (ListPa
log.Printf("Unable to execute query count : %s ", err)
return result, err
}
result.Paging.Limit = limit
result.Paging.Offset = offset
result.Paging.Limit = q.Limit
result.Paging.Offset = q.Offset
result.Paging.Total = int(countData)
result.Paging.CalculatePagingInfo()
// query data
queryData := query
queryData.Limit = limit
queryData.Offset = offset
queryData.Limit = q.Limit
queryData.Offset = q.Offset
err = r.queryBuilder.ExecuteQuery(
c, dbconn, queryData, &result.Data)
if err != nil {
@@ -60,3 +60,12 @@ type CreatePasienOperasiRequest struct {
DokterPelaksanaItems []DokterPelaksanaItemRequest `json:"dokterPelaksanaItems"`
StatusPasienData StatusPasienRequest `json:"statusPasienData"`
}
type AntrianQuery struct {
Search string `form:"search"`
Type string `form:"type,default=all" binding:"omitempty,oneof=all kategori spesialis sub-spesialis"`
TypeID int `form:"type_id,default=0"`
Status string `form:"status" binding:"omitempty,oneof=1 2 3 4"`
Limit int `form:"limit,default=10"`
Offset int `form:"offset,default=0"`
}