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

No files matched your search

+7 -1
View File
@@ -100,7 +100,13 @@ func (h AntrianOperasiHandler) CreateAntrianOperasi(c *gin.Context) {
// @Failure 500 {object} shared.BaseErrorResponse // @Failure 500 {object} shared.BaseErrorResponse
// @Router /antrian-operasi/ [get] // @Router /antrian-operasi/ [get]
func (h AntrianOperasiHandler) GetListAntrianOperasi(c *gin.Context) { 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 { if err != nil {
c.JSON(500, shared.BaseErrorResponse{ c.JSON(500, shared.BaseErrorResponse{
Success: false, Success: false,
+17 -30
View File
@@ -6,10 +6,10 @@ import (
queryUtils "antrian-operasi/internal/utils/query" queryUtils "antrian-operasi/internal/utils/query"
"database/sql" "database/sql"
"log" "log"
"slices"
"strconv"
"time" "time"
"context"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/google/uuid" "github.com/google/uuid"
) )
@@ -23,7 +23,7 @@ const TBL_DOKTER_OPERASI = "data_pasien_operasi_data_pegawai_2"
type IAntrianOperasiRepository interface { type IAntrianOperasiRepository interface {
CreateAntrianOperasi(c *gin.Context, req CreatePasienOperasiRequest) (CreatePasienOperasiRequest, error) 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) GetAntrianOperasiById(c *gin.Context, id string) (DetailPasienOperasiResultQuery, error)
UpdateAntrianOperasi(c *gin.Context, id string, req CreatePasienOperasiRequest) (CreatePasienOperasiRequest, error) UpdateAntrianOperasi(c *gin.Context, id string, req CreatePasienOperasiRequest) (CreatePasienOperasiRequest, error)
UpdateStatusAntrianOperasi(c *gin.Context, id string, req StatusPasienRequest) (StatusPasienRequest, 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 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 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{ query := queryUtils.DynamicQuery{
From: TBL_NAME, From: TBL_NAME,
@@ -419,7 +406,7 @@ func (r antrianOperasiRepo) SearchableListAntrianOperasi(c *gin.Context) (ListPa
var selectFilter []queryUtils.DynamicFilter var selectFilter []queryUtils.DynamicFilter
typeIdColumn := "" typeIdColumn := ""
switch antrianType { switch q.Type {
case "kategori": case "kategori":
typeIdColumn = "dko.id" typeIdColumn = "dko.id"
query.WindowFunctions = append(query.WindowFunctions, wfKategori, wfSpesialis, wfSubSpesialis) 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) query.WindowFunctions = append(query.WindowFunctions, wfKategori, wfSpesialis, wfSubSpesialis)
} }
if antrianTypeId != 0 && antrianType != "all" { if q.TypeID != 0 && q.Type != "all" {
selectFilter = append(selectFilter, queryUtils.DynamicFilter{Column: typeIdColumn, Operator: queryUtils.OpEqual, Value: antrianTypeId}) selectFilter = append(selectFilter, queryUtils.DynamicFilter{Column: typeIdColumn, Operator: queryUtils.OpEqual, Value: q.TypeID})
} }
query.Joins = []queryUtils.Join{ query.Joins = []queryUtils.Join{
@@ -480,18 +467,18 @@ func (r antrianOperasiRepo) SearchableListAntrianOperasi(c *gin.Context) (ListPa
} }
// filtering search results // filtering search results
if search != "" { if q.Search != "" {
searchFilters := []queryUtils.DynamicFilter{ searchFilters := []queryUtils.DynamicFilter{
{Column: "dpo.No_KTP", Operator: queryUtils.OpILike, Value: "%" + search + "%"}, {Column: "dpo.No_KTP", Operator: queryUtils.OpILike, Value: "%" + q.Search + "%"},
{Column: "dpo.No_rekam_medis", Operator: queryUtils.OpILike, Value: "%" + search + "%"}, {Column: "dpo.No_rekam_medis", Operator: queryUtils.OpILike, Value: "%" + q.Search + "%"},
{Column: "dpo.Nama_pasien", Operator: queryUtils.OpILike, Value: "%" + search + "%"}, {Column: "dpo.Nama_pasien", Operator: queryUtils.OpILike, Value: "%" + q.Search + "%"},
} }
query.Filters = append(query.Filters, queryUtils.FilterGroup{Filters: searchFilters, LogicOp: "OR"}) query.Filters = append(query.Filters, queryUtils.FilterGroup{Filters: searchFilters, LogicOp: "OR"})
} }
if statusOp != "" { if q.Status != "" {
selectFilter = append(selectFilter, queryUtils.DynamicFilter{Column: "dpo.Status_operasi", Operator: queryUtils.OpEqual, Value: statusOp}) selectFilter = append(selectFilter, queryUtils.DynamicFilter{Column: "dpo.Status_operasi", Operator: queryUtils.OpEqual, Value: q.Status})
} }
// wiring all select filter // 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) log.Printf("Unable to execute query count : %s ", err)
return result, err return result, err
} }
result.Paging.Limit = limit result.Paging.Limit = q.Limit
result.Paging.Offset = offset result.Paging.Offset = q.Offset
result.Paging.Total = int(countData) result.Paging.Total = int(countData)
result.Paging.CalculatePagingInfo() result.Paging.CalculatePagingInfo()
// query data // query data
queryData := query queryData := query
queryData.Limit = limit queryData.Limit = q.Limit
queryData.Offset = offset queryData.Offset = q.Offset
err = r.queryBuilder.ExecuteQuery( err = r.queryBuilder.ExecuteQuery(
c, dbconn, queryData, &result.Data) c, dbconn, queryData, &result.Data)
if err != nil { if err != nil {
@@ -60,3 +60,12 @@ type CreatePasienOperasiRequest struct {
DokterPelaksanaItems []DokterPelaksanaItemRequest `json:"dokterPelaksanaItems"` DokterPelaksanaItems []DokterPelaksanaItemRequest `json:"dokterPelaksanaItems"`
StatusPasienData StatusPasienRequest `json:"statusPasienData"` 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"`
}